利用c语言完成 给出n个学生的考试成绩表,每条记录由学号、姓名和分数和名次组成,设计算法完成下列操作: (1)设计一个显示对学生信息操作的菜单函数如下所示: 1、录入学生基本信息 2、直接插入排序 3、冒泡排序 4、快速排序 5、输出学生信息 6、退出 算法设计要求:按分数从高到低的顺序进行排序,分数相同的为同一名次。输入的学生信息存入文件中,每选择一种排序方法,必须从文件中取出数据。
时间: 2024-02-19 10:58:37 浏览: 135
C语言课程设计_学生成绩管理系统
5星 · 资源好评率100%
好的,这是一个基于C语言的学生成绩管理程序,主要实现了录入学生信息、排序和输出学生信息等功能。下面是完整的代码和注释。
```C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STUDENT_NUM 100 // 最多学生数
#define MAX_NAME_LEN 20 // 姓名最大长度
typedef struct Student {
char id[10]; // 学号
char name[MAX_NAME_LEN]; // 姓名
int score; // 分数
int rank; // 名次
} Student;
Student students[MAX_STUDENT_NUM]; // 学生数组
int student_num = 0; // 学生数量
// 从文件中读取学生信息
void read_students() {
FILE *fp;
fp = fopen("students.txt", "r");
if (fp == NULL) {
return;
}
while (fscanf(fp, "%s %s %d %d", students[student_num].id, students[student_num].name, &students[student_num].score, &students[student_num].rank) != EOF) {
student_num++;
}
fclose(fp);
}
// 将学生信息写入文件
void write_students() {
FILE *fp;
fp = fopen("students.txt", "w");
for (int i = 0; i < student_num; i++) {
fprintf(fp, "%s %s %d %d\n", students[i].id, students[i].name, students[i].score, students[i].rank);
}
fclose(fp);
}
// 录入学生信息
void input_student() {
if (student_num >= MAX_STUDENT_NUM) {
printf("学生数已满,无法再添加!\n");
return;
}
printf("请输入学号、姓名和分数:\n");
scanf("%s %s %d", students[student_num].id, students[student_num].name, &students[student_num].score);
students[student_num].rank = 0;
student_num++;
}
// 直接插入排序
void insertion_sort() {
for (int i = 1; i < student_num; 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;
}
// 更新名次
int rank = 1;
for (int i = 0; i < student_num; i++) {
if (i > 0 && students[i].score != students[i-1].score) {
rank = i + 1;
}
students[i].rank = rank;
}
}
// 冒泡排序
void bubble_sort() {
for (int i = 0; i < student_num-1; i++) {
for (int j = 0; j < student_num-i-1; j++) {
if (students[j].score < students[j+1].score) {
Student temp = students[j];
students[j] = students[j+1];
students[j+1] = temp;
}
}
}
// 更新名次
int rank = 1;
for (int i = 0; i < student_num; i++) {
if (i > 0 && students[i].score != students[i-1].score) {
rank = i + 1;
}
students[i].rank = rank;
}
}
// 快速排序
void quick_sort(Student arr[], int left, int right) {
if (left >= right) {
return;
}
Student pivot = arr[left];
int i = left, j = right;
while (i < j) {
while (i < j && arr[j].score <= pivot.score) {
j--;
}
arr[i] = arr[j];
while (i < j && arr[i].score >= pivot.score) {
i++;
}
arr[j] = arr[i];
}
arr[i] = pivot;
quick_sort(arr, left, i-1);
quick_sort(arr, i+1, right);
}
// 输出学生信息
void output_students() {
printf("学号\t姓名\t分数\t名次\n");
for (int i = 0; i < student_num; i++) {
printf("%s\t%s\t%d\t%d\n", students[i].id, students[i].name, students[i].score, students[i].rank);
}
}
int main() {
read_students();
while (1) {
printf("请选择操作:\n");
printf("1、录入学生基本信息\n2、直接插入排序\n3、冒泡排序\n4、快速排序\n5、输出学生信息\n6、退出\n");
int choice;
scanf("%d", &choice);
switch (choice) {
case 1:
input_student();
write_students();
break;
case 2:
insertion_sort();
printf("直接插入排序完成!\n");
break;
case 3:
bubble_sort();
printf("冒泡排序完成!\n");
break;
case 4:
quick_sort(students, 0, student_num-1);
printf("快速排序完成!\n");
// 更新名次
int rank = 1;
for (int i = 0; i < student_num; i++) {
if (i > 0 && students[i].score != students[i-1].score) {
rank = i + 1;
}
students[i].rank = rank;
}
break;
case 5:
output_students();
break;
case 6:
return 0;
default:
printf("无效操作!\n");
}
}
}
```
程序中定义了一个 `Student` 结构体表示学生信息,其中包括学号、姓名、分数和名次四个字段。使用了一个全局的 `students` 数组存储所有学生的信息,同时记录了当前学生数量 `student_num`。
首先实现了从文件中读取学生信息的函数 `read_students` 和将学生信息写入文件的函数 `write_students`,用于程序启动和结束时的读写操作。
然后是录入学生信息的函数 `input_student`,通过 `scanf` 函数读入学号、姓名和分数,添加到 `students` 数组中。注意判断学生数是否已满。
接下来实现三种排序算法。直接插入排序和冒泡排序比较简单,直接按照题目要求实现即可。快速排序使用了递归实现,注意分治过程中的基准元素选择和变量交换。
最后是输出学生信息的函数 `output_students`,按照指定格式输出每个学生的学号、姓名、分数和名次。
在 `main` 函数中,使用一个死循环让用户不断选择操作。对于录入学生信息和直接插入排序操作,需要将更新后的学生信息写入文件。
阅读全文