实验一人员信息管理系统(一)
?类与对象的含义是什么?
?构造函数与析构函数的作用以及特点是什么?
开发“人员信息”管理系统:
存储某小型公司雇员的编号,级别和月薪
显示雇员的全部信息
熟悉用Visuanl C++编写多文件结构程序
会按照需求设计人员类的成员
会定义构造函数和析构函数
某小型公司,需要存储雇员的编号、级别、月薪并显示全部信息。根据这些需求,设计一个类employee,在该类中,除了定义构造函数和析构函数以外,还应统一定义对人员信息应有的操作。在类employee中包括的数据成员有编号,级别和月薪等,包括的操作有设置和提取编号,计算和提取级别,设置和提取月薪。构造函数用于设置数据成员编号,级别和月薪的初值。
创建一个工程:EmployeeManagementSystem
创建一个头文件:Employee.h,包含类定义和类的实现
创建一个主函数文件
//employee.h
class employee
{
protected:
int individualEmpNo; //个人编号
int grade; //级别
float accumPay; //月薪
public:
employee(); //构造函数
~employee(); //析构函数
void IncreaseEmpNo (int); //增加编号函数
void promote(int); //升级函数
void SetaccumPay (float); //设置月薪函数
int GetindividualEmpNo(); //提取编号函数
int Getgrade(); //提取级别函数
float GetaccumPay(); //提取月薪函数
};
employee::employee()
{ individualEmpNo=1000; //员工编号目前最大编号为1000 grade=1; //级别初值为1
accumPay=0.0; } //月薪总额初值为0
employee::~employee() {} //析构函数为空
void employee::IncreaseEmpNo (int steps)
{ individualEmpNo+=steps;} //增加编号,增加的步长由steps指定
void employee::promote(int increment)
{ grade+=increment;} //升级,提升的级数由increment指定
void employee::SetaccumPay (float pa)
{ accumPay=pa;} //设置月薪
int employee::GetindividualEmpNo()
{ return individualEmpNo;} //获取成员编号
int employee::Getgrade()
{ return grade;} //获取级别
float employee::GetaccumPay()
{ return accumPay;} //获取月薪
//4_5.cpp
#include
#include"employee.h"
using namespace std;
void main()
{
employee m1;
employee t1;
employee sm1;
employee s1;
cout<<"请输下一个雇员的月薪:";
float pa;
cin>> pa;
m1.IncreaseEmpNo(0); //m1编号为当前编号
m1.promote(3); //m1提升3级
m1.SetaccumPay (pa); //设置m1月薪
cout<<"请输下一个雇员的月薪:";
cin>>pa;
t1.IncreaseEmpNo(1); //t1编号为当前编号加1
t1.promote(2); //t1提升2级
t1.SetaccumPay (pa); //设置t1月薪
cout<<"请输下一个雇员的月薪:";
cin>> pa;
sm1.IncreaseEmpNo(2); //sm1编号为当前编号加2
sm1.promote(2); //sm1提升2级
sm1.SetaccumPay (pa); //设置sm1级别
cout<<"请输下一个雇员的月薪:";
cin >>pa;
s1.IncreaseEmpNo(3); //s1编号为当前编号加3
s1.SetaccumPay (pa); //设置s1月薪
//显示m1信息
cout<<"编号"< <<"级别为"< //显示t1信息 cout<<"编号"< <<"级别为"< //显示sm1信息 cout<<"编号"< <<"级别为"< //显示s1信息 cout<<"编号"< <<"级别为"< } 实验二人员信息管理系统(二) 静态数据成员所具有的静态生存期的性质 友元类与友元函数的定义及使用 开发“人员信息”管理系统: 存储某小型公司雇员的编号,级别和月薪 显示雇员的全部信息 实现员工编号的自动增加 应用静态数据成员的性质来处理职员编号数据成员的方法 能熟练进行类定义及构造函数的编写 在实验(一)需求的基础上,在类employee中增加一个静态数据成员来设置本公司职员编号目前最大值,删除了成员函数IncreaseEmpNo(int steps),其功能通过构造函数来实现。 //employee.h class employee { protected: int individualEmpNo; //个人编号 int grade; //级别 float accumPay; //月薪 static int employeeNo; //本公司职员编号目前最大值 public: employee(); //构造函数 ~employee(); //析构函数 void promote(int); //升级函数 void SetaccumPay (float pa); //设置月薪函数 int GetindividualEmpNo(); //提取编号函数 int Getgrade(); //提取级别函数 float GetaccumPay(); //提取月薪函数 }; //empfunc.cpp #include #include"employee.h" using namespace std; int employee::employeeNo=1000; //员工编号基数为1000 employee::employee() { individualEmpNo=employeeNo++; //新输入的员工编号为目前最大编号加1 grade=1; //级别初值为1 accumPay=0.0; } //月薪总额初值为0 employee::~employee() {} void employee::promote(int increment) { grade+=increment;} //升级,提升的级数由increment指定 void employee::SetaccumPay (float pa) { accumPay=pa;} //设置月薪 int employee::GetindividualEmpNo() { return individualEmpNo;} //获取成员编号 int employee::Getgrade() { return grade;} //获取级别 float employee::GetaccumPay() { return accumPay;} //获取月薪 /5_11.cpp #include #include"employee.h" using namespace std; void main() { employee m1; employee t1; employee sm1; employee s1; cout<<"请输下一个雇员的月薪:"; float pa; cin>> pa; m1.promote(3); // m1提升3级 m1. SetaccumPay (pa); //设置m1月薪 cout<<"请输下一个雇员的月薪:"; cin>>pa; t1.promote(2); //t1提升2级 t1. SetaccumPay (pa); //设置t1月薪 cout<<"请输下一个雇员的月薪:"; cin>> pa; sm1.promote(2); //s1提升2级 sm1. SetaccumPay (pa); //设置sm1月薪 cout<<"请输下一个雇员的月薪:"; cin >>pa; s1. SetaccumPay (pa); //设置s1月薪 //显示m1信息 cout<<"编号"< <<"级别为"< //显示t1信息 cout<<"编号"< <<"级别为"< //显示sm1信息 cout<<"编号"< <<"级别为"< //显示s1信息 cout<<"编号"< <<"级别为"< } 实验三人员信息管理系统(三) 对象数组被使用时构造函数与析构函数的调用 对象的深拷贝与浅拷贝 升级“人员信息”管理系统,增加以下功能: 录入职员姓名信息 显示员工姓名 字符数组的使用 对象数组的使用 在类employee中新增加另一个数据成员——以字符数组成员char name[20]来保存的职工姓名,相应的增加成员函数setname(char *)和char *GetName( )用来设置和提取姓名。 //employee.h class employee { protected: char name[20]; //姓名 int individualEmpNo; //个人编号 int grade; //级别 float accumPay; //月薪 static int employeeNo; //本公司职员编号目前最大值 public: employee(); //构造函数 ~employee(); //析构函数 void SetName(char *); //设置姓名函数 char * GetName(); //提取姓名函数 void promote(int); //升级函数 void SetaccumPay (float pa); //设置月薪函数 int GetindividualEmpNo(); //提取编号函数 int Getgrade(); //提取级别函数 float GetaccumPay(); //提取月薪函数 }; //empfunc.cpp #include #include #include"employee.h" using namespace std; int employee::employeeNo=1000; //员工编号基数为1000 employee::employee() { individualEmpNo=employeeNo++; //新输入的员工编号为目前最大编号加1 grade=1; //级别初值为1 accumPay=0.0; } //月薪总额初值为0 employee::~employee() {} void employee::promote(int increment) { grade+=increment;} //升级,提升的级数由increment指定 void employee::SetName(char* names) { strcpy(name,names); } //设置姓名 char* employee::GetName() { return name;} //提取成员姓名 void employee::SetaccumPay (float pa) { accumPay=pa;} //设置月薪 int employee::GetindividualEmpNo() { return individualEmpNo;} //获取成员编号 int employee::Getgrade() { return grade;} //获取级别 float employee::GetaccumPay() { return accumPay;} //获取月薪 //6_25.cpp #include #include"employee.h" using namespace std; void main() { employee emp[4]; char namestr[20]; //输入雇员姓名时首先临时存放在namestr中 float pa; int grade, i; for (i=0; i<4; i++) { cout<<"请输下一个雇员的姓名:"; cin>>namestr; emp[i].SetName(namestr); //设置雇员emp[i]的姓名 cout<<"请输入雇员的月薪:"; cin>> pa; emp[i]. SetaccumPay (pa); //设置emp[i]的月薪 cout<<"请输入雇员的提升级别:"; cin>>grade; emp[i].promote(grade); // emp[i]升级 } //显示信息 for (i=0; i<4; i++) { cout<< emp[i].GetName()<<"编号"<< emp[i].GetindividualEmpNo() <<"级别为"<< emp[i].Getgrade()<<"级,本月工资"<< emp[i].GetaccumPay()< } } 实验四人员信息管理系统(四) 类的派生与继承 派生类的构造函数与析构函数的使用 虚基类与虚函数的使用 升级“人员信息”管理系统,增加以下功能: 改进月薪处理功能 基类与派生类的定义和使用 虚基类的定义与使用 不同类型员工的月薪计算方法如下:经理固定月薪8000元;兼职技术人员 按每小时100元领取月薪;兼职推销员的月薪按该推销员当月销售额的4%提成;销售经理既拿固定月薪也领取销售提成,固定月薪为5000元,销售提成为所管辖部门当月销售总额的5%。 设计一个基类employee,然后派生technician(兼职技术人员)、manager(经理) 类和salesman(兼职推销员)类。 //employee.h class employee { protected: char name[20]; //姓名 int individualEmpNo; //个人编号 int grade; //级别 float accumPay; //月薪总额 static int employeeNo; //本公司职员编号目前最大值 public: employee(); //构造函数 ~employee(); //析构函数 void pay(); //计算月薪函数 void promote(int); //升级函数 void SetName(char *); //设置姓名函数 char * GetName(); //提取姓名函数 int GetindividualEmpNo(); //提取编号函数 int Getgrade(); //提取级别函数 float GetaccumPay(); //提取月薪函数 }; class technician:public employee //兼职技术人员类 { private: float hourlyRate; //每小时酬金 int workHours; //当月工作时数 public: technician(); //构造函数 void SetworkHours(int wh); //设置工作时数 void pay(); //计算月薪函数 }; class salesman:virtual public employee //兼职推销员类 { protected: float CommRate; //按销售额提取酬金的百分比 float sales; //当月销售额 public: salesman(); //构造函数 void Setsales(float sl); //设置销售额 void pay(); //计算月薪函数 }; class manager:virtual public employee //经理类 { protected: float monthlyPay; //固定月薪数 public: manager(); //构造函数 void pay(); //计算月薪函数 }; class salesmanager:public manager,public salesman //销售经理类{ public: salesmanager(); //构造函数 void pay(); //计算月薪函数 }; //employee.cpp #include #include #include"employee.h" using namespace std; int employee::employeeNo=1000; //员工编号基数为1000 employee::employee() { individualEmpNo=employeeNo++; //新输入的员工编号为目前最大编号加1 grade=1; //级别初值为1 accumPay=0.0; } //月薪总额初值为0 employee::~employee() {} void employee::pay() //计算月薪,空函数 {} void employee::promote(int increment) { grade+=increment;} //升级,提升的级数由increment指定 void employee::SetName(char* names) { strcpy(name,names); } //设置姓名 char* employee::GetName() { return name;} //获取姓名 int employee::GetindividualEmpNo() { return individualEmpNo;} //获取成员编号 int employee::Getgrade() { return grade;} //获取级别 float employee::GetaccumPay() { return accumPay;} //获取月薪 technician::technician() { hourlyRate=100;} //每小时酬金100元 void technician::SetworkHours(int wh) { workHours=wh;} //设置工作时间 void technician::pay() { accumPay=hourlyRate*workHours;} //计算月薪,按小时计酬 salesman::salesman() { CommRate=0.04;} //销售提成比例4% void salesman::Setsales(float sl) { sales=sl;} //设置销售额 void salesman::pay() { accumPay=sales*CommRate;} //月薪=销售提成 manager::manager() { monthlyPay=8000;} //固定月薪8000元 void manager::pay() { accumPay=monthlyPay;} //月薪总额即固定月薪数 salesmanager::salesmanager() { monthlyPay=5000; CommRate=0.005;} void salesmanager::pay() { accumPay=monthlyPay+CommRate*sales; } //月薪=固定月薪+销售提成 //7_10.cpp #include #include #include"employee.h" using namespace std; void main() { manager m1; technician t1; salesmanager sm1; salesman s1; char namestr[20]; //输入雇员姓名时首先临时存放在namestr中 cout<<"请输下一个雇员的姓名:"; cin>>namestr; m1.SetName(namestr); //设置雇员m1姓名 cout<<"请输下一个雇员的姓名:"; cin>>namestr; t1.SetName(namestr); //设置雇员t1姓名 cout<<"请输下一个雇员的姓名:"; cin>>namestr; sm1.SetName(namestr); //设置雇员sm1姓名 cout<<"请输下一个雇员的姓名:"; cin>>namestr; s1.SetName(namestr); //设置雇员s1姓名 m1.promote(3); //经理m1提升3级 m1.pay(); //计算m1月薪 cout<<"请输入兼职技术人员"< int ww; cin>>ww; //输入t1本月的工作时数 t1.SetworkHours(ww); //设置t1本月的工作时数 t1.promote(2); //t1提升2级 t1.pay(); //计算t1月薪 cout<<"请输入销售经理"< cin>>sl; //输入s1所管辖部门本月的销售总额 sm1.Setsales(sl); //设置s1所管辖部门本月的销售总额 sm1.pay(); //计算s1月薪 sm1.promote(2); //s1提升2级 cout<<"请输入推销员"< cin>>sl; //输入s1本月的销售额 s1.Setsales(sl); //设置s1本月的销售额 s1.pay(); //计算s1月薪 //显示m1信息 cout< <<"级别为"< //显示t1信息 cout< <<"级别为"< //显示sm1信息 cout< <<"级别为"< //显示s1信息 cout< <<"级别为"< 实验五人员信息管理系统(五) 虚函数 抽象类 升级“我行我素shopping”购物管理系统,改进以下功能: 升级promote( )成员函数 使用基类指针调用虚函数 将基类employee的成员函数promte( )声明为虚函数,各派生类中再声明同 名函数,在派生类的promte( )函数中以不同的实参调用基类employee的成员函数promte( )。 //employee.h class employee { protected: char name[20]; //姓名 int individualEmpNo; //个人编号 int grade; //级别 float accumPay; //月薪总额 static int employeeNo; //本公司职员编号目前最大值 public: employee(); //构造函数 ~employee(); //析构函数 virtual void pay()=0; //计算月薪函数(纯虚函数) virtual void promote(int increment=0); //升级函数(虚函数) void SetName(char *); //设置姓名函数 char * GetName(); //提取姓名函数 int GetindividualEmpNo(); //提取编号函数 int Getgrade(); //提取级别函数 float GetaccumPay(); //提取月薪函数 }; class technician:public employee //兼职技术人员类 { private: float hourlyRate; //每小时酬金 int workHours; //当月工作时数 public: technician(); //构造函数 void SetworkHours(int wh); //设置工作时数函数 void pay(); //计算月薪函数 void promote(int); //升级函数 }; class salesman:virtual public employee //兼职推销员类 { protected: float CommRate; //按销售额提取酬金的百分比 float sales; //当月销售额 public: salesman(); //构造函数 void Setsales(float sl); //设置销售额函数 void pay(); //计算月薪函数 void promote(int); //升级函数 }; class manager:virtual public employee //经理类 { protected: float monthlyPay; //固定月薪数 public: manager(); //构造函数 void pay(); //计算月薪函数 void promote(int); //升级函数 }; class salesmanager:public manager,public salesman //销售经理类{ public: salesmanager(); //构造函数 void pay(); //计算月薪函数 void promote(int); //升级函数 }; //employee.cpp #include #include #include"employee.h" using namespace std; int employee::employeeNo=1000; //员工编号基数为1000 employee::employee() { individualEmpNo=employeeNo++; //新输入的员工编号为目前最大编号加1 grade=1; //级别初值为1 accumPay=0.0;} //月薪总额初值为0 employee::~employee() {} void employee::promote(int increment) { grade+=increment; } //升级,提升的级数由increment指定 void employee::SetName(char* names) { strcpy(name,names); } //设置姓名 char* employee::GetName() { return name;} //提取成员姓名 int employee::GetindividualEmpNo() { return individualEmpNo;} //提取成员编号 int employee::Getgrade() { return grade;} //提取成员级别 float employee::GetaccumPay() { return accumPay;} //提取月薪 technician::technician() { hourlyRate=100;} //每小时酬金100元 void technician::SetworkHours(int wh) { workHours=wh;} //设置工作时间 void technician::pay() { accumPay=hourlyRate*workHours;} //计算月薪,按小时计酬 void technician::promote(int) { employee::promote(2); } //调用基类升级函数,升2级 salesman::salesman() { CommRate=0.04;} //销售提成比例4% void salesman::Setsales(float sl) { sales=sl;} //设置销售额 void salesman::pay() { accumPay=sales*CommRate;} //月薪=销售提成 void salesman::promote(int) { employee::promote(0); } //调用基类升级函数,升0级 manager::manager() { monthlyPay=8000;} //固定月薪8000元 void manager::pay() { accumPay=monthlyPay;} //月薪总额即固定月薪数 void manager::promote(int ) { employee::promote(3);} //调用基类升级函数,升3级 salesmanager::salesmanager() { monthlyPay=5000; CommRate=0.005;} void salesmanager::pay() { accumPay=monthlyPay+CommRate*sales; } //月薪=固定月薪+销售提成 void salesmanager::promote(int) { employee::promote(2);} //调用基类升级函数,升2级 //employee.cpp #include #include #include"employee.h" using namespace std; int employee::employeeNo=1000; //员工编号基数为1000 employee::employee() { individualEmpNo=employeeNo++; //新输入的员工编号为目前最大编号加1 grade=1; //级别初值为1 accumPay=0.0;} //月薪总额初值为0 employee::~employee() {} void employee::promote(int increment) { grade+=increment; } //升级,提升的级数由increment指定 void employee::SetName(char* names) { strcpy(name,names); } //设置姓名 char* employee::GetName() { return name;} //提取成员姓名 int employee::GetindividualEmpNo() { return individualEmpNo;} //提取成员编号 int employee::Getgrade() { return grade;} //提取成员级别 float employee::GetaccumPay() { return accumPay;} //提取月薪 technician::technician() { hourlyRate=100;} //每小时酬金100元 void technician::SetworkHours(int wh) { workHours=wh;} //设置工作时间 void technician::pay() { accumPay=hourlyRate*workHours;} //计算月薪,按小时计酬 void technician::promote(int) { employee::promote(2); } //调用基类升级函数,升2级 salesman::salesman() { CommRate=0.04;} //销售提成比例4% void salesman::Setsales(float sl) { sales=sl;} //设置销售额 void salesman::pay() { accumPay=sales*CommRate;} //月薪=销售提成 void salesman::promote(int) { employee::promote(0); } //调用基类升级函数,升0级