实验要求: 设计一个菜单驱动的学生成绩管理程序,管理n个学生的m门考试科目成绩,实现以下基本功能。 能够新增学生信息,并计算总分和平均分。 能够根据学号修改和删除某学生信息。 能够显示所有学生的成绩信息。 能够分别按总分和学号进行排序。 能够根据学号查询该学生的基本信息。 学生成绩数据最终保存在文件scores.txt中,能够对文件读、写学生数据。 程序运行时,菜单形式如下。 sy6.jpg
时间: 2023-07-14 19:13:56 浏览: 182
好的,这是一个比较典型的学生成绩管理程序,需要实现比较多的功能。下面是我设计的程序代码,你可以参考一下。
```
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义最多学生数和科目数
#define MAX_STUDENT_NUM 50
#define MAX_SUBJECT_NUM 5
// 定义学生信息结构体
struct student {
char id[20]; // 学号
char name[20]; // 姓名
float score[MAX_SUBJECT_NUM]; // 科目成绩
float total; // 总分
float average; // 平均分
};
// 定义全局变量,存储所有学生信息
struct student students[MAX_STUDENT_NUM];
int student_num = 0;
// 函数声明
void add_student();
void modify_student();
void delete_student();
void display_students();
void sort_students_by_total();
void sort_students_by_id();
void query_student_by_id();
// 主函数
int main()
{
int choice;
do {
// 显示菜单
printf("\n\n");
printf("******************************************\n");
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("******************************************\n");
printf("请选择操作(0~7):");
scanf("%d", &choice);
// 根据用户选择执行相应操作
switch (choice) {
case 1:
add_student();
break;
case 2:
modify_student();
break;
case 3:
delete_student();
break;
case 4:
display_students();
break;
case 5:
sort_students_by_total();
break;
case 6:
sort_students_by_id();
break;
case 7:
query_student_by_id();
break;
case 0:
printf("程序已退出!\n");
break;
default:
printf("输入有误,请重新选择!\n");
break;
}
} while (choice != 0);
// 保存学生信息到文件中
FILE *fp = fopen("scores.txt", "w");
if (fp == NULL) {
printf("文件打开失败!\n");
return 0;
}
for (int i = 0; i < student_num; i++) {
fprintf(fp, "%s %s ", students[i].id, students[i].name);
for (int j = 0; j < MAX_SUBJECT_NUM; j++) {
fprintf(fp, "%.2f ", students[i].score[j]);
}
fprintf(fp, "%.2f %.2f\n", students[i].total, students[i].average);
}
fclose(fp);
return 0;
}
// 新增学生信息
void add_student()
{
// 如果学生数量已经达到最大值,则不能再添加
if (student_num >= MAX_STUDENT_NUM) {
printf("学生数量已达到最大值,不能再添加!\n");
return;
}
// 输入学生信息
struct student s;
printf("请输入学号:");
scanf("%s", s.id);
printf("请输入姓名:");
scanf("%s", s.name);
printf("请输入科目成绩(最多%d门):", MAX_SUBJECT_NUM);
for (int i = 0; i < MAX_SUBJECT_NUM; i++) {
if (i == 0) {
printf("\n语文:");
} else if (i == 1) {
printf("\n数学:");
} else if (i == 2) {
printf("\n英语:");
} else if (i == 3) {
printf("\n物理:");
} else if (i == 4) {
printf("\n化学:");
}
scanf("%f", &s.score[i]);
}
// 计算总分和平均分
s.total = 0;
for (int i = 0; i < MAX_SUBJECT_NUM; i++) {
s.total += s.score[i];
}
s.average = s.total / MAX_SUBJECT_NUM;
// 添加学生信息到全局变量中
students[student_num] = s;
student_num++;
printf("新增学生信息成功!\n");
}
// 修改学生信息
void modify_student()
{
char id[20];
printf("请输入要修改的学生学号:");
scanf("%s", id);
// 查找学号对应的学生信息
int index = -1;
for (int i = 0; i < student_num; i++) {
if (strcmp(students[i].id, id) == 0) {
index = i;
break;
}
}
// 如果找不到对应的学生信息,则输出提示信息
if (index == -1) {
printf("找不到对应的学生信息!\n");
return;
}
// 输入修改后的学生信息
struct student s;
printf("请输入修改后的姓名:");
scanf("%s", s.name);
printf("请输入修改后的科目成绩(最多%d门):", MAX_SUBJECT_NUM);
for (int i = 0; i < MAX_SUBJECT_NUM; i++) {
if (i == 0) {
printf("\n语文:");
} else if (i == 1) {
printf("\n数学:");
} else if (i == 2) {
printf("\n英语:");
} else if (i == 3) {
printf("\n物理:");
} else if (i == 4) {
printf("\n化学:");
}
scanf("%f", &s.score[i]);
}
// 计算总分和平均分
s.total = 0;
for (int i = 0; i < MAX_SUBJECT_NUM; i++) {
s.total += s.score[i];
}
s.average = s.total / MAX_SUBJECT_NUM;
// 修改学生信息
students[index] = s;
printf("修改学生信息成功!\n");
}
// 删除学生信息
void delete_student()
{
char id[20];
printf("请输入要删除的学生学号:");
scanf("%s", id);
// 查找学号对应的学生信息
int index = -1;
for (int i = 0; i < student_num; i++) {
if (strcmp(students[i].id, id) == 0) {
index = i;
break;
}
}
// 如果找不到对应的学生信息,则输出提示信息
if (index == -1) {
printf("找不到对应的学生信息!\n");
return;
}
// 删除学生信息
for (int i = index; i < student_num - 1; i++) {
students[i] = students[i + 1];
}
student_num--;
printf("删除学生信息成功!\n");
}
// 显示所有学生信息
void display_students()
{
// 打印表头
printf("学号\t姓名\t语文\t数学\t英语\t物理\t化学\t总分\t平均分\n");
// 打印每个学生信息
for (int i = 0; i < student_num; i++) {
printf("%s\t%s\t", students[i].id, students[i].name);
for (int j = 0; j < MAX_SUBJECT_NUM; j++) {
printf("%.2f\t", students[i].score[j]);
}
printf("%.2f\t%.2f\n", students[i].total, students[i].average);
}
}
// 按总分排序
void sort_students_by_total()
{
// 冒泡排序
for (int i = 0; i < student_num - 1; i++) {
for (int j = 0; j < student_num - i - 1; j++) {
if (students[j].total < students[j + 1].total) {
struct student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
printf("按总分排序成功!\n");
}
// 按学号排序
void sort_students_by_id()
{
// 冒泡排序
for (int i = 0; i < student_num - 1; i++) {
for (int j = 0; j < student_num - i - 1; j++) {
if (strcmp(students[j].id, students[j + 1].id) > 0) {
struct student temp = students[j];
students[j] = students[j + 1];
students[j + 1] = temp;
}
}
}
printf("按学号排序成功!\n");
}
// 根据学号查询学生信息
void query_student_by_id()
{
char id[20];
printf("请输入要查询的学生学号:");
scanf("%s", id);
// 查找学号对应的学生信息
int index = -1;
for (int i = 0; i < student_num; i++) {
if (strcmp(students[i].id, id) == 0) {
index = i;
break;
}
}
// 如果找不到对应的学生信息,则输出提示信息
if (index == -1) {
printf("找不到对应的学生信息!\n");
return;
}
// 打印学生信息
printf("学号\t姓名\t语文\t数学\t英语\t物理\t化学\t总分\t平均分\n");
printf("%s\t%s\t", students[index].id, students[index].name);
for (int i = 0; i < MAX_SUBJECT_NUM; i++) {
printf("%.2f\t", students[index].score[i]);
}
printf("%.2f\t%.2f\n", students[index].total, students[index].average);
}
```
这个程序中使用了一个结构体存储学生信息,并定义了相应的函数实现各种功能。在主函数中,根据用户选择调用不同的函数。保存学生信息到文件中使用了C语言标准库中的文件操作函数(fopen、fprintf、fclose)。
你可以将上面的代码复制到一个C文件中,编译运行看看效果。
阅读全文