C++高级编程实习指导_第1页
C++高级编程实习指导_第2页
C++高级编程实习指导_第3页
C++高级编程实习指导_第4页
C++高级编程实习指导_第5页
已阅读5页,还剩67页未读 继续免费阅读

下载本文档

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

文档简介

C++高级编程

实习指导手册(试用稿)

夏军宝

中国地质大学(北京)信息工程学院

2012年9月

目录

1雇员管理系统版本1(数组)......................................1

1.1交互式界面设计...............................................1

1.1.1基本实现..................................................1

1.1.2问题剖析.............................................................................................................2

1.1.3头文件的处理技巧...........................................................................................4

1.2定义数据.....................................................5

1.2.1数据结构.............................................................................................................5

1.2.2定义雇员信息数组..........................................6

1.3添加业务功能.................................................6

1.3.1添加功能函数原型声明......................................6

1.3.2功能函数需求分析............................................................................................7

1.3.3辅助功能实现..............................................8

1.3.4功能函数实现..............................................9

2雇员管理系统版本2(动态内存分配).............................14

3雇员管理系统版本3(简单类)...................................15

3.1封装雇员类EMPLOYEE............................................................................................15

3.1.1Employee类定义..........................................15

3.1.2Employee类成员函数实现..................................16

3.2封装雇员管理类EMPLOYEEMANAGE......................................................................18

3.2.1EmployeeManage类定义....................................18

3.2.2EmployeeManage类成员函数实现............................18

3.3封装菜单类MENU.................................................................................................21

3.3.1Menu类定义..............................................21

3.3.2Menu类成员函数实现......................................21

3.4主程序......................................................22

4雇员管理系统版本4(雇员数组).................................24

4.1存储雇员的数组类...........................................24

4.1.1ArrayEmployee类定义.............................................................................24

4.1.2ArrayEmployee类定义.............................................................................25

4.2修改雇员管理类EMPLOYEEMANAGE..............................................................28

4.2.1EmployeeManage类定义........................................28

4.2.2EmployeeManage类实现........................................29

4.3修改主程序..................................................31

5雇员管理系统版本5(多态版本).................................32

5.1版本4的问题分析...........................................32

5.1.1寻找继承关系.................................................32

5.1.2多态..........................................................32

5.2抽象基类EMPLOYEE......................................................................................33

5.2.1抽象基类Employee类定义....................................33

5.2.2抽象Employee类成员函数实现................................33

5.3派生类FULLTIMEEMPLOYEE和PARTTIMEEMPLOYEE............................................34

5.3.1派生类定义...................................................34

5.3.2派生类成员函数实现..........................................35

5.4修改雇员数组类ARRAYEMPLOYEE..................................................................38

5.4.1分析..........................................................38

5.4.2ArrayEmployee类定义.........................................38

5.4.3ArrayEmployee类实现.........................................39

5.5修改雇员管理类EMPLOYEEMANAGE...............................................................42

5.5.1EmployeeManage类定义........................................42

5.5.2EmployeeManage类实现........................................42

5.6修改主程序..................................................44

5.7ARRAYEMPLOYEE拷贝和赋值运算符中的问题........................45

5.7.1Employee类...................................................46

5.7.2派生类中的clone方法.........................................46

5.7.3完善ArrayEmployee类.........................................47

6雇员管理系统版本6(基于模板)................................48

6.1通用数组类定义及实现UNIVERSALARRAY.....................................................48

6.2通用数组类的问题............................................51

6.2.1修改方法1:继承实例化类................................................................52

6.2.2修改方法2:针对Employee修改UniversalArray类.............54

6.2.3修改方法3:特化模板....................................58

6.3修改EMPLOYEEMANAGE类中数组类成员定义.......................61

6.3.1对应数组类修改方法1........................................................................61

6.3.2对应数组类修改方法2........................................................................62

6.3.3对应数组类修改方法3........................................................................62

7雇员管理系统版本7(STL容器)..................................63

7.1修改EMPLOYEEMANAGE类定义...................................63

7.2修改EMPLOYEEMANAGE类实现...................................63

