目录
近来有空闲,把前几个学期做的实验上传上来。如有错误的地方欢迎大佬批评指正,有更好的方法也期待您的分享~
实验要求
本课程要完成一个学生信息管理系统的设计与实现,可实现对于学生信息的录入、增加,修改和删除,以及学生信息浏览和特定条件的学生查询
1.学生信息的存储方式:文件存储
可以文本文件方式存储(txt)或其他文件形式
文本文件存储示例:
201611701208,张三,男,19,广东省xxx,软件工程
201611701209,张小明,男,18,浙江省xxx,软件工程
201611701201,白小云,女,18,广东省xx,软件工程
201611301107,赵晓飞,男,19,广东省xx,自动控制
2.学生记录数据录入、增加
能逐条添加单个学生记录,要求保证学生记录的学号唯一性,并且学号值不允许为空值
能判断对每个字段的输入值是否符合格式要求,比如学号是由12个数字字符组成,前四个字符是合常理的年份;性别只能输入男或者女;年龄是数字字符,范围介于一个合理的区间
要求能接收缺少某个字段值的学生记录
3.数据查询
能够通过给定条件查询学生的信息,给定的条件如学号、姓名、地址等
查询要求能够支持同时指定多个条件的查询:例如查询“18岁的浙江省男生信息”
能进行模糊查询,比如查询名字中包含“小”字的学生;
能统计满足某个条件的学生人数;
因为学生文件中的学生信息的排列顺序是按照添加的顺序排列的,因此需要结合数据结构知识,考虑如何提高查询效率。
4.数据删除
可以删除指定条件的学生信息
需要考虑删除后的文件应如何处理删除的信息
5.数据更新
可以更新指定条件的学生信息
需要考虑如何处理更新后的文件
6.支持学生信息结构的改变
支持增加字段: 比如增加一个“身份证号”,相应的所有记录必须增加相应的值,应考虑如何处理文件比较合理。
同理支持减少字段
7.其他需求
可看性:界面符合一般人的审美观;
易用性:操作便利,有符合使用习惯的流程控制过程,有很好的“进入”和“退出”机制;
健壮性:能够应对处理非法输入和非法操作;
性能:时间和空间复杂度要求;
1 系统介绍
1.1本系统总介绍
学生信息管理系统,是针对学校人事处的大量业务处理工作而开发的管理软件,是典型的管理信息系统。作为计算机应用的一部分,使用计算机对学生信息进行管理,具有着手工管理所无法比拟的优点。例如:检索迅速、查找方便、易修改、存储量大、数据处理快捷等。这些优点能够极大地提高学生信息管理的效率,也是学校实现科学化、正规化管理的重要条件。因此,开发这样一套管理软件是很有必要的事情。
1.2 需求分析
1.2.1学生信息的存储方式:文件存储
可以文本文件方式存储(txt)和二进制文件形式存储。
1.2.2学生记录数据录入、增加
(1)能逐条添加单个学生记录,保证学生记录的学号唯一性,并且学号值不允许为空值;
(2)能判断对每个字段的输入值是否符合格式要求,比如学号是由12个数字字符组成,前四个字符是合常理的年份;性别只能输入男或者女;年龄是数字字符,范围介于一个合理的区间;
(3)能接收缺少某个字段值的学生记录。
1.2.3数据查询
(1)能够通过给定条件查询学生的信息,给定的条件如学号、姓名、性别等;
(2)支持同时进行性别、年龄、籍贯多个条件的查询:例如查询“18岁的浙江省男生信息”;
(3)能进行模糊查询,比如查询名字中包含“小”字的学生;
(4)能统计满足某个条件的学生人数。
1.2.4数据删除
(1)可以删除指定条件的学生信息;
(2)删除后的文件只保留剩下学生的信息。
1.2.5数据更新
(1)可以更新指定条件的学生信息;
(2)更新后文件其他学生信息不变,指定更新的学生信息改变。
1.2.6其他需求
(1)可看性:界面符合一般人的审美观;
(2)易用性:操作便利,有符合使用习惯的流程控制过程,有很好的“管理员进入”和“退出”机制;
(3)健壮性:能够应对处理非法输入和非法操作;
1.3学生管理系统的功能结构图

1.4系统技术平台、标准的相应介绍
Visual Studio 2022主要用于软件开发和应用程序的创建、测试和部署。该版本是Visual Studio 2019的后继版本,带来了一系列改进和新功能,包括:改进了性能,Visual Studio 2022在启动时间和代码编译速度方面都进行了优化,大大提高了开发效率;改进了调试功能,Visual Studio 2022提供了更好的调试工具,包括改进的性能问题分析器和调试查看器等等。
2 系统设计
2.1学生信息的存储方式:文件存储
2.1.1 具体设计过程
(1)采用二进制方式对文件进行写操作
①用 FILE* 定义一个文件指针 fp;
②调用 fopen() 函数,使用给定的模式 mode 打开 filename 所指向的文件,若无法打开,则输出"cannot open file",返回,若打开成功,首先调用 fwrite() 函数将学生人数写入文件,然后使用for循环将学生信息写入,进行出错处理。
③使用fclose() 函数关闭文件指针。
(2)采用txt方式对文件进行写操作
①调用 ofstream() 文件打开txt文件。
②使用for循环用“ << ”将学生信息写入txt文件。
③使用 .close() 关闭文件。
(3)采用二进制方式对文件进行读操作
①用 FILE* 定义一个文件指针 fp;
②调用 fopen() 函数,使用给定的模式 mode 打开 filename 所指向的文件,若无法打开,则输出"cannot open file",返回,若打开成功,首先调用 fread() 函数读取学生人数,然后使用for循环将学生信息写入,进行出错处理。
③使用fclose() 函数关闭文件指针。
2.1.2 存储结构
学生信息既以二进制方式读写又以文本形式存储在文件夹中。
2.1.3 功能算法描述
(1)文件读写

头文件:#include <fstream>
文件写操作,内存写入存储设备 :ofstream
文件读操作,存储设备读区到内存中:ifstream
读写操作,对打开的文件可进行读写操作:fstream
(2)定义文件指针
FILE*
(3)打开文件
FILE *fopen(const char *filename, const char *mode)
使用给定的模式 mode 打开 filename 所指向的文件。
(4)二进制写文件
函数 size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream) 把 ptr 所指向的数组中的数据写入到给定流 stream 中。
(5)二进制读文件
函数 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream) 从给定流 stream 读取数据到 ptr 所指向的数组中。
2.1.4 程序流程图

2.2学生记录数据录入、增加
2.2.1 具体设计过程
(1)输入学生姓名
cin >> s[student_number++].name;
(2)输入学生学号
①输入
strcmp(s[student_number].num, s[i].num) == 0
cin >> s[student_number].num;
②定义字符串aa,将const char*类型的s[student_number].num 转为字符串
string aa(s[student_number].num);
③定义临时变量 string temp(aa, 0, 4);
④for遍历链表,使用 strcmp() 函数判断该学号是否存在,保证记录唯一性
⑤使用 函数 strlen() 和 atoi(temp.c_str())截取用户输入学号的前四位,判断学号是否由12个数字字符组成,且前四个字符是否是合常理的年份
(3)输入用户性别
①输入
cin >> s[student_number].sex;
②将const char* 类型的s[student_number].sex赋值给 char*类型的 c,并具体赋值输入的性别
&