hnust_OJ_成绩排序

题目描述

      学生成绩表有学号、数学成绩、英语成绩与程序设计成绩4项。按学号次序给定一个班的成绩,要求根据个人总分高低排序输出同学们的成绩。

输入

      第一行是整数N,表示班级学生人数(N<=40)。

      随后有N行,每一行依次有空格分开的学号、数学成绩、英语成绩与程序设计成绩等4项。学号统一都是10位数字,前四位是1705,而且不会有相同学号。成绩是来自区间[0,100]的整数。

输出

根据总分由高到低进行排序。如果总分相同,则数学成绩高者居前,如果数学成绩也相同,则英语成绩高者居前,若英语成绩相同,则学号按字典序(即strcmp的比较规则)小者居前。

        每一个学生输出学号,三门成绩总分,数学成绩,英语成绩,程序设计成绩五项信息。其中学号宽度占15位,其它各数据项宽度占5位,输出格式类如”%-5d”,见样例。

样例输入 

6
1705050201 78 65 95
1705050202 81 85 85
1705050203 95 65 78
1705050204 66 65 67
1705050205 56 67 89
1705050206 65 95 80

样例输出 

1705050202     251  81   85   85   
1705050206     240  65   95   80   
1705050203     238  95   65   78   
1705050201     238  78   65   95   
1705050205     212  56   67   89   
1705050204     198  66   65   67   
#include<stdio.h>
struct student
{
    int num;
    int score[3];
    int summ;
} stu[100],t;  //t用作结构交换变量

int main()
{
    int i, j, n;
    scanf ("%d",&n);
    for(i = 0; i < n; i++)
    {
        scanf("%d %d %d %d", &stu[i].num, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2]);
        stu[i].summ = stu[i].score[0] + stu[i].score[1] + stu[i].score[2];
    }  // 输入,并求总分summ
    for(i = 0; i < n - 1; i++)
        for(j = n -1; j > i; j--)
            if(stu[j].summ > stu[j-1].summ)
            {
                t = stu[j];
                stu[j] = stu[j-1];
                stu[j-1] = t;
            }                             //总分排序

    for(i = 0; i < n - 1; i++)
        for(j = n - 1; j > i; j--)
            if(stu[j].score[0] > stu[j-1].score[0] && stu[j].summ == stu[j-1].summ)
            {
                t = stu[j];
                stu[j] = stu[j-1];
                stu[j-1] = t;
            }                             //总分相同时比较数学成绩

    for(i = 0; i < n-1; i++)
        for(j = n-1; j > i; j--)
            if(stu[j].score[0] == stu[j-1].score[0] && stu[j].summ == stu[j-1].summ && stu[j].score[1] > stu[j-1].score[1])
            {
                t = stu[j];
                stu[j] = stu[j-1];
                stu[j-1] = t;
            }                        //总分和数学相同时,比较英语成绩

    for(i = 0; i < n-1; i++)
        for(j = n-1; j > i; j--)
            if(stu[j].score[0] == stu[j-1].score[0] && stu[j].score[1] == stu[j-1].score[1]
                    && stu[j].summ == stu[j-1].summ && stu[j].score[2] > stu[j-1].score[2])
            {
                t = stu[j];
                stu[j] = stu[j-1];
                stu[j-1] = t;
            }                          //总分、数学和英语相同时,比较程序设计成绩
    
    for(i = 0; i < n; i++)
    {
        printf("%-15d", stu[i].num);
        printf("%-5d", stu[i].summ);
        for(j=0; j<3; j++)
            printf("%-5d",stu[i].score[j]);
        printf("\n");
    }
    return 0;
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值