给出n个学生的考试成绩表,每条信息由姓名与分数组成,试设计一个算法: (1)按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一名次。 (2)按名次列出每个学生的姓名与分数。 用c语言编写
时间: 2024-02-22 15:59:07 浏览: 144
以下是用C语言实现该算法的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生结构体类型
typedef struct {
char name[20]; // 学生姓名
int score; // 学生成绩
int rank; // 学生排名
} Student;
// 比较函数,用于快速排序
int compare(const void *a, const void *b) {
return (*(Student *)b).score - (*(Student *)a).score;
}
int main() {
int n;
printf("请输入学生人数:");
scanf("%d", &n);
// 动态分配存储空间
Student *students = (Student *)malloc(n * sizeof(Student));
// 输入学生信息
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
}
// 按分数排序
qsort(students, n, sizeof(Student), compare);
// 处理排名
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");
for (int i = 0; i < n; i++) {
printf("%d\t%s\t%d\n", students[i].rank, students[i].name, students[i].score);
}
// 释放动态分配的内存
free(students);
return 0;
}
```
其中,使用了结构体类型Student来存储每个学生的姓名、成绩和排名。首先使用qsort函数对学生数组按成绩从高到低排序,然后遍历数组,根据相邻学生的成绩是否相同来确定排名。最后按名次输出学生成绩信息。
阅读全文