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<stdio.h>
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啦
不过还好,最终把问题给解决啦!hahaha,加油!