用C语言给出n个学生的考试成绩表,每条信息由姓名和成绩组成,请设计一个算法,实现以下功能: 1)按分数从高到低次序,打印出每个学生的姓名与分数; 2)打印出每个学生在考试中获得的名次,分数相同的为同一名次; 1)利用冒泡排序算法对学生成绩进行排序; 2) 分别利用快速排序、直接插入排序对学生成绩进行排序;
时间: 2024-03-17 18:43:38 浏览: 8
好的,我会根据你的问题进行回答。
1. 按分数从高到低次序,打印出每个学生的姓名与分数
```c
#include <stdio.h>
#include <string.h>
struct student {
char name[20];
int score;
};
void bubble_sort(struct student *students, int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (students[j].score < students[j+1].score) {
struct student temp = students[j];
students[j] = students[j+1];
students[j+1] = temp;
}
}
}
}
int main() {
int n;
printf("请输入学生人数:");
scanf("%d", &n);
struct student students[n];
for (int 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 (int i = 0; i < n; i++) {
printf("%s %d\n", students[i].name, students[i].score);
}
return 0;
}
```
2. 打印出每个学生在考试中获得的名次,分数相同的为同一名次
```c
#include <stdio.h>
#include <string.h>
struct student {
char name[20];
int score;
int rank;
};
void bubble_sort(struct student *students, int n) {
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (students[j].score < students[j+1].score) {
struct student temp = students[j];
students[j] = students[j+1];
students[j+1] = temp;
}
}
}
students[0].rank = 1;
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;
}
}
}
int main() {
int n;
printf("请输入学生人数:");
scanf("%d", &n);
struct student students[n];
for (int 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 (int i = 0; i < n; i++) {
printf("%s %d %d\n", students[i].name, students[i].score, students[i].rank);
}
return 0;
}
```
3. 利用快速排序对学生成绩进行排序
```c
#include <stdio.h>
#include <string.h>
struct student {
char name[20];
int score;
};
int partition(struct student *students, int left, int right) {
int pivot = students[right].score;
int i = left - 1;
for (int j = left; j < right; j++) {
if (students[j].score > pivot) {
i++;
struct student temp = students[i];
students[i] = students[j];
students[j] = temp;
}
}
struct student temp = students[i+1];
students[i+1] = students[right];
students[right] = temp;
return i + 1;
}
void quick_sort(struct student *students, int left, int right) {
if (left < right) {
int pivot = partition(students, left, right);
quick_sort(students, left, pivot - 1);
quick_sort(students, pivot + 1, right);
}
}
int main() {
int n;
printf("请输入学生人数:");
scanf("%d", &n);
struct student students[n];
for (int i = 0; i < n; i++) {
printf("请输入第%d个学生的姓名和分数:", i+1);
scanf("%s%d", students[i].name, &students[i].score);
}
quick_sort(students, 0, n-1);
printf("排序结果如下:\n");
for (int i = 0; i < n; i++) {
printf("%s %d\n", students[i].name, students[i].score);
}
return 0;
}
```
4. 利用直接插入排序对学生成绩进行排序
```c
#include <stdio.h>
#include <string.h>
struct student {
char name[20];
int score;
};
void insertion_sort(struct student *students, int n) {
for (int i = 1; i < n; i++) {
struct student temp = students[i];
int j = i - 1;
while (j >= 0 && students[j].score < temp.score) {
students[j+1] = students[j];
j--;
}
students[j+1] = temp;
}
}
int main() {
int n;
printf("请输入学生人数:");
scanf("%d", &n);
struct student students[n];
for (int i = 0; i < n; i++) {
printf("请输入第%d个学生的姓名和分数:", i+1);
scanf("%s%d", students[i].name, &students[i].score);
}
insertion_sort(students, n);
printf("排序结果如下:\n");
for (int i = 0; i < n; i++) {
printf("%s %d\n", students[i].name, students[i].score);
}
return 0;
}
```
希望我的回答能够帮助到你,如果还有什么问题,可以继续问我哦!