程序员考试1995年下午的题,各侠大侠给看一下,不知道分析的对不对,不希望大家指点:

整个程序分析的都很好,答案也合理,但是觉得在写入文件的那段程序中, “fprintf(fpt,”%4d %7d:”,I+1,total[___(4)___]);”这个语句有错,因为在这个语句中写入的班级号是“I+1”,但应该写入排序后的班级号,如果写成“I+1”不能和总成绩相对应。觉得应该改为“order[i]+1”。

有N个班级参加NS个项目比的比赛。下面的程序从文件T.IN读入N(N<=30),NS(<=10)和全部班级各项项目的得分,计算出各班的总分,并按总分降序的次序将每个班级总分及各项目的得分输出到文件T.OUT。
为了避免排序时可能要交换score[I][k]和score[I][k](0<=k<=ns),程序引入数组order[],改上述交换为order[I]t order[j]的交换。

程序:
#include <stdio.h>
#define Number 30
#define Terms 10
#define INF “t.in”
#define OUTF “t.out”

int score[Number][Terms];
int total[Number,Order[Number];

main()
{
  int I,j,n,ns,t;
  FILE *fpt;
If  ((fpt=fopen(INF, ”r”)==NULL)
{
  printf(“can’t open file %s\no”,INF);
  exit(1);
}
fscanf(fpt,”%d%d”,&n,&ns);
for (I=0;I<n;I++)
for (j=0;j<ns;j++)
{
  fscanf(fpt ,”%d”,score[I]+j);   //读出每个项目的成绩,写入score[I][j]数组
  for (t=j=0;j<ns;j++)
    t+=score[I][j];
total[I]=t;         //计算总成绩
_____________(1)____________;
}
fclose(fpt);
for (I=0;I<n-1;I++)    //选择排序
  for (j=____(2)_____;j<n;j++)
    if (_____(3)______)
      {
          t=order[I];
          order[I]=order[j];
         order[j]=t;
}
        fpt=fopen (OUTF,”w”);    //写入文件
for (I=0;I<n;I++)     
{
  fprintf(fpt,”%4d %7d:”,I+1,total[___(4)___]); //按总成绩排序后写入班级号和成绩
  for (j=0;j<ns)j++)
    fprintf(fpt, ”%3d”, ____(5)____);
    printf (fpt, “\n”);
}
fclose(fpt);

分析与答案:

for (I=0;I<n;I++)
for (j=0;j<ns;j++)
{
  fscanf(fpt ,”%d”,score[I]+j);
  for (t=j=0;j<ns;j++)
    t+=score[I][j];
total[I]=t;
_____________(1)____________;
}

此程序段首先进行数据输入,当输入完一个班级的成绩后,计算其总分。
下面的程序中用到了数组order,并对order的一些元素进行了交换操作。所以前面应已经对order进行赋初值操作,但程序中并无此相关语句,所以(1)应是对数组order赋初值。又因为order的提出是“为了避免排序时可能要交换score[I][k]和score[i][k](0<=k<ns),程序另引入数组order[],改上述交换为order[I]和order[j]的交换”。所以,最初的order应与scor[I]相对应,因此(1)空填order[I]=I。
fclose(fpt);
for (I=0;I<n-1;I++)
  for (j=____(2)_____;j<n;j++)
    if (_____(3)______)
      {
          t=order[I];
          order[I]=order[j];
         order[j]=t;
}
从此处的交换语句可以看出,这里是根据total对名次order进行调整。因为题目要求按总分降序的次序将每个班级总分及各项目的得分输出到文件t.out。所以order[0]应存得分最高的班级号,即最大的total的下标。因此,(2)空应填I+1,(3)空应填total[order[i]<total[order[j]。
        fpt=fopen (OUTF,”w”);
for (I=0;I<n;I++)
{
  fprintf(fpt,”%4d %7d:”,I+1,total[___(4)___]);

对照(2)、(3)空的分析可知,数组order中顾虑储的其实是total的下标,所以(4)空应填order[i]。

  for (j=0;j<ns)j++)
    fprintf(fpt, ”%3d”, ____(5)____);
    printf (fpt, “\n”);
}
fclose(fpt);

题目要求“按总分降序的次序将每个班级总分及各项目的得分输出到文件t.out”,所以这里是输出各项目的得分。因此,(5)空应填score[order[I]][j].

(1) order[i]=I;
(2) I+1
(3) Total[order[i]]<total[order[j]]
(4) Order[i]
(5) Score[order[I]][j]

[color=000080]000080[/color]