用c语言给出n个学生的考试成绩表,每条信息由姓名和分数组成,试设计一个算法: (1)按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一名次; (2)按名次列出每个学生的姓名与分数。
时间: 2024-02-03 21:13:31 浏览: 25
可以使用结构体来存储每个学生的信息,然后按照分数排序,得出每个学生的名次,再按照名次输出每个学生的姓名和分数。
以下是一个示例代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_N 100
struct student {
char name[20];
int score;
int rank;
};
int main() {
int n;
struct student students[MAX_N];
// 输入学生信息
printf("请输入学生人数:");
scanf("%d", &n);
for (int i = 0; i < n; i++) {
printf("请输入第%d个学生的姓名和分数:", i + 1);
scanf("%s %d", students[i].name, &students[i].score);
students[i].rank = 1; // 初始名次为1
}
// 按照分数排序
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (students[j].score < students[j+1].score) {
struct student temp = students[j];
students[j] = students[j+1];
students[j+1] = temp;
}
}
}
// 计算名次
for (int i = 0; i < n - 1; i++) {
if (students[i].score == students[i+1].score) {
students[i+1].rank = students[i].rank;
} else {
students[i+1].rank = i + 2;
}
}
// 按照名次输出
printf("\n按照分数高低次序,每个学生在考试中获得的名次为:\n");
for (int i = 0; i < n; i++) {
printf("%s: 第%d名\n", students[i].name, students[i].rank);
}
// 按照名次排序
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (students[j].rank > students[j+1].rank) {
struct student temp = students[j];
students[j] = students[j+1];
students[j+1] = temp;
}
}
}
// 按照名次输出
printf("\n按照名次列出每个学生的姓名与分数:\n");
for (int i = 0; i < n; i++) {
printf("第%d名:%s %d分\n", students[i].rank, students[i].name, students[i].score);
}
return 0;
}
```
输入输出示例:
```
请输入学生人数:5
请输入第1个学生的姓名和分数:Tom 80
请输入第2个学生的姓名和分数:Jerry 90
请输入第3个学生的姓名和分数:Bob 70
请输入第4个学生的姓名和分数:Alice 90
请输入第5个学生的姓名和分数:John 85
按照分数高低次序,每个学生在考试中获得的名次为:
Jerry: 第1名
Alice: 第2名
John: 第3名
Tom: 第4名
Bob: 第5名
按照名次列出每个学生的姓名与分数:
第1名:Jerry 90分
第2名:Alice 90分
第3名:John 85分
第4名:Tom 80分
第5名:Bob 70分
```