某学校人员信息管理教材DOC 60页.docx
《某学校人员信息管理教材DOC 60页.docx》由会员分享,可在线阅读,更多相关《某学校人员信息管理教材DOC 60页.docx(69页珍藏版)》请在冰豆网上搜索。
![某学校人员信息管理教材DOC 60页.docx](https://file1.bdocx.com/fileroot1/2023-2/23/fa7f5ff8-611b-47b2-9cc1-8b2b8d4176e5/fa7f5ff8-611b-47b2-9cc1-8b2b8d4176e51.gif)
某学校人员信息管理教材DOC60页
一、设计目的
课程设计是学习C++程序设计的一个重要环节。
通过课程设计的综合训练,可以使学生在学习理论知识并在实验中进行了一系列基本训练的基础上,进一步加强学生对实际问题分析、编程和动手能力的提高,强化综合应用能力,扩充知识,开阔视野。
学生在熟练运用VisualC++6.0以后,通过使用VisualC++6.0的训练,扩展程序设计的知识面,提高综合应用C++知识能力的要求。
二、设计内容
设计一个学校人员信息管理系统,可以实现对学校人事的信息管理。
基本功能要求如下:
(1)建立人员信息数据。
包括学号(教工号)、姓名、性别、专业(工作系别部门)、出生时间、年龄。
其中,
1)对学生,还包括3门课的成绩(Chinese,English,Mathematics)。
三门课的成绩为int型数据。
2)对教师,还包括职称(如教授/副教授/讲师),工资(如1432.50)。
工资为double型数据。
(2)使用继承的方法构造3个类,对相应的对象放置10个学生(教师)信息。
ØPeople类——虚基类
ØStudent类——派生类
Ø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.系统类的程序关系
2.类的主要框架描述
***************************************************************************
基类:
***************************************************************************
classpeople{
public:
intnum;charname[30];
charsex[15];
charmajor_or_department[50];
chardate[30];
intage;
people(intn,charnam[30],chars[15],charo[50],chard[30],inta)
{
num=n;
strcpy(name,nam);
strcpy(sex,s);
strcpy(major_or_department,o);
strcpy(date,d);
age=a;
}
};
***************************************************************************
教师类:
***************************************************************************
classteacher:
virtualpublicpeople
{
public:
teacher(intn=0,charnam[30]="",chars[15]="",charo[50]="",chard[30]="",inta=0,charj[50]="",doublesa=0):
people(n,nam,s,o,d,a),salary(sa){strcpy(job,j);}
charjob[50];
doublesalary;
friendistream&operator>>(istream&is,teacher&tea);//重载">>"运算符函数声明
friendostream&operator<<(ostream&os,teacher&tea);//重载"<<"运算符函数声明
voidAddData();
voidDisplayData();
}tea[10];
***************************************************************************
学生类:
***************************************************************************
classstudent:
virtualpublicpeople
{
public:
student(intn=0,charnam[30]="",chars[15]="",charo[50]="",chard[15]="",inta=0,intc=0,inte=0,intm=0):
people(n,nam,s,o,d,a),score_chinese(c),score_english(e),score_mathematices(m){}
intscore_chinese;
intscore_english;intscore_mathematices;
friendistream&operator>>(istream&is,student&stu);//重载">>"运算符函数声明
friendostream&operator<<(ostream&os,student&stu);//重载"<<"运算符函数声明
voidAddData();voidDisplayData();
}stu[10];
***************************************************************************
教师类功能函数
***************************************************************************
template
QMax(Q*x,intlen)
voidTAddData()//对教师类对象的添加功能函数
voidTDeleteData()//对教师类对象的删除功能函数
voidTUpdateData()//对教师类对象的修改功能函数
voidTSearchData_num()//按教工号查询教师类对象
voidTSearchData_nam()//按姓名查询教师类对象
voidTSearchData_sex()//按性别查询教师类对象
voidTFindMaxData()//对教师类对象的最高工资查询功能函数
voidTDisplayData()//对教师类对象按教工号升序排序打印功能函数
voidTsave()//对教师类对象的保存功能函数
voidTload()//对教师类对象的读取功能函数
***************************************************************************
学生类功能函数
***************************************************************************
template
QMax(Q*x,intlen)
voidSAddData()//对学生类对象的添加功能函数
voidSDeleteData()//对学生类对象的删除功能函数
voidSUpdateData()//对学生类对象的修改功能函数
voidSSearchData_num()//按学号查询学生类对象
voidSSearchData_nam()//按姓名查询学生类对象
voidSSearchData_sex()//按性别查询学生类对象
voidSFindMaxData()//对学生类对象的最高英语成绩查询功能函数
voidSDisplayData()//对学生类对象按学号升序排序打印功能函数
voidSsave()//对学生类对象的保存功能函数
voidSload()//对学生类对象的读取功能函数
***************************************************************************
功能函数
***************************************************************************
voidShowmenu()
voidMenu()
voidMenu1()
voidAddData()//添加功能函数
voidDeleteData()//删除功能函数
voidUpdateData()//修改功能函数
voidSearchData()//查询功能函数
voidFindMaxDataS()//英语成绩最高学生查询函数
voidFindMaxDataT()//工资最高教师查询函数
voidDisplayData()//显示全部人员记录函数
voidsave()//保存功能函数
voidload()//读取功能函数
intmain()
四、系统测试用例
主菜单界面
异常处理
教工号学号输入重复报错
按升序排列所有记录
保存记录
五、错误记录及原因分析
1.字符数组直接赋值发生错误
错误原因分析:
字符数组不可直接赋值,而要用stycpy函数进行赋值。
2.在派生类析构函数中初始化出现问题。
错误原因分析:
要给形参赋初值。
3.排序功能有错误
错误原因分析:
排序功能函数只有一个循环,当没有按顺序输入教工号或学号时,不能输出排序。
要在循环外再加一个循环进行控制。
4.添加记录输入重复教工号或学号时不会显示输入有误
错误原因分析:
当输入有误时再次调用添加函数,添加函数里有清屏函数,会将错误提示清屏掉。
应再从主函数中调用添加函数。
六、源程序
#include
#include
#include
#include
#include
usingnamespacestd;
intmain();
staticintT=0;//用于标记老师类对象的个数
staticintS=0;//用于标记学生类对象的个数
classpeople{
public:
intnum;charname[30];
charsex[15];
charmajor_or_department[50];
chardate[30];
intage;
people(intn,charnam[30],chars[15],charo[50],chard[30],inta)
{
num=n;
strcpy(name,nam);
strcpy(sex,s);
strcpy(major_or_department,o);
strcpy(date,d);
age=a;
}
};
classteacher:
virtualpublicpeople
{
public:
teacher(intn=0,charnam[30]="",chars[15]="",charo[50]="",chard[30]="",inta=0,charj[50]="",doublesa=0):
people(n,nam,s,o,d,a),salary(sa){strcpy(job,j);}
charjob[50];
doublesalary;
friendistream&operator>>(istream&is,teacher&tea)//重载">>"运算符函数声明
{
is>>tea.num;
is.getline(tea.name,30,'\n');//使其能够读入字符串中的空格
is>>tea.sex;
is>>tea.major_or_department;
is>>tea.date;
is>>tea.age;
is>>tea.job;
is>>tea.salary;
returnis;//退出函数
}
friendostream&operator<<(ostream&os,teacher&tea)//重载"<<"运算符函数声明
{os<os<os<os<os<os<os<os<returnos;//退出函数
}
voidAddData()
{system("cls");
cout<<"请输入教工号:
";
cin>>num;
for(intk=1;k<11;k++)
if(num==k)
k=11;
if(k==11)
{
cout<<"请输入10以内的教工号"<AddData();
}
cout<<"请输入教师姓名:
";
cin>>name;
cout<<"请输入教师性别:
";
cin>>sex;
cout<<"请输入教师工作系别部门:
";
cin>>major_or_department;
cout<<"请输入教师出生时间:
";
cin>>date;
cout<<"请输入教师年龄:
";
cin>>age;
cout<<"请输入教师职称(如教授/副教授/讲师):
";
cin>>job;
cout<<"请输入教师工资:
";
cin>>salary;
try//处理教师工资合法性
{if(salary<0)
{throwsalary;
}
}
catch(double)
{
cout<<"输入有误,请重新输入"<main();
}
}
voidDisplayData()
{cout<<"******************************"<cout<<"教工号"<<""<<"姓名"<<""<<"性别"<<""<<"工作部门"<<""<<"出生时间"<<""<<"年龄"<<""<<"职称"<<""<<"工资"<cout<<"******************************"<cout<cout<<"******************************"<}
voidsave(ofstream&outf)
{outf<<"教工号"<<""<<"姓名"<<""<<"性别"<<""<<"工作部门"<<""<<"出生时间"<<""<<"年龄"<<""<<"职称"<<""<<"工资"<outf<}
voidload(ifstream&inf)
{
inf>>num>>name>>sex>>major_or_department>>date>>age>>job>>salary;
}
}tea[10];
template
QMax(Q*x,intlen)
{
Qmax=x[0];
for(inti=1;imax=max>x[i]?
max:
x[i];
returni;
}
voidTAddData()//对教师类对象的添加功能函数
{tea[T].AddData();
for(inti=0;i<10;i++)
{
if(i!
=T&&tea[T].num==tea[i].num)
{
cout<<"输入教工号重复,请重新输入!
"<main();
}
}
cout<<"添加记录成功!
"<tea[T].DisplayData();
T++;
}
voidTDeleteData()//对教师类对象的删除功能函数
{
intn;
if(T==0)
cout<<"没有可删除的记录!
"<else
{
cout<<"请输入10以内的教工号:
";
cin>>n;
for(inti=0;iif(tea[i].num==n)
for(;itea[i]=tea[i+1];
T--;
cout<<"成功删除记录!
"<}
}
voidTUpdateData()//对教师类对象的修改功能函数
{
intn;
if(T==0)
cout<<"没有可删除的记录!
"<else{
cout<<"请输入10以内的教工号:
";
cin>>n;
for(inti=0;iif(tea[i].num==n)
{
cout<<"原有的记录:
"<tea[i].DisplayData();
cout<<"请输入新的记录:
"<cout<<"请输入教师职称(如教授/副教授/讲师):
";
cin>>tea[i].job;
cout<<"请输入教师工资:
";
cin>>tea[i].salary;
cout<<"新的记录:
"<tea[i].DisplayData();
}
}
}
voidTSearchData_num()//按教工号查询教师类对象
{
intn;
cout<<"请输入10以内的教工号:
";
cin>>n;
for(inti=0;iif(tea[i].num==n)
{
tea[i].DisplayData();
i=T;
}
if(i==T)
{
cout<<"查询的记录不存在,请重新输入!
"<TSearchData_num();
}
}
voidTSearchData_nam()//按姓名查询教师类对象
{
charnam_s[30];
cout<<"请输入教师名字:
"<cin>>nam_s;
for(intj=0;jif(strcmp(tea[j].name,nam_s)==0)
{
tea[j].DisplayData();
j=T;
}
if(j==T)
{
cout<<"查询的记录不存在,请重新输入!
"<TSearchData_nam();
}
}
voidTSearchData_sex()//按性别查询教师类对象
{
charsex_s[15];
cout<<"请输入教师性别:
"<cin>>sex_s;
for(intp=0;pif(strcmp(tea[p].sex,sex_s)==0)
{
tea[p].DisplayData();
p=T;
}
if(p==T)
{
cout<<"查询的记录不存在,请重新输入!
"<TSearchData_sex();
}
}
voidTFindMaxData()//对教师类对象的最高工资查询功能函数
{
intnu;
doublet[10];
for(inta=0;at[a]=tea[a].salary;
nu=Max(t,T);
tea[nu-1].DisplayData();
}
voidTDisplayData()//对教师类对象按教工号升序排序打印功能函数
{
for(inti=1;i<11;i