8雇员管理系统版本8(STL算法)..................................66

8.1修改EMPLOYEEMANAGE类实现...................................66

in

1雇员管理系统版本1(数组)

1.1交互式界面设计

1.1.1基本实现

首先实现基本的交互式界面,提示若干选项,由用户进行选择,根据用户选

择执行不同的功能。

#include<iostream>

charmenu();

intmain()

{

std::cout«nWelcometoEmployeeManagementSystem!\nn;

charchoice;

while(choice=menu())

(

switch(choice)

{

case'O':

break;"具体功能省略

caseT:

break;H具体功能省略

case'2';

break;〃具体功能省略

case3:

break;H具体功能省略

case'4':

break;"具体功能省略

case'5’:

break;"具体功能省略

case'6':

break;"具体功能省略

default:

std::cout«'7nvalidinput!Tryagain!\nn;

break;

)

}

std::cout«nByeBye!\nn;

return0;

charmenu()

std::cout«r,0)quitthesystem^n;

std::cout«"1)addanemployee\nn;

std::cout«n2)removeanemployeeXnn;

std::cout«n3)findemployeebyid\nn;

std::cout«n4)promoteanemployee\nn;

std::cout«n5)penalizeanemployee\n

std::cout«r,6)displayallemployees\n

std::cout«nPleaseenteryourchoice:n;

charchoice;

std::cbi»choice;

returnchoice;

1.1.2问题剖析

1)为保持主程序的简洁,需要将复杂功能提取出来,定义为函数,将menu

功能保存到独立的函数中,并定义相应的头文件;

2)使用T、2等标识相应的菜单项,难以理解和维护,扩展或修改程序

功能比较困难和复杂,通过定义枚举类型以简化使用。

3)程序基本结构设计:添加头文件datatype},定义数据类型(枚举类型、

结构体、常量等);添加function.cpp,定义系统主要功能函数(如menuQ);添

加functions,声明功能函数,以便在主程序或其它代码中调用;主程序文件

main.cpp仅仅包含顶层功能逻辑。

//datatype.h:定义枚举类型

enumMenuitem

MENU_QU/T,MENU_ADD_DATA,MENU_REMOVE_DATA,

MENU_DISPLAY_INFOSfMENU_FIND,MENU.PROMOTE,

MENU_PENALIZE,MENUJLLEGAL

};

//function.h:功能函数的原型声明

#includendataType.hn

Menuiteminenu();

//function.cpp:功能函数的实现

#include<iostream>

2

^includenfunction.hn

#includer,dataType.hn

Menuitemmenu()

std::cout«"0)quitthesysteniXnn;

std::cout«nI)addanemployee\ti,f;

std::cout«n2)removeanemployeeXn

std::cout«n3)findemployeeby

std::cout«n4)promoteanemployee\n,f;

std::cout«n5)penalizeanemployee\nn;

std::cout«n6)displayallemployees\n

std::cout«nPleaseenteryourchoice:u;

charchoice;

std::cin»choice;

Menuitemmenuitem;

switch(choice)

(

case'O':

menuItem=MENU_QUIT;break;

case7f:

menultem=MENU_ADD_DATA;break;

case'2':

menultem=MENU_REMOVE_DATA;break;

case'3':

tnenuItem=MENU_FIND;break;

case'4':

menuIteni=MENU_PROMOTE;break;

case'5':

menuItem=MENU_PENALIZE;break;

case'6':

menuItem=MENU_piSPLAYJNFOS;break;

default:

menuitem=MENU_ILLEGAL;break;

)

returnmenuItem;

〃修改主程序main.cpp

#include<iostream>

#includendataType.hu

#include"function.h"

intmain()

3

std::cout«nWelcometoEmployeeManagementSystem!\n°;

Menuitemchoice;

while(choice=menu())

