1、厦门理工学院+学校人员信息管理系统C+面向对象程序设计课程设计报告(2012 2013学年 第 3学期)题 目: 学校人员信息管理系统 专 业: 计算机科学与技术 班 级: 计算机科学与技术 姓名学号: DEBUG 指导教师: 成 绩: 计算机科学与技术系2012年6月21日一、设计目的课程设计是学习C+程序设计的一个重要环节。通过课程设计的综合训练,可以使学生在学习理论知识并在实验中进行了一系列基本训练的基础上,进一步加强学生对实际问题分析、编程和动手能力的提高,强化综合应用能力,扩充知识,开阔视野。学生在熟练运用Visual C+ 6.0以后,通过使用Visual C+ 6.0的训练,扩展
2、程序设计的知识面,提高综合应用C+知识能力的要求。二、设计容设计一个学校人员信息管理系统,可以实现对学校人事的信息管理。基本功能要求如下: (1)建立人员信息数据。包括学号(教工号)、姓名、性别、专业(工作系别部门)、出生时间、年龄。其中, 1)对学生,还包括3门课的成绩(Chinese, English, Mathematics)。三门课的成绩为int型数据。 2)对教师,还包括职称(如教授/副教授/讲师),工资(如1432.50)。工资为double型数据。(2)使用继承的方法构造3个类,对相应的对象放置10个学生(教师)信息。 People类虚基类 Student类派生类 Teacher
3、类派生类(3)数据基本功能: 增加数据:AddData()函数。 删除数据:DeleteData()函数。根据学号(教工号),删除该人员的记录。 修改数据: UpdateData()函数。对学生,根据学号,能够修改3门课的成绩;对教师,根据教工号,能够修改“职称”和“工资”。 查找功能:1)SearchData()函数。要求能够根据“学号(教工号)”、“姓名”、“性别”三项实现查询,并能在屏幕上显示满足条件的数据记录。2)FindMaxData()函数。对学生,查找“English”课程成绩最高的学生记录并打印;对教师,查找“工资”最高的教师记录并打印。要求:采用函数模板实现。 显示功能:Di
4、splayData()函数。在屏幕上打印所有的数据记录;打印时,先打印学生的记录,后打印教师的记录。并且按学生(教工号)升序打印。(4)重载功能: 要求对“”和“”运算符进行重载。考虑到输人学生(教工)姓名时,名字中可能引入空格,所以重载“”运算符时,需要满足这个要求。(5)异常处理功能: 设置异常处理,对教师工资为负数的情况给出提示。(6)文件的输入输出功能: 能够从文件中读入数据。外部文件为Student_ext.dat, Teacher_ext.dat。 能够将数据保存到相应目录的文件中。保存数据时,分两个文件分别保存Student.dat, Teacher.dat。(7)参考系统界面如
5、示: 1-增加一位人员(教师、学生)记录 2-删除一个人员记录 3-修改一个人员记录 4-根据“学号(教工号)”、“姓名”、“性别”查找记录 5-根据人员类别(学生、教师)查找“English”课程成绩最高的学生,或最高工资的教师 6-显示全部人员记录 7-从外部文件追加数据 8-将所有数据保存到磁盘文件 9-退出系统。三、总体设计1、系统类的层次关系class people /基类class student:virtual public people /学生派生类class teacher:virtual public people /老师派生类2、类的主要框架描述class people
6、/基类 public: int num; char name30; char sex15; char major_or_department50; char date30; int age;void setpeople(int &z) if(z=1)cout学号; elsecoutnum; coutname; coutsex; if(z=1)cout专业; elsecoutmajor_or_department; coutdate; coutage; ;class student:virtual public people /学生派生类 public: int score_chinese; i
7、nt score_english; int score_mathematices; char xuanxiu50; int score_xuanxiu; void setstudent(int &z) setpeople(z);coutscore_chinese;coutscore_english;coutscore_mathematices;coutxuanxiu;coutscore_xuanxiu; stud100;class teacher:virtual public people /老师派生类public: char job50; double salary; char lesson
8、50;void setteacher(int &z) setpeople(z); coutjob; coutsalary; coutlesson;teacher1100;四、系统测试用例 1、增加数据和修改数据和删除数据功能 通过学号或工号,姓名,和性别查找老师或学生的信息学生选课输出英语成绩最高的学生和工资最高的老师显示所有数据学生数学平均成绩保存数据到磁盘再次运行时,从磁盘中读取数据五、错误记录及原因分析1、错误的记录主要在保存和读取数据的时候运到的,由于要求先保存数据再读取数据,这样就让我忽视了一点就是当你要读取数据到相应的类里面的是时候,你保存的数据也要是该类的类型,这样才能轻易的读取
9、,最好选择用二进制的保存方法这样可以对整个类型的对象进行保存读取的时候也可以直接将数据赋值给对象,使读取更方便简单。2、排序功能有错误错误原因分析:排序功能函数只有一个循环,当没有按顺序输入教工号或学号时,不能输出排序。要在循环外再加一个循环进行控制。由于是升序排序,当后面一个小于前面一个时候,我是拿后面的和前面的交换,但我忘记了判断只有一个学生或老师时不用排序和判断,这时判断后交换反而是会错的,这样就会出错。于是我加了一个判断人数为一的时候是不用判断的。3让名字可以接收空格也是错误百出,首先是要对缓存清理,然后书上的cin.getchar()才派上用场,不然你下次输入时肯定会出错,缓存清理要
10、用到fflush(stdin);std:cin.sync();同学提到的,就解决了名字输入空格的问题。六、源程序#include#include#include#include#includeusing namespace std;static int S=0;/储存学生的人数static int T=0;/储存老师的人数static int temp=0;/用来判断一段代码是否有运行过int main();class people /基类 public: int num; char name30; char sex15; char major_or_department50; char da
11、te30; int age;void setpeople(int &z) if(z=1)cout学号:; elsecoutnum; fflush(stdin); std:cin.sync(); cout名字:;cin.getline(name,30,n); coutsex; if(z=1)cout专业:; elsecoutmajor_or_department; coutdate; coutage; ;class student:virtual public people /学生派生类 public: int score_chinese; int score_english; int scor
12、e_mathematices; char xuanxiu50; int score_xuanxiu; void setstudent(int &z) setpeople(z);coutscore_chinese;coutscore_english;coutscore_mathematices;coutxuanxiu;coutscore_xuanxiu; stud100;class teacher:virtual public people /老师派生类public: char job50; double salary; char lesson50;void setteacher(int &z)
13、 setpeople(z); coutjob; coutsalary; coutlesson;teacher1100;void AddDate() /增加一条数据的函数 int i=1;loop1: while(i) system(cls); cout1学生endl; cout2老师endl; cout3键退出z; switch(z) case 1:system(cls); int g=S+1; for(int i=S;ig;i+) studi.setstudent(z); :S+; for(int j=0;jS-1;j+) if(studj.num=studi-1.num)S-;cout学号
14、输入一样重新添加endl;getchar();getchar();goto loop1; cout增加成功endl; getchar();getchar(); break; case 2:system(cls); int g=T+1; for(int i=T;ig;i+) teacher1i.setteacher(z); :T+; for(int j=0;jT-1;j+) if(teacher1j.num=teacher1i-1.num)T-;cout工号输入一样重新添加endl;getchar();getchar();goto loop1; try /处理教师工资合法性 if (teache
15、r1i-1.salary0) throw teacher1i-1.salary; catch(double ) cout工资输入有误,请重新输入endl;getchar();getchar(); T-; goto loop1; cout增加成功endl; getchar();getchar(); break; case 3:system(cls);i=0; break; main();void DeleteData()/删除功能函数 system(cls); cout1学生endl; cout2老师endl; cout3键退出z; system(cls); if(z=1) coutn; for
16、(int i=0;iS;i+) if(studi.num=n) for(;iS;i+) studi=studi+1; S-;cout删除成功endl;temp=12;/temp用来判断删除记录有没运行,有运行就赋值为12 if(temp!=12)cout没有该记录endl; temp=0; if(z=2) coutm; for(int i=0;iT;i+) if(teacher1i.num=m) for(;iT;i+) teacher1i=teacher1i+1; cout删除成功endl;T-;temp=12;/temp用来判断删除记录有没运行,有运行就赋值为12 if(temp!=12)c
17、out没有该记录endl; temp=0; if(z=3)main();getchar();getchar(); main();void UpdateDate()/修改数据记录函数 cout1学生endl; cout2老师endl; cout3键退出z; if(z=1) system(cls); coutn; for(int i=0;iS;i+) if(studi.num=n) cout修改为:endl;studi.setstudent(z);cout修改成功endl;temp=12;/temp用来判断修改记录有没运行,有运行就赋值为12 if(temp!=12)cout没有该数据记录endl
18、; temp=0; if(z=2) system(cls); coutn; for(int i=0;iT;i+) if(teacher1i.num=n) cout修改为:endl;teacher1i.setteacher(z);cout修改成功endl;temp=12;/temp用来判断修改记录有没运行,有运行就赋值为12 if(temp!=12)cout没有该数据记录endl; temp=0; if(z=3)main(); getchar(); getchar(); main();void SearchData()/查找函数 int n; coutn; char nam_s30; coutn
19、am_s; char sex_s15; coutsex_s; for(int i=0;iT;i+) if(teacher1i.num=n&strcmp(teacher1i.name,nam_s)=0&strcmp(teacher1i.sex,sex_s)=0) cout老师:endl; cout工号:teacher1i.num姓名:teacher1i.name性别:teacher1i.sex部门:teacher1i.major_or_department; cout出生年月日:teacher1i.date年龄:teacher1i.age职称:teacher1i.job工资:teacher1i.
20、salary课程:teacher1i.lesson; coutendl;temp=12; for(int j=0;jS;j+) if(studj.num=n&strcmp(studj.name,nam_s)=0&strcmp(studj.sex,sex_s)=0) cout学生:endl; cout学号:studj.num姓名:studj.name性别:studj.sex专业:studj.major_or_department; cout出生年月日:studj.date年龄:studj.age语文:studj.score_chinese英语:studj.score_english数学:stud
21、j.score_mathematices选修:studj.xuanxiu选修成绩:studj.score_xuanxiu; coutendl; temp=12; if(temp!=12)cout没有这个人的信息endl;temp=0; getchar(); getchar(); main();void FindLesson()/选课的函数 char a50; couta;for(int i=0;iT;i+) if(strcmp(teacher1i.lesson,a)=0|strcmp(teacher1i.name,a)=0) cout教这门的教师是:; cout工号:teacher1i.num
22、姓名:teacher1i.name性别:teacher1i.sex部门:teacher1i.major_or_department; cout出生年月日:teacher1i.date年龄:teacher1i.age职称:teacher1i.job工资:teacher1i.salary课程:teacher1i.lesson; coutendl;temp=12; if(temp!=12)cout没有教这门的教师endl;temp=0;getchar();getchar();main();cout输入你的学号x;for(int j=0;jS;j+) if(studj.num=x) strcpy(st
23、udj.xuanxiu,teacher1i-1.lesson); cout输入选修课成绩studj.score_xuanxiu; cout输出选课成功endl; getchar();getchar();main();template double Max(Q j) double max=0; if(teacher1j-1.salaryteacher1j.salary) max=teacher1j.salary; return max; void FindMaxDataT()/查找最高英语分数的学生和最高工资的教师 double max=teacher10.salary; for(int j=1;jT;j+) max=Max(j); cout工资最高的教师endl;for(int i=0;iT;i+) if(teacher1i.salary=max) cout工号:teacher1i.num姓名:teacher1i.name性别:teacher1i.sex部门:teacher1i.major_or_department; cout出生年月日:teacher1i.date年龄:teacher1i.age职称:teacher1i.job工资:teacher1i.salary
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1