阅读以下说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。 说明 某单位举办了一场知识竞赛,参加竞赛的选手为300名,依次从1~300进行编号。竞赛时间为9:00~11:00。8道竞赛题目依次从“A”~“H”编号,选手可按任意次序答 题,每完

admin2007-03-15  42

问题 阅读以下说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。
说明
   某单位举办了一场知识竞赛,参加竞赛的选手为300名,依次从1~300进行编号。竞赛时间为9:00~11:00。8道竞赛题目依次从“A”~“H”编号,选手可按任意次序答
题,每完成一道题目,可立即提交答案。若答案正确(Y),则选择其他题目进行解答,否则,可继续做该题目或选择其他题目进行解答,直至竞赛结束。
   选手提交答案的情况及判定结果由专人即时录入,录入的数据如表1所示,对竞赛情况进行统计和排名的结果如表2所示。

统计和排名的规则如下:
   1.若选手X在竞赛时提交的题目P解答正确,则解答该题目所用时间如下计算;
   解答题目P的用时=提交题目P正确的时间-竞赛的开始时间+罚时
   罚时=提交题目P错误解答的次数×20
   例如=表1中14号选手在10:27提交了题目A的正确解答,因此该选手正确解答该题目所用时间为87分钟,由于之前的两次提交错误解答,罚时为2×20=40分钟,所以14号选手解答题目A的用时=87+40=127(分钟)。
   2.已经提交正确答案的题目再次提交时不再计算。
   3.竞赛结束时,选手的总用时为所有解答正确的题目用时累加所得,解答不正确的题目不计时。
   4.排名时,完成题目数量多者排名靠前;若完成的题目数相同,则用时少者排名靠前;若完成的题目数和所用时间均相等,则名次相同;完成题目数为。的选手不参加排名。
   函数void Statistic()的功能是:读取输入数据,进行统计、排名并输出结果。
   #define  MAXN    300
   typedef stmct{
   int no;    /*选手编号*/
        int num;   /*完成的题目数量*/
        int time;   /*完成题目的总用时*/
           int d[8];   /*d用于记录提交第i个题目错误答案的次数*/
          int a[8];   /*a用于记录第i个题目是否已经提交正确答案*/
   }Info;
   void Statistic() {
           char ch,pass;
           int i,j,k,h,m,t,time,Maxlndex;
           Info R[MAXN+1 ];
           for(i=1; i<=MAXN; i++){    /*数组R的元素置初值0*/
                 R.no = 0;R.num = 0;  R.time = 0;
                 for(j=0; j<8; j++) {R.d[j] = 0; R.a[j] = 0;}
           }/*for*/
           MaxIndex = 0;
           while (1){
        /*录入一名选手提交答案的信息(小时:分钟,选取手编号,题目号,是否正确)*/
                 scanf("%d:%d,%d,%c,%c",&h,&m,&k,&ch,&pass);
                 if(h==0) break;
                 R[k].no = k;                     /*k为选手编号码*/
             time=(1);          /*计算答题时间,以分钟为单位*/
                 if(isupper(ch))  ch = ’a’ + ch- ’A’;
                 if(pass != ’Y’  &&  pass  != ’y’)  {R[k].d[ch-’a’]++; continue;}
                 if (R[k].a[ch-’a’]==1) continue;
                 R[k].a[ch-’a’] = 1;
                 R[k] .num++;
                 R[k].time +=(2);
                 if (k > MaxIndex)    Maxlndex = k;
           }/*while*/
           for(i=l; i<MaxIndex; i++)  {    /*选取择排序*/
              for(t=i,j=i+1; j<=Maxlndex; j++)
                 if(R[t].num<R[j].num|| (3))t=j;
              if((4)) {R[0]=R[t];R[t]=R;R=R[0];}
           }/*for*/
           k=1; R[0] = R[l];
           for(i=1; i<=Maxlndex; i++)       /*输出排名情况*/
              if (R,.num > 0) {
                 if(R.num!=R[0].num||R.time!=R[0].time)  k++;
                R[0]=(5);
                printf("%d:%3d  %4d  %5d\n",k,R.no,R.num,R.time);
                )/*if*l
   }/*Statistic*/

选项

答案(1)(h-9)*60+m,及其等价形式 (2)time+R[k].d[ch-’a’]*20 其中ch-’a’可以表示为ch-97,R[k]可以表示为R[R[k].no] (3)Rrq.num=R[j].num && R[t].time>R[j].time,及其等价形式 (4)t!=i及其等价形式 (4)R[i],及其等价形式

解析 本题考查的是通过阅读程序说明,在限定条件下进行程序设计的能力。
   在函数Statistic()中,h:m表示竞赛选手提交解答的时间。根据注释,空(1)处用于计算以分钟为单位的答题时间。用提交时间减去竞赛开始时间,就是解答一个题目所用的时间,即空(1)处填入:(h-9)*60+m。
   统计过程中采用小写英文字母表示题目的编号,因此语句
   if(isupper(ch))ch=’a’+ch-’A’;
   用于将题目编号ch统一为小写字母。
   函数中,while循环用于统计每个选手提交答案的情况,采用了直接存取的方法,即k号选手的数据记录在下标为k的数组元素中,即k号选手提交编号为ch的题目情况用R[k].d[ch-’a’]和R[k].a[ch-’a’]记录,其中,d[ch-’a’]用于记录提交编号为ch的题目的错误答案次数,a[ch-’a’]则用于记录编号为ch的题目是否已经提交正确答案,以防止一个正确答案被同一名选手反复提交造成重复统计,相应的语句为
   if(R[k].a[ch-’a’]==1)continue;
   因此,“R[k].a[ch-’a’]=1;”表示选手k首次正确提交了题目ch的解答,同时记录他解答正确的题目数加1,即“R[k).num++;”。已正确解答的题目总用时,由解答用时和罚时两部分组成,因此空(2)处应填入“time+R[k].d[ch-’a’]*20”。
   完成统计后,排名所需的数据都记录在结构体数组R[]的成员NO、nurn和time中,数组成员d[]和a[]就不再有用了。
   根据输入数据完成统计之后,需要进行排序。函数Statistic()中采用的是简单选择排序,n个元素进行简单选择排序的基本思想是:通过n-1(1≤i≤n)次元素值之间的比较,从 n-i+1个元素中选出值最小的元素(用t记录该最小元素在数组中的下标),,并和第i个元素进行交换,当i等于n时所有记录有序排列。根据排序规则,完成题目数量相同时,总用时少者排名靠前,因此空(3)处应填入“R[t].num==R[j].num && R[t].time>R[j].time”,显然,若第i个元素本来就是最小元素,则无需交换,即空(4)处填入“t!=i”或其等价形式。
   输出排名情况时,应注意并列名次问题。下面的代码段用于输出排名情况。
   k=-1;  R[0]=R[1];
          for(i=1;i<=Maxlndex;i++)    /*严输出排名情况*/
             if(R.num>0){
               if(R.num!=R[0].num||R.time!=R[0].time)  k++;
               R[0]=  (5)  ;
               printf("%d:%3d  %4d  %5d\n",k,R.no,R.num,R.time);
           }/*if*/
   显然,k表示选手的名次。R[0]记录的是R[i-1]的值,因此,排序后相邻的两个记录若完成题目数和总用时相同,则输出相同的名次号(即k不变)。因此,空(5)处填入“R
转载请注明原文地址:https://kaotiyun.com/show/lzjZ777K
0

最新回复(0)