当前位置:文档之家› 高等院校人员管理系统

高等院校人员管理系统

中国农业大学面向对象程序设计课程设计报告(2015/2016学年第二学期)高等院校人员管理系统专业计算机学生姓名张三班级学号0000000000指导教师康丽指导单位计算机工程系日期2016年6月1.系统设计内容和要求本系统要完成一个高等院校的人员信息管理系统,能够实现学校中各类人员的信息录入、查询、修改、删除、统计、保存、显示等操作。

假设高校中有三类人员:授课教师、行政人员、行政人员兼职教师(既上课又完成行政人员的工作)。

2.需求分析系统具体实现的功能如下:1)从文件中加载员工信息:系统可以实现把存储在文件person.txt中的学校人员基本信息加载到系统中,可以避免数据的重复录入。

2)增加学校员工信息:系统可以实现键盘录入新员工信息,员工信息包括员工编号、类型、姓名、性别、年龄、政治面貌、学历、工资等。

如果目前学校无员工,则直接录入员工信息;如果有员工,则自动生成新员工的编号(增加1)。

学校人员分为授课教师、行政人员、行政人员兼职教师三类,各类员工的工资计算方法如下:授课教师工资=基本工资+课时费(30*学时数)行政人员工资=基本工资+行政补贴行政人员兼职教师工资=基本工资+行政补贴+课时费(20*学时数)3)查询学校员工信息:系统可以实现按“编号”或“姓名”查询员工,并输出相关信息。

4)修改学校员工信息:系统可以实现对录入的员工信息重新进行编辑、修改,分别修改员工的姓名、性别、年龄、政治面貌、学历和工资信息。

5)删除学校员工信息:系统可以实现当员工离开学校时删除相关信息。

6)统计学校员工信息:系统可以统计学校中的党员人数和女员工人数。

7)学校员工信息存盘:系统可以实现把员工基本信息存储到磁盘文件person.txt中,方便用户以后读取数据,避免重复录入。

8)显示所有员工信息:系统可以输出学校所有员工的信息,包括员工编号、姓名、性别、年龄、政治面貌、学历、工资、人员类型等。

9)系统界面采用文本菜单方式,交互性好,系统界面如图1所示:图1 高等院校人员管理系统界面图3.概要设计系统数据存盘文件person.txt的格式如下:编号姓名性别年龄政治面貌学历工资员工类型1000 张莉女32 党员博士7500 11001 白飞女28 群众硕士2500 21002 孟丹男40 党员博士10500 3其中员工类型为1表示授课教师,2表示行政人员,3表示行政人员兼职教师(1)类定义系统使用类来组织管理数据,共包括五个类,分别是学校类school、员工类person、任课教师类teacher、行政人员类staff、行政人员兼职教师类staffteacher。

员工类person 用来描述学校内各类人员具有的公共属性及操作,由于学校里授课教师、行政人员、行政人员兼职教师这三类人员工资的计算方法不同,表现出多态性,因此以person类为基类,分别派生出授课教师类teacher、行政人员类staff,再以teacher类和staff类为基类,派生出行政人员兼职教师类staffteacher。

由于学校里人员总数允许变动、不确定,因此学校类school采用链表保存所有人员信息,并用共同的方法操作所有人员,类school与类person 之间是类的聚合关系,上述类关系用UML标识如图2所示:学校类school 员工类person授课教师类teacher 行政人员类staff行政人员兼职教师类staffteacher图2高等院校人员管理系统类关系的UML图员工类person。

类属性包括编号(no)、姓名(name)、性别(sex)、年龄(age)、政治面貌(party)、学历(study)、工资(pay)、员工类型(type)、指向下一个员工的指针(mynext),实现对员工类的描述。

成员函数包括提取员工编号(getnum)、提取姓名(getname)、提取性别(getsex)、提取年龄(getage)、设置年龄(getagee)、提取政治面貌(getparty)、提取学历(getstudy)、提取员工类型(gettype)、提取工资(getpay)、设置工资(getpayy)、提取指向下一个员工指针(getnext)、设置指向下一个员工指针(setnext)、输出员工信息(output)等。

●授课教师类teacher。

类属性包括职称(teachpos)、每小时课时费(coursefee)、课时数(coursenum) 。

成员函数包括提取工资(getpay)。

●行政人员类staff。

类属性包括职务级别(pos)、行政补贴(stafffee)。

