最新学生学习成绩管理系统文档格式.docx
《最新学生学习成绩管理系统文档格式.docx》由会员分享,可在线阅读,更多相关《最新学生学习成绩管理系统文档格式.docx(49页珍藏版)》请在冰豆网上搜索。
一、设计实践的目的、任务与要求
本设计实践是“C语言程序设计”课程学习的一个关键环节。
它是根据教学计划的要求,在教师的指导下,对学生实施程序设计训练的必要过程,是对前期课堂学习内容的综合应用及其效果的检验和提高。
其目的在于培养学生综合运用理论知识来分析和解决实际问题的能力、以及严谨的科学态度和良好的程序设计习惯。
本次设计实践,要求设计者基于结构化程序设计思想和所用C语言开发环境与工具,并运用“软件工程”和“数据结构”中的有关概念和方法,针对具体设计题和要求,分析功能要求,划分功能模块,用链表结构设计功能模块函数,以菜单方式调用相应功能模块来实现信息和数据处理。
本次设计时间为二周,要求独立完成,具体任务如下:
1、学习、掌握采用结构化程序设计思想进行TurboC(或WinTC,VC)环境下程序设计的方法;
另外学习C语言简单图形语句以及简单图形界面设计(参见参考文献5、6)。
2、采用C语言设计一个“学生学习成绩管理系统”,上机编程、调试并演示该管理系统中的各功能模块(具体内容见四)。
3、设计完成后,每人必须按时提交与验收程序一致的、能按设计功能和性能要求运行的程序的清单,一份关于本次程序设计和使用介绍的纸质文档即程序设计、使用说明书及个人总结(实践心得、体会等)。
二、任务“学生学习成绩管理系统”的基本功能说明
“学生学习成绩管理系统”用于对学生学习成绩数据文件的新文件创建和老文件管理,并可以进行密码设置。
具体要求实现的功能如下:
1、输入/添加记录:
将每一个学生的学号、姓名和各科学习成绩作为一个记录进行输入或添加。
要求经过密码验证后能建立一个新的数据文件或给已建立好的数据文件增加记录。
2、显示、查询记录:
能按学生姓名(或学号)显示、查询一个或多个学生的各门(或某门)功课的成绩和平均成绩。
3、修改记录:
可以对数据文件中的任意记录的数据进行修改,在修改前后对该记录的内容进行显示,并设确认提示。
(要求设置密码,验证通过后方可进入修改环节)
4、删除记录:
可以删除数据文件中的任一记录,包括逻辑删除(具有恢复功能)和物理删除(不可恢复)。
(说明:
该功能也应设置为经过验证密码后才可实施删除)
5、成绩排序:
采用不同的排序方法对单科成绩和总(或平均)成绩进行排序,但不能改变原记录的顺序。
6、统计功能:
(A)计算各门课程全班总成绩及平均成绩;
(B)统计各门课程得分为100、90~99、80~89、70~79、60~69和不及格学生的人数,以及与全班总人数的百分比。
7、数据文件保存和上载功能:
能按文件名保存已建立的或修改的整体记录数据,能按文件名上载/倒入保存在磁盘的整体记录数据。
8、其他:
该软件应具有系统名称、设计单位或个人等基本信息。
三、此程序的功能
存储学生的成绩信息,可以添加、显示、排序、查询、修改、删除、恢复、统计学生的信息,
运行程序时,先输入专业班级,如果没有对应的文件,进入操作完成后,选择保存或退出系统并保存所做更改时,程序将创建一个和你输入的专业班级同名的文件存储你输入或改变的学生信息,如果有对应的文件,你进入操作时,程序将找到相关文件,读取文件里面的信息。
如果是第一次进入,先设置密码,连续两次输入相同的密码,如果不是第一次进入,要输入原来设置的密码,进入后根据提示选择序号进行相关操作,操作过程中,如果输入错误信息,程序可以处理输入的一些错误信息,如果想中途保存,可以选择保存,再进行其它操,也可以最后退出程序时,选择退出系统并保存;
如果并不想保存此前的操作,可以选择退出系统不保存。
可以对存储被删除学生信息的文件进行删除操作,但要在没有调用删除和恢复函数之前,如果在调用删除和恢复函数之后操作,将提示“数据正在被使用,请下次启动程序时再清理,按任意键返回”。
四、程序设计方案
1、数据结构
采用链表存储学生的基本信息,包括学号、姓名、学生成绩
2、整体设计思想
在main主函数中定义一个结构体指针变量head,对于添加、修改、删除这样的函数,有参数,它们的实参都为head,返回值也赋给head,对于排序函数有参数,实参也为head,但不对head直接处理,因为我们并不希望经过排序后就改变原有学生逻辑顺序,对于排序这样的函数所需的变量,由head提供学生信息,再创建另外一个链表,然后排序函数再对这个新链表处理,处理后不返回任何值。
head在各函数之间传递信息,每个函数运行后,都要保证head要么为NULL(没有学生成绩信息),要么为学生成绩的最新信息。
在启动程序的时候把NULL赋给head,当head变量作为一个实参数传递给函数时,此时head为NULL,函数对head变量不做任何处理,而读取已经保存在文件里的已有学生信息进行处理,如果文件里也没有学生信息,则返回到主界面;
如果文件里有学生信息,根据函数的功能对学生进行处理,再把函数返回的学生信息赋给head,此时head存有学生的最新信息,此时如果head做为实参传递给函数时,函数对head进行处理,而不关心原来已经存在文件里的学生信息。
对于被删除的学生信息用全局变量delstu存储,基本思想和head一样。
学生成绩管理系统示意图
学生成绩管理系统程序结构示意图
3、具体函数实现
voidmainmenu();
用来显示程序的主菜单
voidcheckmenu();
用来显示查询和统计函数的子菜单
voidsortmenu();
用来显示排序函数的子菜单
voidmodifymenu();
用来显示修改函数的子菜单
structstudent*readfile();
从原有文件中读取学生信息,创建链表,输出链表头,如果没有学生信息,输出NULL
structstudent*readdelnum();
读出delnum文件所存储的被删除的学生信息,创建链表,输出链表头,如果没有被删除的学生信息,输出NULL
voidprint(structstudent*);
输入链表,显示链表里的学生信息
voidprintone(structstudent*);
输入链表,只显示链表头的信息
voidsavedelnum(structstudent*head)
把被删除的学生信息保存到delnum文件中,并替换原文件
voidsavereplace(structstudent*);
以写入的方式把链表head存储的信息保存在student文件里
structstudent*insert();
输入新的学生信息,并根据学号插入
structstudent*recreate(structstudent*head);
输入一个链表头head,重新创建一个新链表,如果输入的链表头head为NULL与a==1,(即delselect函数被调用过),则输出NULL;
如果输入的链表头head为NULL与a==0,则输出readfile()返回的链表;
如果输入的链表head不为NULL,则用head存储的学生信息重新创建一个新链表,输出新链表的表头。
structstudent*index(structstudent*,long);
参数为链表头head和学生学号,根据输入的学生学号,找到此学号并输出此学号的
结构体指针变量,如果找不到或head等于NULL,输出NULL。
structstudent*del(structstudent*,long);
参数为链表头head和学生学号,根据输入的学生学号,找到此学号并删除此学生的信息,输出链表头head。
structstudent*create(structstudent*);
输入一个链表头head,如果head为NULL与a==0,head=readfile(),然后输入学生的信息,把输入的学生信息根据学号插入到head链表;
输出head
voidshow(structstudent*);
输入一个链表头head,然后把参数传递给structstudent*recreate(structstudent*head);
得到一个新链表,再把新链表传递给排序函数structstudent*sort(structstudent*);
得到排序后的链表,然后用voidprint(structstudent*)函数显示排序后的链表内容。
structstudent*modify(structstudent*);
输入一个链表头head,如果head的输出等于NULL与a==1,输出NULL;
如果head等于NULL与a==0,把readfile()的输出赋给head;
把head和输入要修改的学号传递给函数structstudent*index(structstudent*,long);
如果index()的输出为NULL,输出head;
如果index()的输出不为NULL,把index()输出链表头的信息赋给函数中的变量structstudent*p;
然后输入要修改的学生信息赋给变量p,调用printone()函数显示修改后的学生信息,在把p存储的修改后的学生信息赋给index()输出的链表头;
最后输出head。
structstudent*delselect(structstudent*);
输入一个链表头head,如果head等于NULL与a==1,输出NULL;
如果delstu==NULL与b==0,把readdelnum()的输出赋给delstu,把head和输入要删除的学号传递给函数structstudent*index(structstudent*,long);
如果index()的输出为NULL,则跳过del函数;
如果index()的输出不为NULL,把index()输出链表头的信息赋给函数中的变量structstudent*p,然后调用structstudent*del(structstudent*head,longnum)函数删除该学号的信息,最后把p中的信息放到存储被删除学生的链表中;
voidcheck(structstudent*head)
得到一个新链表,如果新链表为NULL,则退出函数;
如果新链表不为NULL,用print()函数显示学生信息,然后选择序号进行查询或显示统计结果。
structstudent*recover(structstudent*);
输入一个链表头head,如果head等于NULL与a==0,把readfile()的输出赋给head,如果delstu==NULL与b==0,把readdelnum()的输出赋给delstu,把delstu和要恢复的学号传递给函数structstudent*index(structstudent*,long);
如果index()的输出不为NULL,把index()输出链表头的信息赋给函数中的变量structstudent*p,然后调用structstudent*del(structstudent*head,longnum)函数删除该学号的信息,最后把p中的信息放到存储学生信息的