问答题
对10个候选人进行选举,现有一个100条记录的选票数据文件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, 10);
xx[i] [i0]=0;
}
fclose (fp);
return 0;
}
/*把结果yy输出到文件out.dat中*/
void WriteDat(void)
{
FILE *fp;
int i;
fp=fopen("out.dat", "w");
for(i=0; i<i0; 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; //赋初值0,每次执行循环时,都将重新赋值
for(j=0; j<10; j++)
if(xx[i][j]=="1") //判断xx[i][j]是否数字1
cnt++; //计数变量加1
if(cnt<=5) //如果一张选票中的选中数小于等于5时,统计每个人的得票数
for(j=0; j<10; j++)
if(xx[i](j]=="1") //如果第j人被选中,则其得票数加1
yy[j]++; //得票数加1
}
[解析] 10列100行选票,每行大于5的无效,统计存入数组。
根据题意,本程序中要统计每条记录中的有效票数,因此需要先判断该记录是否有效,然后再对有效的记录做进一步处理,即统计每个人的得票情况。
①首先定义两个循环变量i、j和一个计数变量cnt。
②指定第一个for循环的循环条件,循环变量i从0开始,等于100时结束,每循环一次,变量i的值加1。
③在for循环中,从第一条记录开始,每执行一次循环则处理一条记录是否满足要求。for循环语句执行流程大致如下:先将计数变量cnt赋值0(每执行一次循环时,都将重新赋初值0):然后通过一个for循环判断当前记录的10个数字是否为1,每次判断1个数字,如果数字等于1,则计数变量cnt的值加1,当第二个for循环执行完毕后,如果计数变量cnt的值小于等于5,则再通过一个for循环重新判断哪些位置上的数等于1,并将相应位置上的数值累加1。