(

switch(choice)

(

caseMENU_QUIT:

break;H具体功能省略

caseMENU_REMOVE_DATA:

break;H具体功能省略

caseMENU_ADDJDATA:

break;M具体功能省略

caseMENU_DISPLAY_INFOS:

break;〃具体功能省略

caseMENU_FIND:

break;II具体功能省略

caseMENVJPROMOTE:

break;〃具体功能省略

caseMENU.PENALIZE:

break;"具体功能省略

default:

std::cout«nInvalidinput!Tryagain!\n

break;

)

}

std::cout«nByeBye!\nn;

return0;

)

1.1.3头文件的处理技巧

在function.h中包含了datatype.h;

在main.cpp中同时包含了datatype.h和function.h,会重复包含datatype.h文

件中的内容,引起编译错误,解决头文件重复包含的方法。

//datatype.h:定义枚举类型

mfndefDATATYPEJ1EADER

#defineDATATYPE_HEADER

enumMenuitem

(

MENU_QUIT,MENU_ADD_DATA,MENU_REMOVE_DATA,

MENU_DISPLAY_INFOS,MENU.FIND,MENU_PROMOTE,

MENU_PENALIZE,MENUJLLEGAL

4

#endif

//function.h:功能函数的原型声明

#ifndefFUNCTION_HEADER

^defineFUNCTION_HEADER

#include"dataType.h',

Menuitemmenu();

#endif

1.2定义数据

1.2.1数据结构

为描述雇员的信息,需要设计相应的数据结构,在datatype^中添加描述单

个雇员的结构体定义。

在版本1中,我们通过结构体数组描述所有雇员的信息,为便于维护,在

datatype.h中定义最大雇员数的常量。

//datatype.h:定义枚举类型和雇员信息结构体

#ifndefDATATYPE_HEADER

#defineDATATYPE_HEADER

#include<string>

enumMenuitem

(

MENU.QUIT,MENU_ADD_DATA,MENU_REMOVE_DATA,

MENU_DISPLAY」NFOS,MENU_FIND,MENU_PROMOTE,

MENU_PENALIZE,MENUJLLEGAL

);

structEmployeeinfo

{

longid;

std::stringname;

doublesalary;

doublebonus;

);

constintMAX_EMPLOYEE_NUM=100;

#endif

5

1.2.2定义雇员信息数组

在main函数中,定义存储所有雇员信息的数组,为便于维护,应避免使用

全局数组和全局变量。

为跟踪当前雇员的数量,定义辅助变量,以记录实际雇员数量。

#include<iostream>

#include"dataType.h"

#includeHfunction.hH

intmain()

(

std::cout«"WelcometoEmployeeManagementSystem!\nM;

Employeeinfoemployees[MAX_EMPLOYEE_NUM];

intemployeeNum=O;

Menuitemchoice;

while(choice=menu())

(

…〃省略实际代码

)

return0;

}

1.3添加业务功能

1.3.1添加功能函数原型声明

针对主程序中的每个菜单项,需要编写1个配套的功能函数,功能函数的定

义放在function.cpp中,同时在function.h中添加功能函数声明,在主程序的相

应菜单下调用功能函数。

因雇员信息的数组和计数变量是main函数的局部变量,在调用功能函数时

需要将数据作为参数传递给函数。数组可以通过指针传递,如果函数需要修改计

数变量employeeNum,需要传递引用;如果不修改传值即可。

//function.h

#ifndefFUNCTION.HEADER

#defineFUNCTION_HEADER

#include"dataType.h"

6

Menuitemmenu();

voiddisplayEmployees(EmployeeInfo^pEmployees,intnum);

voidaddEmployee(EmployeeInfo^pEmployees9int&num);

voidremoveEmployee(Employeeinfo^pEmployees,int&num);

voidfindEmployee(Employeeinfo^pEmployees,intnum);

voidpromoteEmployee(Employeeinfo^Employees,intnum);

voidpenalizeEmpoyee(EmployeeInfo^pEmployees,intnum);

#endif

1.3.2功能函数需求分析

1)向系统中添加新的雇员信息:为简化处理,新增雇员添加到现有数据的

尾部;当实际雇员数量达到MAX_EMPLOYEE_NUM时,应禁止添加。

添加雇员时,雇员Id号不得重复。添加雇员信息时,提示用户输入雇员

