实验环境中,给出含有n个学生的成绩表,每条记录由学号,姓名和分数组成,编写具体函数完成下列操作设计一个菜单操作界面,实习录入学生基本信息,直接插入排序,折半插入排序,冒泡排序,快速排序,简单选择排序,输入学生信息,退出等基本操作的C语言完整代码
时间: 2024-02-05 13:03:18 浏览: 123
好的,以下是一个实现上述功能的C语言代码,其中包含一个菜单界面,可以让用户选择需要进行的操作:
```c
#include <stdio.h>
#include <string.h>
#define MAX_STUDENT_NUM 100
struct Student {
int id;
char name[20];
int score;
};
// 录入学生信息
void inputStudentInfo(struct Student *students, int n) {
for (int i = 0; i < n; i++) {
printf("请输入第%d个学生的信息:\n", i + 1);
printf("学号:");
scanf("%d", &(students[i].id));
printf("姓名:");
scanf("%s", students[i].name);
printf("分数:");
scanf("%d", &(students[i].score));
}
}
// 直接插入排序
void straightInsertSort(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].id > temp.id) {
students[j + 1] = students[j];
j--;
}
students[j + 1] = temp;
}
}
// 折半插入排序
void binaryInsertSort(struct Student *students, int n) {
for (int i = 1; i < n; i++) {
struct Student temp = students[i];
int left = 0, right = i - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (students[mid].id > temp.id) {
right = mid - 1;
} else {
left = mid + 1;
}
}
for (int j = i - 1; j >= left; j--) {
students[j + 1] = students[j];
}
students[left] = temp;
}
}
// 冒泡排序
void bubbleSort(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].id > students[j + 1].id) {
struct Student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
}
// 快速排序
void quickSort(struct Student *students, int left, int right) {
if (left >= right) {
return;
}
struct Student pivot = students[left];
int i = left, j = right;
while (i < j) {
while (i < j && students[j].id >= pivot.id) {
j--;
}
students[i] = students[j];
while (i < j && students[i].id <= pivot.id) {
i++;
}
students[j] = students[i];
}
students[i] = pivot;
quickSort(students, left, i - 1);
quickSort(students, i + 1, right);
}
// 简单选择排序
void simpleSelectionSort(struct Student *students, int n) {
for (int i = 0; i < n - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < n; j++) {
if (students[j].id < students[minIndex].id) {
minIndex = j;
}
}
if (minIndex != i) {
struct Student temp = students[i];
students[i] = students[minIndex];
students[minIndex] = temp;
}
}
}
// 输出学生信息
void printStudents(struct Student *students, int n) {
printf("学号\t姓名\t分数\n");
for (int i = 0; i < n; i++) {
printf("%d\t%s\t%d\n", students[i].id, students[i].name, students[i].score);
}
}
int main() {
struct Student students[MAX_STUDENT_NUM];
int n = 0;
int choice = 0;
while (1) {
printf("-----------------菜单-----------------\n");
printf("1. 录入学生信息\n");
printf("2. 直接插入排序\n");
printf("3. 折半插入排序\n");
printf("4. 冒泡排序\n");
printf("5. 快速排序\n");
printf("6. 简单选择排序\n");
printf("7. 输出学生信息\n");
printf("8. 退出\n");
printf("---------------------------------------\n");
printf("请输入菜单选项:");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入学生人数:");
scanf("%d", &n);
inputStudentInfo(students, n);
printf("学生信息录入成功!\n");
break;
case 2:
straightInsertSort(students, n);
printf("直接插入排序完成!\n");
break;
case 3:
binaryInsertSort(students, n);
printf("折半插入排序完成!\n");
break;
case 4:
bubbleSort(students, n);
printf("冒泡排序完成!\n");
break;
case 5:
quickSort(students, 0, n - 1);
printf("快速排序完成!\n");
break;
case 6:
simpleSelectionSort(students, n);
printf("简单选择排序完成!\n");
break;
case 7:
printStudents(students, n);
break;
case 8:
printf("程序已退出!\n");
return 0;
default:
printf("无效的菜单选项!\n");
break;
}
}
return 0;
}
```
注意,上述代码中的每个排序方法都实现了从小到大的排序功能,如果需要从大到小排序,可以通过修改比较函数来实现。同时,为了简化问题,上述代码中没有进行输入检查和错误处理,实际应用中需要根据具体情况进行处理。
阅读全文
相关推荐







