课程设计报告例子:
高等院校人事信息管理系统
1、系统设计目标及意义、功能
本题目要完成一个高等院校的人事信息管理系统,能够实现学校中各类人员的信息录入、 查询、修改、删除、统计、保存、显示等操作。假设高校中有三类人员:授课教师、行政人 员、行政人员兼职教师(既上课又完成行政人员的工作)。系统具体实现的功能如下:
1) 从文件中加载员工信息:系统可以实现把存储在文件 person.txt 中的学校人员基本信息 加载到系统中,可以避免数据的重复录入。
2) 增加学校员工信息:系统可以实现键盘录入新员工信息,员工信息包括员工编号、类型、 姓名、性别、年龄、政治面貌、学历、工资等。如果目前学校无员工,则直接录入员工信息; 如果有员工,则自动生成新员工的编号(增加 1)。学校人员分为授课教师、行政人员、行 政人员兼职教师三类,各类员工的工资计算方法如下:
授课教师工资=基本工资+课时费(30*学时数) 行政人员工资=基本工资+行政补贴 行政人员兼职教师工资=基本工资+行政补贴+课时费(20*学时数)
3)查询学校员工信息:系统可以实现按“编号”或“姓名”查询员工,并输出相关信息。 4)修改学校员工信息:系统可以实现对录入的员工信息重新进行编辑、修改,分别修改员 工的姓名、性别、年龄、政治面貌、学历和工资信息。 5)删除学校员工信息:系统可以实现当员工离开学校时删除相关信息。 6)统计学校员工信息:系统可以统计学校中的党员人数和女员工人数。 7)学校员工信息存盘:系统可以实现把员工基本信息存储到磁盘文件 person.txt 中,方便用 户以后读取数据,避免重复录入。 8)显示所有员工信息:系统可以输出学校所有员工的信息,包括员工编号、姓名、性别、 年龄、政治面貌、学历、工资、人员类型等。 9)系统界面采用文本菜单方式,交互性好,系统界面如图 10 所示:
1
系统数据存盘文件 person.txt 的格式如下:
编号 姓名 性别 年龄 政治面貌 学历 工资 员工类型
1000 张莉 女 32 党员 1001 白飞 女 28 群众
1002 孟丹 男 40 党员
博士 7500 1 硕士 2500 2
博士 10500 3
其中员工类型为 1 表示授课教师,2 表示行政人员,3 表示行政人员兼职教师 2、系统详细设计
系统使用类来组织管理数据,共包括五个类,分别是学校类 school、员工类 person、 任课教师类 teacher、行政人员类 staff、行政人员兼职教师类 staffteacher。员工类 person 用来描述学校内各类人员具有的公共属性及操作,由于学校里授课教师、行政人员、行政人 员兼职教师这三类人员工资的计算方法不同,表现出多态性,因此以 person 类为基类,分 别派生出授课教师类 teacher、行政人员类 staff,再以 teacher 类和 staff 类为基类,派 生出行政人员兼职教师类 staffteacher。由于学校里人员总数允许变动、不确定,因此学 校类 school 采用链表保存所有人员信息,并用共同的方法操作所有人员,类 school 与类 person 之间是类的聚合关系,上述类关系用 UML 标识如图 11 所示:
学校类 school 员工类 person
授课教师类 teacher 行政人员类 staff
行政人员兼职教师类 staffteacher 图11 高等院校人员管理系统类关系的UML图
员工类 person。 类属性包括编号(no)、姓名(name)、性别(sex)、年龄(age)、政治面貌(party)、学历(study)、
工资(pay)、员工类型(type)、指向下一个员工的指针(mynext),实现对员工类的描述。 成员函数包括提取员工编号(getnum)、提取姓名(getname)、提取性别(getsex)、提取年龄 (getage)、设置年龄(getagee)、提取政治面貌(getparty)、提取学历(getstudy)、提取员工类型 (gettype)、提取工资(getpay)、设置工资(getpayy)、提取指向下一个员工指针(getnext)、设置
指向下一个员工指针(setnext)、输出员工信息(output)等。
2
授课教师类 teacher。 类属性包括职称(teachpos)、每小时课时费(coursefee)、课时数(coursenum) 。 成员函数包括提取工资(getpay)。
行政人员类 staff。 类属性包括职务级别(pos)、行政补贴(stafffee)。 成员函数包括提取工资(getpay)。
行政人员兼职教师类 staffteacher。 成员函数包括提取工资(getpay)。
学校类 school。
类属性包括指向学校中第一位员工的指针(myfirst)。 成员函数包括从文件中加载员工信息(load)、增加员工信息(add、input、insert)、按
编号查询员工信息(findnum)、 按姓名查询员工信息(findname)、修改员工信息(modify)、 删除员工信息(deleteperson)、统计员工信息(count)、员工信息存盘(save)、显示学校所 有员工信息(showall)等 。
3、系统主要功能模块流程图
1)主函数 main 的流程图(见图 13)
开始
创建学校对象
显示系统操作菜单
根据输入执行不同操作
信 息
图 13 主函数 main 的流程图 2)从文件中加载员工信息 school::load 流程图(见图 14)
3)增加员工信息 school::add、school::input、school::insert 流程图(见图 15)
加 载 员 工 信 息
增 加 员 工 信 息
查 询 员 工 信 息
修 改 员 工 信 息
删 除 员 工 信 息
统 计 员 工 信 息
员 工 信 息 存 盘
显 示 员 工 信 息
退 出 系 统
3
开始
打开学校员工数据文件 person.txt Y
Y
员工编号自动加 1
开始
学校目前是否 有员工?(add)
N
文件读取失败 或文件结束
文件未读到尾
关闭文件
结束
键盘输入新员工编号
读取一条员工记录
学校员工链表中加入新结点
N
N
键盘输入新员工基本信息(类型、姓名、 性别、年龄、政治面貌、学历)(input)
Y
根据员工的类型调用相应派生类的成员函 数 getpay 计算员工工资
学校员工链表中加入新创建员工结点(insert)
结束
图 15 增加员工信息流程图
图 14 从文件中加载员工信息流程图
4)按编号或姓名查询员工信息 school::findnum、school::findname 流程图(见图 16) 5)修改员工信息 school::modify 流程图(见图 17)
开始
输入待查员工的编号和姓名
学校是否有员工
是否有待查员工
开始
输入待修改员工的编号
N
N
学校是否有员工
有待修改员工吗
Y
N
输出无此员工
输出此员工信息 output
输出无此员工
4
图 16 按编号或姓名查询员工信息流程图
Y
Y
遍历学校员工链表
遍历学校员工链表
Y
N
修改此员工信息(姓名、性别、 年龄、政治面貌、学历、工资)
图 17 修改员工信息流程图
6)删除员工信息 school::deleteperson 流程图(见图 18) 7)统计员工信息 school::count 流程图(见图 19) 8)员工信息存盘 school:save 流程图(见图 20)
开始
输入待删除员工的编号
学校是否有员工
有待删除员工吗
开始
统计计数器初始化 amount=0 N12
输入统计的选项
Y
遍历学校员工链表 统计员工党员人数
遍历学校员工链表 统计女员工人数
遍历学校员工链表
删除链表中此员工结点并
修改学校员工链表
Y
输出无此员工
输出学校中党员 人数 amount
输出学校中女员 工人数 amount
图 19 统计员工信息流程图
图 18 删除员工信息流程图
开始
打开学校员工数据文件 person.txt
关闭文件
结束
图 20 员工信息存盘流程图 4、源程序及说明
遍历学校员工链表,将人员结点 信息写入到文件 person.txt 中
N
整个程序包含 5 个文件:school.h、school.cpp 是学校类的类定义文件和类实现文件; 5
person.h、person.cpp 是员工类及其派生类的类定义文件和类实现文件;main.cpp 是主函数文 件。
1)员工类 person 的定义(person.h) #include
#include
#include
public: person();
//包含文件流对象文件
#include
{ protected:
int no;
char name[20]; char sex[10]; int age;
char party[20]; char study[30]; float pay;
int type;
person *mynext;
ppay,int ntype);
//员工类有参构造函数的定义
person(int pnum,char pname[],char psex[],int page,char pparty[],char pstudy[],float
ppay,int ntype,person *next); //员工类有参构造函数的定义
//员工类的定义
//编号 //姓名 //性别
//年龄 //政治面貌
//学历 //工资
//员工类型,1:授课教师 2:行政人员 3:表示行政人员兼职教 //指向下一个员工的指针
//员工类无参构造函数的定义
person(int pnum,char pname[],char psex[],int page,char pparty[],char pstudy[],float
师
int getnum();
char *getname() ;
char *getsex() ;
int getage() ;
void getagee(int as);
char *getparty() ;
char *getstudy();
virtual float getpay();
void getpayy(float temp); //设置员工工资函数的定义
int gettype(); //提取员工类型函数的定义
person *getnext(); //提取指向下一个员工指针函数的定义 void setnext(person *next); //设置指向下一个员工指针函数的定义 void output(); //输出员工信息函数的定义
};
//提取员工编号函数的定义 //提取员工姓名函数的定义 //提取员工性别函数的定义 //提取员工年龄函数的定义
//设置员工年龄函数的定义 //提取员工政治面貌函数的定义
//提取员工学历函数的定义 //计算员工工资函数的定义
6
2) 员工类 person 的实现(person.cpp) #include”person.h”
person::person() { no=0;
strcpy(name,””); strcpy(sex,””); age=0; strcpy(party,””); strcpy(study,””); pay=0.0;
type=0; mynext=NULL; }
//员工类无参构造函数
person::person(int pnum,char pname[],char psex[],int page,char pparty[],char pstudy[],float
ppay,int ptype) { no=pnum;
strcpy(name,pname); strcpy(sex,psex); age=page; strcpy(party,pparty); strcpy(study,pstudy); pay=ppay; type=ptype; mynext=NULL; }
//员工类有参构造函数
person::person(int pnum,char pname[],char psex[],int page,char pparty[],char pstudy[],float ppay,int ptype,person *next) //员工类有参构造函数
{ no=pnum;
strcpy(name,pname); strcpy(sex,psex); age=page; strcpy(party,pparty); strcpy(study,pstudy); pay=ppay; type=ptype; mynext=next; }
int person::getnum()
{ { { { { {
{ { { {
return no; } return name; } return sex; } return party; } return study; } return age;
char char char char int void float void int void
* person::getname() * person::getsex()
* person::getparty() * person::getstudy()
person::getage() person::getagee(int as) person::getpay() person::getpayy(float temp)
} } }
person::gettype() person::setnext(person *next) {
} }
age=as;
return pay; pay=temp; return type; mynext=next; }
7
person *person::getnext() { return mynext; } void person::output()
{ cout<<"编号:"<
coursefee=30.0; cout<<"请输入授课教师完成的学时数:"; cin>>coursenum; }
float teacher::getpay()
{ if(strcmp(teachpos,”教授”)==0)
//职称 //每节课的课时费 //学时数
//教师类无参构造函数的定义 //计算教师工资函数的定义
//计算工资函数的实现
pay=1600; if(strcmp(teachpos,”副教授”)==0)
pay=1200; if(strcpy(teachpos,”讲师”)==0)
pay=800; pay=pay+coursefee*coursenum; return pay; }
5) 行政人员类 staff 的定义(person.h)
class staff:virtual public person //行政人员类的定义 { protected:
char pos[20];
float stafffee;
public: staff();
float getpay();
};
6) 行政人员类 staff 的实现(person.cpp)
staff::staff() //行政人员类无参构造函数的实现
//行政职务 //行政补贴
//行政人员类无参构造函数的定义 //计算行政人员工资函数的定义
8
{ cout<<"请输入行政人员的职务级别:"; cin>>pos;
cout<<"请输入行政人员的补贴:";
cin>>stafffee; }
float staff::getpay() //计算工资函数的实现 { if(strcmp(pos,”处级”)==0)
pay=2500; if(strcmp(pos,”科级”)==0)
pay=2000; if(strcmp(pos,”科员”)==0)
pay=1500; pay=pay+stafffee; return pay; }
7) 行政人员兼职教师类 staffteacher 的定义(person.h)
class staffteacher:public staff,public teacher //行政人员类的定义 { public:
staffteacher(); //类无参构造函数的定义
float getpay(); //计算工资函数的定义 };
8) 行政人员兼职教师类 staffteacher 的实现(person.cpp) staffteacher::staffteacher() //类无参构造函数的实现
{ coursefee=20.0; }
float staffteacher::getpay() //计算工资函数的实现
{ if(strcmp(pos,”处级”)==0)
{ if(strcmp(teachpos,”教授”)==0)
pay=2000;
else if(strcmp(teachpos,”副教授”)==0)
pay=1800; else
pay=1600; } if(strcmp(pos,”科级”)==0)
{ if(strcmp(teachpos,”教授”)==0) pay=1800;
else if(strcmp(teachpos,”副教授”)==0) pay=1600;
else
pay=1400; }
if(strcmp(pos,”科员”)==0)
{ if(strcmp(teachpos,”教授”)==0)
pay=1600;
else if(strcmp(teachpos,”副教授”)==0)
pay=1400; else
9
pay=1200;} pay=pay+coursenum*coursefee+stafffee; return pay; }
9) 学校类 school 的定义(school.h) #include”person.h”
class school
{ private:
person *myfirst;
ntype);
~school();
void load(); void add();
ntype);
bool findnum(); bool findname( ); bool modify();
bool deleteperson( ); void count();
void save();
void showall();
};
//指向学校人员链表中结点的指针
//school 类无参构造函数的定义
school(int nnum,char nname[],char nsex[],int nage,char nparty[],char nstudy[],float npay,int
public: school();
//school 类带参数构造函数的定义 //school 类析构函数的定义 //从文件中加载员工信息
//增加员工信息
//键盘输入新员工基本信息
void insert(int nnum,char nname[],char nsex[],int nage,char nparty[],char nstudy[],float npay,int
void input(int number);
//学校员工链表中插入新员工结点 //按编号查询员工信息
//按姓名查询员工信息 //修改员工信息 //删除员工信息
//统计员工信息 //员工信息存盘 //显示学校所有员工信息
10)学校类 school 的实现(school.cpp) #include”school.h”
school::school ( ) //school 类无参构造函数的实现 { myfirst=NULL; }
school::school(int nnum,char nname[],char nsex[],int nage,char nparty[],char nstudy[],float npay,int ntype) //school 类带参数构造函数的实现
{ myfirst=new person(nnum,nname,nsex,nage,nparty,nstudy,npay,ntype); }
school::~school( ) //school 类析构函数的实现 { person *next=myfirst,*temp;
while(next!=NULL) { temp=next;
next=next->getnext(); delete temp; }
10
myfirst=NULL; }
void school::load()
{ int nnum,nage,ntype;
//从文件中加载员工信息
char nname[20],nsex[20],nparty[20],nstudy[20]; float npay;
ifstream fin(“person.txt”,ios::in); while(fin.good())
{ fin>>nnum>>nname>>nsex>>nage>>nparty>>nstudy>>npay>>ntype; if(!(fin.eof()))
insert(nnum,nname,nsex,nage,nparty,nstudy,npay,ntype); } fin.close();
cout<
input(tmpnum); } else
{ if(p->getnext()==NULL)
{ number1=p->getnum()+1;
input(number1); } else
{ while(p->getnext()!=NULL) p=p->getnext(); number2=p->getnum()+1;
input(number2); } }
}
void school::input(int number) //键盘输入新员工基本信息 { int nage,ntype;
float npay;
char nname[20],nsex[20],nparty[20],nstudy[20];
cout<<"请选择是任课教师(输入 1),行政人员(输入 2)还是行政人员兼职教师(输入 3):
"<
cout<<"请输入编号为"<
cout<<"输入性别:"<
cout<<"输入年龄:"<
cout<<"输入政治面貌:群众还是党员?"<
cout<<"下面计算工资:"<
person(nnum,nname,nsex,nage,nparty,nstudy,npay,ntype,p->getnext()));}
}
bool school::findnum() //按编号查询员工信息 { int id;
person *ahead=myfirst;
person *follow=ahead; cout<<"请输入员工的编号:"<
if(ahead==NULL)
{ else {
{
cout<<"本校暂无员工信息!"<
{ ahead->output(); return true; else
return false; }
}
{ follow=ahead; ahead=ahead->getnext(); } }
cout<<"本校无此员工信息!"<
if(ahead==NULL)
bool school::findname( ) char tmpname[20];
person *ahead=myfirst; person *follow=ahead; cout<<"请输入员工的姓名:"; cin>>tmpname; if(ahead==NULL)
{ cout<<"本校暂无员工信息!"<
{ ahead->output(); while(1)
return false; }
//按姓名查询员工信息
{ while(ahead!=NULL)
{ if(strcmp(ahead->getname(),tmpname)==0)
{ ahead->output(); return true; } else
{ follow=ahead; ahead=ahead->getnext(); cout<<"本校无此员工信息!"<
1:姓名 2:性别 3:年龄 请选择(1~6)中的选项:”;
4:政治面貌
5:学历 6:工资
return false; }
13
{
int i;
person *ahead=myfirst;
person *follow=ahead; cout<<"请输入要删除学校人员的工作编号:"; cin>>i;
if(ahead==NULL)
{ cout<<"无员工可以删除"; return false; } else if(ahead->getnum()==i)
{ myfirst=myfirst->getnext(); cout<<"工作编号为"<getnext(); while(ahead!=NULL)
{ if(ahead->getnum()==i)
{ follow->setnext(ahead->getnext());
cout<<"编号为"<>temp;strcpy(ahead->getname(),temp); };
break;
case 2:{ cout<<"输入修改性别:"; cin>>temp;strcpy(ahead->getsex(),temp); };break;
case 3:{ cout<<"输入修改年 龄:";cin>>tmpnumber;ahead->getagee(tmpnumber); };break;
case 4:{ cout<<"输入修改政治面 貌:";cin>>temp;strcpy(ahead->getparty(),temp); };break;
case 5:{ cout<<"输入修改学 历:";cin>>temp;strcpy(ahead->getstudy(),temp);};break;
case 6:{ cout<<"输入修改工 资:";cin>>tmpnumber;ahead->getpayy(tmpnumber);};break; }
return true; } }
else
{ ahead=ahead->getnext(); follow=ahead; } }
cout<<"本校没有此工作编号的员工!"<
cout<<"要删除的学校员工不存在,无法删除!"<
person *ahead=myfirst;
person *follow=ahead;
if(ahead==NULL) cout<<"学校无人员信息"<
{ ahead=ahead->getnext(); amount++; } else
ahead=ahead->getnext(); } cout<<"学校中的党员人数:"<
{ ahead=ahead->getnext(); amount++; }
else
ahead=ahead->getnext(); }
} }
}
void school::save()
{ ofstream fout(“person.txt”,ios::out);
person *p=myfirst; while(p)
1.统计学校职工中的党员人数 2.统计学校中女职工人数
*”<<'\n' *"<<'\n'
cout<<"学校中的女员工人数:"<
fout.close();
cout<<"保存数据已经完成"<
<
}
11)函数 main.cpp #include”school.h” void main()
{
school sc1;
int i;
while(1)
{ cout<<"========高等院校人员管理系统======"<
“<