学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun(),它的功能是按分数的高低排列学生的记录,低分在前。 注意:部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #include <stdio.h> #define N 16 typedef struct { char mum[10); int s; }STREC; int fun (STREC a[ ]) { } main () { STREC s[N]={{"GA005",88},{"GA003",64}, {"CA002",77},{"GA004",89},{"GA001",54}, {"GA007",72},{"GA008",72},{"GA006",65}, {"GA015",83},{"GA013",95},{"GA012",55}, {"GA014",68},{"GA011",78},{"GA017",53}, {"GA018",92},{"GA016",82}}; int i; FILE *out; fun(s); printf("The data after sorted :\n"); for(i=0;i<N;i++){if((i)%4==0)/*每行输出4个学生记录*/ printf("\n");printf("%s %4d",s[i].num,s[i].s); } printf("\n"); out=fopen("out21.dat","w"); for(i=0;i<N;i++) {if((i)%4==0&&i) fprintf(out,"\n");fPrintf(out,"%4d",s[i].s); } fprintf(out,"\n"); fclose(out); }
参考答案:
解析:int fun(STREC a[]) { int i,j; STREC t; for(i=1;i<N;i++) /*用冒泡法进行排序,进行N-1次比较*/ for(j=0;j<N-1;j++) /*在每—次比较中要进行N-1次两两比较*/ if(a[j].s>a[j+1].s) /*按分数的高低排列学生的记录,低分在前*/ { t=a[j]; a[j]=a[j+1]; a[j+1]=t; } } 冒泡法算法思路:如果有N个数,则要进行N-1次比较,在每—次比较中要进行N-1次两两比较(这种算法较好理解但不是最精的)。所谓两两比较就是从头到尾依次将相邻两个数进行比较并将其中大的数放在前或在后(若要求从小到大排序,则大的数要放在后。反之则对调),即两两比较后这两个数要形成题中所要求的顺序。由于总是从头到尾进行比较,所以第1次比较结束后,最大(或最小)数肯定在最后,第2次比较结束后,次最大(或次最小)数肯定在倒数的第2个数,依次类推,所以进行第一次比较时必须比较到最后一个数,而进行第2次比较时只要比较到倒数的第2个数即可,所以进行第 i次比较I时只需比较N-i次即可(这种算法较难理解,但它是最好的)。