1、面向对象程序的设计高校学籍管理系统课 程 设 计 报 告 课程名称 面向对象程序设计 课题名称 高校学籍管理系统一、设计内容与设计要求1.课程设计目的:面向对象程序设计课程设计是集中实践性环节之一,是学习完面向对象程序设计课程后进行的一次全面的综合练习。要求学生达到熟练掌握C+语言的基本知识和技能;基本掌握面向对象程序设计的思想和方法;能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题,从而提高动手编程解决实际问题的能力。2.课题题目高校学籍管理系统3设计要求:设计课题题目:每位同学根据自己学号除以4所得的余数加一选择相应题号的课题。换题者不记成绩。根据自己对应的课题完成以下主要工作
2、:完成系统需求分析:主要包括系统设计目的与意义;系统功能需求系统框图;输入输出的要求等内容。完成系统总体设计:主要包括系统功能分析;系统功能模块划分与设计系统功能模块图。完成系统详细设计:主要包括类层次图;界面设计与各功能模块实现等累人。完成系统调试:主要包括调试出现的主要问题,编译语法错误及修改,重点是运行逻辑问题修改和调整。使用说明书及编程体会:说明系统的使用和操作步骤,详细列出每一步的操作步骤。附录:关键源程序带注释,可以只选取程序主要部分。按规定格式完成课程设计报告,将其打印稿上交给老师存档。不得抄袭他人程序、课程设计报告,每个人应体现自己的个性设计。二、进度安排第17周 星期一 08
3、时:00分12时:00分 星期三 14时:00分18时:00分 星期四 14时:00分18时:00分课题2:高校学籍管理系统 一、课程设计题目:高校学籍管理系统二、目的与要求: 1、目的: 1要求学生达到熟练掌握C+语言的基本知识和技能; 2基本掌握面向对象程序设计的基本思路和方法; 3能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。 2、基本要求: 1要求利用面向对象的方法以及C+的编程思想来完成系统的设计;2要求在设计的过程中,建立清晰的类层次; 3在系统的设计中,至少要用到面向对象的一种机制。3、创新要求: 在基本要求达到后,可进行创新设计,如根据查找结果进行修改的功能。
4、4、写出设计说明书 三、设计方法和基本原理: 1、问题描述功能要求: 1能够从屏幕上读取一个学生的信息并将信息存入到数据文件中。2能够将指定的信息从文件中删除。3能够按编号、姓名对学生的信息进行检索并将检索结果显示在屏幕上。4可以统计全部学生的总成绩,及其在班上的排名。5能够统计各科的平均成绩及及格率。6要求有错误提示功能,例如性别只能输入男女,输入错误提示重新输入。7如果检索不到相应的信息应提示用户。8扩展要求:能先行设置本学期的科目每个学生信息应该包括:姓名、学号、成绩成绩信息应该包括:科目数量、各科目名称、各科目成绩2、问题的解决方案: 根据系统功能要求,可以将问题解决分为以下步骤: 1
5、写出需求分析做什么;2分析系统中的各个实体之间的关系及其属性和行为;3根据问题描述,设计系统的类层次;4完成类层次中各个类的描述包括属性和方法;5完成类中各个成员函数的定义;6用户界面的设计;7分析系统功能模块系统流程图;8代码编写,功能调试;9完成系统总结报告以及系统使用说明书。1.系统需求分析1. 程序的功能这个程序的主要功能是能够从屏幕上读取一个学生的信息并将其信息存入到数据文件中;能够将指定的信息从文件中删除;能够按编号、姓名对学生的信息进行检索并将检索结果显示在屏幕上;可以统计全部学生的总成绩,及其在班上的排名;能够统计各科的平均成绩及及格率;要求有错误提示功能,例如性别只能输入男女
6、,输入错误提示重新输入,如果检索不到相应的信息应提示用户该信息不存在。2、系统的设计目标 本系统要求工作人员输入并存储学生学籍的有关信息,如:学生的姓名、学号、性别、年龄、班级等信息。能够在查询学生信息的时候根据提示项输入所要查找的类型,再根据提示输入一项学生信息进行查找及修改,实现学生学籍的动态管理。2.总体设计1. 系统功能分析这个程序是用来对学生的学籍资料进行管理。主要功能包括:a.能够从屏幕上读取一个学生的信息并将其信息存入到数据文件中;b.能够将指定的信息从文件中删除;c.能够按编号、姓名对学生的信息进行检索并将检索结果显示在屏幕上;d.可以统计全部学生的总成绩,及其在班上的排名;e
7、.能够统计各科的平均成绩及及格率;f.要求有错误提示功能,例如性别只能输入男女,输入错误提示重新输入,如果检索不到相应的信息应提示用户该信息不存在。2.系统功能模块划分与设计 Student类进行学生基本信息的录入及保存,学生基本信息包括姓名、学号、年龄、性别、班级、各科成绩等。Stu类里定义了Student类的子对象,不但继承了Student类的数据及函数,还能对信息进行进一步的加工。如:学生信息的录入、显示、修改、查询、删除以及对学生成绩进行统计,算出全部学生的总成绩、班上排名、各科平均分和及格率等,main函数贯穿全局,利用mune函数对程序的各部分进行掌控。3.详细设计该程序应用了2个
8、类,Student类和Stu类,其UML图如下:Student类的UML图Student类# Tag: bool#name: char # num: int #sex: char #cname: char #age: int #mark: int #sum:double+Student+input :void+show:voidStu类的UML图Stu类#count: int# s: Student+insert:void+Show:void+search:void+Delete:void+update:void+tongji:void+mune:void4.系统调试与使用说明4.1系统调试过
9、程中遇到的问题及解决方法信息显示时出错程序运行后出现以下界面设置好科目信息,录入学生信息后。选择3,本应将之前录入的信息显示出来的。但没有将所有的学生信息显示出来,而是只显示了最后一个同学的信息。经检查发现,show函数里没有使用循环,导致每输入一个学生信息时就会将前一个的学生信息覆盖,所以只能输入最后一个学生的信息。信息显示的原有程序为:void show sum=0; cout姓名:nameendl; cout学号:numendl; cout性别:sexendl; cout年龄ageendl; cout班级:cnameendl; forint i=0;i sum+=marki;coutsb
10、ji成绩:markiendl; cout总分为:sumendl;在Stu类中再定义一个Show函数,使用循环,然后这个Show函数里调用Student类中的show函数,便可以将所有的学生信息显示出来。修改后的程序为:void Stu:Show forint i=0;i if si.show;coutendl; 若是退出程序再运行,上来选择3就应该将所有的信息显示出来,可是显示的是乱码。经检查后发现,在录入信息后,保存信息时,没有成功把信息保存到文件中。导致程序再次运行时打开文件后找不到相应的学生信息,所以输出了乱码。原程序中使用了C+中二进制文件的保存方式,file.seekg; file.
11、write&stu,sizeof;而却没有对该保存方式进行相应的函数声明,造成未能成功保存信息。后经老师帮忙修改才得以将信息保存到文件中。修改后的程序,上来选择3就可以将所有已录入的学生信息显示出来。删除、修改、检索信息时出错因为在信息录入时,保存信息的不对,致使要对信息进行删除、修改或检索等操作时,都未能在打开的文件中找到相应的信息,所以都不能对信息进行这些操作。后经老师修改,都能正常显示。在执行修改模块时还出现了不该有的错误。修改学号的时候选择y也不能修改就直接跳到下一步。经检查程序,发现将变量ch1写成了ch,导致不能识别输入的是否为y。原程序为:cout是否要修改学号?ch1; if
12、cout请输入新学号:以回车键结束si.num; 修改后程序:cout是否要修改学号?ch1; if cout请输入新学号:以回车键结束si.num; 改正后的程序便可以对学号进行修改。统计信息时出错在对已有的学生信息进行统计时出现了几个错误。1.计算全部学生总成绩时,未对all进行初始化,导致输出的是乱码。原程序为:void Stu:tongji int i,j,t; float sbj; float cnum=0,pass=0; double all,aver; cout$1.全部学生总成绩,2.班上排名,3.各科平均成绩,4.及格率$endl; cout*请从14中选择*t; switc
13、h case 1: /全部学生总成绩 forj=0;j sj.sum=0; fori=0;i sj.sum=sj.sum+sj.marki; coutsj.name的总成绩为:sj.sumendl; all =all+sj.sum; cout全部学生的总成绩为:allendl; break;修改后程序为:case 1: /全部学生总成绩 all=0; forj=0;j sj.sum=0; fori=0;i sj.sum=sj.sum+sj.marki; coutsj.name的总成绩为:sj.sumendl; all =all+sj.sum; cout全部学生的总成绩为:allendl; br
14、eak;对all进行初始化后便能够正常显示出总成绩。2.对已有学生的总成绩进行排名时出错。经调试检查后发现在该程序中多写了一个for循环且少写了位置的交换,导致将排名信息输出时出错。原程序为:case 2:int n ,zf100; double pm100,t;forj=0;j sj.sum=0; fori=0;i sj.sum=sj.sum+sj.marki; cout班上排名为:n; forj=0;j pmj=sj.sum; zfj=j; forn=j+1;n ifpmj t=pmn; pmn=pmj; pmj=t; forj=0;j cout第j+1名szfj.name总分为:pmje
15、ndl; break;修改后的程序为:case 2:int n,z,zf100; double pm100,t; forj=0;j sj.sum=0; fori=0;i sj.sum=sj.sum+sj.marki; pmj=sj.sum; zfj=j; cout班上排名为:n; forj=0;j forn=j+1;n ifpmj t=pmn; pmn=pmj; pmj=t;z=zfn; zfn=zfj; zfj=z; cout第j+1名szfj.name总分为:pmjendl; break;去掉最后一个for循环后,便可以正常输出排名信息。3.计算各科平均分时显示的信息出错。经检查后发现在定
16、义及格人数cnum和及格率pass时,将其定义为了int型,所以计算时科目及格率不对。原程序为:int i,j,t; float sbj; int cnum=0,pass=0; double all,aver; coutt$请从以下项选择$endl; coutt1.全部学生总成绩tttendl; coutt2.班上排名tttendl; coutt3.各科平均成绩tttendl; coutt4.各科及格率tttendl; coutt$请从14中选择$t; switch修改后的程序为:int i,j,t; float sbj; float cnum=0,pass=0; double all,ave
17、r; coutt$请从以下项选择$endl; coutt1.全部学生总成绩tttendl; coutt2.班上排名tttendl; coutt3.各科平均成绩tttendl; coutt4.各科及格率tttendl; coutt$请从14中选择$t; switch将cnum和pass的类型改为float类后,便可以正常计算各科及格率。4.2运行结果4.2.1主菜单界面科目设置界面信息录入界面信息显示界面删除信息界面信息修改界面信息检索界面统计信息界面计算总成绩班上排名各科平均分各科及格率5.结果分析1.该程序的修改模块先提示输入要修改的学生姓名,再根据提示一项一项的进行修改。不需要修改的项则保
18、留原有的数据,使用起来简单方便快捷。2.不足之处 a. 选择进入某一功能模块之后,要对该模块执行操作完后才能推出到主菜单,使得有时候选择了错误的功能也无法返回。 b. 程序利用了C+中二进制fstream的保存方法,该方法操作很不方便,容易出错。 c. 该程序将保存与退出绑定在一起,要求一定要选择正确的退出方式退出才能将数据保存到文件,否则保存失败。6.总结这次课程设计,从拿到题目开始到现在,前前后后自己大概花了整整一个多星期去搞。刚拿到题目时以为很简单,谁知真正写起程序来才发现它的困难之处。一开始自己总是贪图程序简单功能又多,老想着写好了基本的模板就能用它来实现各项具体的要求。于是在写程序时
19、只是简单的把基本的东西写出来就完了,然而调试时才发现根本行不通。要想写出好的程序就得下功夫,不能贪图简单而使用不懂的东西,这会使程序越写越吃力,越行不通。就比如在将信息保存到文件时,本来可以用C语言里的方法,很快就能搞定的,自己却贪图简单而去使用未学过的C+里的方法。不仅又花了大量时间去看书,而且还写不出能用的程序。最后还得劳烦老师去修改。通过这次课设才发现自己原来存在很多的不足。很多东西以前都是只知道理论,并没有将其用到实践中来,导致使用时才发现原来什么都不会。一些以前学过的知识也因长期没有运用,导致要用时却也不懂理了。理解上存在误区,写程序时不能理好前后的逻辑关系,导致出现很多不该有的问题
20、。经过这一次的课设,我们再一次将学习中学到的各个知识点串联起来统一的运用到程序的设计中去,将理论与应用结合在一起。再一次巩固了学过的知识,也加深了对新知识的了解。附录#include#include#include#include#include#include#includeint numb=0; /科目数量char sbj2020; /科目名称class Student /定义学生类 public: bool Tag; /有效标志,true:有效 false:无效 char name20; /姓名 int num; /学号 char sex3; /性别 char cname20; /班级
21、int age; /年龄 int mark10; /各科成绩 double sum; /总成绩 Student Tag=false; /保证新对象产生时被置为无效,即表示这个对象尚未填入信息 void input cout请输入学生信息endl; cout姓名:name; cout学号:num; cout性别:sex; whilestrcmp!=0&strcmp!=0 cout错误请重新输入!sex; break; cout班级:cname; cout年龄:age; cout请输入成绩:endl; forint i=0;i coutsbjimarki; Tag=true; void show
22、sum=0; cout姓名:nameendl; cout学号:numendl; cout性别:sexendl; cout年龄ageendl; cout班级:cnameendl; forint i=0;i sum+=marki; coutsbji成绩:markiendl; cout总分为:sumendl; ;/*科目设置函数*/void subjects cout请设置科目数量numb; cout请输入科目名称endl; forint i=0;i couti+1sbji; class Stu /定义Stu类 Student s100; public: int count; /表示有效学生的数量
23、Stucount=0; /一开始没学生 void insert; /录入信息 void Show; /显示信息 void search; /检索信息 void Delete; /删除信息 void update; /修改信息 void tongji; /统计信息 void mune; /菜单函数 friend fstream &operator; friend fstream &operator;fstream &operator fc.count; forint i=0;i fc.si.agec.siamec.si.namec.si.numc.si.sexc.si.sum; /每次从文件读入一个学生信息 forint j=0;jfc.si.markj; c.si.Tag=true; return f;fstream &operator fc.count ; forint i=0;i if fc.si.age c.siame c.si.name c.si.num c.si.s
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1