开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情
计算机二级C语言程序设计题
题目:
学生的记录由学号和成绩组成,M名学生的数据已在主函数中放入结构体数组stu中,请编写函数proc(),它的功能是:按分数的高低排列学生的记录,高分在前。
#include <stdio.h>
#include <stdlib.h>
#define M 16
typedef struct
{
char num[10];
int s;
} STREC;
void proc(STREC a[])
{
?
}
void main()
{
STREC stu[M]={{"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 *wf;
proc(stu);
printf("The data after sorted:\n");
for(i=0; i<M; i++)
{
if(i%4==0)/*每行输出4个学生记录*/
{
printf("\n");
}
printf("%s%4d ", stu[i].num, stu[i].s);
}
printf("\n");
wf=fopen("out.dat","w");
for(i=0; i<M; i++)
{
if(i%4==0 && i)
{
fprintf(wf, "\n");
}
fprintf(wf, "%4d ",stu[i].s);
}
fprintf(wf,"\n");
fclose(wf);
system("pause");
}
分析题目:
函数返回指定学号的学生数据,指定的学号在主函数中输入。返回的学生数据应按分数的高低排列。
解题思路:
按照分数的高低排列学生的记录,可以使用冒泡排序法,将每一个学生的成绩与其他学生的成绩相比较,对不符合要求的记录交换位置 具体代码如下:
void proc(STREC a[])
{
int i,j=0;
STREC t;
for(i=1;i<M; i++)/*用冒泡排序进行排序,进行M-1次比较*/
{
for(j=0; j<M-1; j++)/*在每次比较中要进行N-1次两两比较*/
{
if(a[j].s < a[j+1].s)
{/*按分数的高低排列学生记录,高分在前*/
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
}
结果如下:
补充:
冒泡排序:
- 排序步骤: 1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 3.针对所有的元素重复以上的步骤,除了最后一个。 4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
- 冒泡排序总的时间复杂度为O(n*n)。