2022年c++课程设计 2.pdf
C+程序设计课程设计报告公司人员管理系统姓名:班级:学号:指导教师:完成时间:完成地点:湖南人文科技学院计算机科学技术系名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 20 页 -一、设计题目(问题)描述和要求1 题目:公司人员管理系统2 问题描述:某小型公司,主要有四类人员:经理、兼职技术人员、销售经理和兼职推销员。现在,需要存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息。要求:(1)其中,人员编号在生成人员信息时同时生成,每输入一个人员信息编号顺序加 1。(2)程序对所有人员有提升级别的功能(3)月薪的计算方法是:经理拿固定月薪,兼职技术人员按工作小时数领取月薪,兼职推销员的报酬按该推销员当月销售额提成,销售经理既拿固定月薪也领取销售提成。(4)能按姓名或者编号显示、查找、增加、删除和保存各类人员的信息二、系统分析与模块设计根据问题描述和要求,系统要求能够按姓名或者编号显示、查找、增加、删除和保存各类人员的信息。确定程序至少应该具备如下功能:“查询人员”、“增加人员”、“删除人员”、“数据存盘”基本模块。系统既然具有“数据存盘”功能人员数据可以保存到磁盘文件,那么也就意味着今后可以从磁盘文件读出人员数据,所以系统增加了“人员数据装入”模块,以方便用户使用、避免数据重复录入。考虑到系统实现简捷,人员数据文件采用文本文件,人员数据文件名:Person.txt。做为一个完整系统,除了具有增加人员,删除人员信息模块,还应该具有修改人员相关信息的功能,所以本系统设计时考虑增加“修改人员”模块。考虑到根据编号查找人员信息功能在“删除人员”、“修改人员”等模块都使用,所以可以考虑设置为一个模块。考虑到系统要求人员编号在生成人员信息时同时生成,每输入一个人员信息编号顺序加 1。这样就要求人员编号在增加人员时自动生成(增加 1)且不重复。名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 20 页 -根据这个要求,可以考虑设置一个全局量:“当前最大编号”,每增加一个人员,当前最大编号自动增1,然后新增加人员使用这个编号。为了保证系统能记忆这个编号,可以使用一个数据文件保存当前这个编号。系统每次开始运行前从文件读入这个编号,随着人员增加,编号自动增加,系统每次运行结束时将这个编号写入文件。本系统将初值(没有一个用户时)设置为 0。考虑到人员的许多固定信息如:经理、销售经理的固定月薪,销售经理、销售人员提成,技术人员小时工资等都是一些不需要每个人员都要输入的信息,所以可以将这些信息都保存在一个数据文件中,本系统为了方便起见,将这些信息与“最大编号”全部保存在一个文件中,并使用“基础数据设置”模块进行设置和管理。基础数据文件也采用文本文件,基础数据文件名:Base.txt。本系统还提供“查询本月经营信息”帮助计算销售总额,工资总额,并按照公式计算本月盈亏。综合考虑系统具有下面8 项功能模块:增加人员,删除人员,修改人员,查询本月经营信息,基础数据设置,数据存盘,数据装入。系统使用的数据文件格式如下:Base.txt:(格式:项目数据)经理固定月薪3000 销售经理固定月薪1000 销售经理提成1 销售人员提成2 技术人员小时工资20 ID 6 Person.txt:(格式:编号,姓名,人员类别,其它数据,销售员销售额,技术人员工作小时)2 wang 3 100000 3 liu 1 4 wu 4 100 5 huang 2 6 tao 3 150000 注:人员类型编号1经理;2销售经理;3销售员;4技术人员三、系统设计1.系统总体框架使用面向对象的程序设计思想进行分析,整个系统涉及两大类信息和操作,名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 20 页 -公司,人员。所以系统主要涉及两个大类:公司类Company、人员类 Person。系统的总体框架就是公司类,人员类的定义;主函数中定义一个公司对象,循环显示主菜单并根据用户选择调用公司类的相应方法(成员函数)。(1)公司类 Company:考虑系统操作的人员信息的数量具有不确定性,所以考虑使用链表保存、处理人员信息。公司类包含:所有人员信息的一个不带头结点的链表(作为数据成员)及可以对人员信息进行增,删,改,查询经营信息,基础数 据 设 置,数 据 存 盘,数 据 装 入 等 操 作 的 相 关 模 块(Add,Delete,Modify,Query,Set,Save,Load)作为成员函数。(2)人员类Person:所有人员都具有的公共信息及操作可以使用人员类进行描述。由于系统具有 4 类人员且 4类人员数据,操作有所不同,如销售员包含销售额,而技术人员包含工作小时数且计算工资的方法不同,所以应当为 4 类人员创建相应的 Person 类的派生类。(3)为了使公司类可以方便处理人员信息,可以考虑将公司类确定为人员类的友元类或者人员类提供公共的方法以便公司类进行操作。为了公司类可以用共同方法操作人员类,可以将人员类的方法确定为虚函数。2.类的层次图Person No,Name,Duty,Earning,next,Person(),CalcSalary(),Output()Manager Sales SalesManager Technician Manager(),Amount,Amount,t,CalcSalary(),Sales(),GetAmount(),SalesManager(),Technician(),Output()SetAmount(),SetAmount(),GetT(),SetT(),CalcSalary(),CalcSalary(),CalcSalary(),Output()Output()Output()其中:(1)Person 类的 No-人员编号,Name-人员姓名,Duty-人员类别,Earning-工资,next-指向下一个人员的指针;Person 类的 CalcSalary(),Output()定义为纯虚函数分别表示要计算人员工资和输出人员信息,由于定义纯虚函数,所以Person 是抽象类,具体计算工资,输出人员信息由派生类完成。名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 20 页 -(2)各个派生的类,包含本类对象特有的数据,Sales:Amount-销售员销售额,SalesManager:Amount-销售经理的总销售额(系统统计各个销售员销售额得到销售经理的总销售额),Technician:t-技术人员工作小时数。Company Person*Worker,Clear(),Company(),Company(),Add(),Delete(),Modify(),Query(),Set(),Save(),Load()其中:(1)Worker 就是人员链表。(2)Clear()用于清除人员链表所有结点。(3)Add(),Delete(),Modify(),Query(),Set(),Save(),Load()分别表示系统各个功能模块:增加人员,删除人员,修改人员,查询本月经营信息,基础数据设置,数据存盘,数据装入。3.系统关键算法流程图(1)主函数流程创 建公司 对象开始结束显示 菜单根据输入 执行 公司 操作接受 输入退出?YN名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 20 页 -(2)Company:Add()输入岗位ID号增1输 入数据,创建 员工对象结 点员工结点 加入链表开始结束(3)Company:Delete()查 找要 删除 结 点输 入员 工ID链表 删除 员 工结点开 始结 束结点 存 在?提示 未 找到(4)Company:Modify 查 找结 点输入员工ID修改 结点开 始结 束结 点存在?提示 未找到名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 20 页 -(5)Company:Query()遍历 统 计工资 总 额遍 历 统计 销售 额开始结束计算盈 亏打印 本 月 经 营信息(6)Company:Save()遍历链表保存 人员数据打开员工数 据文件开始结束关闭文件保存基础 数据打开基础数 据文件关闭文件名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 20 页 -(7)Company:Load()读取 基础 数据打 开员 工数据 文件开始结束关闭文 件读取 一条 记录打 开人 员数据 文件关闭文 件文 件未结束根据人 员类型创建 结点链表 加入 结点读下面 一行 记录YN四、源程序清单参见附录五、系统测试(列出各功能具体的输入数据及对应的输出结果,说明其是否符合设计要求)六、小结(设计过程心得体会)名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 20 页 -附录:/*本程序有关的两个数据文件:base.txt 基础数据文件(必须存在,且按规定格式保存)person.txt人员信息文件(可选)*/#include#include#include#include /全局数据,对象double ManagerSalary;/经理固定月薪double SalesManagerSalary;/销售经理固定月薪double SalesManagerPercent;/销售经理提成double SalesPercent;/销售人员提成double WagePerHour;/技术人员小时工资int ID;/员工标识(要保证唯一)class Person/员工类 protected:int No;/编号char Name20;/姓名int Duty;/岗位double Earning;/收入Person*next;public:Person(char ID,char*Name,int Duty)this-Duty=Duty;strcpy(this-Name,Name);this-No=ID;virtual void CalcSalary()=0;virtual void Output()=0;friend class Company;class Manager:public Person/经理类 public:Manager(char ID,char*Name,int Duty):Person(ID,Name,Duty)名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 20 页 -void CalcSalary()Earning=ManagerSalary;void Output()CalcSalary();coutNotNamet 经理tEarningendl;class SalesManager:public Person/销售经理类 private:double Amount;public:SalesManager(char ID,char*Name,int Duty):Person(ID,Name,Duty)void SetAmount(double s)Amount=s;void CalcSalary()Earning=SalesManagerSalary+Amount*SalesManagerPercent/100;void Output()CalcSalary();coutNotNamet 销售经理 tEarningt=T;double GetT()return t;void SetT(double T)名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 20 页 -this-t=T;void CalcSalary()Earning=WagePerHour*t;void Output()CalcSalary();coutNotNamet 技术员 tttEarningAmount=Amount;double GetAmount()return Amount;void SetAmount(double Amount)this-Amount=Amount;void CalcSalary()Earning=SalesPercent/100*Amount;void Output()CalcSalary();coutNotNamet 销售员 tAmounttEarningnext;delete Worker;Worker=p;Worker=0;void Add();/增加人员void Delete();/删除人员void Modify();/修改人员void Query();/查询人员void Set();/基础数据设置void Save();/数据存盘(包括基础数据,人员数据)void Load();/数据装入(包括基础数据,人员数据);void Company:Clear()/清除内存中人员数据(内部使用)Person*p=Worker;while(p)Worker=p-next;delete p;p=Worker;void Company:Add()Person*p;/新结点指针int Duty;名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 20 页 -char Name20;double Amount,T;coutn*新增员工*n;/输入员工信息ID+;coutDuty;coutName;if(Duty=3)coutAmount;else if(Duty=4)coutT;/创建新员工结点switch(Duty)case 1:p=new Manager(ID,Name,Duty);break;case 2:p=new SalesManager(ID,Name,Duty);break;case 3:p=new Sales(ID,Name,Duty,Amount);break;case 4:p=new Technician(ID,Name,Duty,T);break;p-next=0;/员工结点加入链表if(Worker)/若已经存在结点 Person*p2;p2=Worker;while(p2-next)/查找尾结点 p2=p2-next;p2-next=p;/连接 else/若不存在结点(表空)Worker=p;/连接 名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 20 页 -void Company:Delete()/删除人员 int No;coutn*删除员工*n;coutNo;/查找要删除的结点Person*p1,*p2;p1=Worker;while(p1)if(p1-No=No)break;else p2=p1;p1=p1-next;/删除结点if(p1!=NULL)/若找到结点,则删除 if(p1=Worker)/若要删除的结点是第一个结点 Worker=p1-next;delete p1;else/若要删除的结点是后续结点 p2-next=p1-next;delete p1;cout找到并删除 n;else/未找到结点cout未找到!n;void Company:Modify()int No,Duty;名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 20 页 -char Name20;double Amount,T;coutn*修改员工*n;coutNo;/查找要修改的结点Person*p1,*p2;p1=Worker;while(p1)if(p1-No=No)break;else p2=p1;p1=p1-next;/修改结点if(p1!=NULL)/若找到结点 p1-Output();coutDuty;if(p1-Duty!=Duty)/若岗位发生变动/修改其它数据coutName;if(Duty=3)coutAmount;else if(Duty=4)coutT;/创建新员工结点Person*p3;switch(Duty)case 1:p3=new Manager(p1-No,Name,Duty);break;case 2:p3=new SalesManager(p1-No,Name,Duty);break;名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 20 页 -case 3:p3=new Sales(p1-No,Name,Duty,Amount);break;case 4:p3=new Technician(p1-No,Name,Duty,T);break;/员工结点替换到链表p3-next=p1-next;if(p1=Worker)/若要替换的结点是第一个结点Worker=p3;else/若要删除的结点是后续结点p2-next=p3;/删除原来的员工结点delete p1;else/若岗位没有变动 coutp1-Name;if(Duty=3)coutAmount;(Sales*)p1)-SetAmount(Amount);else if(Duty=4)coutT;(Technician*)p1)-SetT(T);cout修改成功!n;else/未找到结点cout未找到!n;void Company:Query()coutDuty=3)sum+=(Sales*)p)-GetAmount();p=p-next;名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 20 页 -p=Worker;double sum2=0;/工资总和while(p)if(p-Duty=2)(SalesManager*)p)-SetAmount(sum);p-Output();sum2+=p-Earning;p=p-next;cout本月盈利:sum*0.20-sum2endl;cout(按照 20利润计算)n;void Company:Set()coutn*设置基础数据*n;cout经理固定月薪 ManagerSalaryManagerSalary;cout销售经理固定月薪 SalesManagerSalarySalesManagerSalary;cout销售经理提成 SalesManagerPercentSalesManagerPercent;cout销售人员提成 SalesPercentSalesPercent;cout技术人员小时工资 WagePerHourWagePerHour;cout=IDID;void Company:Save()/数据存盘(包括基础数据,人员数据),均采用文本文件 ofstream fPerson,fBase;char c;coutc;if(toupper(c)!=Y)return;/保存人员编号、姓名、岗位fPerson.open(person.txt,ios:out);Person*p=Worker;while(p)名师资料总结-精品资料欢迎下载-名师精心整理-第 17 页,共 20 页 -fPersonNotNametDutyDuty=3)fPersonGetAmount()Duty=4)fPersonGetT()t;fPersonnext;fPerson.close();/保存基础数据fBase.open(base.txt,ios:out);fBase经理固定月薪 tManagerSalaryendl;fBase销售经理固定月薪 tSalesManagerSalaryendl;fBase销售经理提成 tSalesManagerPercentendl;fBase销售人员提成 tSalesPercentendl;fBase技术人员小时工资 tWagePerHourendl;fBaseIDtIDendl;fPerson.close();coutbufManagerSalary;/经理固定月薪fBasebufSalesManagerSalary;/销售经理固定月薪fBasebufSalesManagerPercent;/销售经理提成fBasebufSalesPercent;/销售人员提成fBasebufWagePerHour;/技术人员小时工资fBasebufID;/员工标识fBase.close();/清除内存人员数据Clear();/人员数据数据装入ifstream fPerson;Person*p=Worker;int No;char Name20;int Duty;double Amount,T;名师资料总结-精品资料欢迎下载-名师精心整理-第 18 页,共 20 页 -fPerson.open(person.txt,ios:in);/读一条记录fPersonNoNameDuty;if(Duty=3)fPersonAmount;else if(Duty=4)fPersonT;while(fPerson.good()/创建员工结点switch(Duty)case 1:p=new Manager(No,Name,Duty);break;case 2:p=new SalesManager(No,Name,Duty);break;case 3:p=new Sales(No,Name,Duty,Amount);break;case 4:p=new Technician(No,Name,Duty,T);break;p-next=0;/员工结点加入链表if(Worker)/若已经存在结点 Person*p2;p2=Worker;while(p2-next)/查找尾结点 p2=p2-next;p2-next=p;/连接 else/若不存在结点(表空)Worker=p;/连接/读下一条记录fPersonNoNameDuty;if(Duty=3)fPersonAmount;else if(Duty=4)fPersonT;fPerson.close();coutn 人员和基础数据已经装入.n;名师资料总结-精品资料欢迎下载-名师精心整理-第 19 页,共 20 页 -void main()char c;Company a;do coutn*公司人员管理系统*n;cout1增加人员 n;cout2删除人员 n;cout3修改人员 n;cout4查询本月经营信息 n;cout5基础数据设置 n;cout6数据存盘 n;cout7数据装入 n;coutc;switch(c)case 1:a.Add();break;case 2:a.Delete();break;case 3:a.Modify();break;case 4:a.Query();break;case 5:a.Set();break;case 6:a.Save();break;case 7:a.Load();break;while(c!=8);名师资料总结-精品资料欢迎下载-名师精心整理-第 20 页,共 20 页 -