公司人员管理系统_第1页
公司人员管理系统_第2页
公司人员管理系统_第3页
公司人员管理系统_第4页
公司人员管理系统_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、程序设计基础( c+)课程设计报告公司人员管理系统姓名:班级:学号:指导教师:成绩:完成时间:完成地点:一、设计题目(问题)描述和要求1 题目:公司人员管理系统2 问题描述:某小型公司,主要有四类人员:经理、兼职技术人员、销售经理和兼职推销员。现在,需要存储这些人员的姓名、编号、级别、当月薪水,计算月薪总额并显示全部信息。要求:( 1) 其中,人员编号在生成人员信息时同时生成, 每输入一个人员信息编号顺序加 1。( 2) 程序对所有人员有提升级别的功能( 3) 月薪的计算方法是: 经理拿固定月薪, 兼职技术人员按工作小时数领取月薪,兼职推销员的报酬按该推销员当月销售额提成 , 销售经理既拿固定

2、月薪也领取销售提成。( 4) 能按姓名或者编号显示、查找、增加、删除和保存各类人员的信息二、系统分析与模块设计根据问题描述和要求,系统要求能够按姓名或者编号显示、查找、增加、删除和保存各类人员的信息。确定程序至少应该具备如下功能: “查询人员”、“增加人员”、“删除人员”、“数据存盘”基本模块。系统既然具有“数据存盘”功能人员数据可以保存到磁盘文件,那么也就意味着今后可以从磁盘文件读出人员数据, 所以系统增加了 “人员数据装入” 模块,以方便用户使用、避免数据重复录入。考虑到系统实现简捷,人员数据文件采用文本文件,人员数据文件名: person.txt 。做为一个完整系统,除了具有增加人员,删

3、除人员信息模块,还应该具有修改人员相关信息的功能,所以本系统设计时考虑增加“修改人员”模块。考虑到根据编号查找人员信息功能在“删除人员” 、“修改人员”等模块都使用,所以可以考虑设置为一个模块。考虑到系统要求人员编号在生成人员信息时同时生成,每输入一个人员信息编号顺序加 1。这样就要求人员编号在增加人员时自动生成 ( 增加 1) 且不重复。根据这个要求,可以考虑设置一个全局量: “当前最大编号”,每增加一个人员,当前最大编号自动增 1,然后新增加人员使用这个编号。为了保证系统能记忆这个编号,可以使用一个数据文件保存当前这个编号。 系统每次开始运行前从文件读入这个编号, 随着人员增加, 编号自动

4、增加, 系统每次运行结束时将这个编号写入文件。本系统将初值 ( 没有一个用户时 ) 设置为 0。考虑到人员的许多固定信息如:经理、销售经理的固定月薪,销售经理、销售人员提成,技术人员小时工资等都是一些不需要每个人员都要输入的信息, 所以可以将这些信息都保存在一个数据文件中, 本系统为了方便起见, 将这些信息与“最大编号”全部保存在一个文件中,并使用“基础数据设置”模块进行设置和管理。基础数据文件也采用文本文件,基础数据文件名: base.txt 。本系统还提供“查询本月经营信息”帮助计算销售总额,工资总额,并按照公式计算本月盈亏。综合考虑系统具有下面 8 项功能模块:增加人员,删除人员,修改人

5、员,查询本月经营信息,基础数据设置,数据存盘,数据装入。系统使用的数据文件格式如下:base.txt: (格式:项目数据 )经理固定月薪3000销售经理固定月薪1000销售经理提成1销售人员提成2技术人员小时工资20id6person.txt:(格式:编号 ,姓名 ,人员类别 ,其它数据 ,销售员销售额 ,技术人员工作小时)2wang31000003liu14wu41005huang26tao3150000注:人员类型编号1经理; 2销售经理; 3销售员; 4技术人员三、系统设计1. 系统总体框架使用面向对象的程序设计思想进行分析,整个系统涉及两大类信息和操作,公司,人员。所以系统主要涉及两个

6、大类:公司类company、人员类 person。系统的总体框架就是公司类, 人员类的定义; 主函数中定义一个公司对象,循环显示主菜单并根据用户选择调用公司类的相应方法( 成员函数 ) 。(1) 公司类 company:考虑系统操作的人员信息的数量具有不确定性,所以考虑使用链表保存、 处理人员信息。 公司类包含: 所有人员信息的一个不带头结点的链表(作为数据成员)及可以对人员信息进行增,删,改,查询经营信息,基础数 据 设 置 , 数 据 存 盘 , 数 据 装 入 等 操 作 的 相 关 模 块(add,delete,modify,query,set,save,load)作为成员函数。(2)

