C语言:7-1 学生成绩排序 分数 20 作者 孔德桢 单位 浙大城市学院 给出一组学生名单(姓名和成绩),请输出按成绩从大到小排序后的结果(名次和姓名)。成绩相同的人拥有相同的名次,且按姓名的字典序从小到大排列。题目保证学生姓名没有重复。 输入格式: 第一行给出不大于10000的整数N。 接下来N行,每行给出学生姓名和成绩,以空格分隔。学生姓名不超过20个字符。 输出格式: 共输出N行,每行包含对应的学生排名和姓名,以空格分隔。
时间: 2024-03-11 13:44:09 浏览: 163
这道题目可以使用结构体和快速排序进行解答,代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_N 10000
#define MAX_NAME_LEN 21
typedef struct {
char name[MAX_NAME_LEN];
int score;
} Student;
int cmp(const void *a, const void *b) {
Student *s1 = (Student *)a;
Student *s2 = (Student *)b;
if (s1->score != s2->score) {
return s2->score - s1->score; // 按成绩从大到小排序
} else {
return strcmp(s1->name, s2->name); // 成绩相同按姓名字典序从小到大排序
}
}
int main() {
int n;
Student students[MAX_N];
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%s %d", students[i].name, &students[i].score);
}
qsort(students, n, sizeof(Student), cmp); // 快速排序
for (int i = 0; i < n; i++) {
printf("%d %s\n", i+1, students[i].name);
}
return 0;
}
```
这里使用结构体来存储学生的姓名和成绩,然后使用快速排序进行排序,其中cmp函数指定了排序的依据,使用了三目运算符来指定按成绩从大到小排序,成绩相同按姓名字典序从小到大排序。最后输出排名和姓名即可。
阅读全文