C语言 学生成绩管理系统
简述:该学生管理系统数据结构采用结构体
1、系统需求分析
1.1系统介绍
本学生管理系统是为教师人员提供管理班级成绩的工具,该系统可以实现的对学生的成绩进行增、删、改、查、信息保存和信息导入等基本功能,以及对学生成绩排序和分段的扩展功能,有利于对学生成绩管理。
1.2功能性需求
(1) 成绩录入
(2) 成绩输出、成绩排序(按平均成绩)
(3) 成绩查找
(4) 成绩修改
(5) 删除成绩
(6) 文件存储、文件导入
1.3非功能性需求
(1) 友好的交互页面
(2) 登陆密码设置
(3) 数据的保护
2、程序结构设计
该该系统总体的流程图框架如下
1 | graph TD |
3、用户界面设计
登陆界面
登陆界面根据自己的需要进行设计,尽量设计的和谐美观。
如我的登陆界面额外添加了获取时间和登陆密码功能!
以下展示主要代码和效果展示。
获取时间代码
1 | time_t timep; //系统时间 |
1 | printf("\t★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★\n\n"); |
如图:
菜单界面
进入页面后设计一个菜单界面,也就是功能界面,在该界面上进行操作
1 | printf("\t\t★————————————————————————————————————————★\n\n"); |
展示如下:
4、功能设计
在该模块中,将会介绍程序的主要功能实现的设计思想和代码
4.1成绩录入
设计思想
成绩录入是对结构体中班级、姓名、学号和五门成绩的录入,同时加上对五门成绩平均成绩的计算。按照基本的录入,只需用scanf函数对数据输入,用printf函数进行汉字的打印即可。然后进行文件保存该组数据,最后判断是否继续录入。
流程图如下
代码
1 | //************************************* |
部分代码说明
1 | while(scanf("%s",stu[count].cla)==0) //判断返回值,除去类型错误bug |
scanf的返回值具体解释见他人解释,地址如下:
(https://blog.csdn.net/zhl254467014/article/details/44183567)
为了方便其它功能的实现,在这里需要判断学号是否重复,保证学号的唯一性
1 | w: |
4.2成绩显示
由于我想按照平均成绩排序的方式输出,因此直接调用该函数
1 | //************************************* |
4.3成绩排序
排序思想:
成绩排序是将结构体中的数据按平均成绩进行排序,在本系统中,我将成绩排序非为按五门成绩排序和平均成绩排序,排序的思想是运用冒泡排序。在此功能中需注意的是排序时要将整组数据随着平均成绩一起改变,最后不能出现平均成绩与信息对应不上。其次在进行字符串互换的时候不能直接赋值号进行互换,要用strcpy函数进行复制,在这里只展示按平均成绩排序的代码,其它成绩排序与之相似
1 | //************************************* |
4.4成绩查找
设计思想:
成绩查找需要实现的是按学号和姓名查找到学生的所有信息,然后打印出来。该功能的思想是输入学号或姓名,然后在循环体中对结构体进行遍历,找到所查到的结构体的下标值,然后将该下标值对应学生的信息打印出来。按照姓名查询时,判断字符串是否相等需要用strcmp函数。在循环体中对结构体进行遍历的时候,找到的时候,可以用break跳出循环,提高效率。
流程图如下:
代码展示
1 | //************************************* |
4.5成绩修改
该功能与录入成绩功能相似,成绩修改是对结构体中的信息进行修改,首先找到需要修改同学结构体的下标值,然后对该下标值对应的信息进行覆盖修改,该信息修改的录入与成绩录入功能的录入相同,同样需要注意与成绩录入时的漏洞。过多的不说了,直接上代码,依据我的需求,代码较多,仅供参考
1 | ****************************** |
4.6成绩删除
设计思想:
删除成绩是对结构体中的信息进行删除,其实对于C语言无法进行删除本身的意义,只是做出了一些假像,其实删除成绩就是覆盖成绩。删除成绩分为按学号删除和按姓名删除。删除成绩的思想为覆盖,首先通过结构体的遍历找到所删学生信息的下标值,然
后从该下标值开始,后面一个学生信息覆盖前面一个学生的信息,最后最关键的一点是将全局变量count即结构体组数-1
流程图如下:
代码如下:
1 | //************************************* |
核心代码如下,请好好理解
1 | for(i=0;i<count;i++){ |
4.7文件保存
文件存储简要介绍:
文件存储是将程序中的数据存储如磁盘中,生成文件。在我们没有进行保存之前,我们每次进入系统都要进行录入,如果数据很多,那么操作十分复杂。所有我们需要对数据进行存储。然后进入系统时进行导入,文件的存储分为两种方法,一种是十进制进行存储,另一种是二进制进行存储。这两种方式都可以对数据进行存储,但每种方式都有其的优点和缺点,对于第一种十进制存储,用fprintf函数对磁盘写入,它的优点是格式化输出,在磁盘中可查看数据,也可进行修改使用方便,容易理解,缺点是由于在输入时要将文件中的ASCII码转换为二进制形式在保存在内存变量中,在输出时又要将内存的二进制形式转换成字符,要花费较多时间。并且数据可被其他人查看和修改,在保存数据时需要进行进制转换,可能会造成数据错误。对于二进制存储,用fwrite函数对磁盘文件进行写,优点是fwrite函数可向文件写一个数据块,在读写时以二进制形式进行的。在向磁盘写数据时,直接将内存中一组数据原封不动、不加转换地复制到磁盘文件上,不需要进制转换,运行速度高。其缺点是生成二进制文件,信息是一堆乱码,但是该文件安全系数高,他人无法查看文件内容,对文件数据进行保护。
我的文件是使用二进制存储
具体代码如下:
1 | void save(struct Student stu[]) |
鉴于有些人使用十进制文件,我这里也写了,代码如下:
1 | FILE *fp; |
4.7文件保存
简要概述
文件导入是对磁盘中的数据导入进学生管理系统的结构体中,对数据进行使用。文件导入是与文件存储相对应,十进制导入对应十进制存储,二进制导入对应二进制存储。因此文件导入也分为两种,十进制导入用fscanf,二进制文件导入用fread
这里同样展示两种方式
首先是二进制
1 | //文件导入 |
二进制形式
1 | while(num!=EOF){ |
4.8主函数代码
主函数代码展示
1 | //************************************* |
4、效果展示
))))
退出时的效果可以自行添加,这里我在csdn上找的时一个心型图案,该图案设计者链接如下:
(https://blog.csdn.net/stone15165/article/details/80260580)
源码在github上:(https://github.com/Mr00wang/C-language.git)
以上是该学生管理系统的全部内容,上面没有对各科均分和成绩分段进行展述,如有问题请留言,谢谢!