的id、姓名、工资和奖金信息。添加雇员后,employeeNum增1。

2)从系统删除指定的雇员信息:需要用户指定雇员的Id,系统查找指定Id

的雇员是否存在,若存在则删除相应的雇员信息,若不存在则提示错误。

删除雇员成功后,employeeNum减1。因为采用数组存储信息,删除某

个雇员后,应将后续的雇员数据往前移动。

3)查找雇员:需要用户指定雇员Id,系统查找指定Id的雇员是否存在,若

存在则显示该雇员的信息,若不存在则提示错误。

4)显示所有雇员:遍历显示所有雇员的信息。

5)奖励雇员:需要用户指定雇员Id,系统查找指定Id的雇员是否存在,若

存在则执行奖励处理,若不存在则提示错误。每次奖励员工时,将其奖

金增加500元。

6)惩罚员工:需要用户指定雇员Id,系统查找指定Id的雇员是否存在,若

存在则执行惩罚处理,若不存在则提示错误。每次惩罚员工时,将其奖

金减少500元,但奖金不得为负数;若惩罚时奖金已经为0,则下调其

工资10%o

分析以上的功能需求,发现存在许多重复的功能,应将其提炼出来,作为公

共模块加以调用。

根据雇员Id号查找雇员在多个模块中重复(奖励雇员、惩罚雇员、查找雇

员、添加雇员、删除雇员),将其提取出来作为公共模块(findEmployeByld)o

7

查找雇员模块找到特定雇员后显示该雇员的信息,而显示所有雇员模块是逐

一显示所有雇员的信息,可以将显示单个雇员信息的功能提取出来作为公共模块

(showEmployeelnfo)。

添加雇员的模块中,需要用户输入雇员的所有信息,可以将设定雇员信息的

模块提出作为独立的函数(setEmployeelnfo)。

1.3.3辅助功能实现

findEmployeeByld、showEmployee、setEmployeelnfo等模块是功能函数的内

部共用模块,不会被主程序调用,它们的声明不用放在functions中,可以考虑

将它们放在独立的文件中,如help.h和help.cpp中。

findEmployeeByld查找特定Id的雇员,若存在则返回该雇员的地址,若不

存在则返回NULLo

//help.h辅助函数的声明

的fndefHELP.HEADER

#defineHELP_HEADER

#includeudataType.hu

Employeeinfo^findEmployeeById(Employeeinfo^pEniployees,

intnum,longemployeeld);

voidshowEmployeehifo(Employeeinfo^pEmployee);

voidsetEmployeeInfo(Employeeinfo^pEmployee);

#endif

//help.cpp辅助函数的定义

#include<iostream>

^includendatatype.hn

voidsetEmployeeInfo(EmployeeInfo"Employee)

{

std::cout«”Entertheemployee'sname:n;

std::cin»pEmployee->name;

std::cout«"Entertheemployee'ssalary:

std::cin»pEmployee->salary;

std::cout«"Entertheemployee'sbonus:n;

std::cin»pEmployee->bonus;

}

EmployeeinfotfifindEmployeeById(Employeeinfo^pEmployees,intnum,longemployeeld)

{

Employeeinfo^pEmployee=pEmployees;

8

for(;pEmployee<pEmployees+wum;pEmployee+-^)

if(pEmployee->id-employeeId)

(

returnpEmployee;

}

}

returnNULL;

}

voidshowEmployee!nfo(EmployeeInfo邪Employee)

