使用C语言编译出有菜单的给出n个学生的考试成绩表,每条信息由姓名和分数组成,试设计一个算法: (1)按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一名次; (2)按名次列出每个学生的姓名与分数
时间: 2024-02-03 10:13:22 浏览: 73
以下是使用C语言编写的解决方案:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENTS 100
// 结构体,表示一个学生的信息
typedef struct {
char name[20]; // 姓名
int score; // 分数
int rank; // 名次
} Student;
// 按分数从高到低排序
int cmp_score_desc(const void* a, const void* b) {
return ((Student*)b)->score - ((Student*)a)->score;
}
// 按名次从小到大排序
int cmp_rank_asc(const void* a, const void* b) {
return ((Student*)a)->rank - ((Student*)b)->rank;
}
int main() {
// 输入学生数量
int n;
printf("请输入学生数量:");
scanf("%d", &n);
// 输入每个学生的姓名和分数
Student students[MAX_STUDENTS];
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), cmp_score_desc);
int cur_rank = 1, cur_score = students[0].score;
for (int i = 0; i < n; i++) {
if (students[i].score != cur_score) {
cur_rank = i + 1;
cur_score = students[i].score;
}
students[i].rank = cur_rank;
}
// 按名次从小到大排序,并输出结果
qsort(students, n, sizeof(Student), cmp_rank_asc);
printf("\n按分数排名:\n");
for (int i = 0; i < n; i++) {
printf("%s\t%d\n", students[i].name, students[i].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;
}
```
运行程序,输入学生数量和每个学生的姓名和分数,程序会按照要求输出每个学生的名次和姓名与分数。
阅读全文