面向对象程序的设计高校学籍管理系统.docx
- 文档编号:11064451
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:41
- 大小:446.92KB
面向对象程序的设计高校学籍管理系统.docx
《面向对象程序的设计高校学籍管理系统.docx》由会员分享,可在线阅读,更多相关《面向对象程序的设计高校学籍管理系统.docx(41页珍藏版)》请在冰豆网上搜索。
面向对象程序的设计高校学籍管理系统
课程设计报告
课程名称面向对象程序设计
课题名称高校学籍管理系统
一、设计内容与设计要求
1.课程设计目的:
面向对象程序设计课程设计是集中实践性环节之一,是学习完《面向对象程序设计》课程后进行的一次全面的综合练习。
要求学生达到熟练掌握C++语言的基本知识和技能;基本掌握面向对象程序设计的思想和方法;能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题,从而提高动手编程解决实际问题的能力。
2.课题题目
高校学籍管理系统
3.设计要求:
⑴设计课题题目:
每位同学根据自己学号除以4所得的余数加一选择相应题号的课题。
换题者不记成绩。
⑵根据自己对应的课题完成以下主要工作:
①完成系统需求分析:
主要包括系统设计目的与意义;系统功能需求〔系统框图;输入输出的要求等内容。
②完成系统总体设计:
主要包括系统功能分析;系统功能模块划分与设计〔系统功能模块图。
③完成系统详细设计:
主要包括类层次图;界面设计与各功能模块实现等累人。
④完成系统调试:
主要包括调试出现的主要问题,编译语法错误及修改,重点是运行逻辑问题修改和调整。
⑤使用说明书及编程体会:
说明系统的使用和操作步骤,详细列出每一步的操作步骤。
⑥附录:
关键源程序〔带注释,可以只选取程序主要部分。
⑶按规定格式完成课程设计报告,将其打印稿
⑷不得抄袭他人程序、课程设计报告,每个人应体现自己的个性设计。
二、进度安排
第17周星期一08时:
00分——12时:
00分
星期三14时:
00分——18时:
00分
星期四14时:
00分——18时:
00分
课题2:
高校学籍管理系统
〔一、课程设计题目:
高校学籍管理系统
〔二、目的与要求:
1、目的:
〔1要求学生达到熟练掌握C++语言的基本知识和技能;
〔2基本掌握面向对象程序设计的基本思路和方法;
〔3能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。
2、基本要求:
〔1要求利用面向对象的方法以及C++的编程思想来完成系统的设计;
〔2要求在设计的过程中,建立清晰的类层次;
〔3在系统的设计中,至少要用到面向对象的一种机制。
3、创新要求:
在基本要求达到后,可进行创新设计,如根据查找结果进行修改的功能。
4、写出设计说明书
〔三、设计方法和基本原理:
1、问题描述〔功能要求:
〔1能够从屏幕上读取一个学生的信息并将信息存入到数据文件中。
〔2能够将指定的信息从文件中删除。
〔3能够按编号、姓名对学生的信息进行检索并将检索结果显示在屏幕上。
〔4可以统计全部学生的总成绩,及其在班上的排名。
〔5能够统计各科的平均成绩及及格率。
〔6要求有错误提示功能,例如性别只能输入男女,输入错误提示重新输入。
〔7如果检索不到相应的信息应提示用户。
〔8扩展要求:
能先行设置本学期的科目
每个学生信息应该包括:
姓名、学号、成绩
成绩信息应该包括:
科目数量、各科目名称、各科目成绩
2、问题的解决方案:
根据系统功能要求,可以将问题解决分为以下步骤:
〔1写出需求分析〔做什么;
〔2分析系统中的各个实体之间的关系及其属性和行为;
〔3根据问题描述,设计系统的类层次;
〔4完成类层次中各个类的描述〔包括属性和方法;
〔5完成类中各个成员函数的定义;
〔6用户界面的设计;
〔7分析系统功能模块〔系统流程图;
〔8代码编写,功能调试;
〔9完成系统总结报告以及系统使用说明书。
1.系统需求分析
1.程序的功能
这个程序的主要功能是能够从屏幕上读取一个学生的信息并将其信息存入到数据文件中;能够将指定的信息从文件中删除;能够按编号、姓名对学生的信息进行检索并将检索结果显示在屏幕上;可以统计全部学生的总成绩,及其在班上的排名;能够统计各科的平均成绩及及格率;要求有错误提示功能,例如性别只能输入男女,输入错误提示重新输入,如果检索不到相应的信息应提示用户该信息不存在。
2、系统的设计目标
本系统要求工作人员输入并存储学生学籍的有关信息,如:
学生的姓名、学号、性别、年龄、班级等信息。
能够在查询学生信息的时候根据提示项输入所要查找的类型,再根据提示输入一项学生信息进行查找及修改,实现学生学籍的动态管理。
2.总体设计
1.系统功能分析
这个程序是用来对学生的学籍资料进行管理。
主要功能包括:
a.能够从屏幕上读取一个学生的信息并将其信息存入到数据文件中;
b.能够将指定的信息从文件中删除;
c.能够按编号、姓名对学生的信息进行检索并将检索结果显示在屏幕上;
d.可以统计全部学生的总成绩,及其在班上的排名;
e.能够统计各科的平均成绩及及格率;
f.要求有错误提示功能,例如性别只能输入男女,输入错误提示重新输入,如果检索不到相应的信息应提示用户该信息不存在。
2.系统功能模块划分与设计
Student类进行学生基本信息的录入及保存,学生基本信息包括姓名、学号、年龄、性别、班级、各科成绩等。
Stu类里定义了Student类的子对象,不但继承了Student类的数据及函数,还能对信息进行进一步的加工。
如:
学生信息的录入、显示、修改、查询、删除以及对学生成绩进行统计,算出全部学生的总成绩、班上排名、各科平均分和及格率等,main函数贯穿全局,利用mune函数对程序的各部分进行掌控。
3.详细设计
该程序应用了2个类,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<>:
void
Stu类的UML图
Stu类
#count:
int
#s:
Student
+insert<>:
void
+Show<>:
void
+search<>:
void
+Delete<>:
void
+update<>:
void
+tongji<>:
void
+mune<>:
void
4.系统调试与使用说明
4.1系统调试过程中遇到的问题及解决方法
信息显示时出错
程序运行后出现以下界面
设置好科目信息,录入学生信息后。
选择3,本应将之前录入的信息显示出来的。
但没有将所有的学生信息显示出来,而是只显示了最后一个同学的信息。
经检查发现,show函数里没有使用循环,导致每输入一个学生信息时就会将前一个的学生信息覆盖,所以只能输入最后一个学生的信息。
信息显示的原有程序为:
voidshow<>
{sum=0;
cout<<"姓名:
"< cout<<"学号: "< cout<<"性别: "< cout<<"年龄"< cout<<"班级: "< for {sum+=mark[i];cout< "< cout<<"总分为: "< } 在Stu类中再定义一个Show函数,使用循环,然后这个Show函数里调用Student类中的show函数,便可以将所有的学生信息显示出来。 修改后的程序为: voidStu: : Show<> {for { if {s[i].show<>;cout< } } 若是退出程序再运行,上来选择3就应该将所有的信息显示出来,可是显示的是乱码。 经检查后发现,在录入信息后,保存信息时,没有成功把信息保存到文件 中。 导致程序再次运行时打开文件后找不到相应的学生信息,所以输出了 乱码。 原程序中使用了C++中二进制文件的保存方式,file.seekg<0,ios: : end>; file.write< 而却没有对该保存方式进行相应的函数声明,造成未能成功保存信息。 后经老师帮忙修改才得以将信息保存到文件中。 修改后的程序,上来选择3就可以将所有已录入的学生信息显示出来。 删除、修改、检索信息时出错 因为在信息录入时,保存信息的不对,致使要对信息进行删除、修改或检索等操作时,都未能在打开的文件中找到相应的信息,所以都不能对信息进行这些操作。 后经老师修改,都能正常显示。 在执行修改模块时还出现了不该有的错误。 修改学号的时候选择"y"也不能修改就直接跳到下一步。 经检查程序,发现将变量ch1写成了ch,导致不能识别输入的是否为"y"。 原程序为: cout<<"是否要修改学号? charch1; cin>>ch1; if { cout<<"请输入新学号: 以回车键结束"< cin>>s[i].num; } 修改后程序: cout<<"是否要修改学号? charch1; cin>>ch1; if { cout<<"请输入新学号: 以回车键结束"< cin>>s[i].num; } 改正后的程序便可以对学号进行修改。 统计信息时出错 在对已有的学生信息进行统计时出现了几个错误。 1. 计算全部学生总成绩时,未对all进行初始化,导致输出的是乱码。 原程序为: voidStu: : tongji<> { inti,j,t; floatsbj; floatcnum=0,pass=0; doubleall,aver; cout<<"$$$$$1.全部学生总成绩,2.班上排名,3.各科平均成绩,4.及格率$$$$$"< cout<<"**********请从1~4中选择*********"< cin>>t; switch { case1: //全部学生总成绩 for {s[j].sum=0; for {s[j].sum=s[j].sum+s[j].mark[i];} cout< "< all=all+s[j].sum; } cout<<"全部学生的总成绩为: "< break; 修改后程序为: case1: //全部学生总成绩 all=0; for {s[j].sum=0; for {s[j].sum=s[j].sum+s[j].mark[i];} cout< "< all=all+s[j].sum; } cout<<"全部学生的总成绩为: "< break; 对all进行初始化后便能够正常显示出总成绩。 2.对已有学生的总成绩进行排名时出错。 经调试检查后发现在该程序中多写了一个for循环且少写了位置的交换,导致将排名信息输出时出错。 原程序为: case2: intn,zf[100];; doublepm[100],t; for {s[j].sum=0; for s[j].sum=s[j].sum+s[j].mark[i]; } cout<<"班上排名为: \n"; for {pm[j]=s[j].sum; zf[j]=j; for {if {t=pm[n]; pm[n]=pm[j]; pm[j]=t; } } for {cout<<"第"< "< } break; 修改后的程序为: case2: intn,z,zf[100]; doublepm[100],t; for {s[j].sum=0; for {s[j].sum=s[j].sum+s[j].mark[i];} pm[j]=s[j].sum; zf[j]=j; } cout<<"班上排名为: \n"; for {for {if {t=pm[n]; pm[n]=pm[j]; pm[j]=t; z=zf[n]; zf[n]=zf[j]; zf[j]=z; } } cout<<"第"< "< } break; 去掉最后一个for循环后,便可以正常输出排名信息。 3. 计算各科平均分时显示的信息出错。 经检查后发现在定义及格人数cnum和及格率pass时,将其定义为了int型,所以计算时科目及格率不对。 原程序为: inti,j,t; floatsbj; intcnum=0,pass=0; doubleall,aver; cout<<"\t$$$$$$$$$$请从以下项选择$$$$$$$$"< cout<<"\t1.全部学生总成绩\t\t\t"< cout<<"\t2.班上排名\t\t\t"< cout<<"\t3.各科平均成绩\t\t\t"< cout<<"\t4.各科及格率\t\t\t"< cout<<"\t$$$$$$$$$$请从1~4中选择$$$$$$$$$"< cin>>t; switch 修改后的程序为: inti,j,t; floatsbj; floatcnum=0,pass=0; doubleall,aver; cout<<"\t$$$$$$$$$$请从以下项选择$$$$$$$$"< cout<<"\t1.全部学生总成绩\t\t\t"< cout<<"\t2.班上排名\t\t\t"< cout<<"\t3.各科平均成绩\t\t\t"< cout<<"\t4.各科及格率\t\t\t"< cout<<"\t$$$$$$$$$$请从1~4中选择$$$$$$$$$"< cin>>t; switch 将cnum和pass的类型改为float类后,便可以正常计算各科及格率。 4.2运行结果 4.2.1主菜单界面 科目设置界面 信息录入界面 信息显示界面 删除信息界面 信息修改界面 信息检索界面 统计信息界面 计算总成绩 班上排名 各科平均分 各科及格率 5.结果分析 1.该程序的修改模块先提示输入要修改的学生姓名,再根据提示一项一项的进行修改。 不需要修改的项则保留原有的数据,使用起来简单方便快捷。 2.不足之处 a.选择进入某一功能模块之后,要对该模块执行操作完后才能推出到主菜单,使得有时候选择了错误的功能也无法返回。 b.程序利用了C++中二进制fstream的保存方法,该方法操作很不方便,容易出错。 c.该程序将保存与退出绑定在一起,要求一定要选择正确的退出方式退出才能将数据保存到文件,否则保存失败。 6.总结 这次课程设计,从拿到题目开始到现在,前前后后自己大概花了整整一个多星期去搞。 刚拿到题目时以为很简单,谁知真正写起程序来才发现它的困难之处。 一开始自己总是贪图程序简单功能又多,老想着写好了基本的模板就能用它来实现各项具体的要求。 于是在写程序时只是简单的把基本的东西写出来就完了,然而调试时才发现根本行不通。 要想写出好的程序就得下功夫,不能贪图简单而使用不懂的东西,这会使程序越写越吃力,越行不通。 就比如在将信息保存到文件时,本来可以用C语言里的方法,很快就能搞定的,自己却贪图简单而去使用未学过的C++里的方法。 不仅又花了大量时间去看书,而且还写不出能用的程序。 最后还得劳烦老师去修改。 通过这次课设才发现自己原来存在很多的不足。 很多东西以前都是只知道理论,并没有将其用到实践中来,导致使用时才发现原来什么都不会。 一些以前学过的知识也因长期没有运用,导致要用时却也不懂理了。 理解上存在误区,写程序时不能理好前后的逻辑关系,导致出现很多不该有的问题。 经过这一次的课设,我们再一次将学习中学到的各个知识点串联起来统一的运用到程序的设计中去,将理论与应用结合在一起。 再一次巩固了学过的知识,也加深了对新知识的了解。 附录 #include #include #include #include #include #include #include intnumb=0;//科目数量 charsbj[20][20];//科目名称 classStudent//定义学生类 { public: boolTag;//有效标志,true: 有效false: 无效 charname[20];//姓名 intnum;//学号 charsex[3];//性别 charcname[20];//班级 intage;//年龄 intmark[10];//各科成绩 doublesum;//总成绩 Student<> { Tag=false;//保证新对象产生时被置为无效,即表示这个对象尚未填入信息 } voidinput<> { cout<<"请输入学生信息"< cout<<"姓名: "< cin>>name; cout<<"学号: "< cin>>num; cout<<"性别 "< cin>>sex; while =0&&strcmp =0> { cout<<"错误请重新输入! "< cin>>sex; break; } cout<<"班级: "< cin>>cname; cout<<"年龄: "< cin>>age; cout<<"请输入成绩: "< for { cout< "; cin>>mark[i]; } Tag=true; } voidshow<> { sum=0; cout<<"姓名: "< cout<<"学号: "< cout<<"性别: "< cout<<"年龄"< cout<<"班级: "< for { sum+=mark[i]; cout< "< } cout<<"总分为: "< } }; /**************************科目设置函数***************************/ voidsubjects<> { cout<<"请设置科目数量"< cin>>numb; cout<<"请输入科目名称"< for { cout< "; cin>>sbj[i]; } } classStu//定义Stu类 { Students[100]; public: intcount;//表示有效学生的数量 Stu<>{count=0;}//一开始没学生 voidinsert<>;//录入信息 voidShow<>;//显示信息 voidsearch<>;//检索信息 voidDelete<>;//删除信息 voidupdate<>;//修改信息 voidtongji<>;//统计信息 voidmune friendfstream&operator>> friendfstream&operator<< }; fstream&operator>> { f>>c.count; for { f>>c.s[i].age>>c.s[i]ame>>c.s[i].name>>c.s[i].num>>c.s[i].sex>>c.s[i].sum;//每次从文件读入一个学生信息 for c.s[i].Tag=true; } returnf; } fstream&operator<< { f< for { if { f<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 程序 设计 高校 学籍 管理 系统