目录1前言...................................................12需求分析...............................................12.1任务和要求.......................................12.2运行环境.........................................12.3开发工具.........................................13分析和设计.............................................23.1系统分析及设计思路................................23.2主要类图.........................................23.3函数流程图.......................................34具体代码实现...........................................45课程设计总结..........................................105.1程序运行结果或预期运行结果.......................105.2设计结论........................................12参考文献................................................13致谢.......................................................................................................1411前言某公司内有5种不同类型的职工:技术人员(technician)、销售人员(salesman)、文秘(secretary)、技术经理(tech-manager)、销售经理(sales-manager)。他们的工资计算方式各不相同:1)技术人员的工资根据他当月工作的小时数来定,时薪为35元;2)销售人员的工资则是根据本人当月销售额来确定,工资为销售额的5%;3)文秘有4000元的基本工资,奖金视当月工作情况而定;4)技术经理和销售经理都有6000元的固定工资,技术经理的工作业绩可分为3个等级,每级可以获得1000元奖金,5)销售经理除有6000元的固定工资外,销售经理的奖金由他所管理的销售员的销售业绩而定,为总销售额的0.2%。为此设计一个工资管理系统管理职工的信息。2需求分析2.1任务和要求使用C++面向对象程序设计一个简易的工资管理系统。,系统的主要功能是:根据不同的职工,计算职工当月工资。确定程序至少应该具备如下功能:.输入职工,添加职工,删除职工,结算工资,等基本模块。1)输入职工:用classperson*creat(void)函数创建链表。2)添加职工:用classperson*insert(classperson*head,classperson*pe)函数添加。3)删除职工:用classperson*del(classperson*head,doublenum)函数删除。4)结算工资:用voidselary(classperson*head)函数计算。2.2运行环境(1)WINDOWS2000/XP系统(2)VisualC++6.0编译环境或DEVC++5.0编译环境2.3开发工具C++语言23分析和设计3.1系统分析及设计思路首先公司有五类人,各类之间又有相同的部分例如:姓名、职工号等,所以定义一个基类Person,四类人相同部分为基类数据成员。由基类Person再派生出各类:技工类Technician类、售货员类Salesman、文秘类Secretary、技术经理类Tech-manager、销售经理类Sales-manager。(1)Person类:包含:num,wage,year,name[10],post[10],sex等数据成员等。要完成结算工资操作,需要设计virtualvoidpay()作为成员函数。(2)Technician类:继承Person类,增加hours数据。(3)Salesman类:继承Person类,增加sales数据。(4)Secretary类:继承Person类,增加bonus数据。(5)Tech-manager类:继承Person类,增加bonus数据(6)Sales-manager类:继承Person类,增加sumsales数据。然后分析系统管理需要有几个功能,分别是输入职工,添加职工,删除职工以及结算工资。我们为这几个功能分别建立对应的函数来实现:classperson*creat(void)、classperson*insert(classperson*head,classperson*pe)、classperson*del(classperson*head,doublenum)、voidselary(classperson*head)。并且还有输出函数print()以及保存信息函数save()最后主函数的实现。由于是有选择的菜单,首先想到了switch选择语句。当输入不同值时,进入不同的case部分以实现不同的功能。case1的功能是实现数据的输入。用creat()函数创建职工信息,按照提示分别输入职工的信息:编号、姓名、性别、出生年份,并用save()函数保存信息。case2的功能是实现数据的添加。用malloc动态分配内存空间,然后输入要添加的职工信息。用insert()函数添加进去。用print()函数输出并保存。case3的功能是实现数据的删除。根据提示输入你要删除的职工编号。按照你输入的编号,用del()函数输出该职工的所有信息。case4的功能是计算职工的工资。根据不同的职工类别计算工资。3.2主要类图3+pay()+num,wage,year,:double+name[10],post[10],sex:charperson+pay()#hours:doubleTechnicia+pay()+sales:doubleSelesma+pay()#bonus:doubleSecretar+pay()#bonus:doubleTechmanage+pay()+sumsales:doubleSalesmanage图3.1主要类图3.3函数流程图(1)主函数流程创建公司对象开始结束显示菜单根据输入执行公司操作接受输入退出?YN图3.2主函数流程图44具体代码实现#includeiostream.h#includefstream.h#includestdlib.h#includestdio.h#includemalloc.h#defineNULL0#defineLENsizeof(classperson)classperson{public:virtualvoidpay(){}doublenum,wage,year;charname[10],post[10],sex;classperson*next;};intn;classTechnician:publicperson{public:voidpay(){cout工时:;cinhours;wage=35*hours;cout工资:wageendl;}protected:doublehours;};classSalesman:publicperson{public:voidpay(){cout销售额:;cinsales;wage=0.05*sales;cout工资:wageendl;}doublesales;};classSecretary:publicperson{public:Voidpay(){cout奖金:;cinbonus;wage=4000+bonus;cout工资:wageendl;}protected:doublebonus;};classTechmanager:publicperson5{public:voidpay(){cout奖金:;cinbonus;wage=6000+bonus;cout工资:wageendl;}protected:doublebonus;};classSalesmanager:publicperson{public:voidpay(){cout总销售额:sumsalesendl;wage=6000+sumsales*0.002;cout工资:wageendl;}doublesumsales;};classperson*creat(void)//创建链表,输入职工{classperson*head,*p1,*p2;n=0;p1=p2=(classperson*)malloc(LEN);cinp1-postp1-nump1-namep1-sexp1-year;head=NULL;while(p1-num!=0){n=n+1;if(n==1)head=p1;elsep2-next=p1;p2=p1;p1=(classperson*)malloc(LEN);cinp1-postp1-nump1-namep1-sexp1-year;}p2-next=NULL;return(head);}voidprint(classperson*head)//输出职工6{classperson*p;coutn个职工信息:endl;cout职务编号姓名性别出生年份endl;p=head;if(head!=NULL)do{coutp-postp-nump-namep-sexp-yearendl;p=p-next;}while(p!=NULL);}classperson*del(classperson*head,doublenum)//删除职工{classperson*p1,*p2;if(head==NULL){coutlistnull!endl;gotoend;}p1=head;while(num!=p1-num&&p1-next!=NULL){p2=p1;p1=p1-next;}if(num==p1-num){if(p1==head)head=p1-next;elsep2-next=p1-next;coutdelete:numendl;n=n-1;}elsecoutnumnotbeenfound!endl;end:return(head);}classperson*insert(classperson*head,classperson*pe)//添加职工{classperson*p0,*p1,*p2;p1=head;p0=pe;if(head==NULL){head=p0;p0-next=NULL;}else{while((p0-nump1-num)&&(p1-next!=NULL)){p2=p1;p1=p1-next;}7if(p0-num=p1-num){if(head==p1)head=p0;elsep2-next=p0;p0-next=p1;}else{p1-next=p0;p0-next=NULL;}}n=n+1;return(head);}voidsave(classperson*head)//保存文件{classperson*p;ofstreamoutfile(职工.txt,ios::out);if(!outfile){cerropenerror!