给出n个学生的考试成绩表,每条信息由姓名和分数组成,试设计一个C语言算法: (1)按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一-名次; (2)按名次列出每个学生的姓名与分数。
时间: 2024-02-12 09:06:15 浏览: 140
以下是C语言实现代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_NUM 100
struct student {
char name[20];
int score;
int rank;
};
// 比较函数,用于qsort排序
int cmp(const void *a, const void *b) {
struct student *s1 = (struct student *)a;
struct student *s2 = (struct student *)b;
return s2->score - s1->score;
}
int main() {
int n;
struct student students[MAX_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);
students[i].rank = 1;
}
// 对学生按分数排序
qsort(students, n, sizeof(struct student), cmp);
// 计算每个学生的名次
for (int i = 1; i < n; i++) {
if (students[i].score == students[i-1].score) {
students[i].rank = students[i-1].rank;
} else {
students[i].rank = i + 1;
}
}
// 按名次输出学生姓名和分数
printf("\n按名次列出每个学生的姓名和分数:\n");
for (int i = 0; i < n; i++) {
printf("%d %s %d\n", students[i].rank, students[i].name, students[i].score);
}
// 按分数输出学生名次
printf("\n按分数高低次序,打印出每个学生在考试中获得的名次:\n");
for (int i = 1; i <= n; i++) {
printf("%d ", i);
for (int j = 0; j < n; j++) {
if (students[j].rank == i) {
printf("%s ", students[j].name);
}
}
printf("\n");
}
return 0;
}
```
使用示例:
```
请输入学生人数:5
请输入第1个学生的姓名和分数:Tom 85
请输入第2个学生的姓名和分数:Jerry 90
请输入第3个学生的姓名和分数:Mike 77
请输入第4个学生的姓名和分数:Lucy 90
请输入第5个学生的姓名和分数:John 80
按名次列出每个学生的姓名和分数:
1 Jerry 90
1 Lucy 90
3 Tom 85
4 John 80
5 Mike 77
按分数高低次序,打印出每个学生在考试中获得的名次:
1 Jerry Lucy
2 Tom
3 John
4 Mike
```
其中,第一个输出表示按名次列出每个学生的姓名和分数,第二个输出表示按分数高低次序,打印出每个学生在考试中获得的名次。
阅读全文