C++人事管理系统课程设计报告Word文件下载.docx
- 文档编号:16618698
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:22
- 大小:97.09KB
C++人事管理系统课程设计报告Word文件下载.docx
《C++人事管理系统课程设计报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《C++人事管理系统课程设计报告Word文件下载.docx(22页珍藏版)》请在冰豆网上搜索。
销售经理固定月薪1000
销售经理提成%1
销售人员提成%2
技术人员小时工资20
ID6
Person.txt:
编号,姓名,人员类别,其它数据,销售员销售额,技术人员工作小时)
2wang3100000
3liu1
4wu4100
5huang2
6tao3150000
注:
人员类型编号1-经理;
2-销售经理;
3-销售员;
4-技术人员
三、系统设计
1.系统总体框架
使用面向对象的程序设计思想进行分析,整个系统涉及两大类信息和操作,公司,人员。
所以系统主要涉及两个大类:
公司类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()}
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-指向下一个人员的指针;
Person类的CalcSalary(),Output()定义为纯虚函数分别表示要计算人员工资和输出人员信息,由于定义纯虚函数,所以Person是抽象类,具体计算工资,输出人员信息由派生类完成。
(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)主函数流程
(2)Company:
Add()
(3)Company:
Delete()
(4)Company:
Modify
(5)Company:
Query()
(6)Company:
Save()
(7)Company:
Load()
四、源程序清单
参见附录
五、系统测试
(列出各功能具体的输入数据及对应的输出结果,说明其是否符合设计要求)
六、小结
(设计过程心得体会)
附录:
/*本程序有关的两个数据文件:
base.txt-基础数据文件(必须存在,且按规定格式保存)
person.txt-人员信息文件(可选)
*/
#include<
iostream.h>
fstream.h>
ctype.h>
string.h>
//全局数据,对象
doubleManagerSalary;
//经理固定月薪
doubleSalesManagerSalary;
//销售经理固定月薪
doubleSalesManagerPercent;
//销售经理提成%
doubleSalesPercent;
//销售人员提成%
doubleWagePerHour;
//技术人员小时工资
intID;
//员工标识(要保证唯一)
classPerson//员工类
{
protected:
intNo;
//编号
charName[20];
//姓名
intDuty;
//岗位
doubleEarning;
//收入
Person*next;
public:
Person(charID,char*Name,intDuty)
{
this->
Duty=Duty;
strcpy(this->
Name,Name);
No=ID;
}
virtualvoidCalcSalary()=0;
virtualvoidOutput()=0;
friendclassCompany;
};
classManager:
publicPerson//经理类
Manager(charID,char*Name,intDuty):
Person(ID,Name,Duty){}
voidCalcSalary(){Earning=ManagerSalary;
}
voidOutput()
CalcSalary();
cout<
<
No<
"
\t"
Name<
\t经理\t"
Earning<
endl;
classSalesManager:
publicPerson//销售经理类
private:
doubleAmount;
SalesManager(charID,char*Name,intDuty):
voidSetAmount(doubles)
Amount=s;
voidCalcSalary()
Earning=SalesManagerSalary+Amount*SalesManagerPercent/100;
\t销售经理\t"
classTechnician:
publicPerson//技术员类
doublet;
Technician(charID,char*Name,intDuty,doubleT):
Person(ID,Name,Duty)
t=T;
doubleGetT()
returnt;
voidSetT(doubleT)
Earning=WagePerHour*t;
\t技术员\t"
t<
classSales:
publicPerson//销售员类
Sales(charID,char*Name,intDuty,doubleAmount):
Amount=Amount;
doubleGetAmount()
returnAmount;
voidSetAmount(doubleAmount)
Earning=SalesPercent/100*Amount;
\t销售员\t"
Amount<
classCompany//公司类
Person*Worker;
//员工表
voidClear();
//清除内存中数据
Company()
Worker=0;
Load();
~Company()
Person*p;
p=Worker;
while(p)
p=p->
next;
deleteWorker;
Worker=p;
voidAdd();
//增加人员
voidDelete();
//删除人员
voidModify();
//修改人员
voidQuery();
//查询人员
voidSet();
//基础数据设置
voidSave();
//数据存盘(包括基础数据,人员数据)
voidLoad();
//数据装入(包括基础数据,人员数据)
voidCompany:
Clear()//清除内存中人员数据(内部使用)
Person*p=Worker;
Worker=p->
deletep;
//新结点指针
doubleAmount,T;
\n**新增员工**\n"
;
//输入员工信息
ID++;
输入岗位(1-经理2-销售经理3-销售员4-技术员):
cin>
>
Duty;
输入姓名:
Name;
if(Duty==3)
本月销售额:
Amount;
elseif(Duty==4)
本月工作小时数(0-168):
T;
//创建新员工结点
switch(Duty)
case1:
p=newManager(ID,Name,Duty);
break;
case2:
p=newSalesManager(ID,Name,Duty);
case3:
p=newSales(ID,Name,Duty,Amount);
case4:
p=newTechnician(ID,Name,Duty,T);
p->
next=0;
//员工结点加入链表
if(Worker)//若已经存在结点
Person*p2;
p2=Worker;
while(p2->
next)//查找尾结点
p2=p2->
p2->
next=p;
//连接
else//若不存在结点(表空)
}
Delete()//删除人员
\n**删除员工**\n"
ID:
No;
//查找要删除的结点
Person*p1,*p2;
p1=Worker;
while(p1)
if(p1->
No==No)
else
p2=p1;
p1=p1->
//删除结点
if(p1!
=NULL)//若找到结点,则删除
if(p1==Worker)//若要删除的结点是第一个结点
Worker=p1->
deletep1;
else//若要删除的结点是后续结点
next=p1->
找到并删除\n"
else//未找到结点
未找到!
\n"
Modify()
intNo,Duty;
\n**修改员工**\n"
//查找要修改的结点
//修改结点
=NULL)//若找到结点
p1->
Output();
调整岗位(1-经理2-销售经理3-销售员4-技术员):
Duty!
=Duty)//若岗位发生变动
{
//修改其它数据
Person*p3;
p3=newManager(p1->
No,Name,Duty);
p3=newSalesManager(p1->
p3=newSales(p1->
No,Name,Duty,Amount);
p3=newTechnician(p1->
No,Name,Duty,T);
//员工结点替换到链表
p3->
if(p1==Worker)//若要替换的结点是第一个结点
Worker=p3;
next=p3;
//删除原来的员工结点
else//若岗位没有变动
p1->
cin>
((Sales*)p1)->
SetAmount(Amount);
((Technician*)p1)->
SetT(T);
修改成功!
Query()
\n**查询人员本月销售信息**\n"
doublesum=0;
//销售额总和
Person*p=Worker;
if(p->
Duty==3)sum+=((Sales*)p)->
GetAmount();
doublesum2=0;
//工资总和
Duty==2)((SalesManager*)p)->
SetAmount(sum);
sum2+=p->
Earning;
本月盈利:
sum*0.20-sum2<
(按照20%利润计算)\n"
Set()
\n**设置基础数据**\n"
经理固定月薪["
ManagerSalary<
元]:
ManagerSalary;
销售经理固定月薪["
SalesManagerSalary<
SalesManagerSalary;
销售经理提成["
SalesManagerPercent<
%]:
SalesManagerPercent;
销售人员提成["
SalesPercent<
SalesPercent;
技术人员小时工资["
WagePerHour<
(元/小时)]:
WagePerHour;
员工标识[>
="
ID<
]:
ID;
Save()//数据存盘(包括基础数据,人员数据),均采用文本文件
ofstreamfPerson,fBase;
charc;
\n保存人员和基础数据,是否继续?
[Y/N]:
c;
if(toupper(c)!
='
Y'
)return;
//保存人员编号、姓名、岗位
fPerson.open("
person.txt"
ios:
out);
fPerson<
p->
Duty<
Duty==3)
((Sales*)p)->
GetAmount()<
elseif(p->
Duty==4)
((Technician*)p)->
GetT()<
fPerson.close();
//保存基础数据
fBase.open("
base.txt"
fBase<
经理固定月薪\t"
销售经理固定月薪\t"
销售经理提成%\t"
销售人员提成%\t"
技术人
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 人事管理系统 课程设计 报告