河南城建学院HenanUniversityofUrbanConstruction《面向对象程序设计》课程设计报告学号:084414119姓名:管维聪专业:软件工程题目:第一题指导老师:周二强王春丽设计时间:第十六周、十七周计算机科学与工程学院2015年6月课程设计名称:高校人事管理系统1.设计内容某高校主要人员有:在职人员(行政人员、教师、一般员工)、退休人员、返聘人员和临时工。现在,需要存储这些人员的人事档案信息:编号、姓名、性别、年龄、职务、职称、政治面貌、最高学历、任职时间、来院时间。要求:1)添加删除功能:能根据学院人事的变动情况,添加删除记录;2)查询功能:能根据编号和姓名进行查询;3)编辑功能(高级):根据查询对相应的记录进行修改,并存储;4)统计功能:能根据多种参数进行人员的统计(在职人数、党员人数、女工人数、高学历高职称人数);5)保存功能:能对输入的数据进行相应的存储,要求重载插入和提取符以完成数据的保存和打开。6)人员编号在生成人员信息时同时生成,每输入一个人员信息编号顺序加1。2.设计目的与要求2.1目的1.达到熟练掌握C++语言的基本知识和技能。2.基本掌握面向对象程序设计的基本思路和方法。3.能够利用所学的基本知识和技能,解决简单的面向对象程序设计问题。2.2要求1.要求利用面向对象的方法以及C++的编程思想来完成系统的设计。2.要求在设计的过程中,建立清晰的类层次。3.在系统的设计中,至少要用到面向对象的一种机制。2.3系统流程图12345687高校人事管理系统选择要进行的操作增加职工资料删除职工信息修改职工信息查询职工信息输出所有职工信息统计职工信息数据存盘退出3.系统分析3.1主要知识点1.链表的使用,链表能动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。链表适用于插入或删除频繁、存储空间需求不定的情况,也就是说可以随意增减元素,具有存储效率高,存取速度快的优点。2.构造函数重载,根据构造函数参数不同调用不同的构造函数,这个是C++重要思想之一,即根据不同的信息处理不同的问题,实现面向对象化。3.2关键技术程序中数据类型和函数用类来实现,共设计了3个类。人员类Person,链表类College,和日期类Date,其中Date是基类,Person类是派生类,每一种类都定义了相应的构造函数和构造函数的重载以及一些成员函数。具体定义如下所示:2.类school3.3基本功能要求1.功能选择用菜单实现例如:***************************************************高校人事管理系统——————————————————————————1--增加职工资料2--删除职工信息3--修改职工信息4--查询职工信息5—输出所有职工信息6—统计职工信息7—数据存盘8—退出****************************************************请选择1--8:用户通过输入不同的数字进入不同的菜单。次级菜单主要显示本程序的功能,主要的功能有增加人员资料,删除人员信息,修改人员信息,修改人员信息,查询人员信息,统计人员信息,数据保存,显示所有信息和退出功能。2.运行时给出明确的提示信息比如,选择1,系统会提醒用户输入编号,输入完系统会进一步提醒用户输入其他信息和选择,进入相应的选择后会提醒用户选择其他子选择和输入;比如,输入增加人员,又选择“在职人员(行政人员、教师、一般员工)、退休人员、返聘人员和临时工”再输入信息。比如在删除人员信息中又显示“所要删除的编号是”和“无此人员”或“已被删除”等比如在查找人员信息中又显示“所要查找的编号是”或“所要查找的姓名是”和“无此人员”和显示相关信息等。在统计人员信息中又显示————————————————————————————请选择统计对象:1在职人数2党员人数3女工人数4高学历高职称人数请选择:————————————————————————————4.系统结构设计本程序的功能结构如图1所示:图1程序功能结构图5.源程序代码/*****************************************************************************/#includeiostream.h#includestring.h#includefstream.h#includestdlib.h#includeiomanip.h//全局变量(代码表)char*Type[]={行政人员,教师,一般员工,退休人员,返聘人员,临时工};char*Sex[]={男,女};char*Pos[]={无,科级,处级,地级};char*TechPos[]={无,初级,中级,高级};char*Party[]={群众,中共党员,民主党派};char*Study[]={小学,初中,高中,大专,大学,硕士,博士};classDate//日期类{private:inty,m,d;public:friendostream&operator(ostream&os,Date&day);friendistream&operator(istream&is,Date&day);};ostream&operator(ostream&os,Date&day){osday.y/day.m/day.d;returnos;}istream&operator(istream&is,Date&day){isday.yday.mday.d;returnis;}classPerson:publicDate//人员类{private:intNo;//编号intType;//职工分类charName[20];//姓名intSex;//性别intAge;//年龄DateD1;//参加工作时间DateD2;//来院时间intPos;//职务intTechPos;//职称intParty;//政治面貌intStudy;//学历Person*next;public:Person(){next=NULL;}voidPrint1();//输出1个职工信息friendistream&operator(istream&is,Person&p);//重载,人员信息输入.friendostream&operator(ostream&os,Person*P);friendclassCollege;};voidPerson::Print1(){cout编号:setiosflags(ios::left)setw(26)No姓名:Nameendl;cout性别:setiosflags(ios::left)setw(26)::Sex[Sex]年龄:Ageendl;cout职工类型:setiosflags(ios::left)setw(22)::Type[Type]职务:::Pos[Pos]endl;cout职称:setiosflags(ios::left)setw(26)::TechPos[TechPos]学历:::Study[Study]endl;cout政治面貌:setiosflags(ios::left)setw(22)::Party[Party]来院时间:D2endl;cout参加工作时间:D1endl;}istream&operator(istream&is,Person&p){cout编号:;cinp.No;cout职工分类[0-行政人员,1-教师,2-一般员工,3-退休人员,4-返聘人员,5-临时工]:;cinp.Type;cout姓名:;cinp.Name;cout性别[0-男,1-女]:;cinp.Sex;cout年龄:;cinp.Age;cout参加工作时间:;cinp.D1;cout来院时间:;cinp.D2;cout职务[0-无,1-科级,2-处级,3-地级]:;cinp.Pos;cout职称[0-无,1-初级,2-中级,3-高级]:;cinp.TechPos;cout政治面貌[0-群众,1-中共党员,2-民主党派]:;cinp.Party;cout学历[0-小学,1-初中,2-高中,3-大专,4-大学,5-硕士,6-博士]:;cinp.Study;returnis;}classCollege//大学类{private:Person*PL;//职工链表voidClear();//清除所有的职工结点(仅保留头结点)intFind1(intID,Person**p1,Person**p2);//按编号查找职工结点intFind2(char*name,Person**p1,Person**p2);//按姓名查找职工结点public:College();//构造~College();//析构voidAdd();//增加职工voidfind1();//按编号查询voidfind2();//按姓名查询voidDelete();//删除职工voidModify();//修改职工voidPrint2();//输出职工信息voidStat();//综合统计voidSave();//职工信息存盘voidLoad();//职工信息装入};College::College()//构造函数(创建1个头结点的链表){Person*p=newPerson;p-next=NULL;PL=p;cout自动装入数据...\n;Load();}College::~College()//析构函数(仅保留1个头结点){Person*p=PL;while(p)//逐个删除结点,包括头结点{PL=p-next;deletep;p=PL;}PL=0;}voidCollege::Add()//增加职工{cout\n**增加职工**\n;//创建新结点Person*pa=newPerson;cin*pa;pa-next=0;//查找尾结点Person*p=PL;while(p-next)p=p-next;//连接p-next=pa;Save();}voidCollege::Clear()//清除所有的职工结点(仅保留头结点){Person*p=PL-next;while(p){PL-next=p-next;deletep;p=PL-next;}}//根据姓名查找职工结点。intCollege::Find2(char*name,Person**p1,Person**p2){*p1=PL-next;*p2=PL;while(*p1){if(strcmp((*p1)-Name,name)==0)break;//找到else{*p2=*p1;//继续查找*p1=(*p1)-next;}}return*p1?1:0;}//根据编号查找职工结点(返回1-找到,0-未找到.结点指针由p1返回,p2为前看指针)intCollege::Find1(intID,Person**p1,Person**p2){*p1=PL-next;*p2=PL;while(*p1){if((*p1)-No==ID)break;//找到else{*p2=*p1;//继续查找*p1=(*p1)-next;}}return*p1?1:0;}voidCollege::find1(){intnid;cout请输入编号:;cinnid;Person*p1,*p2;if(!Find1(nid,&p1,&p2)){cout无此编号人员信息;return;}else{p1-Print1();}}voidCollege::find2()