给出n个学生的考试成绩表,每条信息由姓名和分数组成,试用C语言设计一个算法: (1)按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一名次; (2)按名次列出每个学生的姓名与分数。
时间: 2024-02-03 21:13:22 浏览: 26
以下是一种实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char name[20];
int score;
int rank;
} Student;
int cmp(const void *a, const void *b) {
return ((Student *)b)->score - ((Student *)a)->score;
}
int main() {
int n;
printf("请输入学生数量:");
scanf("%d", &n);
Student students[n];
for (int i = 0; i < n; i++) {
printf("请输入第%d个学生的姓名和分数:", i + 1);
scanf("%s%d", students[i].name, &students[i].score);
students[i].rank = 0;
}
// 按分数排序
qsort(students, n, sizeof(Student), cmp);
// 计算排名
int cur_rank = 1;
students[0].rank = cur_rank;
for (int i = 1; i < n; i++) {
if (students[i].score == students[i - 1].score) {
students[i].rank = cur_rank;
} else {
students[i].rank = ++cur_rank;
}
}
// 按排名输出
printf("\n按分数高低次序,打印出每个学生在考试中获得的名次:\n");
for (int i = 0; i < n; i++) {
printf("%s的名次是%d\n", students[i].name, students[i].rank);
}
// 按名次输出
printf("\n按名次列出每个学生的姓名与分数:\n");
for (int i = 1; i <= cur_rank; i++) {
printf("第%d名:\n", i);
for (int j = 0; j < n; j++) {
if (students[j].rank == i) {
printf("%s\t%d\n", students[j].name, students[j].score);
}
}
}
return 0;
}
```
运行效果如下:
```
请输入学生数量:5
请输入第1个学生的姓名和分数:Tom 80
请输入第2个学生的姓名和分数:Bob 90
请输入第3个学生的姓名和分数:Alice 70
请输入第4个学生的姓名和分数:Jack 80
请输入第5个学生的姓名和分数:Lucy 90
按分数高低次序,打印出每个学生在考试中获得的名次:
Bob的名次是1
Lucy的名次是1
Tom的名次是3
Jack的名次是3
Alice的名次是5
按名次列出每个学生的姓名与分数:
第1名:
Bob 90
Lucy 90
第2名:
Tom 80
Jack 80
第3名:
Alice 70
```