7-6 学生信息的那些操作:(7)单科成绩排序
分数 10
有一学生成绩表,包括学号、姓名、3门课程成绩。请按要求排序输出:若输入1,则按第1门课成绩降序输出成绩表,若输入为i(1<=i<=3),则按第i门课成绩降序输出成绩表。
输入格式:
首先输入一个整数n(1<=n<=100),表示学生人数;
然后输入n行,每行包含一个学生的信息:学号(12位)、姓名(不含空格且不超过20位),以及3个整数,表示3门课成绩,数据之间用空格隔开。
最后一行输入一个整数i,表示要求按第i门课成绩降序排序输出,若该门课成绩相同,则按学号升序。
输出格式:
输出按第i门课降序排序的结果,格式见样例。
输入样例:
在这里给出一组输入。例如:
3
202016040201 Zhangling 89 78 95
202016040202 Wangli 85 87 99
202016040203 Fangfang 85 68 76
1
输出样例:
在这里给出相应的输出。例如:
202016040201 Zhangling 89 78 95
202016040202 Wangli 85 87 99
202016040203 Fangfang 85 68 76
代码长度限制
16 KB
时间限制
1000 ms
内存限制
64 MB
栈限制
8192 KB
C (gcc)
答案:
#include<stdio.h>
#include<string.h>
struct student
{
char xue[13],name[21];
int a,b,c;
};
int main()
{
int n,i,j,d,e;
scanf("%d",&n);
struct student s[n],t;
for(i=0; i<n; i++)
{
scanf("%s%s%d%d%d",s[i].xue,s[i].name,&s[i].a,&s[i].b,&s[i].c);
}
scanf("%d",&d);
if(d==1)
{
for(i=0; i<n-1; i++)
{
for(j=i+1; j<n; j++)
{
e=strcmp(s[i].xue,s[j].xue);//有这一个就够了
if(s[i].a<s[j].a)
{
t=s[i];
s[i]=s[j];
s[j]=t;
}
if(s[i].a==s[j].a)//如果相同就ASCLL值来算
{
if(e>0)
{
t=s[i];
s[i]=s[j];
s[j]=t;
}
}
}
}
}
else if(d==2)
{
for(i=0; i<n-1; i++)
{
for(j=i+1; j<n; j++)
{
if(s[i].b<s[j].b)
{
t=s[i];
s[i]=s[j];
s[j]=t;
}
if(s[i].b==s[j].b)
{
if(e>0)
{
t=s[i];
s[i]=s[j];
s[j]=t;
}
}
}
}
}
else
{
for(i=0; i<n-1; i++)
{
for(j=i+1; j<n; j++)
{
if(s[i].c<s[j].c)
{
t=s[i];
s[i]=s[j];
s[j]=t;
}
if(s[i].c==s[j].c)
{
if(e>0)
{
t=s[i];
s[i]=s[j];
s[j]=t;
}
}
}
}
}
for(i=0; i<n; i++)
{
printf("%s %s %d %d %d \n",s[i].xue,s[i].name,s[i].a,s[i].b,s[i].c);//注意要求最后有空格
}
}
查看上次提交
提交本题作答