问题 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
#include
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 {
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; istu[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 {
printf("%-15s%-5d%-5d%-5d%-5d\n",stu[i].num,stu[i].total,stu[i].math,stu[i].eng,stu[i].cheng);
}
return 0;
}

你可能感兴趣的:(问题 B: 成绩排序)