c语言编程:给出n个学生的考试成绩表,每条信息由姓名和分数组成,试设计一个算法: (1)按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一名次; (2)按名次列出每个学生的姓名与分数
时间: 2024-02-03 20:13:28 浏览: 95
下面是一种基于冒泡排序的算法来解决这个问题:
```c
#include <stdio.h>
#include <string.h>
struct student {
char name[20];
int score;
int rank;
};
void sort(struct student *students, int n) {
int i, j;
struct student temp;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - i - 1; j++) {
if (students[j].score < students[j + 1].score) {
temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
}
void print_ranks(struct student *students, int n) {
int i, rank = 1;
students[0].rank = rank;
printf("%s %d\n", students[0].name, students[0].rank);
for (i = 1; i < n; i++) {
if (students[i].score == students[i - 1].score) {
students[i].rank = rank;
} else {
rank = i + 1;
students[i].rank = rank;
}
printf("%s %d\n", students[i].name, students[i].rank);
}
}
void print_names(struct student *students, int n) {
int i;
for (i = 0; i < n; i++) {
printf("%d %s %d\n", students[i].rank, students[i].name, students[i].score);
}
}
int main() {
int n, i;
struct student students[100];
printf("请输入学生人数:");
scanf("%d", &n);
printf("请输入学生成绩表(格式为:姓名 分数):\n");
for (i = 0; i < n; i++) {
scanf("%s %d", students[i].name, &students[i].score);
}
sort(students, n);
printf("按分数高低次序,打印出每个学生在考试中获得的名次:\n");
print_ranks(students, n);
printf("按名次列出每个学生的姓名与分数:\n");
print_names(students, n);
return 0;
}
```
首先,我们定义了一个 `struct student` 结构体来存储每个学生的姓名、分数和名次。然后,我们使用冒泡排序算法对学生数组进行排序,排序的依据是分数高低。排序完成后,我们遍历数组,计算每个学生的名次,并打印出来。最后,我们再次遍历数组,按名次列出每个学生的姓名和分数。
这段代码可以满足我们的需求,但是它有一个缺陷,就是无法处理分数相同的情况。如果有两个或多个学生分数相同,它们应该获得同样的名次。我们可以通过稍微修改一下代码来解决这个问题,具体实现见 `print_ranks` 函数的代码。
阅读全文
相关推荐
