成员函数包括提取工资(getpay)。

●行政人员兼职教师类staffteacher。

成员函数包括提取工资(getpay)。

●学校类school。

类属性包括指向学校中第一位员工的指针(myfirst)。

成员函数包括从文件中加载员工信息(load)、增加员工信息(add、input、insert)、按编号查询员工信息(findnum)、按姓名查询员工信息(findname)、修改员工信息(modify)、删除员工信息(deleteperson)、统计员工信息(count)、员工信息存盘(save)、显示学校所有员工信息(showall)等。

在基于UML的可视化建模工具Rational Rose中高等院校人员管理系统各类关系的UML图形标识如图3所示:图3Rational Rose中系统类关系的UML图(2)系统主要功能模块流程图1)主函数main的流程图(见图4)2)从文件中加载员工信息school::load流程图(见图5)3)增加员工信息school::add、school::input、school::insert流程图(见图6)4)按编号或姓名查询员工信息school::findnum、school::findname流程图(见图7)5)修改员工信息school::modify流程图(见图8)6)删除员工信息school::deleteperson流程图(见图9)7)统计员工信息school::count流程图(见图10)8)员工信息存盘school::save流程图(见图11)图5 从文件中加载员工信息流程图图6 增加员工信息流程图………………(3)详细设计整个程序包含5个文件:school.h、school.cpp是学校类的类定义文件和类实现文件;person.h、person.cpp是员工类及其派生类的类定义文件和类实现文件;main.cpp是主函数文件。

