要件と仕様:
小さな会社には、マネージャー、技術者、セールスマネージャー、セールスマンの4種類の人員がいます。これらの担当者の名前、番号、等級、および現在の月給を保存し、合計月給を計算して、すべての情報を表示する必要があります。
従業員番号の基本番号は1000であり、個人情報が入力されるたびに、番号シーケンスが1ずつ増加します。
プログラムは、すべての人員のレベルをアップグレードする機能を備えている必要があります。簡単にするために、すべての担当者の初期レベルはレベル1で、その後アップグレードされます。マネージャーはレベル4にアップグレードされ、技術者と営業マネージャーはレベル3にアップグレードされ、営業担当者は引き続きレベル1になります。
月給の計算方法は次のとおりです。マネージャーは8,000元の固定月給を受け取り、技術スタッフは1時間あたり100元の月給を受け取ります。営業担当者の月給は、営業担当者の月給の4%の手数料に基づいています。営業マネージャーは、固定の月給と固定の販売手数料の両方を受け取ります。月給は5,000元で、販売貢献は管轄部門の総月収の5‰です。
設計:
上記の要件に従って、基本クラスの従業員を設計してから、技術者(技術者)クラス、マネージャー(マネージャー)クラス、およびセールスマン(セールスマン)クラスを派生させます。営業部長(営業部長)は、部長と営業担当者の両方であり、両方のタイプの人員の特性を持っているため、管理者と営業担当者の2つのカテゴリを同時に継承します。
基本クラスでは、コンストラクタとデストラクタの定義に加えて、さまざまなタイプの人事情報に対して実行する必要のある操作も一律に定義して、各派生クラスの基本的な動作を標準化できるようにする必要があります。ただし、人員によって月給の計算方法が異なり、基本社員で一律に計算することはできません。各種人事情報の表示内容も異なり、基本クラスで表示方法を一律に定義することはできません。したがって、従業員クラスでは、月給関数pay()と表示情報関数displayStatus()を純粋仮想関数の形式で定義し、それぞれの関数に従って派生クラスに特定の関数を実装します。名前。
salesmanagerの2つの基本クラスには共通の基本クラスemployeeがあるため、あいまいさを避けるために、employeeクラスは仮想基本クラスとして設計されています。
Employee.h
#pragma once
// 基类员工
class Employee {
protected:
char* name; // 姓名
int individualEmpNo;//个人编号
int grade; //等级
float accumPay;//月薪总额
static int employeeNo;//本公司职员编号目前的最大值
public:
Employee();
~Employee();
void promote(int);//升级函数
void setName();
virtual void pay();
virtual void displayStatus();
};
class Technician :public Employee {
//技术人员
protected:
float hourlyRate; // 每小时酬金
int workHours; //每月工作时数
public:
Technician();
void pay(); //计算月薪函数
void displayStatus(); // 显示人员信息
};
class Manager : public Employee {
//经理
protected:
float monthlyPay;
public:
Manager();
void pay(); //计算月薪函数
void displayStatus(); // 显示人员信息
};
class SalesMan :public Employee {
// 推销员
protected:
float CommRate; //按销售额提取酬金的百分比
float sales;//当月销售额
public:
SalesMan();
void pay(); //计算月薪函数
void displayStatus(); // 显示人员信息
};
class SalesManager :public Manager, SalesMan {
public:
SalesManager();
void pay(); //计算月薪函数
void displayStatus(); // 显示人员信息
};
recomc.cpp
#include <iostream>
#include <string.h>
#include<string>
#include<conio.h>
#include "Employee.h"
using namespace std;
int Employee::employeeNo = 1000;
Employee::Employee() {
individualEmpNo = ++employeeNo; //新输入员工编号:目前最大编号+1
grade = 1;
}
Employee::~Employee() {
delete name;
}
void Employee::pay() {
}
void Employee::displayStatus() {
}
void Employee::promote(int incre) {
grade += incre;
}
void Employee::setName()
{
char str[30];
cout << "please input employee's name:";
cin >> str;
name = new char[strlen(str) + 1];
strcpy_s(name, strlen(str) + 1, str);
}
Technician::Technician() {
hourlyRate = 100; //每小时酬金1000元
}
void Technician::pay() {
cout << "input " << name << " the workHours of this month:";
cin >> workHours;
accumPay = hourlyRate * workHours;
}
void Technician::displayStatus() {
cout << "Technician:" << name << " No:" << individualEmpNo
<<" grade:"<<grade
<< " this month salary:" << accumPay << "\n";
}
Manager::Manager() {
monthlyPay = 8000;//固定月薪8000
}
void Manager::pay() {
accumPay = monthlyPay;
}
void Manager::displayStatus() {
cout << "Manager:" << name << " No:" << individualEmpNo
<< " grade:" << grade
<< " this month salary:" << accumPay << "\n";
}
SalesMan::SalesMan() {
CommRate = 0.05f;// 销售提成比例5%
}
void SalesMan::pay() {
cout << "input " << name << " the sales of this month:";
cin >> sales;
accumPay = sales * CommRate;
}
void SalesMan::displayStatus() {
cout << "SalesMan:" << name << " No:" << individualEmpNo
<< " grade:" << grade
<< " this month salary:" << accumPay << "\n";
}
SalesManager::SalesManager() {
monthlyPay = 5000;
CommRate = 0.005f;
}
void SalesManager::pay() {
cout << "input" << Employee::name
<< " the total sales of the department of this month:";
cin >> sales;
Employee::accumPay = monthlyPay + CommRate * sales;
}
void SalesManager::displayStatus() {
cout << "SalesManager:" << Employee::name << " No:" << Employee::individualEmpNo
<< " grade:" << Employee::grade
<< " this month salary:" << Employee::accumPay << "\n";
}
Test.cpp
#include <iostream>
#include "Employee.h"
int main() {
Manager m1;
Technician t1;
m1.setName();
m1.promote(3);
m1.pay();
m1.displayStatus();
t1.setName();
t1.promote(2);
t1.pay();
t1.displayStatus();
return 0;
}