阅读以下说明和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;
}
正确答案及解析
正确答案
解析
(1)j++,或++j,或其等价表示
(2)0
(3)MAXP2=MAXP1
(4)totalP+=data[M][j],或totalP+=totalP+data[M][j],或其等价表示
(5)(double)MAxP1/totalP,或(float)MAXP1/totalP,或其等价表示。其中,将(double)或(float)写在totalP之前亦可
本题考查 C 程序设计基本能力。题目中涉及的知识点主要有数组、文件、循环和类型转换,分析程序时首先要明确各个变量(或数组元素)所起的作用,并以语句组分析各段代码的功能,从而完成空缺处的代码填充。根据题目描述,首先将文件中的数据读入数组 data 。显然,i 和 j 分别起行号、列号的作用。行号 i应在一行的数据都读入后增加1,而列号 j 则每读入一个数据就要增加1, 因此空(1)处应填写 "j++" 或其等价形式的语句。
将数据读入数组 data 后,以题中的数据为例,data 数组的内容可表示如下:
由于 data[M][i] 存放 i 号竞选者的得票总数,data[][0]存放的是选区编号,因此 data[M][0]不用。
以上表为例,需要将 data[0][l] 、data[l][l] 、...、data[M-l][l]加起来存入data[M] [1] ,因此,空(2) 处应填入 0,以设置data[M][l] 、data[M][2]、..d.ata[M][N]的初始值。空(3)所在的语句组用于找出得票数最多的竞选者,此时,因此之前的最多票数(MAXPl)将成为次多数(MAXP2),即空(3)处填入"MAXP2= MAXPl" 。
空(4)处为计算总票数的语句,根据说明,应填入 "totalP += data[M] [j]"或其等价形式。
空(5)处为计算票数最多者得票率的表达式,根据说明是将 MAXPl 除以 totalP ,需要注意的是: MAXPl 和 totalP都是整数且 MAXPl 小于totalP,因此应至少对其中的一个数值进行整数到实数的类型转换,否则其结果为0,因此,空(5)处应填入"(double)MAXPl/tota1P"或其等价形式。
你可能感兴趣的试题
一台主机的IP地址为202.123.25.36,掩码为255.255.254.0。如果该主机需要在该网络进行直接广播,那么它应该使用的目的地址为( )
-
- A.202.123.25.0
- B.202.123.25.255
- C.202.123.24.0
- D.202.123.24.255
- 查看答案
在计算机系统的日常维护工作中,应当注意硬盘工作时不能__(2)__。另外,需要防范病毒,而__(3)__是不会被病毒感觉的。
-
- A.电子邮件
- B.硬盘
- C.U盘
- D.ROM
- 查看答案
有 4 个 IP 地址:201.117.15.254、201.117.17.01、201.117.24.5 和 201.117.29.3,如果子网掩码为 255.255.248.0,则这 4 个地址分别属于3个子网;其中属于同一个子网的是()
-
- A.201.117.15.254 和 201.117.17.01
- B.201.117.17.01 和 201.117.24.5
- C.201.117.15.254 和 201.117.29.3
- D.201.117.24.5 和 201.117.29.3
- 查看答案
在异步通信中,每个字符包含1位起始位、7位数据位、1位奇偶位和1位终止位,每秒钟传送200个字符,采用4相位调制,则码元速率为()。
-
- A.50波特
- B.500波特
- C.550波特
- D.1000波特
- 查看答案
在 Windows 中,运行( )命令得到下图所示结果。以下关于该结果的叙述中,错误的是( )。
Pinging 59.74.111.8 with 32 bytes of data:
Reply from 59.74.111.8: bytes=32 time=3ms TTL=60
Reply from 59.74.111.8: bytes=32 time=5ms TTL=60
Reply from 59.74.111.8: bytes=32 time=3ms TTL=60
Reply from 59.74.111.8: bytes=32 time=5ms TTL=60
Ping statistics for 59.74.111.8:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 3ms, Maximum = 5ms, Average = 4ms
-
- A.该命令使得本地主机向目标主机发送了 4 个数据包
- B.本地主机成功收到了目标主机返回的 4 个数据包
- C.本地主机与目标主机连接正常
- D.该命令用于查看目标主机的 IP 地址
- 查看答案