1)员工类person的定义(person.h)#include<iostream>#include<string>#include<fstream> //包含文件流对象文件#include<iomanip>using namespace std;class person //员工类的定义{ protected:int no; //编号char name[20]; //姓名char sex[10]; //性别int age; //年龄char party[20]; //政治面貌char study[30]; //学历float pay; //工资int type; //员工类型,1:授课教师2:行政人员3:表示行政人员兼职教师person *mynext; //指向下一个员工的指针public:person(); //员工类无参构造函数的定义person(int pnum,char pname[],char psex[],int page,char pparty[], char pstudy[],float ppay,int ntype);//员工类有参构造函数的定义person(int pnum,char pname[],char psex[],int page,char pparty[], char pstudy[],float ppay,int ntype,person *next); //员工类有参构造函数的定义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(); //输出员工信息函数的定义};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; }char * person::getname() {return name; } char * person::getsex(){return sex; }char * person::getparty() {return party; }char * person::getstudy() { return study; }int person::getage(){return age;}void person::getagee(int as) {age=as; } float person::getpay() { return pay; }void person::getpayy(float temp) { pay=temp; } int person::gettype() { return type; } void person::setnext(person *next) {mynext=next; } person *person::getnext() {return mynext; } void person::output(){cout<<"编号:"<<no<<"姓名:"<<name<<endl;cout<<"性别:"<<sex<<"年龄:"<<age<<endl;cout<<"政治面貌:"<<party<<"学历:"<<study<<endl;cout<<"工资:"<<pay<<"人员类型:"<<type<<endl; } 3)授课教师类teacher的定义(person.h)class teacher: virtual public person //授课教师类的定义{ protected:char teachpos[20]; //职称float coursefee; //每节课的课时费float coursenum; //学时数public:teacher(); //教师类无参构造函数的定义float getpay(); //计算教师工资函数的定义};4)授课教师类teacher的实现(person.cpp)teacher::teacher() //教师类无参构造函数的实现{ cout<<"请输入授课教师的职称:";cin>>teachpos;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() //行政人员类无参构造函数的实现{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;elsepay=1600; }if(strcmp(pos,"科级")==0){ if(strcmp(teachpos,"教授")==0)pay=1800;else if(strcmp(teachpos,"副教授")==0)pay=1600;elsepay=1400; }if(strcmp(pos,"科员")==0){ if(strcmp(teachpos,"教授")==0)pay=1600;else if(strcmp(teachpos,"副教授")==0)pay=1400;elsepay=1200;}pay=pay+coursenum*coursefee+stafffee;return pay; }9)学校类school的定义(school.h)#include"person.h"class school{ private:person *myfirst; //指向学校人员链表中结点的指针public:school(); //school类无参构造函数的定义school(int nnum,char nname[],char nsex[],int nage,char nparty[],char nstudy[],float npay,int ntype);//school类带参数构造函数的定义~school(); //school类析构函数的定义void load(); //从文件中加载员工信息void add(); //增加员工信息void input(int number); //键盘输入新员工基本信息void insert(int nnum,char nname[],char nsex[],int nage,char nparty[],char nstudy[],float npay,int ntype);//学校员工链表中插入新员工结点bool findnum(); //按编号查询员工信息bool findname( ); //按姓名查询员工信息bool modify(); //修改员工信息bool deleteperson( ); //删除员工信息void count(); //统计员工信息void save(); //员工信息存盘void showall(); //显示学校所有员工信息};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; }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<<endl<<"存储在文件中的学校人员信息已加载到系统中"<<endl;}void school::add() //增加新员工{int tmpnum,number1,number2;person *p=myfirst;if(p==NULL){ cout<<"目前学校无员工,请输入新员工的编号:";cin>>tmpnum;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):"<<endl;cin>>ntype;cout<<"请输入编号为"<<number<<"的员工信息"<<endl;cout<<"输入姓名:"<<endl;cin>>nname;cout<<"输入性别:"<<endl;cin>>nsex;cout<<"输入年龄:"<<endl;cin>>nage;cout<<"输入政治面貌:群众还是党员?"<<endl;cin>>nparty;cout<<"输入学历:小学,初中,高中,专科,本科,硕士,博士:"<<endl;cin>>nstudy;cout<<"下面计算工资:"<<endl;if(ntype==1){ teacher t1; npay=t1.getpay(); }else if(ntype==2){ staff s1; npay=s1.getpay();}else if(ntype==3){cout<<"请输入行政人员兼职教师的工资信息:"; staffteacher st1; npay=st1.getpay(); }insert(number,nname,nsex,nage,nparty,nstudy,npay,ntype);}void school::insert(int nnum,char nname[],char nsex[],int nage,char nparty[],char nstudy[],float npay,int ntype) //学校员工链表中插入新员工结点{person *p=myfirst;if(p==NULL)myfirst=new person(nnum,nname,nsex,nage,nparty,nstudy,npay,ntype);else{ while(p->getnext()!=NULL)p=p->getnext();p->setnext(newperson(nnum,nname,nsex,nage,nparty,nstudy,npay,ntype,p->getnext()));} }bool school::findnum() //按编号查询员工信息{ int id;person *ahead=myfirst;person *follow=ahead;cout<<"请输入员工的编号:"<<endl;cin>>id;if(ahead==NULL){ cout<<"本校暂无员工信息!"<<endl; return false; }else{ while(ahead!=NULL){ if(ahead->getnum()==id){ ahead->output(); return true; }else{ follow=ahead; ahead=ahead->getnext(); }}cout<<"本校无此员工信息!"<<endl;return false;}}bool school::findname( ) //按姓名查询员工信息{ char tmpname[20];person *ahead=myfirst;person *follow=ahead;cout<<"请输入员工的姓名:";cin>>tmpname;if(ahead==NULL){ cout<<"本校暂无员工信息!"<<endl; return false; }else{ while(ahead!=NULL){ if(strcmp(ahead->getname(),tmpname)==0){ ahead->output(); return true; }else{ follow=ahead; ahead=ahead->getnext(); } }cout<<"本校无此员工信息!"<<endl;return false;}}bool school::modify() //修改员工信息{ int number;person *ahead=myfirst;person *follow=ahead;cout<<"请输入要修改的学校员工编号:";cin>>number;if(ahead==NULL){ cout<<"本校无员工!"<<endl; return false; }else{ while(ahead!=NULL){ if(ahead->getnum()==number){ ahead->output();while(1){ int i;float tmpnumber;char temp[30];cout<<"请选择要修改的员工信息:"<<endl;cout<<"1:姓名2:性别3:年龄4:政治面貌5:学历6:工资"<<endl;cout<<" 请选择(1~6)中的选项:";cin>>i;switch(i){ case 1:{ cout<<"输入修改姓名:";cin>>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<<"本校没有此工作编号的员工!"<<endl;return false;}}bool school::deleteperson( ) //删除员工信息{ 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<<"工作编号为"<<i<<"的学校员工已被删除了!"<<endl;delete ahead;return true; }else{ ahead=ahead->getnext();while(ahead!=NULL){ if(ahead->getnum()==i){ follow->setnext(ahead->getnext());cout<<"编号为"<<i<<"的成员以被删除\n";delete ahead;return true; }follow=ahead;ahead=ahead->getnext();}cout<<"要删除的学校员工不存在,无法删除!"<<endl;return false;}}void school::count( ) //统计员工信息{ int i,amount=0;cout<<" ***********************************************"<<'\n' <<" * *"<<'\n'<<" * 1.统计学校职工中的党员人数*"<<'\n'<<" * *"<<'\n'<<" * 2.统计学校中女职工人数*"<<'\n'<<" * *"<<'\n'<<" *************************************************"<<'\n'<<"请您选择上面的选项:"<<endl;cin>>i;person *ahead=myfirst;person *follow=ahead;if(ahead==NULL) cout<<"学校无人员信息"<<endl;else{ switch(i){ case 1: { while(ahead!=NULL){ if (strcmp(ahead->getparty(),"党员")==0){ ahead=ahead->getnext(); amount++; }elseahead=ahead->getnext(); }cout<<"学校中的党员人数:"<<amount<<endl; };break;case 2: { while(ahead!=NULL){ if (strcmp(ahead->getsex(),"女")==0){ ahead=ahead->getnext(); amount++; }elseahead=ahead->getnext(); }cout<<"学校中的女员工人数:"<<amount<<endl; };break;}}}void school::save() //员工信息存盘{ ofstream fout("person.txt",ios::out);person *p=myfirst;while(p){ fout<<p->getnum()<<"\t"<<p->getname()<<"\t"<<p->getsex()<<"\t"<<p->getage()<<"\t"<<p->getparty()<<"\t"<<p->getstudy()<<"\t"<<p->getpay()<<"\t"<<p->gettyp e()<<endl;p=p->getnext(); }fout.close();cout<<"保存数据已经完成"<<endl;}void school::showall( ) //显示学校所有员工信息{ person *ahead=myfirst;cout<<setw(8)<<"编号"<<setw(8)<<"姓名"<<setw(8)<<"性别"<<setw(8)<<"年龄"<<setw(8)<<"政治面貌"<<setw(8)<<"学历"<<setw(8)<<"工资"<<setw(8)<<"人员类型"<<endl;while(ahead!=NULL){ cout<<setw(4)<<ahead->getnum()<<setw(6)<<ahead->getname()<<setw(5) <<ahead->getsex()<<setw(4)<<ahead->getage()<<setw(10)<<ahead->getparty()<<setw(6)<<ahea d->getstudy()<<setw(12)<<ahead->getpay()<<setw(12)<<ahead->gettype()<<endl;ahead=ahead->getnext(); }}11)函数main.cpp#include"school.h"void main(){ school sc1;int i;while(1){ cout<<"========高等院校人员管理系统======"<<endl;cout<<" 1. 从文件中加载员工信息"<<endl;cout<<" 2. 增加学校员工信息"<<endl;cout<<" 3. 按编号查询学校员工信息"<<endl;cout<<" 4. 按姓名查询学校员工信息"<<endl;cout<<" 5. 修改学校员工信息"<<endl;cout<<" 6. 删除学校员工信息"<<endl;cout<<" 7. 统计学校员工信息"<<endl;cout<<" 8. 学校员工信息存盘"<<endl;cout<<" 9. 显示所有员工信息"<<endl;cout<<" 10. 退出系统"<<endl;cout<<"================================"<<endl;cout<<"请选择上面的选项(1~10):"<<endl;cin>>i;switch(i){ case 1:sc1.load();break;case 2:sc1.add(); break;case 3:sc1.findnum();break;case 4:sc1.findname();break;case 5:sc1.modify(); break;case 6:sc1.deleteperson(); break;case 7:sc1.count(); break;case 8:sc1.save(); break;case 9:sc1.showall(); break;case 10:exit(1);break; }}}(4) 测试数据及其结果分析(a)设计数据如下:编号姓名性别年龄政治面貌学历工资人员类型1 张红梅女40 群众博士5000 12 李玉和男45 党员硕士3800 23 王选男30 党员博士4200 34 孙扬男20 党员硕士3000 15 李明男30 群众硕士3600 16 文红燕女45 党员博士3000 17 英若诚男50 党员博士4000 28 党育红男40 党员硕士4400 39 贝宁宁女30 群众硕士3600 110 高乐高男45 党员博士4000 3(b) 经程序运行测试结果正确。

相关主题