假设学生的基本信息包括学号、姓名、三门课程成绩以及个人平均成绩,定义一个能够表示学生信息的结构类型。输入n(n<50)个学生的成绩信息,按照学生的个人平均分从高到低输出他们的信息。
注意:
1)平均分出现相同的分数时按学号从小到大进行排序输出。
2)平均分以四舍五入取整数保存。
输入格式:
输入一个正整数n(n<50),下面n行输入n个学生的信息,包括:学号、姓名、三门课程成绩(整数)。
输出格式:
输出从高到低排序后的学生信息,包括:学号、姓名、三门课程成绩、平均分(整数)
输入样例:
4
101 Zhang 78 87 85
102 Wang 91 88 90
104 chen 86 90 75
103 Li 75 90 86
输出样例:
102 Wang 91 88 90 90
103 Li 75 90 86 84
104 chen 86 90 75 84
101 Zhang 78 87 85 83
解题思路:
在这道题目中,可以先算出每个学生的平均分,然后进行排序。需要注意的是,在算平均分的时候,由于需要进行四舍五入取整数保存,则需要将其平均数加上0.5。然后,在最后输出的时候 ,强制转换为int类型输出。
注意:
题目中,相同的分数时按学号从小到大进行排序输出,这就需要我们再输出的时候进行判断,
对结构体数组进行遍历,当后面一个人的成绩的平均分与前一个人的相同并且后一个人的学号比前一个人的小时,交换其位置即可.
#include<stdio.h>
struct stu
{
int num;
char name[10];
double s1, s2, s3;
double avg;
};
int main()
{
int n, i, j;
scanf("%d", &n);
struct stu ss[100];
for(i = 0; i <n ; i++)
{
scanf("%d%s%lf%lf%lf", &ss[i].num, ss[i].name, &ss[i].s1, &ss[i].s2, &ss[i].s3);
ss[i].avg = (ss[i].s1+ ss[i].s2 +ss[i].s3) /3 + 0.5;//四舍五入
}
for(i = 0; i < n; i++)
{
for(j = 0; j < n-i-1; j++)
{
if(ss[j]. avg < ss[j+1].avg)
{
struct stu t = ss[j];
ss[j] = ss[j+1];
ss[j+1] = t;
}
}
}
for(i = 0; i < n; i++)
{
if(ss[i].avg == ss[i+1].avg && ss[i].num > ss[i+1].num)//平均分相同时,学号不合题意,交换两个的位置
{
struct stu t = ss[i];
ss[i] = ss[i+1];
ss[i+1] = t;
}
//注意输出的时候取整
printf("%d %s %d %d %d %d\n", ss[i].num, ss[i].name, (int)ss[i].s1, (int)ss[i].s2, (int)ss[i].s3, (int)ss[i].avg);
}
return 0;
}