試題三(共15分)
閱讀以下說明和C代碼,填補C代碼中的空缺(1)~(5),將解答寫在答題紙的對應(yīng)欄內(nèi)。
【說明】
某市在進行市長選舉,該市共分為M個選區(qū)(1<M<6,從1開始順序編號),共有N個候選者參選(1<N<5,從A開始順序編號)。經(jīng)投票后,所得選票數(shù)據(jù)如下表所示。
現(xiàn)已將選票數(shù)據(jù)存入文本文件data.txt,該文件內(nèi)容格式如下:共有M行,每行N+1個整數(shù),第一個整數(shù)為選區(qū)編號,隨后為N個候選者在該選區(qū)所得票數(shù)。
下面的程序先從文件中讀入選票數(shù)據(jù)存入二維數(shù)組data,然后完成下列功能:
a.計算并顯示每個競選者獲得的選票數(shù)及占總選票數(shù)的百分比;
b.如果任一競選者獲得的選票數(shù)超過總票數(shù)的50%,則顯示競選者獲勝;
c.如果沒有競選者獲得總選票數(shù)的50%以上,則顯示兩位得票最高的競選者需再進行決選。
在下面的程序代碼中,競選者A的編號為1,競選者B的編號為2,以此類推。
【C代碼】
#include<stdio.h>
#include<stdlib.h>
#define M 5 /*選區(qū)數(shù)*/
#define N 4 /*競選者人數(shù) */
int main(int argc, char argv[ ] )
{
FILE *fin;
int data[M+1] [N+1];
/*data[ ][0]存放選區(qū)編號,data[M][J]存放j號競選者得票總數(shù)*/
int MAXP1,cdl; /*MAXP1、cd1存放得票最多者的票數(shù)和競選者編號*/
int MAXP2,cd2; /*MAXP2、cd2存放得票次多者的票數(shù)和競選者編號*/
int i,j, totalP; /*tatalp存放總票數(shù)*/
fin=fopen("data.txt","r");
if(!fin)return -1;
i=0; j=0;
while(!feof(fin)){ /* 從文件讀入數(shù)據(jù) */
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); /* 設(shè)置競選者得票總數(shù)初始值 */
for(i=0;i<M;i++) /* 設(shè)置j號競選者的得票總數(shù) */
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); /* 計算總票數(shù) */
}
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) /* 判斷得票數(shù)最多者的得票率 */
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;
}