计算机二级C语言程序设计

136 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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;
			}
		}
	}
}

结果如下:

3.png

补充:

冒泡排序:

  • 排序步骤: 1.比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 3.针对所有的元素重复以上的步骤,除了最后一个。 4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
  • 冒泡排序总的时间复杂度为O(n*n)。