用C语言给出n个学生的考试成绩表,每条信息由姓名和成绩组成,请设计一个算法,实现以下功能: 1)按分数从高到低次序,打印出每个学生的姓名与分数;打印出每个学生在考试中获得的名次,分数相同的为同一名次;利用冒泡排序算法、快速排序、直接插入排序对学生成绩进行排序;
时间: 2024-03-17 18:43:43 浏览: 43
好的,我知道你的问题了。以下是针对你的问题的回答:
可以使用结构体来存储每个学生的姓名和成绩。具体实现如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENT_NUM 100
typedef struct {
char name[20];
int score;
} Student;
int main() {
Student students[MAX_STUDENT_NUM];
int n, i, j;
printf("请输入学生人数:");
scanf("%d", &n);
for (i = 0; i < n; i++) {
printf("请输入第%d个学生的姓名和成绩:", i + 1);
scanf("%s %d", students[i].name, &students[i].score);
}
// 使用冒泡排序算法对学生成绩进行排序
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - i - 1; j++) {
if (students[j].score < students[j + 1].score) {
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
// 打印每个学生的姓名和分数
printf("按分数从高到低的次序,每个学生的姓名和分数如下:\n");
for (i = 0; i < n; i++) {
printf("%s %d\n", students[i].name, students[i].score);
}
// 打印每个学生在考试中获得的名次
printf("每个学生在考试中获得的名次如下:\n");
for (i = 0; i < n; i++) {
int rank = 1;
for (j = 0; j < n; j++) {
if (students[j].score > students[i].score) {
rank++;
}
}
printf("%s %d\n", students[i].name, rank);
}
return 0;
}
```
上述代码中,我们使用了冒泡排序算法对学生成绩进行排序,并打印出每个学生的姓名和分数,以及每个学生在考试中获得的名次。这里的名次指的是排名,如果有多个学生分数相同,则他们的名次相同,都是他们排名的最终名次。
除了冒泡排序算法,我们还可以使用快速排序和直接插入排序对学生成绩进行排序。具体实现如下:
使用快速排序算法对学生成绩进行排序:
```c
void quick_sort(Student students[], int left, int right) {
if (left >= right) {
return;
}
int i = left, j = right;
Student pivot = students[left];
while (i < j) {
while (i < j && students[j].score <= pivot.score) {
j--;
}
students[i] = students[j];
while (i < j && students[i].score >= pivot.score) {
i++;
}
students[j] = students[i];
}
students[i] = pivot;
quick_sort(students, left, i - 1);
quick_sort(students, i + 1, right);
}
```
使用直接插入排序算法对学生成绩进行排序:
```c
void insert_sort(Student students[], int n) {
int i, j;
Student temp;
for (i = 1; i < n; i++) {
temp = students[i];
for (j = i - 1; j >= 0 && students[j].score < temp.score; j--) {
students[j + 1] = students[j];
}
students[j + 1] = temp;
}
}
```
在主函数中,我们只需要分别调用这三个排序算法即可:
```c
int main() {
Student students[MAX_STUDENT_NUM];
int n, i, j;
printf("请输入学生人数:");
scanf("%d", &n);
for (i = 0; i < n; i++) {
printf("请输入第%d个学生的姓名和成绩:", i + 1);
scanf("%s %d", students[i].name, &students[i].score);
}
// 使用冒泡排序算法对学生成绩进行排序
bubble_sort(students, n);
// 打印每个学生的姓名和分数
printf("按分数从高到低的次序,每个学生的姓名和分数如下:\n");
for (i = 0; i < n; i++) {
printf("%s %d\n", students[i].name, students[i].score);
}
// 打印每个学生在考试中获得的名次
printf("每个学生在考试中获得的名次如下:\n");
for (i = 0; i < n; i++) {
int rank = 1;
for (j = 0; j < n; j++) {
if (students[j].score > students[i].score) {
rank++;
}
}
printf("%s %d\n", students[i].name, rank);
}
// 使用快速排序算法对学生成绩进行排序
quick_sort(students, 0, n - 1);
// 打印每个学生的姓名和分数
printf("按分数从高到低的次序,每个学生的姓名和分数如下:\n");
for (i = 0; i < n; i++) {
printf("%s %d\n", students[i].name, students[i].score);
}
// 打印每个学生在考试中获得的名次
printf("每个学生在考试中获得的名次如下:\n");
for (i = 0; i < n; i++) {
int rank = 1;
for (j = 0; j < n; j++) {
if (students[j].score > students[i].score) {
rank++;
}
}
printf("%s %d\n", students[i].name, rank);
}
// 使用直接插入排序算法对学生成绩进行排序
insert_sort(students, n);
// 打印每个学生的姓名和分数
printf("按分数从高到低的次序,每个学生的姓名和分数如下:\n");
for (i = 0; i < n; i++) {
printf("%s %d\n", students[i].name, students[i].score);
}
// 打印每个学生在考试中获得的名次
printf("每个学生在考试中获得的名次如下:\n");
for (i = 0; i < n; i++) {
int rank = 1;
for (j = 0; j < n; j++) {
if (students[j].score > students[i].score) {
rank++;
}
}
printf("%s %d\n", students[i].name, rank);
}
return 0;
}
```
这样,我们就实现了按分数从高到低次序打印出每个学生的姓名与分数,以及打印出每个学生在考试中获得的名次,分数相同的为同一名次的功能,并且使用冒泡排序算法、快速排序、直接插入排序对学生成绩进行了排序。