问答题 学生的记录由学号和成绩组成,N名学生的数据已放入主函数中的结构体数组S中。请编写函数fun,其功能是:按分数降序排列学生的记录,高分在前,低分在后。
注意:部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
试题程序:
#include<stdio.h>
#define N 16
typedef struct
{
char num[10];
int s;
}STREC;
void fun(STREC a[])
{
}
void main()
{
STREC s[N]={{"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;
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");
}
【正确答案】
【答案解析】Void 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个数进行排序的算法很多,其中冒泡算法比较简单。冒泡法用双层for循环和if判断语句来实现,外层循环控制需比较的轮数,内层循环控制两两比较。
常见排序算法有冒泡法、选择法、插入法。冒泡排序算法:两两比较待排序相邻数据元素的大小,若两个数据元素处于反序则进行交换,直到没有反序的数据元素为止;选择排序算法:在要排序的一组数中,选出最大或最小的数与第一个位置的数进行交换,再在剩下的数中找出最大或最小的数与第二个位置的数进行交换,依次类推,直至最后两个数比较完成;插入排序算法:先对两个数进行排序,然后把第三个数插入前两个数中,这三个数有序,依次把后面的数插入完。对整型一维数组a[N]进行升序排序各种算法实现如下:
冒泡法:
for(int i=0;i<N-1;i++)
for(int j=0;j<N-1-i;j++)
if(a[j]>a[j+1])
{t=a[j];a[j]=a[j+1];a[j+1]=t;}
选择法:
for(int 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;
}