问题 问答题

学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun(),它的功能是:按分数的高低排列学生的记录,高分在前。 注意:部分源程序给出如下. 请勿改动主函数main和其他函数中的任何内容,仅在函数fum的花括号中填入所编写的若啡:语句。 试题程序: #include <stdio.h> #define N 16 typedef struct { char num[10]; int s ; }STREC; int fun (STREC a[]) { } main () { STREC s IN] ={ {"GA005", 85 }, {"GA003", 76}, {"GA002", 69}, {"GA004", 85}, {"GA001", 91}, {"GA007", 72}, {"GA008", 64}, {"GA006", 87}, {"GA015", 85}, {"GA013", 91}, {"GA012", 64}, {"GA014", 91}, {"GA011", 66}, {"GA017", 64}, {"GA018", 64}, {"GA016", 72} }; int i; FILE *out; fun (s); printf("The data after sorted :In"); 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 ( "out 16. 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次比较时只需比较N-i次即可(这种算法较难理解,但它是最好的)。 选择法算法思路:如果有N个数则从头到倒数的第2个数一个一个往后走动,每走动1个数总是将这个数与其后的所有数进行比较并找出它们的最大(或最小)数,找出最大(或最小)数后再将所得的最大(或最小)数与该数进行交换,交换后再走到下一个数依次交换到结束。此外,选择法还可用如下思路:如果有N个数,则从头到倒数的第2个数—个一个往后走动,每走动一个数总是将这个数与其后的所有数进行两两比较,在比较时按顺序将进行比较的这两个数排序(即交换)。 插入法算法思路:先对头两个数进行排序。然后把第3个数插入到前两个数中,插入后前3个数依然有序;再把第4个数插入到前3个数中,插入后前4个数依然有序;依次插完所有的数。具体执行方式(假设从小到大排序):从第2个数开始往后一个一个走动直到最后。每走到1个数总是将该数(先将其存到1个临时变量中)与其前面的数进行比较(比较的顺序总是从后往前进行),在比较时只要发现该数比被比较的数小,就将被比较的数往后移1位,然后该数还要冉与前1个数进行比较,亢到发现该数比被比较的数大或己比较到头(即第1个数的前面),并将该数存入当前被比较数的后1位(存储空间)。 如果有整型一维数组a其有N个元素,要求将其按从小到大排序。注意元素下标是从0始的。 冒泡法: for (i=1; i<N; i++) for (j=0;N-1; j++) if (a[j]>a[j+1]) {t=a[j] ;a [j]=a[j+1] ;a[j+1]=a[j]; } 选择法 for (i=0 i<N-1; i++) {p=i; for(j i+1; j<N; j++) if (a[p]>a[j]) p=j; if{p!=i) t=a[i];a[i]=a[p];a[p]=t; } 插入法 for {i=1; i<N; i++} {t=a[i]; for {j=i-1; a [j]>t& &j>=0; j--) a[j+1]=a[j]; a[j+1]=t; }

单项选择题
单项选择题