c语言2.给出n个学生的考试成绩表,每条信息由姓名和分数组成,试设计一个算法: (1)按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一名次; (2)按名次列出每个学生的姓名与分数。
时间: 2024-02-24 13:59:28 浏览: 116
C语言课程设计学生成绩管理程序.pdf
这个问题可以用结构体和排序算法来解决。首先定义一个存储学生姓名和分数的结构体,然后输入n个学生的考试成绩。接下来,使用快速排序算法对学生成绩进行排序,排名相同的学生分数相同,排名不同的学生的名次就是当前的循环变量i。最后,按照排名输出每个学生的名次、姓名和分数,也可以按照姓名的字典序或分数的大小进行排序输出。
以下是C语言的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_N 100
// 学生结构体
struct student {
char name[20]; // 学生姓名
int score; // 学生成绩
int rank; // 学生名次
};
// 快速排序算法
int cmp(const void* a, const void* b) {
struct student* s1 = (struct student*)a;
struct student* s2 = (struct student*)b;
if (s1->score != s2->score) {
return s2->score - s1->score;
} else {
return strcmp(s1->name, s2->name);
}
}
int main() {
int n;
struct student s[MAX_N];
// 输入学生成绩
printf("请输入学生人数n:");
scanf("%d", &n);
for (int i = 0; i < n; i++) {
printf("请输入第%d个学生的姓名和分数:", i + 1);
scanf("%s%d", s[i].name, &s[i].score);
}
// 排序并设置名次
qsort(s, n, sizeof(struct student), cmp);
for (int i = 0; i < n; i++) {
if (i > 0 && s[i].score == s[i - 1].score) {
s[i].rank = s[i - 1].rank;
} else {
s[i].rank = i + 1;
}
}
// 按照名次输出学生信息
printf("\n按照名次输出学生信息:\n");
for (int i = 0; i < n; i++) {
printf("第%d名 %s %d分\n", s[i].rank, s[i].name, s[i].score);
}
// 按照姓名或分数输出学生信息
char choice;
printf("\n请选择按照姓名(a)或分数(b)排序输出:");
scanf(" %c", &choice);
if (choice == 'a') {
qsort(s, n, sizeof(struct student), (int (*)(const void*, const void*))strcmp);
printf("\n按照姓名排序输出学生信息:\n");
} else if (choice == 'b') {
qsort(s, n, sizeof(struct student), cmp);
printf("\n按照分数排序输出学生信息:\n");
} else {
printf("\n输入有误!\n");
return 0;
}
for (int i = 0; i < n; i++) {
printf("%s %d分\n", s[i].name, s[i].score);
}
return 0;
}
```
阅读全文