1. 程式人生 > 其它 >【C++】【繼承】小型公司人員資訊管理

【C++】【繼承】小型公司人員資訊管理

技術標籤:# C++大作業

需求和規格說明:
某小型公司,主要有四類人員:經理、技術人員、銷售經理和推銷員。要求儲存這些人員的姓名、編號、級別、當月薪水,計算月薪總額並顯示全部資訊。

人員編號基數為1000,每輸入一個人員的資訊,編號順序加1。
程式要對所有人員有提升級別的功能。為簡單起見,所有人員的初始級別均為1級,然後進行升級,經理升為4級,技術人員和銷售經理升為3級,推銷員仍為1級。

月薪計算辦法是:經理拿固定月薪8000元;技術人員按每小時100元領取月薪;推銷員的月薪按該推銷員當月銷售額的4%提成;銷售經理既拿固定月薪也領取銷售提成,固定月薪為5000元,銷售提成為所管轄部門當月銷售總額的5‰。

設計:


根據上述需求,設計一個基類employee,然後派生出technician(技術人員)類、manager(經理)類和salesman(推銷員)類。由於銷售經理(salesmanager)既是經理又是銷售人員,兼具兩類人員的特點,因此同時繼承manager和salesman兩個類。
在基類中,除了定義建構函式和解構函式以外,還應統一定義對各類人員資訊都應有的操作,這樣可以規範各派生類的基本行為。但是各類人員的月薪計算方法不同,不能在基類employee中統一定義計算方法。各類人員資訊的顯示內容也不同,同樣不能在基類中統一定義顯示方法。因此,在employee類中用純虛擬函式的方式定義了計算月薪函式pay()和顯示資訊函式displayStatus(),然後在派生類中再根據各自的同名函式實現具體的功能。
由於salesmanager的兩個基類又有公共基類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(); // 顯示人員資訊 };

empfunc.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;
}

在這裡插入圖片描述