利用c语言完成 给出n个学生的考试成绩表,每条记录由学号、姓名和分数和名次组成,设计算法完成下列操作: (1)设计一个显示对学生信息操作的菜单函数如下所示: 1、录入学生基本信息 2、直接插入排序 3、冒泡排序 4、快速排序 5、输出学生信息 6、退出 算法设计要求:按分数从高到低的顺序进行排序,分数相同的为同一名次。输入的学生信息存入文件中,每选择一种排序方法,必须从文件中取出数据。
时间: 2024-02-20 17:00:05 浏览: 19
好的,我会尽力回答。这是一个需要涉及文件操作和排序算法的问题,需要一定的编程基础。以下是我的设计思路:
1. 定义一个结构体,表示学生的基本信息,包括学号、姓名、分数和名次。
2. 实现菜单函数,根据用户选择的操作,执行相应的函数。
3. 实现录入学生基本信息的函数,将学生信息写入文件中。
4. 实现从文件中读取学生信息的函数,用于排序和输出学生信息。
5. 实现直接插入排序、冒泡排序和快速排序三个排序算法函数,按分数从高到低的顺序进行排序,分数相同的为同一名次。
6. 实现输出学生信息的函数,将排序后的学生信息输出到屏幕上。
7. 实现主函数,调用菜单函数,根据用户选择执行相应操作。
下面是大概的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义学生信息结构体
struct Student {
char id[20];
char name[20];
int score;
int rank;
};
// 菜单函数,根据用户选择执行相应操作
void menu() {
printf("1. 录入学生基本信息\n");
printf("2. 直接插入排序\n");
printf("3. 冒泡排序\n");
printf("4. 快速排序\n");
printf("5. 输出学生信息\n");
printf("6. 退出\n");
}
// 录入学生基本信息,将学生信息写入文件中
void input(struct Student *students, int n) {
FILE *fp = fopen("students.txt", "w");
for (int i = 0; i < n; i++) {
printf("请输入第%d个学生的学号、姓名和分数(用空格隔开):", i+1);
scanf("%s %s %d", students[i].id, students[i].name, &students[i].score);
students[i].rank = 0;
fwrite(&students[i], sizeof(struct Student), 1, fp);
}
fclose(fp);
}
// 从文件中读取学生信息
void read(struct Student *students, int n) {
FILE *fp = fopen("students.txt", "r");
for (int i = 0; i < n; i++) {
fread(&students[i], sizeof(struct Student), 1, fp);
}
fclose(fp);
}
// 直接插入排序
void insertSort(struct Student *students, int n) {
for (int i = 1; i < n; i++) {
struct Student temp = students[i];
int j;
for (j = i - 1; j >= 0 && temp.score > students[j].score; j--) {
students[j+1] = students[j];
}
students[j+1] = temp;
}
// 计算名次
int rank = 1;
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;
}
}
}
// 冒泡排序
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].score < students[j+1].score) {
struct Student temp = students[j];
students[j] = students[j+1];
students[j+1] = temp;
}
}
}
// 计算名次
int rank = 1;
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;
}
}
}
// 快速排序
void quickSort(struct Student *students, int left, int right) {
if (left >= right) {
return;
}
int i = left, j = right;
struct 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;
quickSort(students, left, i - 1);
quickSort(students, i + 1, right);
// 计算名次
int rank = 1;
students[left].rank = 1;
for (int k = left + 1; k <= right; k++) {
if (students[k].score == students[k-1].score) {
students[k].rank = students[k-1].rank;
} else {
students[k].rank = k - left + 1;
}
}
}
// 输出学生信息
void output(struct Student *students, int n) {
printf("学号\t姓名\t分数\t名次\n");
for (int i = 0; i < n; i++) {
printf("%s\t%s\t%d\t%d\n", students[i].id, students[i].name, students[i].score, students[i].rank);
}
}
int main() {
int n;
printf("请输入学生人数:");
scanf("%d", &n);
struct Student *students = (struct Student*)malloc(sizeof(struct Student) * n);
while (1) {
menu();
int choice;
printf("请输入操作编号:");
scanf("%d", &choice);
switch (choice) {
case 1:
input(students, n);
break;
case 2:
read(students, n);
insertSort(students, n);
output(students, n);
break;
case 3:
read(students, n);
bubbleSort(students, n);
output(students, n);
break;
case 4:
read(students, n);
quickSort(students, 0, n-1);
output(students, n);
break;
case 5:
read(students, n);
output(students, n);
break;
case 6:
free(students);
exit(0);
default:
printf("请输入正确的操作编号!\n");
}
}
return 0;
}
```