7-72 学生成绩排序 (20分)
给出一组学生名单(姓名和成绩),请输出按成绩从大到小排序后的结果(名次和姓名)。成绩相同的人拥有相同的名次,且按姓名的字典序从小到大排列。题目保证学生姓名没有重复。
输入格式:
第一行给出不大于10000的整数N。 接下来N行,每行给出学生姓名和成绩,以空格分隔。学生姓名不超过20个字符。
输出格式:
共输出N行,每行包含对应的学生排名和姓名,以空格分隔。
输入样例:
7
KongDezhen 94
FuTaotao 93
HuYu 94
XuJiecen 94
WuSuqi 96
ChenDa 93
HuNianbo 95
输出样例:
1 WuSuqi
2 HuNianbo
3 HuYu
3 KongDezhen
3 XuJiecen
6 ChenDa
6 FuTaotao
#include<stdio.h>
#include<string.h>
struct student{
char name[25];
int num;
};
int cmp(struct student a,struct student b)//比较函数
{
if(a.num==b.num)
return strcmp(a.name,b.name)>0;
else
return b.num>a.num;
}
int main()
{
int n,i,j;
scanf("%d",&n);
struct student a[11111],b;
for(i=0;i<n;i++)
{
scanf("%s",a[i].name);
scanf("%d",&a[i].num);
}
for(i=0;i<n;i++)//冒泡排序进阶
for(j=i+1;j<n;j++)
{
if(cmp(a[i],a[j]))
{
b = a[i];
a[i] = a[j];
a[j] = b;
}
}
int t=1;
for(i=1;i<=n;i++)
{
printf("%d %s\n",t,a[i-1].name);
if(a[i].num!=a[i-1].num)
{
t=i+1;
}
}
}
这题的第一个难点主要是需要在给成绩排序的同时还要给名字的首字母排序。所以建立一个比较函数较为便捷,然后符合cmp函数的条件就进行排序,其实就是冒泡排序的进阶
第二个难点是排名的问题,若成绩相同排名相同,其实排名还是按照名次的,仔细揣摩一下我最后是如何排的,挺基础的一个解决方式。