《C--学生成绩管理系统课程设计报告剖析(共35页).doc》由会员分享,可在线阅读,更多相关《C--学生成绩管理系统课程设计报告剖析(共35页).doc(35页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上C+面向对象程序设计课程设计设计题目:成绩管理系统 专 业:计算机科学与技术 班 级: 学 号: 姓 名:贺超 日 期:2015年10月25日2015年12月25日成 绩: 专心-专注-专业目录一、选题背景学生成绩管理系统是对学生信息及成绩的管理。开发工具Visual C+。主要用于对学生的学号、姓名等基本信息以及各个学科成绩进行增加、删除、修改、查询以及保存到文件等操作。系统给用户提供一个人机界面,使用户可以根据提示输入操作项,调用系统提供的管理功能。二、方案论证 本系统采用c+控制台程序来实现程序所需的所有要求,具体实现如下:1. 系统主控平台通过主菜单允许用户选
2、择想要的操作。包括输入学生信息、显示学生信息、查询学生信息、修改学生信息、删除学生信息、显示所有学生信息、统计各个分数段学生信息、学生按总分排序输出。通过输入相应的序号选择相应的操作。2. 增加学生成绩信息用户根据提示输入学生的学号、姓名、性别、4门课程的成绩(课程名称自定)。输入完一条学生记录,保存在学生数组中,可选择继续输入下条学生记录还是退回到主菜单。3. 显示学生信息将保存在学生数组中的学生记录逐行显示出来。若数据很多,应该每显示若干行后暂停,按回车后继续显示后续内容。4. 查询学生信息先询问按学号、姓名、成绩做查询,若按学号查询,则输入要查找的学号,然后在学生数组中找到该学号的学生记
3、录,显示出该学生的信息。若找不到该学号信息,则显示无此学号。若按姓名查询,则输入要查找的姓名,然后在学生数组中找到该姓名的学生记录,显示出该学生的信息。若找不到该姓名信息,则显示无此姓名。若按成绩查询,则输入要查找的科目及成绩范围,然后在学生数组中找到该成绩范围的学生记录(可以有多个学生),显示出相关学生的信息。若找不到信息,则显示无此成绩。每次查询完,询问是否继续查询,是则继续下轮查询,否则退回主菜单。5 修改学生信息先提示输入要修改的学生的学号,在学生数组中找出该学生记录,若找到,则重新输入学生的姓名、性别、4门课程的成绩等。然后保存到学生数组的该学生记录中。若找不到,则显示无此学号。6.
4、 删除学生信息先提示输入要删除的学生的学号,在学生数组中找出该学生记录,若找到,则在学生数组中删除该学生记录。若找不到,则显示无此学号。7. 学生信息按总分排序在本模块中,系统自动遍历信息链表并排序来对链表中所有的信息进行排序,并在排序后显示排序后的所有信息。8. 保存数据到文件与将文件数据装入学生数组在系统退出前,先将学生数组的学生信息保存的文件中。然后结束系统。每次进入系统时,先将文件中的学生数据装入学生链表中,然后才进入系统的主菜单。本系统的数据存储利用类对象链表,定义学生信息类,将学生信息定义为类的成员变量,并定义初始化信息、修改信息、显示信息、计算总分、计算平均分这几个类成员函数,方
5、便数据的增加与修改。系统中录入学生数据前会在系统类对象链表中检测是否存在与输入的学号相同的信息,如果存在并继续输入了信息,则会出现信息的重复和搜索不到的情况,因此,设置数据检查环节可以避免数据的重复录入,当出现输入了重复的数据时,会有系统提示,提示输入的信息已存在并提供重新输入的机会;另在输入学号查找和删除部分,如果系统在检测类对象链表的时候未发现系统中包含输入的学号,则输出提示,输入的信息在系统中不存在;系统在学生信息查询部分,有根据学生成绩查询所有符合条件的学生信息,这部分存在输入分数的上下限问题,必须存在上限大于等于下限,并且上下限必须都在分数的范围内,因此每次输入一个分数都设置一个判断
6、语句来判断是否符合条件,如果不符合提示重新输入。本系统开发环境:VC+6.0使用开发语言:C+三、过程论述详细设计:图1 系统模块图如图1,本系统分为添加学生信息模块、删除学生信息模块、修改学生信息模块、查找学生信息模块、显示学生信息模块、学生信息排序、统计学生信息七个主要实现功能的模块,每个模块分别有个主函数,用来实现这个模块的信息。1.系统学生信息类设计:class Menupublic:int TheMenu();void Work();void Save();void Read();int ReadOnePart(int nPass, char cOneLine, int n, cha
7、r cC, int m);int nEnd;int nChoose;Menu();Menu();protected:void Insert();void Revise();void Delete();void Search();void Show();Menu:Menu()nEnd = 1;nChoose = 0;Menu:Menu()class Worker :public Menupublic:int TheMenu();void Work();protected:void Insert();void Revise();void Delete();void Search();void Or
8、derInChinese();void OrderInEnglish();void OrderInMath();void OrderInSum();void Show();class Information/数据:public:char cNum12;/学号char cName12;/姓名char cSex12;/性别int nChinese;int nMath;int nEnglish;int nSum;Information *pSNext;2.添加学生信息模块:图2 添加学生信息流程图添加信息的时候会检测系统中是否含有同样学号的学生信息,如果不存在才可以添加,如果已经存在,需要输出提示。
9、添加学生信息函数:void Worker:Insert()int nCheck = 0;/用于判断是否存在int nScore1;int nScore2;int nScore3;float nSum;cout * endl;cout *请输入学号: * cNum;pSSearch = pSHead;/遍历指针指向头指针,开始遍历链表while (pSSearch != NULL)if (strcmp(pSSearch-cNum, cNum) = 0)/如果等于0表示两边字符数组相等,即存在cout * endl;cout * 输入的学号已存在! * endl;cout * pSNext;/令遍
10、历指针指向下一个节点/查找不存在再插入信息,因此nCkeck 为0if (nCheck = 0)/向链表中插入值cout *请输入姓名: * cName;cout *请输入性别: * cSex;cout *请输入语文成绩: * nChinese;cout *请输入数学成绩: * nMath;cout *请输入英语成绩: * nEnglish;nSum = nChinese + nMath + nEnglish;pSSearch = pSHead;/遍历指针指向头指针pSFormer = pSHead;/最开始初始化为指向头指针if (pSSearch = NULL)/如果头指针为空的话,直接把
11、数据插入链表pToThis = (Information *)malloc(nSize);/开辟一个节点大小的内存区pSHead = pToThis;/令头指针指向第一个节点pToThis-pSNext = NULL;/此时链表内只存在一个节点,因此该节点的指针不指向任何节点for (int i = 0; i cNumi = cNumi;pToThis-cNamei = cNamei;pToThis-cSexi = cSexi;pToThis-nChinese = nChinese;pToThis-nMath = nMath;pToThis-nEnglish = nEnglish;pToThi
12、s-nSum = nSum;else/当头指针不是空的时候,即链表内存在节点,需要遍历节点,我们插入默认按照学号由小到大排序while (pSSearch != NULL)if (strcmp(pSSearch-cNum, cNum) 0)/表示新节点的编号大于正遍历的节点,要插在这个节点之前/插入条件符合,缓存信息小于正在搜索的信息,则插入消息if (pSSearch = pSHead)/如果查找的指针等于头指针pToThis = (Information*)malloc(nSize);pSHead = pToThis;pToThis-pSNext = pSSearch;/令新节点的指针指向
13、刚才正在遍历的节点,让新的节点连入链表for (int i = 0; i cNumi = cNumi;pToThis-cNamei = cNamei;pToThis-cSexi = cSexi;pToThis-nChinese = nChinese;pToThis-nMath = nMath;pToThis-nEnglish = nEnglish;pToThis-nSum = nSum;break;else/当搜索的节点并非首节点pToThis = (Information*)malloc(nSize);pToThis-pSNext = pSSearch;pSFormer-pSNext = p
14、ToThis;for (int i = 0; i cNumi = cNumi;pToThis-cNamei = cNamei;pToThis-cSexi = cSexi;pToThis-nChinese = nChinese;pToThis-nMath = nMath;pToThis-nEnglish = nEnglish;pToThis-nSum = nSum;break;pSFormer = pSSearch;/指向前一个节点的指针指向当前节点pSSearch = pSSearch-pSNext;/当搜寻的尾节点仍然没有打到插入要求if (pSSearch = NULL)pToThis =
15、 (Information*)malloc(nSize);pSFormer-pSNext = pToThis;pToThis-pSNext = NULL;for (int i = 0; i cNumi = cNumi;pToThis-cNamei = cNamei;pToThis-cSexi = cSexi;pToThis-nChinese = nChinese;pToThis-nMath = nMath;pToThis-nEnglish = nEnglish;pToThis-nSum = nSum;break;cout * endl;cout * 信息添加成功! * endl;cout *
16、endl;cout * endl;3.删除信息模块:图3 删除信息流程图在删除信息模块中,首先输入需要删除的学生学号,在信息链表中查询,如果存在,则删除需要删除的信息,如果不存在,则提示所需要删除的信息不存在。删除信息函数代码:void Worker:Delete()cout * endl;cout *请输入需要删除的学号: * cNum;pSSearch = pSHead;pSFormer = pSHead;while (pSSearch != NULL)if (strcmp(pSSearch-cNum, cNum) = 0)if (pSFormer = pSHead)/如果被查到的节点是第
17、一个节点,pFormer是头指针pSHead = pSSearch-pSNext;elsepSFormer-pSNext = pSSearch-pSNext;/令前一个节点中指向下一个节点的指针直接指向被删除节点的下一个节点,以达到删除该节点的目的free(pSSearch);cout * endl;cout * 该学号信息已删除! * endl;cout * pSNext;/pSSearch指向下一个节点if (pSSearch = NULL)/输出cout * endl;cout * 输入的学号信息不存在! * endl;cout * endl;4.修改信息模块图4.修改学生信息流程图在修
18、改学生信息模块中,首先输入需要修改的学号,在信息链表中查找信息,如果查找不到则输出提示,输入的学号不存在,如果存在,则调用类对象成员函数对信息进行修改。修改模块的代码如下:void Worker:Revise()float nSum;/输入需要修改的信息cout * endl;cout *请输入需要修改的学号: * cNum;pSSearch = pSHead;while (pSSearch != NULL)/如果匹配的话,则重新输入各个信息if (strcmp(pSSearch-cNum, cNum) = 0)cout *请输入姓名: * cName;cout *请输入性别: * cSex;
19、cout *请输入语文成绩: * nChinese;cout *请输入数学成绩: * nMath;cout *请输入英语成绩: * nEnglish;nSum = nChinese + nMath + nEnglish;/将修改的信息存入链表for (int i = 0; i cNumi = cNumi;pSSearch-cNamei = cNamei;pSSearch-cSexi = cSexi;pSSearch-nChinese = nChinese;pSSearch-nMath = nMath;pSSearch-nEnglish = nEnglish;pSSearch-nSum = nS
20、um;cout * endl;cout * 信息已修改! * endl;cout * pSNext;/遍历指针指向下一个节点,用于下一次比较if (pSSearch = NULL)cout * endl;cout * 输入的学号信息不存在! * endl;cout * endl;5.查找学生信息图5 查找学生信息流程图在查找信息模块中,利用学号查询符合条件的学生信息均可输出,而且添加了对上下限的判断。查找学生信息代码:void Worker:Search()int nKey = 0;/输入查询的信息cout * endl;cout 请输入学号: * cNum;pSSearch = pSHead
21、;/从头开始遍历链表while (pSSearch != NULL)if (strcmp(pSSearch-cNum, cNum) = 0)nKey = 1;cout * endl;cout * 查询结果 * endl;cout 学号: cNum endl;cout 姓名: cName endl;cout 性别: cSex endl;cout 语文成绩: nChinese endl;cout 数学成绩: nMath endl; cout 英语成绩: nEnglish endl;cout * pSNext;if (nKey = 0)cout * endl;cout * 系统不含该学号信息 * e
22、ndl;cout * endl;6.显示学生信息模块图6.显示学生信息流程图在显示系统所有信息模块中,是一个遍历链表的过程,一边遍历链表一边显示链表中所有的信息。显示所有信息代码:void Worker:Show()pSSearch = pSHead;/从头指针开始一个节点一个节点的显示各个节点的数据cout * endl;cout * 学生信息如下 * endl;cout.width(10);/定义显示距离cout 学号;cout.width(10);cout 姓名;cout.width(10);cout 性别;cout.width(10);cout 语文;cout.width(10);co
23、ut 数学;cout.width(10);cout 英语;cout.width(10);cout 总分 endl;while (pSSearch != NULL)cout.width(10);/定义显示距离cout cNum;cout.width(10);cout cName;cout.width(10);cout cSex;cout.width(10);cout nChinese;cout.width(10);cout nMath;cout.width(10);cout nEnglish;cout.width(10);cout nSum pSNext;cout * pSNext = NULL
24、;for (int i = 0; i cNumi = pSSearch-cNumi;pSNOToThis-cNamei = pSSearch-cNamei;pSNOToThis-cSexi = pSSearch-cSexi;pSNOToThis-nChinese = pSSearch-nChinese;pSNOToThis-nMath = pSSearch-nMath;pSNOToThis-nEnglish = pSSearch-nEnglish;pSNOToThis-nSum = pSSearch-nSum;elsewhile (pSNoSearch != NULL)if (pSNoSear
25、ch-nChinese pSSearch-nChinese)/插入条件符合,缓存信息小于正在搜索的信息,则插入消息if (pSNoSearch = pSNoHead)/如果查找的指针等于头指针pSNOToThis = (Information*)malloc(nSize);pSNoHead = pSNOToThis;pSNOToThis-pSNext = pSNoSearch;for (int i = 0; i cNumi = pSSearch-cNumi;pSNOToThis-cNamei = pSSearch-cNamei;pSNOToThis-cSexi = pSSearch-cSexi
26、;pSNOToThis-nChinese = pSSearch-nChinese;pSNOToThis-nMath = pSSearch-nMath;pSNOToThis-nEnglish = pSSearch-nEnglish;pSNOToThis-nSum = pSSearch-nSum;break;else/当搜索的节点并非首节点pSNOToThis = (Information*)malloc(nSize);pSNOToThis-pSNext = pSNoSearch;pSNoFormar-pSNext = pSNOToThis;for (int i = 0; i cNumi = pS
27、Search-cNumi;pSNOToThis-cNamei = pSSearch-cNamei;pSNOToThis-cSexi = pSSearch-cSexi;pSNOToThis-nChinese = pSSearch-nChinese;pSNOToThis-nMath = pSSearch-nMath;pSNOToThis-nEnglish = pSSearch-nEnglish;pSNOToThis-nSum = pSSearch-nSum;break;pSNoFormar = pSNoSearch;pSNoSearch = pSNoSearch-pSNext;if (pSNoSearch = NULL)pSNOToThis = (Information*)malloc(nSize);pSNoForma