7、 人员类 person:所有人员都具有的公共信息及操作可以使用人员类进行描述。由于系统具有 4 类人员且 4 类人员数据, 操作有所不同, 如销售员包含销售额,而技术人员包含工作小时数且计算工资的方法不同, 所以应当为 4 类人员创建相应的 person 类的派生类。(3) 为了使公司类可以方便处理人员信息,可以考虑将公司类确定为人员类的友元类或者人员类提供公共的方法以便公司类进行操作。为了公司类可以用共同方法操作人员类,可以将人员类的方法确定为虚函数。2. 类的层次图person no,name,duty,earning,next,person(),calcsalary(),output()

8、managersalessalesmanagertechnician 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-

9、 指向下一个人员的指针 ;person 类的 calcsalary() ,output() 定义为纯虚函数分别表示要计算人员工资和输出人员信息, 由于定义纯虚函数,所以person 是抽象类,具体计算工资,输出人员信息由派生类完成。( 2)各个派生的类, 包含本类对象特有的数据,sales:amount- 销售员销售额,salesmanager:amount- 销售经理的总销售额(系统统计各个销售员销售额得到销售经理的总销售额),technician:t-技术人员工作小时数。companyperson *worker,clear(),company(),company(),add(),dele

10、te(),modify(),query(),set(),save(),load()其中:( 1) worker 就是人员链表。( 2) clear() 用于清除人员链表所有结点。( 3)add(),delete(),modify(),query(),set(),save(),load()分别表示系统各个功能模块 : 增加人员,删除人员,修改人员,查询本月经营信息,基础数据设置,数据存盘,数据装入。3. 系统关键算法流程图(1) 主函数流程开 始创 建公司 对象显 示菜单接受输入根 据输入 执行公司 操作n退出 ?y结束(2) company:add()开 始id 号 增 1输 入岗 位输入数据

11、 ,创 建员工对象结 点员工结 点 加入链表结束(3) company:delete()开 始输 入员工 id查 找要删除结点结点存在 ?链表删除员工结点提示未找到结束(4) company:modify开 始输 入员工 id查 找结点结 点存在 ?修 改结点提示未找到结束(5) company:query()开 始遍 历统计销售额遍 历统计工 资 总额计算盈亏打印本月经营信息结束(6)company:save()开 始打 开员工数据文 件遍 历链表保存人 员数据关 闭文件打 开基础数据文 件保存基 础数 据关 闭文件结 束(7) company:load()开 始打 开员工 数据文件读 取基

12、础 数据关 闭文件打 开人员 数据文件读 取一条 记录y文件未结束n根据人 员类型创建结点链表加入结点读 下面 一 行记录关闭文件结束四、源程序清单参见附录五、系统测试(列出各功能具体的输入数据及对应的输出结果,说明其是否符合设计要求)六、小结( 设计过程心得体会 )附录:/* 本程序有关的两个数据文件:base.txt基础数据文件 (必须存在,且按规定格式保存)person.txt人员信息文件 (可选 )*/#include #include #include #include /全局数据,对象double managersalary;/经理固定月薪double salesmanagersa

13、lary; /销售经理固定月薪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

14、);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) void calcsalary()earning=managersalary;void output()calcsalary();coutnotnamet 经理 tearningendl;class salesmanager:publ

15、ic 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 se

16、tt(double t)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 销售员 t

17、amounttearningnext;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;v

18、oid company:add()person *p;/新结点指针int duty;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,amo

19、unt); 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;/连接void company:delete()/删除人员int no;coutn*删除员工*n;coutno;/查找要删除的结点person *p1,*p2;p1=worker;while(p1)if(p1-no=no)b

20、reak;elsep2=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;char name20;double amount,t;coutn*修改员工*n;coutno;/查找要修改的结点person *p1,*p2;p1=worker;w

21、hile(p1)if(p1-no=no)break;elsep2=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);

22、break; 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);el

23、se 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;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(

24、按照 20利润计算 )n;void company:set()coutn*设置基础数据*n;cout经理固定月薪 managersalarymanagersalary;cout销售经理固定月薪 salesmanagersalarysalesmanagersalary;cout销售经理提成 salesmanagerpercentsalesmanagerpercent;cout销售人员提成 salespercentsalespercent;cout技术人员小时工资 wageperhourwageperhour;cout=idid;void company:save()/数据存盘 (包括基础数据,人

25、员数据),均采用文本文件ofstream fperson,fbase;char c;coutc; if(toupper(c)!=y)return;/保存人员编号、姓名、岗位fperson.open(person.txt,ios:out);person *p=worker;while(p)fpersonnotnametdutyduty=3)fpersongetamount()duty=4)fpersongett()t;fpersonnext;fperson.close();/保存基础数据fbase.open(base.txt,ios:out);fbase经理固定月薪 tmanagersalary

26、endl;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;fperso

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论