当前位置: 代码迷 >> C语言 >> [求助]请教一道C语言习题
  详细解决方案

[求助]请教一道C语言习题

热度:249   发布时间:2006-03-24 02:24:00.0
[求助]请教一道C语言习题

题目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

原题如上.里面提供了几种解法,但几种解法都算不出正确答案,而且里面说有问题的标准答案(偶还没认真看)拿去运行却可以得出正确的输出.数据我对过,是正确的.现在我想问题里面提供的解法(除了标准答案外)哪里错了,还有一个我自己的解法
帮我看下是哪里有待改正
void CountRs(void)
{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]++;}
}
}
}
在此先谢谢了
搜索更多相关的解决方案: C语言  习题  选票  DAT  函数  

----------------解决方案--------------------------------------------------------

答案那格式太乱(不忍心仔细看),就说下你写的吧
[CODE]
void CountRs(void)
{
int i,j,icount;

for (i=0;i<100;i++)
{
icount=0;
for(j=0;j<10;j++)
{
if ( icount > 5 ) /*这里不妥吧,不过你可以把continue放外层循环里*/
break;
if(xx[i][j]=='1')
{
icount++;
yy[j]++;
}
}
}
}


[/CODE]


----------------解决方案--------------------------------------------------------
要往下移
----------------解决方案--------------------------------------------------------
以下是引用feng1256在2006-3-24 4:19:00的发言:

答案那格式太乱(不忍心仔细看),就说下你写的吧
[CODE]
void CountRs(void)
{
int i,j,icount;

for (i=0;i<100;i++)
{
icount=0;
for(j=0;j<10;j++)
{
if ( icount > 5 ) /*这里不妥吧,不过你可以把continue放外层循环里*/
break;
if(xx[i][j]=='1')
{
icount++;
yy[j]++;
}
}
}
}


[/CODE]

呵呵,把你修改后的放进去运行,结果跟我之前的一样的结果!拜托斑竹再帮我看看哈.
----------------解决方案--------------------------------------------------------
呵呵,搞定了,谢谢斑竹和各位的关注哈
[QUOTE]void CountRs(void)
{int i,j,icount;
for (i=0;i<100;i++)
{ icount=0;
for(j=0;j<10;j++)
{if(xx[i][j]=='1') icount++;}

if ( icount > 5 ) continue;
for(j=0;j<10;j++)
if(xx[i][j]=='1') yy[j]++;

}
}[/QUOTE]

[此贴子已经被作者于2006-3-24 15:25:55编辑过]


----------------解决方案--------------------------------------------------------
开始看错了,因为你必要先判断此选票中的选中数是不是超过5才能记数,不然记数就是错误的
----------------解决方案--------------------------------------------------------
以下是引用feng1256在2006-3-24 22:56:00的发言:
开始看错了,因为你必要先判断此选票中的选中数是不是超过5才能记数,不然记数就是错误的

呵呵,斑竹帮偶看下别外一道题哈.
----------------解决方案--------------------------------------------------------

  相关解决方案