(

std::cout«"EmployeeId:,,«pEmployee->id«std::endl;

std::cout«"Name:u«pEmployee->name«std::endl;

std::cout«”Income:n«pEmployee->salary^pEmployee->bonus

«n(Salary:,r«pEmployee->salary«Bonus:''

«pEmployee->bonus«")\nr,;

)

1.3.4功能函数实现

//function.cpp

#include<iostream>

#include'Tunction.h"

ffincludet,help.h,t

#include"dataType.h"

Menuitemmenu()

(

std::cout«"0)quitthesystem\n";

std::cout«"1)addanemployee\nu;

std::cout«"2)removeanemployee\n";

std::cout«"3)findemployeebyid\nM;

std::cout«H4)promoteanemployee\nH;

std::cout«"5)penalizeanemployee\n";

std::cout«"6)displayallemployees'll”;

std::cout«"Pleaseenteryourchoice:";

charchoice;

std::cin»choice;

Menuitemmenuitem;

switch(choice)

9

case'O':

menuItem=MENU_QUIT;break;

caseT:

menuItem=MENU_ADD_DATA;break;

case2:

menuItem=MENU_REMOVE_DATA;break;

case3:

menuItem=MENU_FIND;break;

case'4':

menuItem=MENU_PROMOTE;break;

case5:

menuItem=MENU_PENALIZE;break;

case'6':

menuItem=MENU_DISPLAY_INFOS;break;

default:

menuItem=MENU_ILLEGAL;break;

)

returnmenuitem;

)

voiddisplayEmployees(Employeeinfo^pEmployees,intnum)

(

inti;

std::cout«nTotalnumber:'1«num«std::endl;

for(i=0;i<niun;i+-¥)

{

showEmployeeInfo(&pEmployees[i]);

)

std::cout«std::endl;

}

voidaddEmployee(EmployeeInfo^pEmployees,int&num)

{

if(num==MAX_EMPLOYEE_NUM)

(

std::cout«nNomemoryfortheemployee'sinfo!\n\n

return;

}

intemployeeld;

std::cout«nEntertheemployee'sid:n;

std::cin»employeeld;

Employeeinfo^pEmployee=findEmployeeById(pEmployeesfnutn,eniployeeld);

if(pEmployee!-NULL)

10

std::cout«nTheemployeen«employeeld«ndoesexist!\n\nu;

return;

}

pEmployee=&pEmployees[num];

pEmployee->id=employee!d;

setEmployeelnfo(pEmployee);

num++;

std::cout«nTheemployeehasbeenappended!\u\nn;

voidremoveEmployee(Employeeinfo^pEmployees^int&num)

{

intemployeeld;

std::cout«”Entertheemployeersid:f,;

std::cin»employeeld;

Employeeinfo^pEmployee=findEmployeeById(pEmployeesfnum,ernployeeld);

if(pEmployee-NULL)

/

std::cout«"Theemployee,,«employeeld«ndoesn'texist!\n\nn;

return;

}

num-;

while(pEmployee<pEmployees+num)

{

Employeeinfo^pNext=pEmployee+l;

pEmployee->id=pNext->id;

pEmployee->name=pNext->name;

pEmployee->salary=pNext->salary;

pEmployee->bonus=pNext->bonus;

pEniployee++;

}

std::cout«nTheemployeehasbeenremoved!\n\nn;

}

voidfindEmployee(Employeeinfo^pEmployeesfintnum)

{

intemployeeld;

std::cout«"Entertheemployee'sid:f,;

std::cin»employeeld;

11

Employeeinfo^pEinployee=findEmployeeById(pEmployeesfnum,employeeld);

if(pEmployee-NULL)

(

std::cout«nTheemployee,,«employeeld«ndoesn'texistn;

return;

)

showEmployeelnfo(pEmployee);

std::cout«std::endl;

}

voidpromoteEniployee(Employeeinfo"Employees,i,itiium)

(

intemployeeld;

std::cout«nEntertheemployeersid:

std::ci〃》employeeld;

Employeeinfo^pEmployee=findEmployeeById(pEmployeesfnum9employeeld);

if(pEmployee==NULL)

(

std::cout«nTheemployee,,«employeeld«ndoesn'texist!\ii\n

return;

)

pEmployee->bonus+=500;

std::cout«nTheemployee,,«employeeld«nhasbeenpromoted!\n\tiH;

}

voidpenalizeEmpoyee(Entployeelnfo^pEmployees,intnum)

(

intemployeeld;

std::cout«nEntertheemployee'sid:n;

std::cin»employeeld;

Employeeinfo^pEmployee=findEtnployeeById(pEmployeesynum,employeeld);

if(pEniployee-NULL)

(

std::cout«nTheemployeeu«employeeld«ndoesn7exist

return;

)

if(pEmployee->bonus-0)

pEntployee->salary*=0・9;

else

pEmployee->bonus-=500;

if(pEmployee->honus<0)

12

pEmployee->bonus=0;

)

std::cout«nTheemployee,,«employeeld«nhasbeenpenalized!\n\nu;

}

