给出n个学生的考试成绩表,每条信息由姓名和分数组成,试用C语言设计一个算法: (1)按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一名次; (2)按名次列出每个学生的姓名与分数
时间: 2024-02-03 21:13:29 浏览: 78
可以使用结构体来存储每个学生的姓名和分数信息,然后根据分数对学生进行排序,从而实现上述要求。
以下是示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_LEN 20
#define MAX_STUDENT_NUM 100
// 学生信息结构体
typedef struct {
char name[MAX_NAME_LEN]; // 姓名
int score; // 分数
int rank; // 名次
} Student;
// 比较函数:按分数降序排列
int compare_score(const void *a, const void *b) {
const Student *s1 = (const Student*)a;
const Student *s2 = (const Student*)b;
return s2->score - s1->score;
}
int main() {
int n; // 学生个数
Student students[MAX_STUDENT_NUM]; // 学生数组
printf("请输入学生个数:");
scanf("%d", &n);
// 输入每个学生的姓名和分数
for (int i = 0; i < n; i++) {
printf("请输入第%d个学生的姓名和分数(中间用空格隔开):", i + 1);
scanf("%s%d", students[i].name, &students[i].score);
}
// 对学生按分数排序
qsort(students, n, sizeof(Student), compare_score);
// 设置名次
int last_score = -1;
int last_rank = 0;
for (int i = 0; i < n; i++) {
if (students[i].score != last_score) {
last_score = students[i].score;
last_rank = i + 1;
}
students[i].rank = last_rank;
}
// 按名次输出每个学生的姓名和分数
printf("\n按名次列出每个学生的姓名和分数:\n");
for (int i = 0; i < n; i++) {
printf("%d\t%s\t%d\n", students[i].rank, students[i].name, students[i].score);
}
return 0;
}
```
示例运行结果:
```
请输入学生个数:5
请输入第1个学生的姓名和分数(中间用空格隔开):Tom 80
请输入第2个学生的姓名和分数(中间用空格隔开):Jerry 90
请输入第3个学生的姓名和分数(中间用空格隔开):Mike 70
请输入第4个学生的姓名和分数(中间用空格隔开):Lucy 80
请输入第5个学生的姓名和分数(中间用空格隔开):Bob 85
按名次列出每个学生的姓名和分数:
1 Jerry 90
2 Bob 85
3 Tom 80
3 Lucy 80
5 Mike 70
```
阅读全文