一、实验目的
本实验旨在通过使用C语言开发一个简单的学生成绩管理系统,掌握结构体、数组、函数调用、文件操作等基本编程技能。同时,培养学生在实际项目中分析问题、设计程序和调试代码的能力。
二、实验内容
本次实验要求实现一个能够对学生成绩进行录入、查询、修改、删除以及统计的系统。系统应具备以下功能:
1. 学生信息的录入(包括学号、姓名、成绩);
2. 学生成绩的查询(按学号或姓名查找);
3. 学生成绩的修改;
4. 学生成绩的删除;
5. 成绩统计(如平均分、最高分、最低分等);
6. 数据的保存与读取(使用文件操作)。
三、系统设计
1. 数据结构设计:
使用结构体来存储学生的相关信息,例如:
```c
struct Student {
int id; // 学号
char name[50];// 姓名
float score;// 成绩
};
```
2. 功能模块划分:
- 主菜单界面:提供用户选择功能的选项;
- 数据录入模块:用于输入学生信息并保存到文件;
- 查询模块:根据学号或姓名查找学生信息;
- 修改模块:允许用户修改已有学生的信息;
- 删除模块:移除指定的学生记录;
- 统计模块:计算总分、平均分、最高分、最低分等;
- 文件操作模块:负责将数据写入文件或从文件中读取。
四、程序实现
整个系统采用C语言编写,主要使用了标准库函数,如`scanf`、`printf`、`fopen`、`fclose`、`fwrite`、`fread`等。
以下是部分核心代码示例:
- 主函数逻辑:
```c
int main() {
int choice;
while (1) {
printf("\n=== 学生成绩管理系统 ===\n");
printf("1. 录入学生信息\n");
printf("2. 查询学生信息\n");
printf("3. 修改学生信息\n");
printf("4. 删除学生信息\n");
printf("5. 成绩统计\n");
printf("6. 退出系统\n");
printf("请选择操作:");
scanf("%d", &choice);
switch (choice) {
case 1: addStudent(); break;
case 2: searchStudent(); break;
case 3: updateStudent(); break;
case 4: deleteStudent(); break;
case 5: statistics(); break;
case 6: exit(0);
default: printf("无效选项,请重新选择。\n");
}
}
return 0;
}
```
- 数据保存与读取:
```c
void saveToFile(struct Student students[], int count) {
FILE fp = fopen("students.dat", "wb");
if (fp == NULL) {
printf("无法打开文件!\n");
return;
}
fwrite(students, sizeof(struct Student), count, fp);
fclose(fp);
}
int loadFromFile(struct Student students[]) {
FILE fp = fopen("students.dat", "rb");
if (fp == NULL) {
printf("文件不存在,将新建数据。\n");
return 0;
}
int count = 0;
while (fread(&students[count], sizeof(struct Student), 1, fp)) {
count++;
}
fclose(fp);
return count;
}
```
五、实验结果与分析
经过测试,系统能够正常运行,各项功能均实现了预期目标。通过文件操作,可以实现数据的持久化存储,避免每次运行程序时都需要重新录入数据。
在实验过程中,也发现了一些问题,例如:
- 输入数据时未进行合法性校验,可能导致错误数据被录入;
- 系统没有实现多用户登录功能,安全性较低;
- 用户界面较为简单,缺乏图形化交互。
六、实验总结
本次实验不仅加深了对C语言基础语法的理解,还提升了实际编程能力。通过完成学生成绩管理系统的开发,掌握了结构体、文件操作、函数封装等重要概念,为今后学习更复杂的软件开发打下了坚实的基础。
同时,也认识到在实际项目中,良好的用户体验、数据安全性和系统稳定性同样重要,未来可以考虑引入更多高级功能,如数据库支持、图形界面等,以提升系统的实用性与可扩展性。
七、附录
- 源代码清单
- 测试用例及运行结果截图