〃修改主程序main.cpp

#include<iostream>

#include"dalaType.h"

#includenfunction.hn

inimain()

(

std::cout«"WelcometoEmployeeManagementSystem!\nH;

Menuitemchoice;

while(choice=menu())

(

switch(choice)

(

caseMENUJQUIT:

break;

caseMENU_REMOVEJDATA:

removeEmployee(employeesfemployeeNum);

break;

caseMENUyiDD_DATA:

addEmployee(employees,employeeNum);

break;

caseMENUDISPLAYJNFOS:

displayEmployees(employeesyemployeeNum);

break;

caseMENU_FIND:

JindEmployee(employees,employeeNum);

break;

caseMENU.PROMOTE:

promoteEmployee(employees,employeeNum);

break;

caseMENU.PENALIZE:

penalizeEmpoyee(employees,employeeNum);

break;

default:

std::cout«'Invalidinput!Tryagain!\nu;

break;

}

}

std::cout«"ByeBye!\nu;

return0;

13

2雇员管理系统版本2(动态内存分配)

版本1中的代码,定义数组保存雇员信息,需要在代码中硬编码数组大小,

修改大小后需要重新编译发布程序。

可以考虑在程序运行过程中动态分配内存,系统启动后,由用户输入并确定

数组大小(最大雇员数量)。

定义全局变量(maxEmployeeNum),以保存用户设置的最大雇员数量。为

便于对全局变量的访问和管理,将maxEmployeeNum定义在help.cpp文件中,

在function.h中包含对maxEmployeeNum的声明。

//function.cpp辅助函数的定义

#include<iostream>

#includeMfunction.hu

#include"help.h"

#include"dataType.h"

intmaxEmployeeNum;

…〃其它代码省略

//function.h

#ifndefFUNCTION_HEADER

#defineFUNCTION_HEADER

#includendataType.hM

externintmaxEmployeeNum;

Menuitemmenu();

voiddisplayEmployees(EmployeeInfo*pEmployees,intnum);

voidaddEmployee(EmployeeInfo*pEmployees,int&num);

voidremoveEmployee(EmployeeInfo*pEmployees,Int&num);

voidfindEmployee(EmployeeInfo*pEmployees,intnum);

voidpromoteEmployee(EmployeeInfo*pEmployees,intnum);

voidpenalizeEmpoyee(EmployeeInfo*pEmployees,intnum);

#endif

//main.cpp

#include<iostream>

#includendataType.h"

#include"function.h"

intmain()

14

std::cout«nWelcometoEmployeeManagementSystem!\n°;

std::cout«"Enterthemaxemployeenumber:n;

std::cin»maxEmployeeNum;

Employeeinfo^employees-newEmployeeInfo[maxEmployeeNum];

intemployeeNum=0;

…〃其它代码省略

delete[]employees;

return0;

)

进一步完善:固定最大雇员数量的做法不够完美,可以通过其它数据结构,

允许中程序运行过程中,动态增加或移除数据,而不设置雇员数量的上限。例如

可以通过链表等数据结构。

3雇员管理系统版本3(简单类)

3.1封装雇员类Employee

Employee应封装对单个雇员信息,存储雇员姓名、id、工资和奖金,提供相

应的构造函数,提供设置和读取工资、设置和读取奖金、读取总收入、奖励、惩

罚、输出基本信息功能接口。

3.1.1Employee类定义

//employee,h

#ifndefHEADER_EMPLOYEE

#defineHEADER_EMPLOYEE

#include<string>

classEmployee

