题目描述
学生成绩表有学号、数学成绩、英语成绩与程序设计成绩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;
}