C++_课程设计_公司人员管理系统未删减版要点_第1页
C++_课程设计_公司人员管理系统未删减版要点_第2页
C++_课程设计_公司人员管理系统未删减版要点_第3页
C++_课程设计_公司人员管理系统未删减版要点_第4页
C++_课程设计_公司人员管理系统未删减版要点_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

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

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

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

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

5、月盈亏。 综合考虑系统具有下面 8 项功能模块:增加人员,删除人员,修改人员,查 询本月经营信息,基础数据设置,数据存盘,数据装入。 系统使用的数据文件格式如下: Base.txt: (格式:项目 数据 ) 经理固定月薪 3000 销售经理固定月薪 1000 销售经理提成 1 销售人员提成 2 技术人员小时工资 20 ID 6 Person.txt:(格式:编号,姓名,人员类别,其它数据,销售员销售额,技术人员工作小时) 2 wang 3100000 3 liu 1 4 wu 4 100 5 huang 2 6 tao 3150000 注:人员类型编号 1经理; 2销售经理; 3销售员; 4技

6、术人员 二、 系统设计 1. 系统总体框架 使用面向对象的程序设计思想进行分析, 整个系统涉及两大类信息和操作, 公司,人员。所以系统主要涉及两个大类:公司类 Company人员类Person。系 统的总体框架就是公司类, 人员类的定义; 主函数中定义一个公司对象, 循环显 示主菜单并根据用户选择调用公司类的相应方法 (成员函数 )。 公司类Company考虑系统操作的人员信息的数量具有不确定性,所以考虑 使用链表保存、处理人员信息。公司类包含:所有人员信息的一个不带头结点的 链表(作为数据成员)及可以对人员信息进行增,删,改,查询经营信息,基础 数据设置,数据存盘,数据装入等操作的相关模块

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

8、Earni ng, next,Perso n( ),CalcSalary(),Output() Man ager SalesSalesMa nagerTech ni cia n Ma nager(), Amou nt,Amou nt, t, CalcSalary(), Sales(),GetAmou nt(), SalesMa nager(), Tech nicia n(), Output。SetAmou nt(),SetAmou nt(), GetT(),SetT(), CalcSalary(), CalcSalary(), CalcSalary(), Output() Output() O

9、utput() 其中: (1) Person类的No-人员编号,Name人员姓名,Duty-人员类别,Earning-工 资,next-指向下一个人员的指针;Person类的CalcSalary() ,Output()定义为 纯虚函数分别表示要计算人员工资和输出人员信息,由于定义纯虚函数,所以 Person是抽象类,具体计算工资,输出人员信息由派生类完成。 (2) 各个派生的类,包含本类对象特有的数据,Sales:Amount-销售员销售额, SalesManager:Amount-销售经理的总销售额(系统统计各个销售员销售额得到 销售经理的总销售额),Technician:t- 技术人员工作

10、小时数。 Compa ny Person *Worker, Clear(),Compa ny(),Compa ny(),Add(),Delete(),Modify(), Query(),Set(),Save(),Load() 其中: (1) Worker就是人员链表。 (2) Clear()用于清除人员链表所有结点。 (3) Add(),Delete(),Modify(),Query(),Set(),Save(),Load()分别表示系统各 个功能模块:增加人员,删除人员,修改人员,查询本月经营信息,基础数据设 置,数据存盘,数据装入。 3. 系统关键算法流程图 (1)主函数流程 Compa

11、ny:Add() Compa ny:Delete() Compa ny:Modify (5) Compa ny:Query() (6)Compa ny:Save() (7) Compa ny:Load() 三、源程序清单 参见附录 四、系统测试 CA D:Procra* FilesIicrosoft Visual 人员和基础数据已经装入- 盼人人人本数真请 么醫修查基数数退 统 系 二 瑾 管 自心 五、小结 通过程序设计,我能够基本掌握C+程序设计的方法,并且在此基础上掌握类的构造方 法,明确类中构造函数、成员函数的建立以及调用,此外,并且,结合C+中字符串函数的 编译系统给定的库函数,采用

12、一定的逻辑编译,实现题目中要求的各项要求,达到基本实验 目的,提高自己的 C+语言使用水平。 六、参考文献 【1】陈维兴,林小茶.C+面向对象程序设计教程北京.清华大学出版社 2010, 10 【2】谭浩强.C语言程序设计.北京:清华大学出版社.2010,5 附录: /*本程序有关的两个数据文件: base.txt-基础数据文件(必须存在,且按规定格式保存) person .txt人员信息文件(可选) */ #include #include #include #include /全局数据,对象 double ManagerSalary;/经理固定月薪 double SalesManagerS

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

