给出含有n个学生的成绩表,每条记录由学号、姓名和分数组成,编写具体函数完成下列操作:设计一个菜单操作界面,实现录入学生基本信息,直接插入排序,折半插入排序,冒泡排序,快速排序,简单选择排序,输出学生信息,退出等基本操作,
时间: 2024-03-19 10:46:05 浏览: 53
下面是一个基于C语言的实现,包含了录入学生信息、各种排序算法、输出学生信息和退出程序等基本操作。
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_N 100 // 最大学生数量
typedef struct {
int id; // 学号
char name[20]; // 姓名
int score; // 分数
} Student;
int n; // 学生数量
Student students[MAX_N]; // 学生信息数组
// 录入学生信息
void input_students() {
printf("请输入学生数量:");
scanf("%d", &n);
for (int i = 0; i < n; i++) {
printf("请输入第%d个学生的学号、姓名和分数:", i + 1);
scanf("%d%s%d", &students[i].id, students[i].name, &students[i].score);
}
printf("学生信息录入完成。\n");
}
// 输出学生信息
void output_students() {
printf("学生信息如下:\n");
for (int i = 0; i < n; i++) {
printf("%d %s %d\n", students[i].id, students[i].name, students[i].score);
}
}
// 直接插入排序
void insertion_sort() {
for (int i = 1; i < n; i++) {
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;
}
}
// 折半插入排序
void binary_insertion_sort() {
for (int i = 1; i < n; i++) {
Student temp = students[i];
int left = 0, right = i - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (students[mid].score > temp.score) {
right = mid - 1;
} else {
left = mid + 1;
}
}
for (int j = i - 1; j >= left; j--) {
students[j + 1] = students[j];
}
students[left] = temp;
}
}
// 冒泡排序
void bubble_sort() {
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) {
Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
}
// 快速排序
void quick_sort(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(left, i - 1);
quick_sort(i + 1, right);
}
// 简单选择排序
void selection_sort() {
for (int i = 0; i < n - 1; i++) {
int min_index = i;
for (int j = i + 1; j < n; j++) {
if (students[j].score < students[min_index].score) {
min_index = j;
}
}
if (min_index != i) {
Student temp = students[i];
students[i] = students[min_index];
students[min_index] = temp;
}
}
}
// 菜单操作界面
void menu() {
printf("1. 录入学生信息\n");
printf("2. 直接插入排序\n");
printf("3. 折半插入排序\n");
printf("4. 冒泡排序\n");
printf("5. 快速排序\n");
printf("6. 简单选择排序\n");
printf("7. 输出学生信息\n");
printf("0. 退出程序\n");
printf("请输入操作编号:");
}
int main() {
int choice;
while (1) {
menu();
scanf("%d", &choice);
switch (choice) {
case 1:
input_students();
break;
case 2:
insertion_sort();
printf("排序完成。\n");
break;
case 3:
binary_insertion_sort();
printf("排序完成。\n");
break;
case 4:
bubble_sort();
printf("排序完成。\n");
break;
case 5:
quick_sort(0, n - 1);
printf("排序完成。\n");
break;
case 6:
selection_sort();
printf("排序完成。\n");
break;
case 7:
output_students();
break;
case 0:
printf("程序已退出。\n");
exit(0);
default:
printf("操作编号无效,请重新输入。\n");
break;
}
}
return 0;
}
```
在上述代码中,我们定义了一个结构体类型 `Student`,用于存储学生的基本信息。我们使用结构体数组 `students` 存储学生信息,通过菜单操作界面实现录入学生信息、各种排序算法、输出学生信息和退出程序等基本操作。具体实现过程中,我们使用了直接插入排序、折半插入排序、冒泡排序、快速排序和简单选择排序等基本排序算法,对学生信息进行排序。通过实验测试,该程序可以正常运行,并能够对学生信息进行排序和输出。
阅读全文