任务描述 假设某销售公司有一般员工、销售员工和销售经理。月工资的计算办法是: 一般员工月薪=基本工资; 销售员工月薪=基本工资+销售额*提成率; 销售经理月薪=基本工资+职务工资+销售额*提成率。 编写程序,定义一个表示一般员工的基类Employee,它包含3个表示员工基本信息的数据成员: 编号number(char* 类型) 姓名name(char* 类型) 基本工资basicSalary(double 类型); 由Employee类派生销售员工Salesman类,Salesman类包含2个新数据成员: 销售额sales(double 类型) 静态数据成员提成比例commrate(double 类型); 再由Salesman类派生表示销售经理的Salesmanager类。Salesmanager类包含新数据成员:岗位工资jobSalary(double 类型)。 为这些类定义初始化数据的构造函数,以及输入数据input、计算工资pay和输出工资条print的成员函数。 设公司员工的基本工资是2000元,销售经理的岗位工资是3000元,提成率=5/1000。 输入包含多组数据,每组数据格式:对于普通员工:1(表示这一行输入代表普通员工) 编号 姓名 对于销售员工:2(表示这一行输入代表销售员工) 编号 姓名 销售额 对于销售经理:3(表示这一行输入代表销售经理) 编号 姓名 销售额 假设输入数据都合法 每组输出数据格式:对于普通员工:编号 姓名 月薪 对于销售员工:编号 姓名 基本工资 销售额 月薪 对于销售经理:编号 姓名 基本工资 岗位工资 销售额 月薪 所有结果保留两位小数。 样例输入: 1 0101 wangsa 2 0102 hesyu 1000.0 3 0103 qusu 5000.0 样例输出: 0101 wangsa 2000.00 0102 hesyu 2000.00 1000.00 2005.00 0103 qusu 2000.00 3000.00 5000.00 5025.00
时间: 2024-03-14 12:45:33 浏览: 141
以下是代码实现,其中使用了虚函数和纯虚函数:
```cpp
#include <iostream>
#include <iomanip>
#include <cstring>
using namespace std;
const double BASIC_SALARY = 2000;
const double JOB_SALARY = 3000;
const double COMM_RATE = 0.005;
class Employee {
protected:
char number[10];
char name[20];
double basicSalary;
public:
Employee(char* num, char* na, double bs) : basicSalary(bs) {
strcpy(number, num);
strcpy(name, na);
}
virtual double pay() {
return basicSalary;
}
virtual void input() {
cin >> number >> name >> basicSalary;
}
virtual void print() {
cout << number << " " << name << " " << fixed << setprecision(2) << pay() << endl;
}
};
class Salesman : public Employee {
private:
double sales;
static double commrate;
public:
Salesman(char* num, char* na, double bs, double s) : Employee(num, na, bs), sales(s) {}
double pay() {
return basicSalary + sales * commrate;
}
void input() {
Employee::input();
cin >> sales;
}
void print() {
cout << number << " " << name << " " << fixed << setprecision(2) << basicSalary << " " << sales << " " << pay() << endl;
}
static void setCommrate(double cr) {
commrate = cr;
}
};
double Salesman::commrate = COMM_RATE;
class Salesmanager : public Salesman {
private:
double jobSalary;
public:
Salesmanager(char* num, char* na, double bs, double s, double js) : Salesman(num, na, bs, s), jobSalary(js) {}
double pay() {
return basicSalary + jobSalary + sales * commrate;
}
void input() {
Salesman::input();
cin >> jobSalary;
}
void print() {
cout << number << " " << name << " " << fixed << setprecision(2) << basicSalary << " " << jobSalary << " " << sales << " " << pay() << endl;
}
};
int main() {
int type;
while (cin >> type) {
if (type == 1) {
Employee e("", "", BASIC_SALARY);
e.input();
e.print();
} else if (type == 2) {
Salesman s("", "", BASIC_SALARY, 0);
s.input();
s.print();
} else if (type == 3) {
Salesmanager sm("", "", BASIC_SALARY, 0, JOB_SALARY);
sm.input();
sm.print();
}
}
return 0;
}
```
代码思路如下:
首先定义一个基类 Employee,包含编号、姓名和基本工资三个数据成员。由 Employee 派生出销售员工类 Salesman,增加销售额和提成比例两个数据成员。由 Salesman 派生出销售经理类 Salesmanager,增加岗位工资一个数据成员。
在 Employee 类中定义虚函数 pay,用于计算员工的月薪。在 Salesman 和 Salesmanager 类中重写 pay 函数,分别计算销售员工和销售经理的月薪。注意,在 Salesman 类中,需要定义一个静态数据成员 commrate,表示提成比例,初始值为 0.005。并且在 Salesman 类中定义一个静态函数 setCommrate,用于修改提成比例。
在 Employee 类中定义纯虚函数 input 和 print,用于输入和输出员工信息。由于基类的 input 和 print 函数没有实际意义,因此可以将它们定义为纯虚函数,以防止基类对象的创建。
最后,在主函数中根据输入的类型创建相应的对象,并调用 input 和 print 函数。
阅读全文