1、课程设计(论文)任务书软件学院学院专业班一、课程设计(论文)学生成绩管理系统的设计与实现二、课程设计(论文)工作自2014年12月22日起至2012年12月27日止三、课程设计(论文) 地点:创 新 大 楼 机 房 四、课程设计(论文)内容要求:1本课程设计的目的训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题;初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;提高综合运用所学的理论知识和方法独立分析和解决问题的能力,巩固、深化学生的理论知识,提升编程水平。2课程设计的任务及要求1)基本要求:要求从分析题目的需求入手,按设计
2、抽象数据类型、构思算法、通过设计实现抽象数据类型、编写上机程序和上机调试等若干步骤完成题目,最终写出完整的报告;在程序设计阶段应尽量利用已有的标准函数,加大代码的重用率;程序设计语言推荐使用C/C+,程序书写规范,源程序需必要的注释;每位同学需提交可独立运行的程序和规范的课程设计报告。2)课程设计论文编写要求理论设计部分以课程设计论文的形式提交,格式必须按照课程设计论文标准格式进行书写和装订;课程设计报告(论文)包括中文目录、设计任务、需求分析、概要设计、详细设计、编码实现、调试分析、总结、谢辞、参考文献、附录等;设计部分应包含系统功能模块图,调试分析应包括运行截图等。3)课程设计评分标准:学
3、习态度:10分;系统设计:20分;编程调试:20分;回答问题:20分;论文撰写:30分。4)参考文献:严蔚敏,吴伟民. 数据结构(C语言版)M。 清华大学出版社. 2010。3 严蔚敏,吴伟民. 数据结构题集(C语言版)M. 清华大学出版社。 1999.2何钦铭,冯燕等。 数据结构课程设计M。 浙江大学出版社。 2007。85)课程设计进度安排准备阶段(4学时):选择设计题目、了解目的要求、查阅相关资料;程序模块设计分析阶段(4学时):程序概要设计、详细设计;代码编写调试阶段(8学时):程序模块代码编写、调试、测试;撰写论文阶段(4学时):总结设计任务和设计内容,撰写设计论文.学生签名:年月日
4、6)课程设计题目具体要求:能够实现对学生成绩的常用管理功能.采用一定的存储结构对学生成绩进行管理;可以进行成绩的录入、查询、修改、删除等操作;可以查询某门课程的平均分,学生的排名,不同分数段的学生人数及学生信息等;可以查询某学生的各课程分数,总分及学生的班级排名等;可以按学号排序输出全部学生的成绩信息、总分及班级排名等。课程设计(论文)评审意见(1)学习态度(10分):优()、良()、中()、一般()、差();(2)系统设计(20分):优()、良()、中()、一般()、差();(3)编程调试(20分):优()、良()、中()、一般()、差();(4)回答问题(20分):优()、良()、中()、
5、一般()、差();(5)论文撰写(30分):优()、良()、中()、一般()、差();(6)格式规范性及考勤是否降等级:是()、否()评阅人:周娟职称:讲师2014年12 月28日目 录第1章 设计任务分析1第2章 功能实现详细设计2第3章 功能测试8第4章 调试与改进19第5章 小结20第6章 源代码21第1章 设计任务分析1.1. 需求与功能分析1.1.1. 需求分析学生成绩管理系统是一个教育单位不可缺少的部分它的内容对于学校的决策者和管理者来说都至关重要所以学生成绩管理系统应该能够为用户提供充足的信息和快捷的查询手段.以前各个学校的学生成绩管理基本上都是靠手工进行,但随着各个学校的规模增
6、大,有关学生成绩管理工作所涉及的数据量也越来越大,有的学校不得不靠增加人力、物力来进行学生成绩管理。这种管理方式存在着许多缺点,如:效率低、保密性差等,另外其所用时间长,产生大量的文件和数据,这对于查找、更新和维护都带来了不少的困难。如今学校的学生越来越多,成绩管理的工作量越来越大,手工管理成绩的弊端也越来越明显。作为计算机应用的一部分,使用计算机对学生档案信息进行管理具有手工管理所无法比拟的优点,如检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等,能够极大地提高学生档案管理的效率.所以我想借本次课程设计之际,设计一个简易的学生成绩管理系统.1.1.2. 功能分析1) 输入输
7、出的形式和输入值的范围首先输入学生个数按回车键,然后按照提示选择输入学生信息并将学生信息保存在文本文档中,具体对学生信息进行插入删除查询操作时,将保存在文本文档中的学生信息提取出来保存在自己定义的数据结构中,然后再对该数据结构进行操作,所有操作完成后或者在相应的命令后再将学生信息保存到文本文档中.输入数据类型主要是char、int、float等数据类型,输入内容包括学号、姓名、基础会计成绩、大学英语成绩、数据结构成绩、总分、平均分等数据。输出的形式为学号、姓名、基础会计成绩、大学英语成绩、数据结构成绩、总分、平均分等数据。2) 程序所达到的功能i. 数据输入功能,输入的数据能最终保存在文件中;
8、ii. 数据删除功能,能最终从文件中删除;iii. 多种排序功能,根据自己设计的数据结构,设计排序算法;iv. 多种查询功能(如按学号查询、按姓名查询等)及输出功能;v. 学生信息的修改(比如修改学生姓名,修改学生某门课程的成绩等);vi. 其他功能(如各种统计,统计每个学生所有课程的平均分,统计某门课程的所有学生的平均分等等)第2章功能实现详细设计1.2. 库函数先编入系统所需的库函数,使程序可运行。#includestdio。h#includeiostreamincludestdlib。h#include /主要是对cin,cout之类的一些操纵运算,是I/O流控制头文件include输入
9、学生信息并保存到文件2读取文件并输出学生信息3按学号查询4按姓名查询5按学号修改信息6插入学生信息7按学号删除信息 8各科成绩排序9按总分降序排序10各科成绩统计 11分数段查找 12按学号排序 13退出”等功能。每个函数体如下:void input(Stu r); /输入void output(Stu *r); /输出void searchnum(Stu r); /按学号查找void searchname(Stu r); /按姓名查找void modify(Stu r); /修改学生信息Stu *insert(Stu *r); /插入信息void erase(Stu r); /按学号删除信息
10、void sortmenu(); /排序菜单void sortsum(Stu *r); /按总分降序排序void stat(Stu r); /统计各科总分和平均分信息void intmenu(); /分数段查找菜单图2.2.1 主菜单界面 在此界面中用户可以选择要操作的选项,回车之后即进行相关操作或进入相关二级菜单void sortnum(Stu *r); /按学号排序1.3.2. 排序菜单的设计在排序菜单中包括“1按基础会计成绩排序2按大学英语成绩排序 3按数据结构成绩排序 4返回上级菜单等功能.每个函数体如下:void sort_BA(Stu r); /基础会计成绩排序void sort_
11、UE(Stu *r); /大学英语成绩排序图2.2.2 排序菜单界面void sort_DS(Stu r); /数据结构成绩排序1.3.3. 分数段查找菜单的设计在分数段查找菜单中包括“基础会计分数段查找2大学英语分数段查找数据结构分数段查找4返回上级菜单”等功能.每个函数体如下:void int_BA(Stu *r); /基础会计分数段查找void int_UE(Stu r); /大学英语分数段查找图2.2.3 分数段查找菜单界面void int_DS(Stu r); /数据结构分数段查找1.4. 详细设计1.4.1. 系统流程图输入学生人数主菜单界面输入学生成绩输出学生成绩按学号查询成绩按
12、姓名查询成绩修改学生信息各科成绩排序按学号删除信息插入学生信息按总分降序排序各科成绩统计分数段查找按学号排序退出退出1.1.1.1. 各功能模块的设计1) 主函数模块用函数int main()来实现,主要功能是显示菜单,让用户根据提示选择操作,首先定义一个指针数组(全局使用)Stu *p=(Stu *)new Stunum; 此处num指学生个数,并不是学号,这里应用了do-while和switchcase语句来进行循环选择,最后若用户选择“13”则保存记录并退出循环。2) 学生记录输入模块用函数void input(Stu *r)来实现,在主菜单选择“1”进入输入模块之后用户需要输入所需学生
13、个数的学生信息,包括学号、姓名、各科成绩等,输入完成之后会返回主菜单。本函数根据设计的条件判断循环来判断是否有重复学号输入.本函数还将算出学生的总分与平均分并按学号的默认顺序将其与输入的原始学生记录保存的文件中去。3) 学生记录输入模块用函数void output(Stu *r)来实现,在系统已经录入了学生资料的前提下,调用本函数可以输出学生资料.其中setw()控制域宽,括号里整型数据的数值代表域宽的字符数。4) 按学号查找学生记录模块用函数void searchnum(Stu *r)来实现,首先提示用户输入要查找的学生学号,再用for循环语句和if判断语句进行循环判断来进行查找,if(rm
14、.num=n)表示找到学生记录,然后显示学生记录并跳出循环,if(rm。num!=n)表示未找到学生记录并输出提示“该学号不存在!”。5) 按姓名查找学生记录模块用函数void searchname(Stu r)来实现,首先提示用户输入要查找的学生姓名,再用for循环语句和if判断语句进行循环判断来进行查找,if(rm。name0=n0) 表示找到学生记录,然后显示学生记录并跳出循环,if(rm。name0!=n0)表示未找到学生记录并输出提示“该姓名不存在!”。6) 按学号修改学生信息模块用函数void modify(Stu *r)来实现,首先提示用户输入要修改信息的学生序号,再通过if条件
15、语句进行判断输入的学号是否存在,if(rm。num!=n)表示输入的学生学号不存在,输出提示“该学号不存在”,再利用begin标记和goto语句重新开始循环并提示用户重新输入要修改的学生学号。if(rm。num=n)若输入的学生学号存在,则先输出修改前的学生信息,此处有一个while循环语句和switchcase选择语句,用来选择修改学生的某一科成绩,并让用户选择是否继续进行修改.最后将修改过后的记录写入文件中,并输出提示“文件已修改并写入”.7) 插入学生信息模块用函数Stu insert(Stu *r)来实现,主要功能是添加学生资料。在此模块中定义了另一个指针数组:Stu y=(Stu *
16、)new Stu(num+1);用来存放新添加的学生记录。再利用for循环语句进行输入新学生记录,最后输出一个提示语句让用户判断是否继续输入,若用户输入“Y或“y”则继续输入,否则将返回主菜单。8) 删除学生记录模块用函数void erase(Stu r)来实现,首先对文件进行读取,之后的if判断语句根据用户输入的学号来显示删除前的信息记录,然后用for循环语句循环把后一位的信息提前一位,整体数量建议,来进行全局变量的修改,之后再把修改过后的信息记录保存到文件中去。9) 各科成绩降序与学号(冒泡)排序模块用函数void sort_BA(Stu r),void sort_UE(Stu r),vo
17、id sort_DS(Stu r)三个函数来实现,主要功能是利用用户保存在文件的学生记录按单科成绩进行降序排序.首先对文件进行读取,然后进行冒泡排序。冒泡排序有两个优点,一是代码比较容易,二是具有稳定性。这里的稳定性是指原序列中相同两元素的相对顺序仍然保持到排序后的序列。冒泡排序时进过n-1趟子排序完成的,第i趟子排序从第1个数至第n+1个数,若第i个数比后一个数大则交换两数。排序之后,将排序之后的结果写入文件,再读取文件的时候,输出的就是按单科成绩排序后的结果。10) 总分降序排序模块用函数void sortsum(Stu r)来实现,主要功能是利用保存在文件的学生总分进行排序。首先对文件进
18、行读取,然后进行选择排序.其基本思想是:n个记录的文件的直接选择排序可经过n1趟直接选择排序得到有序结果:初始状态:无序区为R1。.n,有序区为空。第1趟排序:在无序区R1。.n中选出关键字最小的记录Rk,将它与无序区的第1个记录R1交换,使R1。.1和R2。n分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。第i趟排序第i趟排序开始时,当前有序区和无序区分别为R1。.i1和R(i。n)。该趟排序从当前无序区中选出关键字最小的记录 Rk,将它与无序区的第1个记录R交换,使R1。.i和R分别变为记录个数增加1个的新有序区和记录个数减少1个的新无序区。11) 各科成绩统计模块用函数v
19、oid stat(Stu r)来实现,主要功能是计算各科总分和各科平均分。12) 各科分数段查找模块用函数void int_BA(Stu r),void int_UE(Stu r),void int_DS(Stu r),void intsum(Stu *r);四个函数实现,首先提示用户输入要查找的单科成绩或总分的上限与下限,然后通过for循环语句遍历学生记录找到符合条件的学生并输入相应学生记录。第3章 功能测试图3-1 在主菜单选择1开始输入学生信息输入学生人数之后进入主菜单界面,在主菜单选择1开始输入学生信息.图3-2 输入学生信息完成后的界面输入完成后的界面:Student.txt:1 J
20、BJ 91.0 92.0 93。0 276.0 92.02 RS 87。0 88。0 89.0 264。0 88.03 TT 93。0 94。0 95。0 282.0 94。04 DB 84。0 85.0 86。0 255.0 85.05 AJS 92。0 93。0 94。0 279.0 93。0图3-3 输出文件内的学生信息返回主菜单后选择2读入文件信息并输出.图3-4 按学号查找学生信息返回主菜单后选择3按学号查找学生信息.图3-5 按学生姓名查找返回主菜单后选择4按姓名查找学生信息.图3-6 按学号修改学生信息返回主菜单后选择5按学号修改学生信息。图3-7 修改完成后的界面修改完成后的界
21、面:Student.txt:1 JBJ 91。0 92.0 93。0 276.0 92。02 RS 87。0 88。0 89。0 264.0 88.03 TT 93。0 94.0 95.0 282.0 94。04 DB 84。0 85。0 86.0 255.0 85。05 AJS 92.0 93.0 94.0 279.0 93.0图3-8 插入学生信息返回主菜单后选择6插入学生信息.Student.txt:1 JBJ 91。0 92。0 93.0 276。0 92.02 RS 87。0 88。0 89。0 264。0 88。03 TT 93.0 94。0 95。0 282。0 94。04 DB
22、 84.0 85.0 86。0 255.0 85.05 AJS 92。0 93。0 94.0 279。0 93。06 HM 99.0 98。0 97。0 294。0 98。0图3-9 按学号删除学生记录返回主菜单后选择7,按学号删除学生记录.student。txt:1 JBJ 91。0 92。0 93.0 276。0 92。02 RS 87.0 88。0 89。0 264.0 88.03 TT 93。0 94.0 95.0 282。0 94。04 DB 84。0 85.0 86.0 255。0 85.05 AJS 92。0 93。0 94。0 279。0 93。0图3-10 排序菜单返回主菜单
23、后选择8进入排序菜单,通过选择13选择单科成绩进行排序.图3-11 排序完成的提示以选择1基础会计成绩排序为例:图3-12 按基础会计学成绩降序对学生记录进行排序的排序结果排序结果:Student。txt:3 TT 93。0 94。0 95.0 282.0 94.05 AJS 92.0 93.0 94。0 279.0 93。01 JBJ 91.0 92。0 93。0 276.0 92。02 RS 87。0 88。0 89.0 264。0 88.04 DB 84。0 85。0 86。0 255.0 85.0图3-13 按总分降序排序返回菜单后选择9按总分降序对学生记录进行排序.图3-14 按总分
24、降序排序对学生记录排序的结果排序结果:Student。txt3 TT 93.0 94.0 95.0 282。0 94.05 AJS 92。0 93.0 94。0 279。0 93.01 JBJ 91。0 92.0 93。0 276。0 92。02 RS 87。0 88.0 89.0 264。0 88。04 DB 84.0 85.0 86.0 255.0 85。0图3-15 各科总分和平均分的统计返回主菜单后选择10对各科总分以及平均分进行统计。图3-16 分数段查找菜单返回主菜单后选择11进入分数段查找菜单对学生记录的单科成绩或总成绩进行分数段查找.图3-17 数据结构分数段查找结果以数据结构
25、为例:图3-18 提示用户对学生记录已完成按学号排序返回主菜单之后选择12对学生记录进行按学号排序.图3-19 按学生学号对学生记录进行排序的排序结果排序结果:student。txt:1 JBJ 91。0 92。0 93.0 276.0 92.02 RS 87.0 88。0 89。0 264.0 88。03 TT 93.0 94.0 95.0 282。0 94。04 DB 84。0 85.0 86.0 255.0 85.05 AJS 92。0 93。0 94.0 279.0 93.0第4章 调试与改进程序编译连接通过后在调试过程中以及本报告的编写过程中遇到了不少的问题,经过几天的调试与修改大部
26、分问题已经成功解决。遇到并以解决的部分问题如下:1) 在多处需要用户输入数字时没有设置数字范围或者没有限定用户只能输入数字,导致用户在输入错误时出现越界问题或者程序崩溃.以用户在主菜单输入数字选择操作时为例,解决方法为利用while循环语句进行循环判断,在用户输入越界的数字或者输入非数字时输出错误语句并利用cin。clear();与cin。sync();语句清除错误状态与输入流再提示用户重新输入.2) 插入学生记录时没有进行新插入的学生学号是否重复的检查,利用for循环语句与if判断语句进行循环判断,在用户输入重复的学生学号时输出提示该学号已存在并利用cin。clear();与cin。sync
27、();语句清除错误状态与输入流再提示用户重新输入.3) 修改学生记录函数void modify(Stu *r)没有判断用户输入的学号是否存在,初次采用修改方式是增加一个if判断语句if(rm.serial!=n)并将此这个判断过程放在了for(m=0;mnum;m+)的大循环内,思考后发现在m遍历了一次num之后再进行此判断必定输出错误提示,并跳到定义的begin标记处,陷入了死循环.思考过后定义一个新变量l,在每次满足if(rm。serial!=n)时自增1,在循环结束以后若l的值等于num则输出错误提示并提示用户重新输入。修改过后发现在执行完了修改成绩之后仍会输出错误提示。最后定义了end
28、标记,在用户输入了一个存在的学号之后执行修改成绩完毕后直接利用goto语句跳到end标记处。第5章 小结通过本次课程设计,我巩固了部分本学期以及上学期所学的理论知识,有了一些新的理解与体会。对于一些平时似懂非懂的知识,在这次课程设计中也解决了一些困惑,虽然还是不能够全面的理解,但是已经有了进步。在课程设计中遇到不少困难,包括上一章提及的几个问题与已经解决的一些小问题,通过查阅资料、与同学讨论,在应用课本的前提下.拓展课外知识,基本完成了本次课程设计,虽然其中还有许多不足之处,但是从中我学到了许多东西,懂得了不能拘泥于课本上的知识形式,应该对其灵活运用。本次课程设计使我认识到自己对知识的掌握不够
29、全面,而且感觉到我们在学习专业知识的同时还需要加强对自己逻辑性思维的培养以及对其他方面知识的学习,逻辑性思维对于能不能写出一个好的算法以及排除代码错误方面至关重要.在编程的过程中我又重新复习了本学期的数据结构以及上学期的C+程序设计的课本,对一些以前学过的知识有了更深的理解,对一些以前没学过的知识有了初步的认识,当自己把程序一点点完善时让我对学好数据结构这门课程更有信心了,以前一直感觉枯燥难学的数据结构,在编程的过程中好像显得不那么高深了.在以后的学习过程中,我一定会认真负责地对待课本中的知识点,进一步充实、提高自己.争取在不断的练习中提高自己的层次。第6章 源代码includestdio.h
30、#includeiostreamincludeiomanipincludestdlib.hincludeconio。husing namespace std;struct Stuint serial;char name50;float BA_score; /基础会计成绩float UE_score; /大学英语成绩float DS_score; /数据结构成绩float sum; /总分float average; ;/平均分int num=0;int ch,choice;void input(Stu r); /输入void output(Stu r); /输出void menu(); /菜单
31、界面void sortmenu(); /排序菜单void intmenu(); /分数段查找菜单void searchnum(Stu r); /按学号查找void searchname(Stu r); /按姓名查找void modify(Stu *r); /修改学生信息void erase(Stu r); /按学号删除信息void sort_BA(Stu *r); /基础会计成绩排序void sort_UE(Stu r); /大学英语成绩排序void sort_DS(Stu r); /数据结构成绩排序void sortnum(Stu r); /按学号排序void sortsum(Stu r);
32、 /按总分降序排序void stat(Stu r); /统计各科总分和平均分信息Stu insert(Stu r); /插入信息void int_BA(Stu r); /基础会计分数段查找void int_UE(Stu r); /大学英语分数段查找void int_DS(Stu *r); /数据结构分数段查找void intsum(Stu *r); /总分分数段查找int main()cout”输入学生的人数:”; cinnum;while(!cin) coutm;while(!cin|m1|m13) coutm;begin:switch(m)case 1:input(p);menu();br
33、eak;case 2:output(p);menu();break;case 3:searchnum(p);menu();break;case 4:searchname(p);menu();break;case 5:modify(p);menu();break;case 6:p=insert(p);menu();break; case 7:erase(p);menu();break;case 8:sortmenu();docinch;while(!cinch1ch4) cout”输入错误!;cin.clear(); cin.sync();coutch;switch(ch)case 1:syst
34、em(cls”);sortmenu();sort_BA(p);output(p);sortmenu();break;case 2:system(cls”);sortmenu();sort_UE(p);output(p);sortmenu();break;case 3:system(”cls”);sortmenu();sort_DS(p);output(p);sortmenu();break;while(ch!=4);system(cls);menu();break;case 9:sortsum(p);output(p);menu();break;case 10:stat(p);menu();b
35、reak;case 11:intmenu();docinchoice;while(!cin|choice6) cout”输入错误!”;cin。clear(); cin。sync();coutchoice;switch(choice)case 1:system(”cls);intmenu();int_BA(p);intmenu();break;case 2:system(cls”);intmenu();int_UE(p);intmenu();break;case 3:system(”cls”);intmenu();int_DS(p);intmenu();break;case 4:system(c
36、ls”);intmenu();intsum(p);intmenu();break;while(choice!=5);system(”cls”);menu();break;case 12:system(cls);sortnum(p);output(p);menu();break;case 13:exit(0); default:while(m0|m12!cin) cout输入有误!请重新输入m;goto begin;while(1);void menu()coutendl; cout菜单栏-n”endl; cout” 1 输入学生信息并保存到文件 2 读取文件并输出学生信息 *endl; cou
37、t” 按姓名查询 修改学生信息 6 插入学生信息 ”endl; cout” 按学号删除信息 8 各科成绩排序 *”endl; cout 按总分降序排序 10 各科成绩统计 * 分数段查找 12 按学号排序 * 退出 ”endl; cout” *-n”endl; cout请选择:”endl;void sortmenu()coutendl; coutendl; cout 排序菜单 -nendl; cout” 各科成绩排序 ”endl; cout” * 大学英语 *” 数据结构 4 返回上级 *”endl; cout” *-n”endl; cout”请选择:”endl;void intmenu()coutendl; coutendl; cout” - 分数段查找菜单 -n”endl; cout” 各科及总分分数段查找 *endl; cout” 1 基础会计 2 大学英语 ”endl; cout 数据结构 4 总分查找 ”endl;cout 5 返回上级 endl; cout *-