给出n个学生的考试成绩表,每条信息由姓名和分数组成,试设计一个C语言算法: (1)按分数高低次序,打印出每个学生在考试中获得的名次,分数相同的为同一-名次; (2)按名次列出每个学生的姓名与分数,并给出流程。
时间: 2024-02-13 12:06:22 浏览: 62
以下是C语言实现该算法的代码:
```c
#include <stdio.h>
#include <string.h>
#define MAX_STUDENT_NUM 100
struct Student {
char name[20];
int score;
int rank;
};
void sort(struct Student students[], int n) {
// 冒泡排序
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;
}
}
}
}
void printRanks(struct Student students[], int n) {
int rank = 1;
for (int i = 0; i < n; i++) {
if (i > 0 && students[i].score != students[i - 1].score) {
rank = i + 1;
}
students[i].rank = rank;
printf("%s\t%d\n", students[i].name, students[i].rank);
}
}
void printScores(struct Student students[], int n) {
for (int i = 0; i < n; i++) {
printf("%d\t%s\t%d\n", students[i].rank, students[i].name, students[i].score);
}
}
int main() {
struct Student students[MAX_STUDENT_NUM];
int n;
printf("请输入学生人数:");
scanf("%d", &n);
printf("请依次输入每个学生的姓名和成绩:\n");
for (int i = 0; i < n; i++) {
scanf("%s%d", students[i].name, &students[i].score);
}
sort(students, n);
printf("按分数高低次序列出每个学生的名次:\n");
printRanks(students, n);
printf("按名次列出每个学生的姓名与分数:\n");
printScores(students, n);
return 0;
}
```
代码思路:
1.定义一个结构体`Student`,包含学生姓名、分数和名次三个属性。
2.定义冒泡排序函数`sort`,按照分数从高到低的顺序对学生进行排序。
3.定义打印名次函数`printRanks`,遍历学生数组,如果当前学生的分数与上一个学生的分数不相等,则更新名次;然后打印学生的姓名和名次。
4.定义打印分数函数`printScores`,遍历学生数组,按照名次从小到大的顺序,打印学生的名次、姓名和分数。
5.在`main`函数中,读取学生人数和每个学生的姓名和分数,调用`sort`函数进行排序,然后分别调用`printRanks`和`printScores`函数进行打印输出。
该算法的时间复杂度为O(n^2),可以使用更高效的排序算法来优化。
阅读全文