问题 问答题

学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun,它的功能是:按分数的高低排列学生的记录,高分在前。
注意:部分源程序在文件PROG1.C中,请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
文件PROG1.C的内容如下:
#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",92,
"GA011",66,"GA017",65,"GA018",68,"GA016",72;
int i:
fun(s);
printf("The data after sorted: \n");
for(i=0;i<N;i++)
if(i%4==0)printf("\n");
printf("%s%4d",s[i].num,s[i].s):
printf("\n");

答案

参考答案:void fun(STREC a[]){
i nf i,j;
STREC t:
for(i=0;i<N-1;i++)
for(j=0;j<N-1-i;j++)
if(a[j].s<a[j+1].s){
t=a[j];a[j]=a[j+1];a[j+1]=t;
}
}

解析: 参考答案:中利用冒泡排序法对结构体数组进行了排序。程序中定义的结构体类型包含了两个成员学生的学号和成绩,题目要求按成绩进行降序排列,所以排序依据只是成绩这个成员,循环中需要做a[j].s<a[j+1].s的比较,而在进行元素交换时,一定要将整个结构体变量进行交换,不能只交换成绩部分。所以算法虽然是排序算法,但是数据结构发生了变化,考生在编写程序时一定要注意这些细节问题。
[归纳总结] 本套试题的程序填空和程序设计题考查的是排序算法。排序算法通常要求掌握两种常用的算法:冒泡排序法和选择排序法。试题中除了要求对整型数组排序外,还要求对字符数组和结构体数组进行排序。
常见程序如下(假设对整型数组a进行升序排列,数组a长度为n):
(1)冒泡排序法程序段。
for(i=0;i<n-1;i++)
for(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;
}
(2)选择排序法程序段。
for(i=0;i<n;i++)
{
k=i:
fbr(j=i+1;j<n;j++)
if(a[k]>a[j])k=j;
if(k! =i) {
t=a[i]; a[i]=a[k]; a[k]=t;
}
}
如果只对奇数下标或只对偶数下标的元素进行排序,则需要对i和j变量的初值进行一定的处理,并且注意每次循环需要自加2,而不能只加1。如果是对结构体数组进行排序,则需要判断清楚排序依据是什么,并且一定要注意结构体变量的引用方法,交换时要对整个结构体变量进行交换,不能只交换其中的一个成员。

实验题
单项选择题