14、; 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) void CalcSalary()Earning=ManagerSalary; void Output() CalcSalary(); coutNotNamet 经理 t

15、Earningendl; ; 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(); coutNotNam

16、et 销售经理 tEarningt=T; double GetT() return t; void SetT(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=Sale

17、sPercent/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

18、:Clear() /清除内存中人员数据 (内部使用 ) Person* p=Worker; while(p) Worker=p-next; delete p; p=Worker; void Company:Add() Person *p; /新结点指针 int Duty; char Name20; double Amount,T; coutDuty; coutvv输入岗位(1-经理2-销售经理3-销售员4-技术员):; cout输入姓名:;cinName; if(Duty=3) cout本月销售额:;cinAmount; else if(Duty=4) coutvv本月工作小时数(0-168)

19、:; cinT; /创建新员工结点 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) /查找尾

20、结点 p2=p2-next; p2-next=p; /连接 else /若不存在结点 (表空 ) Worker=p; /连接 void Company:Delete() /删除人员 int No; coutvvn* 删除员工 *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

21、; else / 若要删除的结点是后续结点 p2-next=p1-next; delete p1; coutvv找到并删除n; else /未找到结点 cout未找到!n; void Company:Modify() int No,Duty; 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-Outp

22、ut(); coutvv调整岗位(1-经理2-销售经理3-销售员4-技术员):;cinDuty; if(p1-Duty!=Duty) /若岗位发生变动 /修改其它数据 cout输入姓名:;cinName; if(Duty=3) cout本月销售额:;cinAmount; else if(Duty=4) coutvv本月工作小时数(0-168):; cinT; /创建新员工结点 Person *p3; switch(Duty) case 1:p3=new Manager(p1-No,Name,Duty); break; case 2:p3=new SalesManager(p1-No,Name,

23、Duty); 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 / 若岗位没有变动 coutvv输入姓名:;cinp1-Name; if(Duty=3) cout本月销售额:;

24、cinAmount; (Sales *)p1)-SetAmount(Amount); else if(Duty=4) cout本月工作小时数(0-168):;cinT; (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(

25、sum); p-Output(); sum2+=p-Earning; p=p-next; cout本月盈利:vsum*0.20-sum2vendl; coutvv(按照20%利润计算)n; void Company:Set() coutn* 设置基础数据 *n; cout经理固定月薪ManagerSalary; cout销售经理固定月薪SalesManagerSalaryvv元:; cinSalesManagerSalary; coutvv销售经理提成vvSalesManagerPercentSalesManagerPercent; coutvv销售人员提成vvSalesPercentSale

26、sPercent; coutvv技术人员小时工资vWagePerHour; coutvv员工标识=vv|Dvv:; cinID; void Company:Save() /数据存盘 (包括基础数据,人员数据 ),均采用文本文件 ofstream fPerson,fBase; char c; coutvvn 保存人员和基础数据 ,是否继续 ?Y/N:; cinc; if(toupper(c)!=Y)return; /保存人员编号、姓名、岗位 fPerson.open(person.txt,ios:out); Person *p=Worker; while(p) fPersonvvp-Novvtv

27、vp-Namevvtvvp-Dutyvvt; if(p-Duty=3) fPersonvv(Sales*)p)-GetAmount()vvt; else if(p-Duty=4) fPersonvv(Technician *)p)-GetT()vvt; fPersonvvendl; p=p-next; fPerson.close(); /保存基础数据 fBase.open(base.txt,ios:out); fBase经理固定月薪 tvManagerSalaryvvendl; fBase销售经理固定月薪 tSalesManagerSalaryvvendl; fBase销售经理提成 tSale

28、sManagerPercentendl; fBasevv销售人员提成 tSalesPercentendl; fBasevv技术人员小时工资 tvWagePerHourvbufManagerSalary;/经理固定月薪 fBasebufSalesManagerSalary; /销售经理固定月薪 fBasebufSalesManagerPercent; /销/ 售经理提成 /销售人员提成 /技术人员小时工资 /员工标识 fBasebufSalesPercent; fBasebufWagePerHour; fBasebufID; fBase.close(); /清除内存人员数据 Clear(); /人员数据数据装入 ifstream fPerson; Person *p=Worker; int No; char Name20; int Duty; double Amount,T; fPerson.op

温馨提示

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

评论

0/150

提交评论