厦门理工学院+学校人员信息管理系统Word格式文档下载.docx
《厦门理工学院+学校人员信息管理系统Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《厦门理工学院+学校人员信息管理系统Word格式文档下载.docx(36页珍藏版)》请在冰点文库上搜索。
Teacher类——派生类
(3)数据基本功能:
增加数据:
AddData()函数。
删除数据:
DeleteData()函数。
根据学号(教工号),删除该人员的记录。
修改数据:
UpdateData()函数。
对学生,根据学号,能够修改3门课的成绩;
对教师,根据教工号,能够修改“职称”和“工资”。
查找功能:
1)SearchData()函数。
要求能够根据“学号(教工号)”、“姓名”、“性别”三项实现查询,并能在屏幕上显示满足条件的数据记录。
2)FindMaxData()函数。
对学生,查找“English”课程成绩最高的学生记录并打印;
对教师,查找“工资”最高的教师记录并打印。
要求:
采用函数模板实现。
显示功能:
DisplayData()函数。
在屏幕上打印所有的数据记录;
打印时,先打印学生的记录,后打印教师的记录。
并且按学生(教工号)升序打印。
(4)重载功能:
要求对“<<”和“>>”运算符进行重载。
考虑到输人学生(教工)姓名时,名字中可能引入空格,所以重载“>>”运算符时,需要满足这个要求。
(5)异常处理功能:
设置异常处理,对教师工资为负数的情况给出提示。
(6)文件的输入输出功能:
能够从文件中读入数据。
外部文件为Student_ext.dat,Teacher_ext.dat。
能够将数据保存到相应目录的文件中。
保存数据时,分两个文件分别保存Student.dat,Teacher.dat。
(7)参考系统界面如示:
1-增加一位人员(教师、学生)记录
2-删除一个人员记录
3-修改一个人员记录
4-根据“学号(教工号)”、“姓名”、“性别”查找记录
5-根据人员类别(学生、教师)查找“English”课程成绩最高的学生,或最高工资的教师
6-显示全部人员记录
7-从外部文件追加数据
8-将所有数据保存到磁盘文件
9-退出系统。
三、总体设计
1、系统类的层次关系
classpeople{//基类
classstudent:
virtualpublicpeople{//学生派生类
classteacher:
virtualpublicpeople{//老师派生类
2、类的主要框架描述
public:
intnum;
charname[30];
charsex[15];
charmajor_or_department[50];
chardate[30];
intage;
voidsetpeople(int&
z)
{
if(z==1){cout<
<
"
学号"
;
}
else{cout<
工号"
}cin>
>
num;
cout<
名字"
cin>
name;
性别"
sex;
专业"
部门"
major_or_department;
出生年月日"
date;
年龄"
age;
}
};
intscore_chinese;
intscore_english;
intscore_mathematices;
charxuanxiu[50];
intscore_xuanxiu;
voidsetstudent(int&
{
setpeople(z);
cout<
语文"
score_chinese;
英语"
score_english;
数学"
score_mathematices;
选修"
xuanxiu;
选修成绩"
cin>
score_xuanxiu;
}
}stud[100];
public:
charjob[50];
doublesalary;
charlesson[50];
voidsetteacher(int&
{setpeople(z);
职称"
job;
工资"
salary;
课程"
lesson;
}teacher1[100];
四、系统测试用例
1、
增加数据和修改数据和删除数据功能
通过学号或工号,姓名,和性别查找老师或学生的信息
学生选课
输出英语成绩最高的学生和工资最高的老师
显示所有数据
学生数学平均成绩
保存数据到磁盘
再次运行时,从磁盘中读取数据
五、错误记录及原因分析
1、
错误的记录主要在保存和读取数据的时候运到的,由于要求先保存数据再读取数据,这样就让我忽视了一点就是当你要读取数据到相应的类里面的是时候,你保存的数据也要是该类的类型,这样才能轻易的读取,最好选择用二进制的保存方法这样可以对整个类型的对象进行保存读取的时候也可以直接将数据赋值给对象,使读取更方便简单。
2、
排序功能有错误
错误原因分析:
排序功能函数只有一个循环,当没有按顺序输入教工号或学号时,不能输出排序。
要在循环外再加一个循环进行控制。
由于是升序排序,当后面一个小于前面一个时候,我是拿后面的和前面的交换,但我忘记了判断只有一个学生或老师时不用排序和判断,这时判断后交换反而是会错的,这样就会出错。
于是我加了一个判断人数为一的时候是不用判断的。
3.
让名字可以接收空格也是错误百出,首先是要对缓存清理,然后书上的cin.getchar()才派上用场,不然你下次输入时肯定会出错,缓存清理要用到fflush(stdin);
std:
cin.sync();
同学提到的,就解决了名字输入空格的问题。
六、源程序
#include<
iostream>
string>
fstream>
stdlib.h>
windows.h>
usingnamespacestd;
staticintS=0;
//储存学生的人数
staticintT=0;
//储存老师的人数
staticinttemp=0;
//用来判断一段代码是否有运行过
intmain();
学号:
工号:
fflush(stdin);
std:
cout<
名字:
cin.getline(name,30,'
\n'
);
性别:
专业:
部门:
出生年月日:
年龄:
语文:
英语:
数学:
选修:
选修成绩:
职称:
工资:
课程:
voidAddDate(){//增加一条数据的函数
inti=1;
loop1:
while(i)
{system("
cls"
1学生"
endl;
2老师"
3键退出"
intz;
z;
switch(z)
case1:
system("
{intg=S+1;
for(inti=S;
i<
g;
i++)
{stud[i].setstudent(z);
:
:
S++;
}
for(intj=0;
j<
S-1;
j++)
{
if(stud[j].num==stud[i-1].num){S--;
学号输入一样重新添加"
getchar();
gotoloop1;
cout<
增加成功"
getchar();
}break;
case2:
{intg=T+1;
for(inti=T;
teacher1[i].setteacher(z);
:
T++;
}
T-1;
if(teacher1[j].num==teacher1[i-1].num){T--;
工号输入一样重新添加"
try//处理教师工资合法性
{if(teacher1[i-1].salary<
0)
{throwteacher1[i-1].salary;
catch(double)
{
工资输入有误,请重新输入"
T--;
gotoloop1;
}
getchar();
case3:
i=0;
break;
main();
voidDeleteData()//删除功能函数
{
system("
if(z==1)
输入学号"
intn;
cin>
n;
for(inti=0;
S;
if(stud[i].num==n){
for(;
stud[i]=stud[i+1];
S--;
删除成功"
temp=12;
}//temp用来判断删除记录有没运行,有运行就赋值为12
if(temp!
=12){cout<
没有该记录"
temp=0;
if(z==2)
输入工号"
intm;
m;
T;
if(teacher1[i].num==m){
teacher1[i]=teacher1[i+1];
cout<
T--;
temp=0;
if(z==3){main();
voidUpdateDate()//修改数据记录函数
{system("
if(stud[i].num==n){cout<
修改为:
stud[i].setstudent(z);
修改成功"
}//temp用来判断修改记录有没运行,有运行就赋值为12
没有该数据记录"
if(teacher1[i].num==n){cout<
teacher1[i].setteacher(z);
getchar();
voidSearchData()//查找函数
intn;
请输入学号或教工号:
//查找有个人信息要有三个条件学号或教工,名字,性别。
charnam_s[30];
请输入名字:
nam_s;
charsex_s[15];
请输入性别:
sex_s;
for(inti=0;
{if(teacher1[i].num==n&
&
strcmp(teacher1[i].name,nam_s)==0&
strcmp(teacher1[i].sex,sex_s)==0)
老师:
teacher1[i].num<
姓名:
teacher1[i].name<
teacher1[i].sex<
teacher1[i].major_or_department;
teacher1[i].date<
teacher1[i].age<
teacher1[i].job<
teacher1[i].salary<
teacher1[i].lesson;
for(intj=0;
{if(stud[j].num==n&
strcmp(stud[j].name,nam_s)==0&
strcmp(stud[j].sex,sex_s)==0)
学生:
stud[j].num<
stud[j].name<
stud[j].sex<
stud[j].major_or_department;
stud[j].date<
stud[j].age<
stud[j].score_chinese<
stud[j].score_english<
stud[j].score_mathematices<
stud[j].xuanxiu<
stud[j].score_xuanxiu;
temp=12;
if(temp!
没有这个人的信息"
temp=0;
voidFindLesson()//选课的函数
chara[50];
输入想选修的课程或上选修课老师的名字"
a;
for(inti=0;
{if(strcmp(teacher1[i].lesson,a)==0||strcmp(teacher1[i].name,a)==0)
教这门的教师是:
if(temp!
没有教这门的教师"
main();
输入你的学号"
intx;
x;
for(intj=0;
if(stud[j].num==x){
strcpy(stud[j].xuanxiu,teacher1[i-1].lesson);
输入选修课成绩"
输出选课成功"
}
template<
typenameQ>
doubleMax(Qj)
doublemax=0;
if(teacher1[j-1].salary<
teacher1[j].salary)
max=teacher1[j].salary;
returnmax;
voidFindMaxDataT()//查找最高英语分数的学生和最高工资的教师
doublemax=teacher1[0].salary;
for(intj=1;
{
max=Max(j);
工资最高的教师"
{if(teacher1[i].salary==max)