试题三(共15分)
阅读以下说明和C代码,填补C代码中的空缺(1)~(5),将解答写在答题纸的对应栏内。
【说明】
某市在进行市长选举,该市共分为M个选区(1<M<6,从1开始顺序编号),共有N个候选者参选(1<N<5,从A开始顺序编号)。经投票后,所得选票数据如下表所示。
现已将选票数据存入文本文件data.txt,该文件内容格式如下:共有M行,每行N+1个整数,第一个整数为选区编号,随后为N个候选者在该选区所得票数。
下面的程序先从文件中读入选票数据存入二维数组data,然后完成下列功能:
a.计算并显示每个竞选者获得的选票数及占总选票数的百分比;
b.如果任一竞选者获得的选票数超过总票数的50%,则显示竞选者获胜;
c.如果没有竞选者获得总选票数的50%以上,则显示两位得票最高的竞选者需再进行决选。
在下面的程序代码中,竞选者A的编号为1,竞选者B的编号为2,以此类推。
【C代码】
#include<stdio.h>
#include<stdlib.h>
#define M 5 /*选区数*/
#define N 4 /*竞选者人数 */
int main(int argc, char argv[ ] )
{
FILE *fin;
int data[M+1] [N+1];
/*data[ ][0]存放选区编号,data[M][J]存放j号竞选者得票总数*/
int MAXP1,cdl; /*MAXP1、cd1存放得票最多者的票数和竞选者编号*/
int MAXP2,cd2; /*MAXP2、cd2存放得票次多者的票数和竞选者编号*/
int i,j, totalP; /*tatalp存放总票数*/
fin=fopen("data.txt","r");
if(!fin)return -1;
i=0; j=0;
while(!feof(fin)){ /* 从文件读入数据 */
fscanf(fin,”%d”,&data[i][j]);
(1);
if(j>N) {j=0;i++;}
}
fclose(fin);
totalP =0;MAXP1=0;MAXP2=0;cd1=0;cd2=0;
for(j=1;j<N+1;j++) {
data[M][j]=(2); /* 设置竞选者得票总数初始值 */
for(i=0;i<M;i++) /* 设置j号竞选者的得票总数 */
data[M][j] +=data[i][j];
if(data[M][j]>MAXP1) {
(3); cd2=cd1;
MAXP1=data[M][j]; cd1=j;
}
else
if(data[M][j]> MAXP2){ MAXP2=data[M][j];cd2=j;}
(4); /* 计算总票数 */
}
for(j=1;j<N+1;j++) {
printf("Candidate-%c:%d ",j+'A'-1,data[M][j]);
printf("%.2lf\n",(double)data[M][j]/totalP);
}
printf("\n");
if((5)>0.5) /* 判断得票数最多者的得票率 */
printf("Winner:Candidate-%c\n",cd1+'A'-1);
else
printf("Result : Candidate-%c PK Candidate-%c\n",cd1+'A'-1,cd2+'A'-1);
system("pause");
return 0;
}