问答题
对10个候选人进行选举,现有一个180条记录的选票数据文件in.dat,其数据存放的格式是每条记录的长度均为10位,第一位表示第一个候选人的选中情况,第二位表示第二个候选人的选中情况,依次类推;每一位内容均为字符"0"或"1","1"表示此人被选中,"0"表示此人未被选中,若一张选票选中人数小于等于5个人时被认为无效的选票则不作统计。给定函数ReadDat()的功能是把选票数据读入到字符串数组xx中。请编制函数CountRs()来统计每个候选人的选票数并把得票数依次存入yy[0]到yy[9]中,即第一个候选人的得票数存入yy[0]中,以此类推。最后调用函数writeDat()把结果yy输出到文件out.dat中。
请勿改动主函数main()、读函数ReadDat()和输出函数WriteDat()的内容。
#include <stdio.h>
#include <string.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不能打开! \007\n");
return;
}
CountRs ();
WriteDat ();
}
/*把选票数据读入到字符串数组xx中*/
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, i0);
xx[i] [10] =0;
}
fclose (fp);
return 0;
}
/*把结果yy输出到文件out.dat中*/
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("第%d个人的选票数=%d\n", i+1, yy[i]);
}
fclose (fp);
}
【正确答案】
【答案解析】int i, j, cnt;
for(i=0; i<100; i++)
{
cnt=0;
for(j=0; j<10; j++)
if(xx[i] [j] == "i")
cnt++;
if (cnt>5) //如果一张选票中的选中数大于5时,统计每个人的得票数
for(j=0; j<10; j++)
if(xx[i][j]=="1")
yy [j] ++;
}
[解析] 10列100行选票,每行小于等于5的无效,统计存入数组。
通过审题可以发现本题仅一个不同点,即本题中要求每行选票中选中数大于5时记录才有效,参考答案的第8行,修改该条件语句的条件设置即可。