数据结构课程设计学生成绩管理系统C++.docx
- 文档编号:10664722
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:64
- 大小:160.82KB
数据结构课程设计学生成绩管理系统C++.docx
《数据结构课程设计学生成绩管理系统C++.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计学生成绩管理系统C++.docx(64页珍藏版)》请在冰豆网上搜索。
数据结构课程设计学生成绩管理系统C++
课程设计(论文)任务书
软 件学 院 学 院 专业 班
一、课程设计(论文)学 生成绩 管理系 统 的 设 计 与实现
二、课程设计(论文)工作自2014年12月22日起至2012年12月27日止
三、课程设计(论文) 地点:
创新 大楼机房
四、课程设计(论文)内容要求:
1.本课程设计的目的
⑴训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题;
⑵初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;
⑶提高综合运用所学的理论知识和方法独立分析和解决问题的能力,巩固、深化学生的理论知识,提升编程水平。
2。
课程设计的任务及要求
1)基本要求:
⑴要求从分析题目的需求入手,按设计抽象数据类型、构思算法、通过设计实现抽象数据类型、编写上机程序和上机调试等若干步骤完成题目,最终写出完整的报告;
⑵在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率;
⑶程序设计语言推荐使用C/C++,程序书写规范,源程序需必要的注释;
⑷每位同学需提交可独立运行的程序和规范的课程设计报告。
2)课程设计论文编写要求
⑴理论设计部分以课程设计论文的形式提交,格式必须按照课程设计论文标准格式进行书写和装订;
⑵课程设计报告(论文)包括中文目录、设计任务、需求分析、概要设计、详细设计、编码实现、调试分析、总结、谢辞、参考文献、附录等;
⑶设计部分应包含系统功能模块图,调试分析应包括运行截图等。
3)课程设计评分标准:
⑴学习态度:
10分;
⑵系统设计:
20分;
⑶编程调试:
20分;
⑷回答问题:
20分;
⑸论文撰写:
30分。
4)参考文献:
⑴严蔚敏,吴伟民. 数据结构(C语言版)[M].清华大学出版社.2010。
3
⑵严蔚敏,吴伟民。
数据结构题集(C语言版)[M].清华大学出版社. 1999。
2
⑶何钦铭,冯燕等.数据结构课程设计[M].浙江大学出版社.2007.8
5)课程设计进度安排
⑴准备阶段(4学时):
选择设计题目、了解目的要求、查阅相关资料;
⑵程序模块设计分析阶段(4学时):
程序概要设计、详细设计;
⑶代码编写调试阶段(8学时):
程序模块代码编写、调试、测试;
⑷撰写论文阶段(4学时):
总结设计任务和设计内容,撰写设计论文.
学生签名:
年月 日
6)课程设计题目具体要求:
能够实现对学生成绩的常用管理功能。
⑴采用一定的存储结构对学生成绩进行管理;
⑵可以进行成绩的录入、查询、修改、删除等操作;
⑶可以查询某门课程的平均分,学生的排名,不同分数段的学生人数及学生信息等;
⑷可以查询某学生的各课程分数,总分及学生的班级排名等;
⑸可以按学号排序输出全部学生的成绩信息、总分及班级排名等。
课程设计(论文)评审意见
(1)学习态度(10分):
优( )、良()、中()、一般( )、差();
(2)系统设计(20分):
优()、良()、中( )、一般( )、差();
(3)编程调试(20分):
优()、良( )、中()、一般( )、差( );
(4)回答问题(20分):
优()、良()、中( )、一般( )、差();
(5)论文撰写(30分):
优()、良( )、中()、一般()、差( );
(6)格式规范性及考勤是否降等级:
是( )、否( )
评阅人:
周娟职称:
讲师
2014年12 月28日
目 录
第1章设计任务分析ﻩ1
第2章功能实现详细设计2
第3章功能测试ﻩ8
第5章小结20
第6章源代码21
第1章 设计任务分析
1.1.需求与功能分析
1.1.1.需求分析
学生成绩管理系统是一个教育单位不可缺少的部分它的内容对于学校的决策者和管理者来说都至关重要所以学生成绩管理系统应该能够为用户提供充足的信息和快捷的查询手段。
以前各个学校的学生成绩管理基本上都是靠手工进行,但随着各个学校的规模增大,有关学生成绩管理工作所涉及的数据量也越来越大,有的学校不得不靠增加人力、物力来进行学生成绩管理.这种管理方式存在着许多缺点,如:
效率低、保密性差等,另外其所用时间长,产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。
如今学校的学生越来越多,成绩管理的工作量越来越大,手工管理成绩的弊端也越来越明显。
作为计算机应用的一部分,使用计算机对学生档案信息进行管理具有手工管理所无法比拟的优点,如检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等,能够极大地提高学生档案管理的效率.所以我想借本次课程设计之际,设计一个简易的学生成绩管理系统.
1.1.2.功能分析
1)输入输出的形式和输入值的范围
首先输入学生个数按回车键,然后按照提示选择输入学生信息并将学生信息保存在文本文档中,具体对学生信息进行插入删除查询操作时,将保存在文本文档中的学生信息提取出来保存在自己定义的数据结构中,然后再对该数据结构进行操作,所有操作完成后或者在相应的命令后再将学生信息保存到文本文档中.输入数据类型主要是char、int、float等数据类型,输入内容包括学号、姓名、基础会计成绩、大学英语成绩、数据结构成绩、总分、平均分等数据.输出的形式为学号、姓名、基础会计成绩、大学英语成绩、数据结构成绩、总分、平均分等数据.
2)程序所达到的功能
i.数据输入功能,输入的数据能最终保存在文件中;
ii.数据删除功能,能最终从文件中删除;
iii.多种排序功能,根据自己设计的数据结构,设计排序算法;
iv.多种查询功能(如按学号查询、按姓名查询等)及输出功能;
v.学生信息的修改(比如修改学生姓名,修改学生某门课程的成绩等);
vi.其他功能(如各种统计,统计每个学生所有课程的平均分,统计某门课程的所有学生的平均分等等)
ﻬ第2章 功能实现详细设计
2.
2.1.库函数
先编入系统所需的库函数,使程序可运行。
#include<stdio。
h〉
#include〈iostream〉
#include〈stdlib。
h>
#include<iomanip>//主要是对cin,cout之类的一些操纵运算,是I/O流控制头文件
#include
2.2.菜单界面的设计
2.2.1.主菜单的设计
在主界面中包括“<1〉输入学生信息并保存到文件<2>读取文件并输出学生信息<3>按学号查询<4>按姓名查询〈5〉按学号修改信息〈6>插入学生信息<7〉按学号删除信息 <8>各科成绩排序 〈9〉按总分降序排序<10>各科成绩统计〈11〉分数段查找 〈12〉按学号排序<13>退出"等功能。
每个函数体如下:
voidinput(Stu*r); //输入
void output(Stu*r); //输出
voidsearchnum(Stu *r);//按学号查找
voidsearchname(Stu*r);//按姓名查找
void modify(Stu*r); //修改学生信息
Stu*insert(Stu *r); //插入信息
void erase(Stu*r); //按学号删除信息
voidsortmenu(); //排序菜单
voidsortsum(Stu *r); //按总分降序排序
voidstat(Stu*r); //统计各科总分和平均分信息
voidintmenu(); //分数段查找菜单
voidsortnum(Stu*r);//按学号排序
2.2.2.排序菜单的设计
在排序菜单中包括“〈1>按基础会计成绩排序〈2〉按大学英语成绩排序<3>按数据结构成绩排序〈4〉返回上级菜单"等功能.每个函数体如下:
void sort_BA(Stu*r); //基础会计成绩排序
voidsort_UE(Stu *r); //大学英语成绩排序
voidsort_DS(Stu *r); //数据结构成绩排序
2.2.3.分数段查找菜单的设计
在分数段查找菜单中包括“<1>基础会计分数段查找<2〉大学英语分数段查找〈3>数据结构分数段查找〈4〉返回上级菜单”等功能。
每个函数体如下:
voidint_BA(Stu*r); //基础会计分数段查找
voidint_UE(Stu*r);//大学英语分数段查找
voidint_DS(Stu *r); //数据结构分数段查找
2.3.详细设计
2.3.1.系统流程图
2.3.2.
1.
1.1.
1.2.
1.3.
1)
2)
2.1.
2.2.
2.3.
2.3.1.
2.3.2.各功能模块的设计
1)主函数模块
用函数int main()来实现,主要功能是显示菜单,让用户根据提示选择操作,首先定义一个指针数组(全局使用)Stu *p=(Stu*)new Stu[num];此处num指学生个数,并不是学号,这里应用了do-while和switch—case语句来进行循环选择,最后若用户选择“13”则保存记录并退出循环.
2)学生记录输入模块
用函数voidinput(Stu*r)来实现,在主菜单选择“1”进入输入模块之后用户需要输入所需学生个数的学生信息,包括学号、姓名、各科成绩等,输入完成之后会返回主菜单。
本函数根据设计的条件判断循环来判断是否有重复学号输入。
本函数还将算出学生的总分与平均分并按学号的默认顺序将其与输入的原始学生记录保存的文件中去。
3)学生记录输入模块
用函数voidoutput(Stu*r)来实现,在系统已经录入了学生资料的前提下,调用本函数可以输出学生资料。
其中setw()控制域宽,括号里整型数据的数值代表域宽的字符数。
4)按学号查找学生记录模块
用函数voidsearchnum(Stu*r)来实现,首先提示用户输入要查找的学生学号,再用for循环语句和if判断语句进行循环判断来进行查找,if(r[m].num==n)表示找到学生记录,然后显示学生记录并跳出循环,if(r[m]。
num!
=n)表示未找到学生记录并输出提示“该学号不存在!
”。
5)按姓名查找学生记录模块
用函数voidsearchname(Stu*r)来实现,首先提示用户输入要查找的学生姓名,再用for循环语句和if判断语句进行循环判断来进行查找,if(r[m].name[0]==n[0])表示找到学生记录,然后显示学生记录并跳出循环,if(r[m].name[0]!
=n[0])表示未找到学生记录并输出提示“该姓名不存在!
”.
6)按学号修改学生信息模块
用函数voidmodify(Stu*r)来实现,首先提示用户输入要修改信息的学生序号,再通过if条件语句进行判断输入的学号是否存在,if(r[m]。
num!
=n)表示输入的学生学号不存在,输出提示“该学号不存在”,再利用begin标记和goto语句重新开始循环并提示用户重新输入要修改的学生学号.if(r[m]。
num==n)若输入的学生学号存在,则先输出修改前的学生信息,此处有一个while循环语句和switch—case选择语句,用来选择修改学生的某一科成绩,并让用户选择是否继续进行修改.最后将修改过后的记录写入文件中,并输出提示“文件已修改并写入”.
7)插入学生信息模块
用函数Stu*insert(Stu *r)来实现,主要功能是添加学生资料。
在此模块中定义了另一个指针数组:
Stu*y=(Stu*)newStu(num+1);用来存放新添加的学生记录。
再利用for循环语句进行输入新学生记录,最后输出一个提示语句让用户判断是否继续输入,若用户输入“Y"或“y”则继续输入,否则将返回主菜单.
8)删除学生记录模块
用函数void erase(Stu*r)来实现,首先对文件进行读取,之后的if判断语句根据用户输入的学号来显示删除前的信息记录,然后用for循环语句循环把后一位的信息提前一位,整体数量建议,来进行全局变量的修改,之后再把修改过后的信息记录保存到文件中去.
9)各科成绩降序与学号(冒泡)排序模块
用函数void sort_BA(Stu*r),void sort_UE(Stu*r),void sort_DS(Stu*r)三个函数来实现,主要功能是利用用户保存在文件的学生记录按单科成绩进行降序排序。
首先对文件进行读取,然后进行冒泡排序.冒泡排序有两个优点,一是代码比较容易,二是具有稳定性。
这里的稳定性是指原序列中相同两元素的相对顺序仍然保持到排序后的序列.冒泡排序时进过n-1趟子排序完成的,第i趟子排序从第1个数至第n+1个数,若第i个数比后一个数大则交换两数.排序之后,将排序之后的结果写入文件,再读取文件的时候,输出的就是按单科成绩排序后的结果。
10)总分降序排序模块
用函数voidsortsum(Stu *r)来实现,主要功能是利用保存在文件的学生总分进行排序。
首先对文件进行读取,然后进行选择排序。
其基本思想是:
n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果:
①初始状态:
无序区为R[1..n],有序区为空.②第1趟排序:
在无序区R[1。
。
n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换,使R[1.。
1]和R[2..n]分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
……③第i趟排序第i趟排序开始时,当前有序区和无序区分别为R[1..i-1]和R(i.。
n).该趟排序从当前无序区中选出关键字最小的记录R[k],将它与无序区的第1个记录R交换,使R[1。
.i]和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。
11)各科成绩统计模块
用函数voidstat(Stu*r)来实现,主要功能是计算各科总分和各科平均分。
12)各科分数段查找模块
用函数voidint_BA(Stu*r),void int_UE(Stu*r),void int_DS(Stu*r),voidintsum(Stu*r);四个函数实现,首先提示用户输入要查找的单科成绩或总分的上限与下限,然后通过for循环语句遍历学生记录找到符合条件的学生并输入相应学生记录.
第3章功能测试
输入学生人数之后进入主菜单界面,在主菜单选择1开始输入学生信息。
输入完成后的界面:
Student.txt:
1 JBJ91.0 92.0 93.0 276。
092。
0
2 RS87.0 88。
0 89。
0264。
088。
0
3 TT93.094.0 95.0282。
094.0
4DB 84.0 85。
086。
0 255.0 85.0
5 AJS 92.0 93。
0 94.0279.0 93。
0
返回主菜单后选择2读入文件信息并输出。
返回主菜单后选择3按学号查找学生信息。
ﻬ返回主菜单后选择4按姓名查找学生信息.
返回主菜单后选择5按学号修改学生信息。
修改完成后的界面:
Student。
txt:
1JBJ 91.0 92.0 93。
0276.0 92.0
2 RS 87.088。
0 89.0 264。
0 88。
0
3 TT 93。
094。
095。
0 282.0 94。
0
4 DB84.085.086.0 255.085.0
5AJS 92。
0 93。
094。
0279.0 93.0
返回主菜单后选择6插入学生信息.
Student.txt:
1 JBJ 91.092.0 93。
0 276.092.0
2 RS 87.0 88。
0 89。
0 264.088.0
3 TT93。
0 94。
095.0 282.094.0
4 DB84.0 85.086。
0255.0 85.0
5 AJS 92。
0 93。
0 94.0279。
0 93。
0
6 HM 99.0 98。
0 97.0 294。
0 98。
0
返回主菜单后选择7,按学号删除学生记录。
student.txt:
1 JBJ91.092.0 93。
0276.0 92。
0
2RS87.0 88。
0 89.0 264。
0 88。
0
3 TT 93。
0 94.0 95.0 282。
094.0
4 DB 84.085.0 86。
0 255。
0 85.0
5AJS92.0 93。
0 94.0 279。
0 93.0
返回主菜单后选择8进入排序菜单,通过选择1—3选择单科成绩进行排序.
以选择1基础会计成绩排序为例:
排序结果:
Student。
txt:
3 TT 93.0 94.0 95。
0 282.094.0
5 AJS92.093.094.0 279.0 93.0
1 JBJ91。
0 92。
093.0 276.092.0
2 RS 87.0 88。
0 89。
0 264.088。
0
4 DB84.0 85。
086。
0 255.0 85.0
返回菜单后选择9按总分降序对学生记录进行排序。
排序结果:
Student。
txt
3 TT 93.0 94。
0 95.0 282。
094。
0
5 AJS92。
0 93.094.0 279.0 93。
0
1 JBJ 91.092.0 93.0276.0 92.0
2RS87。
0 88.0 89.0 264。
088.0
4 DB 84.0 85。
0 86。
0 255。
0 85.0
返回主菜单后选择10对各科总分以及平均分进行统计.
返回主菜单后选择11进入分数段查找菜单对学生记录的单科成绩或总成绩进行分数段查找.
以数据结构为例:
返回主菜单之后选择12对学生记录进行按学号排序.
排序结果:
student.txt:
1 JBJ 91.092.0 93.0 276.0 92。
0
2RS87.0 88.0 89.0 264.0 88.0
3 TT93.094.0 95.0282.0 94.0
4 DB 84.0 85.0 86.0 255。
0 85。
0
5 AJS92。
093。
0 94.0279。
0 93.0
第4章调试与改进
程序编译连接通过后在调试过程中以及本报告的编写过程中遇到了不少的问题,经过几天的调试与修改大部分问题已经成功解决。
遇到并以解决的部分问题如下:
1)在多处需要用户输入数字时没有设置数字范围或者没有限定用户只能输入数字,导致用户在输入错误时出现越界问题或者程序崩溃。
以用户在主菜单输入数字选择操作时为例,解决方法为利用while循环语句进行循环判断,在用户输入越界的数字或者输入非数字时输出错误语句并利用cin。
clear();与cin。
sync();语句清除错误状态与输入流再提示用户重新输入.
2)插入学生记录时没有进行新插入的学生学号是否重复的检查,利用for循环语句与if判断语句进行循环判断,在用户输入重复的学生学号时输出提示该学号已存在并利用cin。
clear();与cin.sync();语句清除错误状态与输入流再提示用户重新输入。
3)修改学生记录函数voidmodify(Stu*r)没有判断用户输入的学号是否存在,初次采用修改方式是增加一个if判断语句if(r[m].serial!
=n)并将此这个判断过程放在了for(m=0;m〈num;m++)的大循环内,思考后发现在m遍历了一次num之后再进行此判断必定输出错误提示,并跳到定义的begin标记处,陷入了死循环。
思考过后定义一个新变量l,在每次满足if(r[m].serial!
=n)时自增1,在循环结束以后若l的值等于num则输出错误提示并提示用户重新输入。
修改过后发现在执行完了修改成绩之后仍会输出错误提示。
最后定义了end标记,在用户输入了一个存在的学号之后执行修改成绩完毕后直接利用goto语句跳到end标记处。
ﻬ第5章小结
通过本次课程设计,我巩固了部分本学期以及上学期所学的理论知识,有了一些新的理解与体会.对于一些平时似懂非懂的知识,在这次课程设计中也解决了一些困惑,虽然还是不能够全面的理解,但是已经有了进步.在课程设计中遇到不少困难,包括上一章提及的几个问题与已经解决的一些小问题,通过查阅资料、与同学讨论,在应用课本的前提下。
拓展课外知识,基本完成了本次课程设计,虽然其中还有许多不足之处,但是从中我学到了许多东西,懂得了不能拘泥于课本上的知识形式,应该对其灵活运用.
本次课程设计使我认识到自己对知识的掌握不够全面,而且感觉到我们在学习专业知识的同时还需要加强对自己逻辑性思维的培养以及对其他方面知识的学习,逻辑性思维对于能不能写出一个好的算法以及排除代码错误方面至关重要。
在编程的过程中我又重新复习了本学期的数据结构以及上学期的C++程序设计的课本,对一些以前学过的知识有了更深的理解,对一些以前没学过的知识有了初步的认识,当自己把程序一点点完善时让我对学好数据结构这门课程更有信心了,以前一直感觉枯燥难学的数据结构,在编程的过程中好像显得不那么高深了。
在以后的学习过程中,我一定会认真负责地对待课本中的知识点,进一步充实、提高自己。
争取在不断的练习中提高自己的层次。
第6章源代码
#include<stdio.h〉
#include
#include #include<stdlib.h> #include〈conio.h> using namespace std; structStu{ ﻩintserial; ﻩcharname[50]; ﻩfloatBA_score;//基础会计成绩 floatUE_score;//大学英语成绩 floatDS_score;//数据结构成绩 floatsum;//总分 ﻩfloataverage;};//平均分 int num=0; intch,choice; voidinput(Stu*r); //输入 voidoutput(Stu*r); //输出 voidmenu(); //菜单界面 voidsortmenu();//排序菜单 voidintmenu(); //分数段查找菜单 void searchnum(Stu*r); //按学号查找 voidsearchname(Stu *r); //按姓名查找 void modify(Stu*r); //修改学生信息 v
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 学生 成绩管理系统 C+