PTA:学生平均成绩排序

假设学生的基本信息包括学号、姓名、三门课程成绩以及个人平均成绩,定义一个能够表示学生信息的结构类型。输入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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值