题目84:对10个候选人进行选举,现有一个100条记录的选票数据文件IN.DAT,其数据存放的格式是每条记录的长度均为10位,第一位表示第一个人的选中情况,第二位表示第二个人的选中情况,依此类推 :内容均为字符0和1,1表示此人被选中,0表示此人未被选中,若一张选票人数大于5个人时认为无效的选票.给定函数ReadDat()的功能是把选票数据读入到字符串数组xx中。请编制函数CountRs()来统计每个人的选票数并把得票数依次存入yy[0]到yy[9]中。把结果yy输出到文件OUT.DAT中。
注意:部分源程序已给出。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数writeDat()的内容。
----------------------
类型:选票问题。
void CountRs(void) /*标准答案,有问题!!!*/
{int I,count,j;
char *pf;
for(I=0;I<10;I++)
yy[I]=0;
for(I=0;I<100;I++)
{pf=xx[I];count=0;
while (*pf)
if(*pf=='1'){count++;pf++;} else pf++;
if (count<=5)
{pf=xx[I];
j=0;
while (*pf)
if (*pf=='1') {yy[j]+=1;j++;pf++;}
else if (*pf=='0') {pf++;j++;}
}
}
}
或者:
void CountRs(void)
{ int i,j,k;
for(i=0;i<10;i++)
{ k=0;
for(j=0;j<10;j++)
if(xx[i][j]=='1') k++;
if(k>5) continue;
for(j=0;j<10;j++)
if(xx[i][j]=='1') yy[j]++; }
}
本题要求将那些选了超过5个人的选票视为无效票,在外层for()循环是用来一张一张选票地数。在循环内的第一个for()循环用来数一张选票中共选了几个人,第二个if()用来将选了超过5人的选票去掉。
void countrs(void)
{int i,j,count;
for(i=0;i<100;i++)
{count=0;
for(j=0;j<10;j++)
if(xx[i][j]=='1')
count++;
if(count>5) continue;
for(j=0;j<10;j++)
if(xx[i][j]=='1') yy[j]++;
}
}
PROG1.C
#include<stdio.h>
char xx[100][11];
int yy[10];
int ReadDat(void);
void WriteDat(void);
void CountRs(void)
{
}
void main()
{int i;
for(i=0;i<10;i++) yy[i]=0;
if(ReadDat()){
printf("IN.DAT can`t open!\n\007" );
return;
}
CountRs();
WriteDat();
system("pause");
}
int ReadDat(void)
{FILE *fp;
int i;
char tt[13];
if((fp=fopen("in.dat","r" ))==NULL) return 1;
for(i=0;i<100;i++){
if(fgets(tt,13,fp)==NULL)return 1;
memcpy(xx[i],tt,10);
xx[i][10]=0;
}
fclose(fp);
return 0;
}
void WriteDat(void)
{
FILE *fp;
int i;
fp=fopen("OUT.DAT","w" );
for(i=0;i<10;i++){
fprintf(fp," %d\n",yy[i]);
printf(" NO. %d notes=%d\n" ,i+1,yy[i]);
}
fclose(fp);
}
IN.DAT
1111110111
1011011110
1111101101
1111101101
1110101101
0111101011
0110100100
1010011100
1111011011
1000000100
0000011011
1001011100
0000011110
0100011101
0000001010
0011010000
1000000001
1110101010
1100001000
1110111110
0010011101
0101100001
0101001111
0101001000
0001110011
0110110000
1110100010
1000001101
0000101111
1010110000
1011101111
1001110000
1000110010
0100011001
1110100000
1101011000
0101011010
1111101001
0001010010
1101100110
0000100110
1000011100
0000111100
0111001110
0010101010
1111011001
0010000100
1000101101
1101101011
0000111101
1101000100
1111100000
0111000011
1011101000
1101101001
1110110100
1100100110
0001111101
1110100110
0010011110
1110010011
0011100011
0011011000
1001011000
1010101000
0010000111
1110101111
1101110001
1100001000
0110001001
0011100110
0001111010
0010100000
0101110000
0101110000
1100101111
1001010101
0110111110
0111001000
0101110101
0000011011
1101101000
1011011100
0100000110
0000010010
1000101101
0000010001
1111101001
0001001110
0011001000
0111010110
1010011011
0000110010
0100111101
1100100101
1111011000
0001000100
1101110011
1110111011
1111011000
OUT.DAT
25
23
23
26
29
30
33
26
23
20
帮我看下是哪里有待改正
{int i,j,icount;
for (i=0;i<100;i++)
{ icount=0;
for(j=0;j<10;j++)
{if ( icount > 5 ) continue;
if(xx[i][j]=='1') {icount++;
yy[j]++;}
}
}
}