7-29 学生成绩排序 (15 分)(C语言版)

7-29 学生成绩排序 (15 分)
假设学生的基本信息包括学号、姓名、三门课程成绩以及个人平均成绩,定义一个能够表示学生信息的结构类型。输入n(n<50)个学生的成绩信息,按照学生的个人平均分从高到低输出他们的信息。如果平均分相同,按输入的先后顺序排列。

输入格式:
输入一个正整数n(n<50),下面n行输入n个学生的信息,包括:学号、姓名、三门课程成绩(整数)。

输出格式:
输出从高到低排序后的学生信息,包括:学号、姓名、平均分(保留两位小数)。

输入样例:
3
101 Zhang 78 87 85
102 Wang 91 88 90
103 Li 75 90 84
输出样例:
102,Wang,89.67
101,Zhang,83.33
103,Li,83.00
参考代码

#include
struct{
	int a;
	char name[20];
	double b1,b2,b3,temp;
	double average;
}s[55];
int main()
{
	int n,i,j,t;
	double k;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&s[i].a);
		scanf("%s",&s[i].name);
		scanf("%lf",&s[i].b1);
		scanf("%lf",&s[i].b2);
		scanf("%lf",&s[i].b3);
		s[i].average=(s[i].b1+s[i].b2+s[i].b3)/3;
		s[i].temp=k++;
	}
	for(i=0;i<n-1;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(s[i].average<s[j].average)
			{
				k=s[i].average;
				s[i].average=s[j].average;
				s[j].average=k;
				
				k=s[i].temp;//标记数组,记录数组的变化 
				s[i].temp=s[j].temp;
				s[j].temp=k;
			}	
		}	
	}
	for(i=0;i<n;i++)
	{
		t=s[i].temp;
		printf("%d,%s,%.2lf\n",s[t].a,s[t].name,s[i].average);//注意数组里的变量,一个是t,一个是i 
	}
	return 0;
}

心得:因为还不会C++,不能调用排序函数,等学会C++后,可能再遇到这个问题就好些啦!不过还好定义一个temp标记数组,保持和average数组的同步变化,到最后就可以使结构体内的其它数组也保持一样的变化,然后输出出来!
以后遇到整型的变化,要把他们从一开始就定义为浮点型,不然会出各种乱七八糟的问题,就比如这次遇到的,上一个数据还保留两位小数,下面的就变为.00啦
7-29 学生成绩排序 (15 分)(C语言版)_第1张图片
不过还好,最终把问题给解决啦!hahaha,加油!

你可能感兴趣的:(PAT训练)