阅读以下应用程序说明和C程序,将C程序段中(1)~(7)空缺处的语句填写完整。 【说明】 以下【C程序】的功能是,逐一从指定课程成绩文件中读入学生的考号和成绩,对同一学生汇总他(她)的总成绩,并按如图6-14所示格式输出名次(按总成绩由高到底

admin2009-02-15  31

问题 阅读以下应用程序说明和C程序,将C程序段中(1)~(7)空缺处的语句填写完整。
    【说明】
   以下【C程序】的功能是,逐一从指定课程成绩文件中读入学生的考号和成绩,对同一学生汇总他(她)的总成绩,并按如图6-14所示格式输出名次(按总成绩由高到底的顺序)、总成绩、同一名次的学生人数、同一名次学生的学号(按学号由小到大的顺序)。
   
   该应用程序约定学生学习课程不超过30种,课程成绩文件的第1个数字就是课程号。统计过程中,同一课程号的成绩文件不能重复输入。
   该应用程序采用链表结构存储学生的相关信息,链表中的每个表元对应一位学生。在数据输入过程中,形成一个按学号从小到大顺序链接的有序链表。当数据输入结束后,程序按总成绩从高到低,学号从小到大的顺序对链表排序。最后程序按指定格式输出链表中的信息。
   【C程序】
   #include<stdio.h>
   #define M 30
   #define NLEN 10
   typedef struct node {
           int cur_s;                /* 最近输入成绩的科目*/
           Char no[NLEN];
           int score;
           struct node *next;
   } NODE;
   int s[M], sp, ss, i, mark, order, C;
   FILE *fp; NODE *h, *U, *V, *p;
   Char fname[80], no[NLEN], ans;
   main()
   {   for(h = NULL, sp = 0; ;)
       {   printf("输入科目成绩文件名(输入aaaa表示强行结束)。  \n");
           while(1)
           {   scanf("%s", fname);
               if (strcmp(fname, "aaaa") == 0)
                   break;
               if ((fp = fopen(fname, "r")) == NULL)
                    printf("不能打开文件%s, 请重新输入科目文件名。  \n", fname);
               else
                   break;
           }
           if (strcmp(fname, "aaaa") == 0) break;
           fscanf(fp, "%d", &ss);  /* 输入科目号 */s[sp]=s;
           for (i=0; s ! = ss; 1++);
               if (  (1)  )
               {   printf("该科目的成绩已输入,请输入别的科目成绩文件。\n");
                   continue;
               }
               sp++;
               while (fscanf(fp, "%s%d", no, &mark) == 2)
               {    /* 在链表中寻找最近输入的学号 */
                    for(v = h; v != NULL && strcmp(v-> no, no)<0; u=v, v= v-> next);
                    if (v !=NULL && strcmp(v->no, nb) == 0)
                    {   /* 该生已有成绩 */
                        if (V->cur_s != ss)
                        {   /* 该生的当前科目成绩是第一次输入 */
                             v->score += mark;  /* 累计总成绩 */
                             v->cur_s = ss;
                        } /* 同一科目成绩重复输入,后输入成绩被忽略 */
                    }
                    else
               {    p = (NODE *)malloc(sizeof(NODE));  /* 一位新的学生 */
                    strcpy(p->no,no);
                    p->score = mark;
                    p->cur_s = ss;
                    p-> next = v;
                    if ( v == h)
                         (2)  ;
                    else
                         (3)  ;
               }
           }
           fclose(fp);
           printf(" 还有科目成绩文件要输入吗? (Y/N) ");
           scanf("%c", &ans);
           if (ans == ’N’ || ans == ’n’) break;
           } /* 以下按总成绩和学号对链表排序 */
           v = (NODE *)malloc(sizeof(NODE));
           v->next = h;
           h = v;
           while (v->next != NULL)
           {  /* 在余下的部分链表中找总成绩高学号小的表元 */
              for(p = v, u = v->next; u->next != NULL; u = u->next)
                  if (u->next->score > p->next->score || u->next->score
              == p->next->score && strcmp(u->next->no, p->next->no) < 0)
                      p = u;
                  if (p != v)
                  {   u = p->next;
                      p->next =  (4)  ;
                       (5)= v->next;
                      v->next = u;
                  }
                  v = v->next;
           }
           v = h; h = h->next; free(v);
           printf(" 名次  总成绩  人数  学号\n "); /* 以下按格式要求输出 */
           v = h; order = 1;
           while (v != NULL)
           {   for(c = 1, u = v->next; u != NULL && u->score == v->score;(6);
               printf("%4d%7d%8d ", order, v->score, c);
               for (order += c, i = 1;(7); v = v->next, i++)
               {   if (i > 1 && i%5 == 1)
                       printf("\n%23c", ’ ’);
                       printf("%s ", v->no);
                   }
                   printf ("\n");
               }
   }

选项

答案(1)i<sp或i!=sp或其他等价的形式 (2)h=p (3)u->next=p (4)u->next (5)u->next (6)C++,u=u->next (7)i<=c,或c-!=0,或u!=v,或c->0,或c-或其他等价的形式

解析 通读题干说明和C程序之后可知,该C程序首先从指定的文件中输入某个科目的学生学号和成绩,并进行合法性检查,全部输入完成后,按总成绩进行排序。程序采用链表结构进行存储,最后按指定的格式输出。
   该应用程序首先输入数据,(1)空缺处所在的for循环语句是对输入的数据进行检查,数组s的作用是记录已经输入的科目。当输入一个科目之后,就在数组s中进行检查处理。如果已有该科目,就提示“该科目的成绩已输入,请输入别的科目成绩文件”信息,要求用户重新输入。其中,if语句用于判断是否有该科目,因此(1)空缺处所填写的内容是“i<sp”或“i!=sp”。
   接着在链表中寻找最近输入的学号,循环语句“for(v=h;v!=NULL && strcmp(v->no,no)<0;u=v,v=v->next);”结束之后,通过if...else语句对循环的出口进行判断,(2)、(3)空缺处是对应没有该学生的成绩(即是一位新学生)的情况,此时需要申请存储空间,然后进行赋值并把它插入到链表中。由于链表是排序的,因此需要判断插入点是否是第1个节点。如果是第1个节点,就需要修改表头节点的指针,因此(2)空缺处所填写的内容是“h=p”,(3)空缺处所填写的内容为“u->next=p”。
   接下来程序通过while循环对链表按总成绩的高低和学号从小到大的顺序进行排序。通读C程序可知,指针p所指向的节点应在指针u所指向的节点之前(或等于),指针v所指向的节点为当前节点。在内循环结束之后,若p!=v,则表示找到一个满足排序条件的节点,此时就需要移动指针。因此(4)、(5)空缺处所填写的内容均为“u->next”。
   应用程序的最后一个while循环语句,其功能是对排序后的链表按指定的格式进行输出。变量c的功能是计数器,用来记录总成绩相等的人数,因此(6)空缺处所填写的内容的作用是使指针u下移,计数器加1,即该空缺处应填入“c++,u=u->next”。
   变量Order的作用是记录名次,而(7)空缺处所在的for循环语句的功能是,输出成绩相同的学生的学号。由于计数器c的初值为1,因此该for循环的结束条件为c=O或i=c。由此进一步推知,(7)空缺处所填写的内容是“c--!=0”或“i<=c”或其他等价的形式。
转载请注明原文地址:https://kaotiyun.com/show/5ojZ777K
0

最新回复(0)