# 基于C语言的课程信息管理系统
# 一、 设计内容及要求
每门课程包含以下信息项:课程编号,课程名称,课程性质,学时,授课学时,实验或上机学时,学分,开课学期。系统的主要功能包括:
1. 创建课程信息文件,根据提示输入课程的各项信息,然后将课程信息存储到一个文件中。
2. 增加课程信息,在原有课程信息文件的基础上增加新的课程信息,要求继续保存至原文件,并提示用户选择是否继续进行增加操作。
3. 删除课程信息,提示用户输入要进行删除操作的课程编号,如果在文件中有该信息存在,则将该课程编号所对应的课程信息删除,否则输出提示信息,并提示用户选择是否继续进行删除操作。
4. 修改课程信息,提示用户输入要进行修改操作的课程编号,如果在文件中有该信息存在,则将提示用户输入该编号对应的要修改的选项,结果保存至原文件,并提示用户选择是否继续进行修改操作。
5. 按不同条件对课程信息进行查询操作,输出满足条件的课程信息。
- 按课程名称查询,输入课程名称。
- 按开课学期查询,输入开课学期。
6. 按不同条件对课程信息进行统计工作。
- 按课程性质统计课程门数(例:选修课:5门;必修课:10门)。
- 找出学分大于等于3分的课程,并输出他们的信息。
# 二、设计思路
## 2.1 系统概述
1. 系统名称:课程信息管理系统
2. 根据系统开发所提出该《课程信息管理系统》所应具备的系统功能包括以下六点:
- 创建课程信息文件;
- 增加课程信息;
- 删除课程信息;
- 修改课程信息;
- 按不同条件对课程信息进行查询操作,输出满足条件的课程信息;
- 按不同条件对课程信息进行统计工作。
3. 用户人群:学校课程信息管理人员及在校学生。
## 2.2 需求概述
### 2.2.1 系统目标
本系统的总体目标是通过该系统的实施,可以对学生课程信息更加有效地进行管理。系统设计实施过程中,力争做到以下几点:
1. 能够实现各个要求的功能;
2. 具有较高的可靠性和可用性;
3. 系统易于管理维护;
4. 使用方便,易学易用。
### 2.2.2 系统用例图
根据需求分析,分析出系统的具体操作步骤及功能,此系统应当包括输入、修改、查询、添加、删除、储存。详细使用见下图--系统整体用例图。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/eaabd552a33ad6a424ea465efa52bc42.writebug)
### 2.2.3 系统功能描述
该系统可以输入记录保存于文件中,之后可以对记录进行修改、查询、添加、统计、删除。
### 2.2.4 程序界面大纲
主程序是显示给用户的一个进入的界面,包含着该课程信息管理系统的各个应用功能,并通过调用函数的形式来实现。用户通过主函数中给出的各个功能提示,来进行相应的选择。如图所示:
![](http://www.writebug.com/myres/static/uploads/2021/10/19/b8349a02a471eb26498722a9c75dc09a.writebug)
### 2.2.5 存储和读取
可以用存储函数将输入及修改的数据保存至文本文档中,也可用读取函数读取文本文档中所有的数据。
# 三、设计结果及分析
- 为了使程序设计更适合面向对象,使用getch()等函数使得程序的使用更加便利,多处设计防误触循环、清屏函数、屏幕暂停函数等,同时在程序编写时尽量多的考虑使用对象可能遇到的情况,增加提示,使得程序更加人性化。
- 充分利用链表,对结构体数据实现增删改查等操作,整体而言就是通过多次对链表的建立和释放,每次需要操作文件时都会将数据全部提取到链表,对链表进行操作,再写入文件,使操作与文件数据实时切合,由于fwrite的特点,能覆盖旧数据,同时也能防止丢失数据以确保数据的完整性。
- 当程序运行出现崩溃、报错或停止运行时,通过单步调试寻找问题所在,找到程序出现问题所在行时,再分析代码,寻找原因,不断解决程序的问题。
- 数据的读取与存储:在数据保存到文件当中,以及从文件当中读取出来这两个部分,需要考虑到存储形式、内存分配,还有如何确保结构体的数据能够整块的移动,在调整过程中,曾存在存储数据不当导致出现“屯”等乱码,读取文件数据崩溃等情况。最后决定采用fwrite以二进制的形式保存到dat类型文件中,运用fread读取到链表中,同时为了防止内存分配存在问题,多次调整自定义函数read()当中的代码。
- 运用模块化的思想,对于程序的多个自定义函数进行了划分,分为负责主要操作功能的和辅助主要操作功能的两类,使得程序的模块划分清晰明了。