7-3 学生平均成绩排序

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

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <stdio.h>
#include <math.h>
struct student{
    int number;
    char name[20];
    int x,y,z;
    int avg;
};
int ScoreAvg(struct student* p);
void BubbleSort(struct student* q,int n);
int main()
{
    int n;
    scanf("%d",&n);
    struct student a[n];
    for(int i=0;i<n;++i)
    {
        scanf("%d %s %d %d %d",&a[i].number,a[i].name,&a[i].x,
              &a[i].y,&a[i].z);
        a[i].avg=ScoreAvg(&a[i]);
    }
    BubbleSort(a,n);
    for(int i=0;i<n;++i)
    {
        printf("%d %s %d %d %d %d\n",a[i].number,a[i].name,a[i].x,
              a[i].y,a[i].z,a[i].avg);
    }
    return 0;
}
int ScoreAvg(struct student* p)
{
    int sum=p->x+p->y+p->z;
    int avg=sum/3;    //四舍五入,取整数
    int rem=sum%3;
    if((rem*10)/3>=5)
    {
        avg+=1;
    }
    else
    {
        avg=sum/3;
    }
    return avg;
}
void BubbleSort(struct student* q,int n)
{
    for(int i=0;i<n-1;i++)
    {
        int flag=1;    //若一次都没有交换,说明有序
        for(int j=0;j<n-1-i;++j)
        {
            if(q[j].avg<q[j+1].avg)    //根据题意要求,小的放后面,注意,不是改变平均分的顺序
            {
                struct student temp=q[j+1]; //temp一定要是结构体类型
                q[j+1]=q[j];    //改变的是结构体数组的元素顺序,不要写成q[j+1].avg
                q[j]=temp;
                flag=0;
            }
            else if(q[j].avg==q[j+1].avg)
            {
                if(q[j+1].number<q[j].number)    //题目要求
                {
                    struct student temp=q[j+1];
                    q[j+1]=q[j];
                    q[j]=temp;
                }
            }
        }
        if(flag)
        {
            return;
        }
        else
        {
            flag=1;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值