600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > C语言学生成绩管理系统——检查学号姓名 双向循环链表

C语言学生成绩管理系统——检查学号姓名 双向循环链表

时间:2024-01-10 02:37:13

相关推荐

C语言学生成绩管理系统——检查学号姓名 双向循环链表

设计一个学生管理系统,存储学生的基本信息和成绩。我是用C语言写的,最近在学习C++,回过头看,C++的特性可以减少很多冗余的代码。

功能

增删查改以及排序,数据可保存到磁盘,每次初始化的时候读取文件信息。

存储

内存中的数据用双向带头循环链表存储,因此插入和删除时间复杂度都是O(1),数据可以保存在本地磁盘的txt文件中,可自行修改代码中的存储路径。

要点

提几个设计这个系统要注意的关键点:

数据结构的使用

我这里是用的双向带头循环链表,读者可以自行修改成单链表,在使用方面效率根本区分不出。设计这个系统需要你对链表结构很熟悉,能自己写增删查改。

输入合法性

输入判断包括学生信息输入的合法性以及选项选择时候的合法性。

用户输入信息的时候可能会调皮,比如学号输入中文,姓名输入学号等,因此需要检查格式是否正确,不正确就继续输,直到输对了为止。

选择选项的时候,比如我5个选项从1到5,但是你输入了以外的数字,或者你输入了一个字符,因为我是用scanf读取选项,如果输入了一个字符会导致读取不到,如果套在while里就会导致卡死,因为字符会一直留在缓冲区

模块化编程

设计的时候要时刻牢记模块化,函数要做到高内聚低耦合,想用到的时候就能复用。

先说学号判断:

学号是用字符数组存储的,需要判断输入的学号是否为纯数字,不允许输入字母或符号,且规定学号为五位,允许输入的学号范围为0到10^5 - 1,考虑到以上两点,在输入学生信息时先用一个整型数据接收用户输入的数据。如果格式正确,则将数据每次模10后加上字符0的ASCII值,即取整数的最后一位转换成字符型数据存放在数组的末端,便实现学生学号的存储。如果用int型接收用户的输入,当用户输入的数据数值过大会出现问题,因此选用long long int型存储。当数字成功输入且存放在stuNumber数组中后,调用isExistStu()函数检查是否已有该学号的学生存在。如果上述情况都能通过,则执行之后的程序。

姓名判断:

姓名用字符数组存储,只允许用户输入汉字,不允许输入字母、数字或符号。姓名字数支持2到4位,先判断用户是否输入字符或数字,如果不是,需要进一步判断是否输入为非中文符号的汉字。

设置当前环境的编码格式为 简体中文(GB2312),已知该编码格式下字符集中一个汉字或中文符号在字符数组中占两个字节,且每个字节的最高位都为1,因此可以区分该空间的内容是否为汉字。用for循环判断用户输入的是否为纯中文,如果不是中文则让用户重新输入。如果是中文,再检查是否存在中文符号。

已知GB2312编码对收录的字符进行了“分区”处理,共94个区,每区含有94个位,共8836个码位。01-09区收录除汉字外的682个字符。GB2312规定对收录的每个字符采用两个字节表示,第一个字节为“高字节”,对应94个区;第二个字节为“低字节”,对应94个位。所以它的区位码范围是:0101-9494。区号和位号分别加上0xA0就是GB2312编码。因此除汉字以外的字符存储时,高位内容为A0-A9,即可检查输入的每个中文在数组中存放时的高位判断是否为符号。如果上述情况都能通过,则执行之后的程序。

各项成绩:

成绩用单精度浮点型变量存储,同样不允许输入字符或符号,成绩范围为0-100,至多一位小数,且小数部分只能为0.0或0.5。用modf()函数取出输入数字的小数部分判断是否为0.5或0.0,如果不是则重新输入。

排序学生成绩

主菜单中选择8的时候排序学生信息,调用GetNumStu函数得到链表中学生信息的个数,之后开辟两个等大小的数组,数组theScore存放成绩,数组theNode存放学生信息所在结点的地址。之后提示用户输入要排序的选项。随后调用SortStu函数,以学生成绩为索引,把学生成绩之间的排序转化为对应结点的排序。先将学生的待排序成绩依次存放在theScore中,同时把对应学生的结点存放在theNode中。之后通过插入排序对成绩进行排序的同时修改theNode中结点的顺序。排序完成后返回。循环调用PrintStu 打印结构体指针数组theNode中学生的信息即可得到成绩的排序结果,打印完成之后释放开辟的两个数组,之后返回主菜单界面。

文件保存

用fread和fwrite函数,而不是fscanf和fprintf,因为使用起来很不方便。

这里就不贴代码了,代码上传到我的码云上,需要的话自取。

学生管理系统的源代码

对于代码有什么问题可以在评论区提出!

结语

算是对C语言的一个小测试吧,希望我能有动力继续学习,继续更博客!!!!欲稍有成就,须从“有恒”二字下手。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。