某公司财务需要开发一个计算雇员工资的程序。 该公司有3类员工。 工人 工资为每小时工资额乘当月工作时数再加上工龄工资; 销售人员 工资为每小时工资额乘当月工作时数加上销售额提成再加上工龄 工资,其中,销售额提成等于该销售人员当月售出商品金额的1%; 管理人员 工资为基本工资再加上工龄工资。 请用面向对象方法分析、设计这个程序,并用C++语言写出完整的程序。 要求设计人员基类,派生工人类,销售人员类和管理人员类, 举例: 员工工号:键盘输入 员工类型:键盘输入 姓名:键盘输入 参加工作时间:键盘输入 工人工资: 每小时工资额:宏定义80元/小时 月工作时数:键盘输入 工龄工资:第一年50元/月(宏定义),以后每年以20%递增,比如1978年参加工作,1979年为50+50*0.2=60元 月总工资 = 每小时工资额*月工作时数+工龄工资 输出:工号、姓名,员工类型,月工作时数、总工资 要求: 可以同时输入输出多位员工信息
时间: 2024-03-14 09:42:40 浏览: 20
```cpp
#include <iostream>
#include <string>
using namespace std;
//员工类
class Employee {
public:
//构造函数
Employee() {}
//虚析构函数
virtual ~Employee() {}
//虚函数,计算月总工资
virtual double getMonthSalary() = 0;
//设置员工工号
void setId(string id) {
m_id = id;
}
//设置员工姓名
void setName(string name) {
m_name = name;
}
//设置员工参加工作时间
void setBeginTime(int year) {
m_beginTime = year;
}
//获取员工工号
string getId() {
return m_id;
}
//获取员工姓名
string getName() {
return m_name;
}
//获取员工参加工作时间
int getBeginTime() {
return m_beginTime;
}
private:
string m_id; //员工工号
string m_name; //员工姓名
int m_beginTime; //员工参加工作时间
};
//工人类
class Worker : public Employee {
public:
//构造函数
Worker() {}
//计算月总工资
virtual double getMonthSalary() {
//每小时工资额
const double HOURLY_WAGE = 80;
//月工作时数
int workHours;
//工人工作年限
int years;
//输入月工作时数和工作年限
cout << "请输入" << getName() << "的月工作时数和工作年限(用空格隔开):";
cin >> workHours >> years;
//计算工龄工资
double senioritySalary = 50; //第一年工龄工资为50元/月
for (int i = 1; i < years; i++) {
senioritySalary *= 1.2; //每年递增20%
}
//计算月总工资
return workHours * HOURLY_WAGE + senioritySalary;
}
};
//销售人员类
class Salesman : public Employee {
public:
//构造函数
Salesman() {}
//计算月总工资
virtual double getMonthSalary() {
//每小时工资额
const double HOURLY_WAGE = 80;
//月工作时数
int workHours;
//销售额
double sales;
//销售人员工作年限
int years;
//输入月工作时数、销售额和工作年限
cout << "请输入" << getName() << "的月工作时数、销售额和工作年限(用空格隔开):";
cin >> workHours >> sales >> years;
//计算销售额提成
double commission = sales * 0.01;
//计算工龄工资
double senioritySalary = 50; //第一年工龄工资为50元/月
for (int i = 1; i < years; i++) {
senioritySalary *= 1.2; //每年递增20%
}
//计算月总工资
return workHours * HOURLY_WAGE + commission + senioritySalary;
}
};
//管理人员类
class Manager : public Employee {
public:
//构造函数
Manager() {}
//计算月总工资
virtual double getMonthSalary() {
//基本工资
const double BASE_SALARY = 5000;
//管理人员工作年限
int years;
//输入工作年限
cout << "请输入" << getName() << "的工作年限:";
cin >> years;
//计算工龄工资
double senioritySalary = 50; //第一年工龄工资为50元/月
for (int i = 1; i < years; i++) {
senioritySalary *= 1.2; //每年递增20%
}
//计算月总工资
return BASE_SALARY + senioritySalary;
}
};
int main() {
//定义员工数组
const int MAX_EMPLOYEES = 100;
Employee* employees[MAX_EMPLOYEES];
int count = 0; //员工计数器
//循环输入员工信息
while (true) {
//输入员工类型
cout << "请输入员工类型(1为工人,2为销售人员,3为管理人员,0表示输入结束):";
int type;
cin >> type;
if (type == 0) {
break;
}
//输入员工工号、姓名和参加工作时间
string id, name;
int beginTime;
cout << "请输入员工工号、姓名和参加工作时间(用空格隔开):";
cin >> id >> name >> beginTime;
//根据员工类型创建相应类型的员工对象
Employee* employee = nullptr;
switch (type) {
case 1:
employee = new Worker();
break;
case 2:
employee = new Salesman();
break;
case 3:
employee = new Manager();
break;
default:
break;
}
if (employee == nullptr) {
continue;
}
//设置员工信息
employee->setId(id);
employee->setName(name);
employee->setBeginTime(beginTime);
//将员工对象指针加入数组
employees[count++] = employee;
}
//输出员工信息和月总工资
for (int i = 0; i < count; i++) {
Employee* employee = employees[i];
cout << "工号:" << employee->getId() << ",姓名:" << employee->getName() << ",员工类型:";
if (dynamic_cast<Worker*>(employee) != nullptr) {
cout << "工人,";
}
else if (dynamic_cast<Salesman*>(employee) != nullptr) {
cout << "销售人员,";
}
else if (dynamic_cast<Manager*>(employee) != nullptr) {
cout << "管理人员,";
}
int beginTime = employee->getBeginTime();
int workYears = 2021 - beginTime;
cout << "月工作时数和总工资:" << employee->getMonthSalary() << ",工作年限:" << workYears << "年" << endl;
}
//释放员工对象内存
for (int i = 0; i < count; i++) {
delete employees[i];
}
return 0;
}
```