{

public:

Employee(std::stringname,longid,doublesalary=0fdoublebonus^O);

Employee(constEmployee&e);

Employee();

voidoutputlnfo()const;

doublegetlncomes()const;

doublegetSalary()const;

doublegetBonus()const;

intgetld()const;

15

voidsetSalary(doublesalary);

voidsetBonus(doublebonus);

voidpromote();

voidpenalize();

private:

std::stringname;

longid;

doublesalary;

doublebonus;

};

#endif

3.1.2Employee类成员函数实现

//employee.cpp

#include<iostream>

#include''Employee.h'9

Employee::Employee(std::stringname,longid,doublesalary,doublebonus)

{

this->name-name;

this->id=id;

this->salary-salary;

this->bonus=honus;

)

Employee::Employee(constEmployee&e)

(

name=;

id=e,id;

salary^.salary;

bonus=e.bonus;

}

Employee::Employee()

{

name=nunknownn;

id=0;

salary=0;

bonus=0;

}

voidEmployee::outputlnfo()const

{

std::cout«nEmployeeId:u«id«std::endl;

std::cout«"Name:,,«name«std::endl;

std::cout«nIncome:f,«getlncomes()

16

«r,(Salary:''«sakuy«'\Bonus:"v<b(musvv")\n";

doubleEmployee::getlncomes()const

(

returnsalary+bonus;

)

doubleEmployee::getSalary()const

(

returnsalary;

)

doubleEmployee::getBonus()const

(

returnbonus;

)

intEmployee::getld()const

(

returnid;

)

voidEmployee::setSalary(doublesalary)

{

this->salary=salary;

)

voidEmployee::setBonus(doublebonus)

{

this->bonus-bonus;

}

voidEmployee::protnote()

(

bonus+=500;

}

voidEmployee::penalize()

{

if(bonus~0)

{

salary^=0.9;

}

else

bonus-=500;

if(honus<0)

bonus-0;

17

3.2封装雇员管理类EmployeeManage

EmployeeManage类中,包含Employee指针作为数据成员,同时定义最大雇

员数量和当前实际雇员数量,在构造函数中动态分配内存。

EmployeeMange类提供添加雇员、删除雇员、查看指定雇员、查看所有雇员、

奖励雇员和惩罚雇员接口。

3.2.1EmployeeManage类定义

//employeemanage.h

#ifndefHEADER_EMPLOYEE_MANAGE

#defineHEADERJEMPLOYEE_MANAGE

#includefrEmployee.h,f

classEmployeeManage

(

public:

EmployeeManage(intmaxSize=0);

-EmployeeManage();

voidaddEmployee(constEmployee&e);

voidremoveEmployee(intid);

voiddisplayEmployees()const;

voidretriveEmployee(intid)const;

voidpromoteEmployee(intid);

voidpenalizeEmployee(intid);

private:

Employee^pemp;

intmaxSize;

intcurSize;

Employee*findEmployeeByld(intid)const;

);

#endif

3.2.2EmployeeManage类成员函数实现

//employeemanage.cpp

#include<iostream>

^include^'EmployeeManage.h''

EmployeeManage::EmployeeManage(intmaxSize)

18

thiS">maxSize=maxSize;

curSize=O;

pemp=newEmployee[maxSize];

/

EmployeeManage::-EmployeeManage()

(

delete[]pemp;

pemp=NULL;

)

voidEmployeeManage::addEmployee(constEmployee&e)

(

if(curSize-maxSize)

(

std::cout«"Nomemoryfortheemployee'sinfo!\n\nn;

return;

)

Employee^pEmployee=findEmployeeById(e.getId());

if(pEmployee!=NULL)

(

std::cout«"Theemployee,,«e.getld()«ndoesexist!\n\n,r;

return;

}

pemp[curSize]=e;

curSize++;

}

voidEmployeeManage::removeEmployee(intid)

(

Employee*pEmployee=ftndEtnployeeById(id);

if(pEniployee-NULL)

(

std::cout«"Theemployeen«id«udoesn7exist!\n\nn;

return;

}

Employee^pNext;

curSize-;

while(pEmployee<pemp-\-curSize)

(

pNext=p

温馨提示

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

评论

0/150

提交评论