改错题
1. 下列给定程序中,函数proc()的功能是:对M名学生的学习成绩,按从低到高的顺序找出m(m≤10)名学生来,并将这些学生数据存放在一个动态分配的连续存储区中,将此存储区的首地址作为函数值返回。
请改正程序中的错误,使它能得出正确的结果。
注意:不要改动main()函数,不得增行或测行,也不得更改程序的结构。
试题程序: #include<stdlib.h>
#include<conio.h>
#include<string.h>
#include<stdio.h>
#include<malloc.h>
#define M 10
typedef struct ss
{
char num[10];
int s;
} STU;
STU *proc(STU a[],int m)
STU b[M],*t;
int i, j,k;
//****found****
*t=calloc(m,sizeof(STU));
for(i=0;i<M;i++)
b[i]=a[i];
for(k=0;k<m;k++)
{
for(i=j=0;i<M;i++)
if(b[i].s<b[j].s)j=i;
//****fond****
t[k].num=b[j].num;
t[k].s=b[j].s;
b[j].s=100;
}
return t;
}
void outresult(STU a[],FILE *pf)
{
int i;
for(i=0;i<M;i++)
fprintf(pf, "No=% s Mark=% d\n",
a[i].num,a[i].s)
fprintf(pf, "\n\n");
}
void main ()
{STU stu[M]={{"A01",81},{"A02",89},
{{"A03",66},{"A04",87},
{{"A05",77},{"A06",90},
{{"A07",79},{"A08",61},
{{"A09",80},{"A10",71}};
STU *pOrder;
int i, m;
system("CLS");
printf("****THE RESULT****\n");
outresult(stu,stdout);
printf("\nGive the number of the students who have
lower score:");
scanf("% d",&m);
}
while(m>10)
{
printf("\nGive the number of the students who have
lower score:");
scanf("%d",&m);
}
pOrder=proc(stu,m);
printf("****THE RESULT****\n");
printf("The top: \n");
for(i=0;i<m;i++)
printf("%s%d\n",pOrder[i].num,pOrder[i].s);
free(pOrder);
【正确答案】(1)错误:*t=calloc(m,sizeof(STU))
正确:t=(struct ss*)calloc(m, sizeof(STU))
(2)错误:t[k].num=b[j].num
正确:t[k]=b[j]
【答案解析】 因为t是一个指向动态存储空间的指针变量,因此,“*t=calloc(m,sizeof(STU))”应改为“t=(struct ss*)calloc(m,sizeof(STU))”;而题目要求把学生的全部内容互换,即整个结构体的内容,而不是某个成员变量的值,因此,应去掉“t[k].num=b[j].num”中的“.num”。