基于C++实现(控制台)学生成绩管理系统

发布时间:2026/7/21 15:35:37
基于C++实现(控制台)学生成绩管理系统 ♻️ 资源大小20.1MB➡️资源下载https://download.csdn.net/download/s1t16/87453189学生成绩管理系统选题背景说明本课题应解决的主要问题及应达到的技术要求简述本设计的指导思想。学生成绩管理对于学校来说是至关重要的一个良好的学生成绩管理系统能够为学校的老师和学生的管理和学生的查询带来很多方便以前的都是登记在纸质资料或者运用 Excel 来登记并且手工完成查找和修改给大量数据的查找更新和维护带了不少的困难工作效率低下。现在互联网快速发展计算机科学日渐成熟计算机科学改善人们的生活条件提高人们办事效率的观念也越来越被群众接受。为了快速实现增删查改有效地操作数据需要运用数据结构知识来优化功能。由于链表的动态性所以管理系统主要是用链表来存储数据并辅助用归并排序和哈希开地址散列法来优化实现高效快速地增删查改。方案论证(设计理念)由于链表的动态性所以管理系统主要是依靠链表用树结构存储数据并辅助用归并排序和哈希开地址散列法来优化实现高效快速地增删查改。说明设计原理理念并进行方案选择阐明为什么要选择这个设计方案以及所采用方案的特点。包括重点说明要实现的功能及其要求、系统的安全性、数据的完整性、应用的运行环境及其性能等要求。学习成绩管理系统应满足下面功能每个学生的信息包括学号姓名修的课程学分每门课程的总评成绩等支持添加、删除学生功能将该学生相关的所有信息删除支持添加、删除课程的功.能需要将该课程的所有分数信息都删除支持输入某个学生某门课程的分数的功能支持分数统计可统计每门课程的及格率平均分数最低分最高分将所有学生的某门功课成绩做成表格输出可以是简单文本格式)图形化界面可生成全班学生通讯录文件输出可生成某个学生的成绩单文件输出。数据的完整性其中学生有三个变量学号姓名电话号码存放在 student 结构中并且建立索引链表 stuIndex 有 100 个索引项键值 keysno%100,用开地址哈希散列法来存数据课程信息有三个变量课程号课程名学分存放在 cnoIndex 结构并且存在一个指针用来存放学生的成绩也就是将同一门的课程的所有学生的数据存放在在一起。每个成绩以学号和课程号为主码。运行环境vs2013win10过程论述重点说明设计是如何实现的包括对设计工作的详细表述。要求层次分明、表达确切。要求每个图都必须有文字说明图前说明为什么使用该图、图的主要作用图后说明图中各成分的作用和成分之间的交互或图所表达的流程。主要的结构 struct其中学生有三个变量学号姓名电话号码存放在 student 结构中其中主码为学号 int sno并且建立索引链表 stuIndex 有 100 个索引项键值 keysno%100,用开地址哈希散列法来存数据struct student { long int sno; string sname; string pnumber; student *next; }; struct stuIndex { int key; student *head; stuIndex *next; };课程信息有三个变量课程号课程名学分存放在 cnoIndex 结构主码为课程号 int cno并且存在一个指针用来存放学生的成绩也就是将同一门的课程的所有学生的数据存放在在一起。每个成绩以学号 sno 和课程号 cno 为主码。struct cnoGrade { int cno; int sno; int grade; cnoGrade *next; }; struct cnoIndex { int cno; string cname; double credit; cnoGrade *head; cnoIndex *next; };三个头文件student.h 主要实现和学生个人信息有关的功能//创建学生的索引 stuIndex* create_stuIndex(stuIndex *head, int n); //实现从文件中导入数据 stuIndex* loadStu(stuIndex *head); //寻找索引地址 stuIndex* find(stuIndex *head, int sno); //判断学号是否存在插入和删除时需要判断使用 bool judge_sno(student *head, int sno); //插入学生信息在头链表中导入结点 void insert_sno(stuIndex *head); //删除学生信息中个人信息部分 void delete_sno(stuIndex *head, int sno); //输出学生通讯录到文档 void txt_phone(stuIndex *head); //学生信息的更改可以通过这个文档来查看 void txt_stu_now(stuIndex *head);CS_grade.h主要实现和课程信息有关的以及学生的成绩int min(int a, int b); int max(int a, int b); //成绩单_01将同一个课程的成绩放在cnoGrade中 cnoIndex* load_grade(cnoIndex *head); //归并排序cnoGrade cnoGrade *list_split(cnoGrade *head);//实现链表的归并排序之拆分链表,返回后面半段 cnoGrade* merge(cnoGrade *h1, cnoGrade *h2);//合并两个链表 cnoGrade* sort_cnoGrade(cnoGrade *head);//按照学号归并排序先分后并 //归并排序cnoIndex cnoIndex *list_split(cnoIndex *head);//实现链表的归并排序之拆分链表,返回后面半段 cnoIndex* merge(cnoIndex *h1, cnoIndex *h2);//合并两个链表 cnoIndex* sort_cnoIndex(cnoIndex *head);//按照学号归并排序先分后并 //创建成绩单_02按照课程链接表格 cnoIndex* load_cno(cnoIndex *p); //删除导入数据的重复 void nocopy_cs(cnoIndex* h); //判断课程号是否存在在插入和删除时需要用到 bool judge_cno(cnoIndex *head, int cno); void txt_grade_now(cnoIndex *h); void txt_cno_now(cnoIndex *head); //6打印单科成绩到文件夹 void txt_cno(cnoIndex *h); //5统计单个课程分数 void groupby(cnoIndex *head); //统计课程成绩 void txt_groupby(cnoIndex *head); //2-2-2删除学生成绩cs void delete_sno_grade(cnoIndex *head, int sno); //3-2-2删除课程号以及成绩 void delete_cno(cnoIndex *head); //3-1添加课程 void insert_cno(cnoIndex *head); UI.h //实现功能时的界面 void UI();主程序和代码的运行初步设定的功能实现和界面添加学生删除学生添加功课删除功课输入学生某门功课成绩统计分数将所有功课的学生成绩做成表格输出 txt生成通讯录某个同学的成绩单输出统计成绩的文档课程信息成绩信息学生信息我们要实现的的功能主要有上面所示在 main()函数中的这样实现的int i; while (1) { UI(); cin i; switch (i) { case 0: insert_sno(stuhead); break; case 1: delete_stu(cnohead,stuhead); break; case 2: insert_cno(cnohead); break; case 3: delete_cno(cnohead); break; case 4: insert_grade(cnohead, stuhead); break; case 5: groupby(cnohead); break; case 6: txt_cno(cnohead); break; case 7: txt_phone(stuhead); break; case 8: txt_grade(cnohead,stuhead); break; case 9: txt_groupby(cnohead); break; case 10: txt_cno_now(cnohead); break; case 11: txt_grade_now(cnohead); break; case 12: txt_stu_now(stuhead); break; default: break; } system(pause); }运行之后下面是各个功能实现的原理和主要函数以及他们的实现界面功能 0 添加学生实现对应的函数 insert_sno()先用 judge_sno()判断学号是否已经存在存在则添加不了学号不存在则在对应的索引中插入结点如上面学号 18661001 在第一次可以实现插入在第二次的时候就不行了功能 1 删除学生删除学生的函数接口 delete_sno(),在里面同样有一个判断函数 judge_sno(),如果存在的则删除对应的结点学生信息结点以及对应学生号的成绩不存在则会报错功能 2 添加功课的原理分别同功能 0 类似先判断再插入功能 3 删除功课也有部分类似同功能 1 类似 先判断再删除对应的课程索引结点和里面的课程成绩功能 4 插入学生成绩Insert_grade()函数中有两个判断函数先执行判断学号是否在student中存在judge_sno()如果不存在直接返回如果存在则执行判断课程号是否存在的函数judge_cno();不存在也返回课程号存在的号还要再判断判断在这个课程索引当中是否已经存在这个学生的成绩的不存在的话直接添加成功存在的话则可以选择是否替换原有的成绩功能 5 统计分数实现的函数是 groupby在里面先判断输入的课程号是否存在 judge_cno()不存在则返回存在则继续判断是否有成绩记录没有也返回其他的 6-9 是实现的文档形式6 实现的函数 txt_cno()7 实现的函数Txt_phone();8 实现的函数Txt_sno();9 实现的函数Txt_groupby();功能是为了方便查看数据增删查改之后的情况为将数据形成文档。结果分析对研究过程中所获得的主要的数据、现象进行定性或定量分析得出结论和推论。从上面的运行结果来看上述的功能都实现了运用了归并排序和哈希链地址散列法学生成绩 20 万规模50 万规模100 万规模以及 200 万成绩的能很快得到满足要求的增删查改要求。最后一次测试的是有 10 万学生1 万个课程200w 成绩的测试结果。在插入学生中我没有对数据进行排序所以插入的时候我直接在表头的下一个结点查入不用去找插入的排序位置而我在对课程还有成绩都有运用归并排序去处理数据这样我在判断的时候则不用遍历全部的数据也是一种相对优化的方法不过就是需要引进归并排序函数处理一下顺序与我一开始没有应用哈希散列相比优化后运行速度非常快。在学生成绩管理系统中用哈希散处理数据非常快非常实用。课程设计总结总结可以包括:课程设计过程的收获、遇到的问题遇到问题解决问题过程的思考、程序调试能力的思考课程设计实现过程中的收获和体会等。开始动手的时候很多知识都忘了并且不知道如何下手就重新将课本看了一遍之后再开始写那种重新掌握知识的感觉真的不错之前掌握不牢所以才会有“提笔忘字”双手放在电脑上不知道从何开始的感觉复习完之后写起来也非常流畅和高效在写 cnoIndex 结构的时候出现了很多 bug要么是删除不彻底要么是添加的位置不得当所以 debug 的时间是最长的后面解决了问题之后又想起了将判断的过程放在一个函数中也就可以不用总是写判断函数优化之后代码看起来整洁舒服在逐一实现功能的时候不能把所有的功能一起测试而是应该先实现基本的功能再把各个功能合在一起实现调控。由于我一开始的目的是想让自己主动去掌握知识所以选择一个人做效果也是如此逼自己去学习我掌控了很多知识对知识应用更好但是就造成了所有工作都是我自己完成所以后面有类似大作业还是得和同学合作完成当自己遇到问题可以一起讨论并且掌握这也对我自己的能力提升有所帮助。这次掌握最好的关于链表的使用关于空链表以及头结点不变的问题都是非常注意的这就是链表最重要的点。还有我在处理读取 TXT 文档时也是掌握好多以前没有注意到的点。这次我收获非常多最大的变化是我积极去解决问题以及我学习态度的转变。参考文献陈宝平.数据结构c 版[M].北京清华大学出版社2012.1Clifford A.Shaffer.数据结构与算法分析c 版第三版[M].北京电子工业出版社2013.1Alex_McAvoy 数据结构与算法 —— 线性表 —— 顺序表