用C++语言编写程序 某小型公司主要有4类人员:经理、兼职技术人员、兼职销售员。这些人员分别具有以下属性。 经理:姓名、编号、固定工资、当月薪水、计算月薪、显示信息; 兼职技术人员:姓名、编号、工作小时、每小时工资额、当月薪水、计算月薪、显示信息; 兼职销售员:姓名、编号、销售额、销售额提成、当月薪水、计算月薪、显示信息。 销售经理:姓名、编号、固定工资、销售额、销售额提成、当月薪水、计算月薪、显示信息。 要求: (1)人员编号基数为1000,每输入一个人员信息编号顺序加1; (2)月薪计算办法是经理固定月薪8000元;兼职技术人员按100元/小时领取月薪;兼职销售员按当月销售额的4%提成;销售经理固定月薪5000元,销售提成为所管辖部门当月销售总额的0.5%。 (3)将成员函数displayStatus(显示信息)设置成虚函数。 (4)将void pay()(计算月薪)设置成纯虚函数。 (5)根据以上要求,设计一个基类Employee,然后派生出Technician(兼职技术人员)类、Manager(经理)类、Salesman(兼职销售员)类和Salesmanager(销售经理)类。 (6)每类人员的信息记录在“类名_info.dat”文件中,例如兼职技术人员的信息记录在 Technician_info.dat文件中。能够根据编号对每类人员的信息进行增加、查找和修改。
时间: 2023-07-04 20:15:21 浏览: 228
用C++语言编写的基于MFC的计算器程序 实现了基本的加减乘除及括号功能 用户可以按照需要选择进制,有二进制,八进制,十进制和十六进制等四种进制方式
5星 · 资源好评率100%
以下是一个简单的C++程序,实现了以上要求:
```c++
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
// 基类Employee
class Employee {
protected:
string name; // 姓名
int id; // 编号
double salary; // 当月薪水
public:
Employee(string n, int i) : name(n), id(i), salary(0.0) {} // 构造函数
virtual void pay() = 0; // 计算月薪,纯虚函数
virtual void displayStatus() {} // 显示信息,虚函数
void setId(int i) { id = i; } // 设置编号
int getId() { return id; } // 获取编号
};
// 经理类Manager
class Manager : public Employee {
private:
double fixed_salary; // 固定工资
public:
Manager(string n, int i, double fs) : Employee(n, i), fixed_salary(fs) {} // 构造函数
void pay() { salary = fixed_salary; } // 计算月薪
void displayStatus() { // 显示信息
cout << "姓名:" << name << endl;
cout << "编号:" << id << endl;
cout << "固定工资:" << fixed_salary << endl;
cout << "当月薪水:" << salary << endl;
}
};
// 兼职技术人员类Technician
class Technician : public Employee {
private:
double hourly_wage; // 每小时工资额
double work_hours; // 工作小时
public:
Technician(string n, int i, double hw, double wh) : Employee(n, i), hourly_wage(hw), work_hours(wh) {} // 构造函数
void pay() { salary = hourly_wage * work_hours; } // 计算月薪
void displayStatus() { // 显示信息
cout << "姓名:" << name << endl;
cout << "编号:" << id << endl;
cout << "工作小时:" << work_hours << endl;
cout << "每小时工资额:" << hourly_wage << endl;
cout << "当月薪水:" << salary << endl;
}
};
// 兼职销售员类Salesman
class Salesman : public Employee {
private:
double sales; // 销售额
double commission_rate; // 销售额提成
public:
Salesman(string n, int i, double s, double cr) : Employee(n, i), sales(s), commission_rate(cr) {} // 构造函数
void pay() { salary = sales * commission_rate; } // 计算月薪
void displayStatus() { // 显示信息
cout << "姓名:" << name << endl;
cout << "编号:" << id << endl;
cout << "销售额:" << sales << endl;
cout << "销售额提成:" << commission_rate << endl;
cout << "当月薪水:" << salary << endl;
}
};
// 销售经理类Salesmanager
class Salesmanager : public Manager {
private:
double sales; // 销售额
double commission_rate; // 销售额提成
public:
Salesmanager(string n, int i, double fs, double s, double cr) : Manager(n, i, fs), sales(s), commission_rate(cr) {} // 构造函数
void pay() { salary = fixed_salary + sales * commission_rate * 0.005; } // 计算月薪
void displayStatus() { // 显示信息
cout << "姓名:" << name << endl;
cout << "编号:" << id << endl;
cout << "固定工资:" << fixed_salary << endl;
cout << "销售额:" << sales << endl;
cout << "销售额提成:" << commission_rate << endl;
cout << "当月薪水:" << salary << endl;
}
};
// 根据编号查找指定类别的员工信息
template <typename T>
void findEmployee(int id) {
ifstream fin(T::type + "_info.dat"); // 打开对应类别的数据文件
T emp("", 0, 0, 0); // 创建一个空的员工对象
bool found = false; // 是否找到标志
while (fin.read((char*)&emp, sizeof(T))) { // 逐行读取文件
if (emp.getId() == id) { // 找到了对应编号的员工
emp.displayStatus(); // 显示员工信息
found = true;
break;
}
}
if (!found) cout << "未找到指定编号的员工!" << endl;
fin.close();
}
// 添加员工信息到指定类别的数据文件
template <typename T>
void addEmployee(T emp) {
ofstream fout(T::type + "_info.dat", ios::app); // 打开对应类别的数据文件,以追加方式写入
fout.write((char*)&emp, sizeof(T)); // 写入员工信息
fout.close();
}
// 修改指定编号的员工信息
template <typename T>
void modifyEmployee(int id) {
fstream file(T::type + "_info.dat", ios::in | ios::out | ios::binary); // 打开对应类别的数据文件,以读写方式打开
T emp("", 0, 0, 0); // 创建一个空的员工对象
bool found = false; // 是否找到标志
while (file.read((char*)&emp, sizeof(T))) { // 逐行读取文件
if (emp.getId() == id) { // 找到了对应编号的员工
emp.displayStatus(); // 显示员工信息
emp.pay(); // 计算月薪
file.seekp(-sizeof(T), ios::cur); // 定位到当前记录的起始位置
file.write((char*)&emp, sizeof(T)); // 写入修改后的员工信息
found = true;
break;
}
}
if (!found) cout << "未找到指定编号的员工!" << endl;
file.close();
}
// 主函数
int main() {
int choice, id;
string name;
double fixed_salary, hourly_wage, work_hours, sales, commission_rate;
cout << "请选择要进行的操作:" << endl;
cout << "1. 添加员工信息" << endl;
cout << "2. 查找员工信息" << endl;
cout << "3. 修改员工信息" << endl;
cin >> choice;
switch (choice) {
case 1:
// 添加员工信息
cout << "请输入员工姓名:";
cin >> name;
cout << "请输入员工编号:";
cin >> id;
id += 1000; // 编号基数为1000
cout << "请选择员工类型:" << endl;
cout << "1. 经理" << endl;
cout << "2. 兼职技术人员" << endl;
cout << "3. 兼职销售员" << endl;
cout << "4. 销售经理" << endl;
cin >> choice;
switch (choice) {
case 1:
// 添加经理信息
cout << "请输入经理固定工资:";
cin >> fixed_salary;
Manager m(name, id, fixed_salary);
addEmployee(m);
break;
case 2:
// 添加兼职技术人员信息
cout << "请输入兼职技术人员每小时工资额:";
cin >> hourly_wage;
cout << "请输入兼职技术人员工作小时:";
cin >> work_hours;
Technician t(name, id, hourly_wage, work_hours);
addEmployee(t);
break;
case 3:
// 添加兼职销售员信息
cout << "请输入兼职销售员销售额:";
cin >> sales;
cout << "请输入兼职销售员销售额提成:";
cin >> commission_rate;
Salesman s(name, id, sales, commission_rate);
addEmployee(s);
break;
case 4:
// 添加销售经理信息
cout << "请输入销售经理固定工资:";
cin >> fixed_salary;
cout << "请输入销售经理销售额:";
cin >> sales;
cout << "请输入销售经理销售额提成:";
cin >> commission_rate;
Salesmanager sm(name, id, fixed_salary, sales, commission_rate);
addEmployee(sm);
break;
default:
cout << "无效的选择!" << endl;
break;
}
break;
case 2:
// 查找员工信息
cout << "请输入员工编号:";
cin >> id;
id += 1000; // 编号基数为1000
cout << "请选择员工类型:" << endl;
cout << "1. 经理" << endl;
cout << "2. 兼职技术人员" << endl;
cout << "3. 兼职销售员" << endl;
cout << "4. 销售经理" << endl;
cin >> choice;
switch (choice) {
case 1:
// 查找经理信息
findEmployee<Manager>(id);
break;
case 2:
// 查找兼职技术人员信息
findEmployee<Technician>(id);
break;
case 3:
// 查找兼职销售员信息
findEmployee<Salesman>(id);
break;
case 4:
// 查找销售经理信息
findEmployee<Salesmanager>(id);
break;
default:
cout << "无效的选择!" << endl;
break;
}
break;
case 3:
// 修改员工信息
cout << "请输入员工编号:";
cin >> id;
id += 1000; // 编号基数为1000
cout << "请选择员工类型:" << endl;
cout << "1. 经理" << endl;
cout << "2. 兼职技术人员" << endl;
cout << "3. 兼职销售员" << endl;
cout << "4. 销售经理" << endl;
cin >> choice;
switch (choice) {
case 1:
// 修改经理信息
modifyEmployee<Manager>(id);
break;
case 2:
// 修改兼职技术人员信息
modifyEmployee<Technician>(id);
break;
case 3:
// 修改兼职销售员信息
modifyEmployee<Salesman>(id);
break;
case 4:
// 修改销售经理信息
modifyEmployee<Salesmanager>(id);
break;
default:
cout << "无效的选择!" << endl;
break;
}
break;
default:
cout << "无效的选择!" << endl;
break;
}
return 0;
}
```
说明:
* Employee为基类,Technician、Manager、Salesman、Salesmanager为派生类。
* 每个类中都有一个纯虚函数pay()和一个虚函数displayStatus(),分别用于计算月薪和显示员工信息。
* 使用模板函数实现根据编号查找、添加和修改员工信息的功能。
* 数据存储在以类名为前缀的数据文件中,例如Technician_info.dat、Manager_info.dat等。
* 员工编号基数为1000,每输入一个员工信息编号顺序加1。
阅读全文