问题 B: 成绩排序

时间限制: 1 Sec 内存限制: 128 MB
提交: 460 解决: 139
[状态] [提交] [命题人:外部导入]
题目描述
科大学生成绩表有学号、数学成绩、英语成绩与程序设计成绩4项。按学号次序给定一个班的成绩,要求根据个人总分高低排序输出同学们的成绩。
输入
第一行是整数N,表示班级学生人数(N<=40)。
随后有N行,每一行依次有空格分开的学号、数学成绩、英语成绩与程序设计成绩等4项。学号统一都是10位数字,前四位是1705,而且不会有相同学号。成绩是来自区间[0,100]的整数。
输出
根据总分由高到低进行排序。如果总分相同,则数学成绩高者居前,如果数学成绩也相同,则英语成绩高者居前,若英语成绩相同,则学号按字典序(即strcmp的比较规则)小者居前。
每一个学生输出学号,三门成绩总分,数学成绩,英语成绩,程序设计成绩五项信息。其中学号宽度占15位,其它各数据项宽度占5位,输出格式类如”%-5d”,见样例。
样例输入 Copy
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
样例输出 Copy
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>
#include<string.h>
struct student
{
char num[10];
int math;
int eng;
int cheng;
int total;
};
int main(void)
{
struct student stu[40],tem;
int n,i,index=0,j;
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%s%d%d%d",stu[i].num,&stu[i].math,&stu[i].eng,&stu[i].cheng) ;
stu[i].total=stu[i].math+stu[i].eng+stu[i].cheng;
}

for(i=0; i<n-1; i++)
{
    index=i;
    for(j=i+1; j<n; j++)
    {
        if(stu[j].total>stu[index].total)
            index=j;
        else if(stu[j].total==stu[index].total)
        {
            if(stu[j].math>stu[index].math)
                index=j;
            else if(stu[j].math==stu[index].math)
            {
                if(stu[j].eng>stu[index].eng)
                    index=j;
                else if(stu[j].eng==stu[index].eng)
                {
                    if(strcmp( stu[j].num,stu[index].num)<0)
                            index=j;
                }
            }

        }
    }
    tem=stu[index];
        stu[index]=stu[i];
        stu[i]=tem;

}

for(i=0;i<n;i++)
{
printf("%-15s%-5d%-5d%-5d%-5d\n",stu[i].num,stu[i].total,stu[i].math,stu[i].eng,stu[i].cheng);
}
return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值