用C语言给出n个学生的考试成绩表,每条信息由姓名和分数组成,试设计一个算法: (1)按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一名次; (2)按名次列出每个学生的姓名与分数。
时间: 2024-02-03 14:13:22 浏览: 70
以下是一种用C语言实现的算法,可以实现按分数高低次序打印出每个学生的名次,并按名次列出每个学生的姓名与分数:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 学生结构体
typedef struct student {
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 = (Student *)malloc(sizeof(Student) * 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; // 初始名次为0
}
qsort(students, n, sizeof(Student), cmp); // 排序
int rank = 1; // 当前名次
int last_score = students[0].score; // 上一个分数
for (int i = 0; i < n; i++) {
if (students[i].score < last_score) { // 分数不同,更新名次
rank++;
last_score = students[i].score;
}
students[i].rank = rank; // 更新名次
}
// 按名次列出学生信息
printf("按名次列出每个学生的姓名与分数:\n");
for (int i = 0; i < n; i++) {
printf("%d %s %d\n", students[i].rank, students[i].name, students[i].score);
}
// 按分数高低次序打印出每个学生的名次
printf("按分数高低次序,打印出每个学生在考试中获得的名次:\n");
for (int i = 0; i < n; i++) {
printf("%s %d\n", students[i].name, students[i].rank);
}
free(students); // 释放内存
return 0;
}
```
示例输入:
```
请输入学生个数:5
请输入第1个学生的姓名和分数:张三 95
请输入第2个学生的姓名和分数:李四 85
请输入第3个学生的姓名和分数:王五 90
请输入第4个学生的姓名和分数:赵六 85
请输入第5个学生的姓名和分数:钱七 80
```
示例输出:
```
按名次列出每个学生的姓名与分数:
1 张三 95
2 王五 90
3 李四 85
3 赵六 85
5 钱七 80
按分数高低次序,打印出每个学生在考试中获得的名次:
张三 1
王五 2
李四 3
赵六 3
钱七 5
```
阅读全文