項目要求:
編寫一個程序實現小型公司的人員信息管理系統。該公司雇員(employee)包括經理(manager),技術人員(technician)、銷售員(salesman)和銷售部經理(salesmanager)。要求存儲這些人員的姓名、編號、級別、當月薪水,計算月薪并顯示全部信息。
程序要對所有人員有提升級別的功能。為簡單起見,所有人員的初始級別均為1,然后進行升級,經理升為4級,技術人員和銷售部經理升為3級,銷售員仍為1級。
月薪計算辦法是:經理拿固定月薪8000元,技術人員按每小時100元領取月薪,銷售員按該當月銷售額4%提成,銷售經理既拿固定月工資也領取銷售提成,固定月工資為5000元,銷售提成為所管轄部門當月銷售額的5‰。
寫在前面:
很清楚自己的這個小小的管理系統還存在很多漏洞,功能上還有很多地方沒有實現,例如銷售經理手下的人員變動,銷售部門和其他部門的人員變動,每個月銷售員銷售額都會不同,在設置銷售員銷售額的過程中需要改變對應的銷售經理的薪水等等。但是那些雖然能想到卻沒有實現,主要是我這只是一個簡單的C++課程實驗,沒有精力做的盡善盡美。但是我覺得我在這個過程中已經體會到了面向對象編程的思想魅力,覺得數據開始有靈魂了。
這是我第一次真正接觸面向對象編程,在沒有什么指導,沒怎么設計的情況下做出的這個肯定顯得很稚嫩。但是我相信千里之行始于足下,我會一直進步下去。
實現過程:
很容易想到,雇員作為基類,其他成員作為派生類。
關鍵在于,如何讓銷售經理管理手下的人,并且能夠方便的對銷售員進行升級。
我的想法是創建一個銷售部門的類,所有關于銷售的事務都通過銷售部門進行管理。銷售部門那里有所有銷售經理和銷售員的詳細信息(兩個對象數組),銷售經理也有自己管理的銷售員的名單。
為了防止存在多個銷售部門,我使用了單例模式(詳見博客:單例模式簡單實現)。
同時我們需要對所有的人員進行管理,我又創建了一個公司類,所有人員都記錄在公司中。
類圖如下:
因為程序比較小,我又懶得寫cpp文件,所以簡單起見我就將所有的實現都放在頭文件中。(雖然這樣做不太合適,但是在這種自己寫的小程序上問題不大。)
代碼:
首先是雇員:
#ifndef _EMPLOYEE_H_
#define _EMPLOYEE_H_#include<string>
#include<iostream>
#include<vector>
#include<windows.h>using namespace std;class employee
{
protected:string name, id;int grade; double salary;
public:employee(){grade = 1; salary = 0;}string GetName(){return name;}string GetId(){return id;}double GetSalary(){return salary;}
};#endif
經理:
#ifndef _MANAGER_H_
#define _MANAGER_H_#include"employee.h"class manager :public employee
{
public:manager(){cout << "請輸入經理的姓名:"; cin >> name;cout << "請輸入經理的編號:"; cin >> id;grade = 4; salary = 8000;}manager(string _name, string _id){name = _name; id = _id; grade = 4; salary = 8000;}void DisInform(){cout << "經理:" << name<< endl;cout << "編號:" << id << endl;cout << "薪水:" << salary << endl;}
};#endif
技術人員:
#ifndef _TECHNICIAN_H_
#define _TECHNICiAN_H_#include"employee.h"class technician :public employee
{double worktime;
public:technician(){cout << "請輸入技術人員的姓名:"; cin >> name;cout << "請輸入技術人員的編號:"; cin >> id;cout << "請輸入工作人員每月的工作時間:"; cin >> worktime;grade = 3; salary = 100 * worktime;}technician(string _name,string _id,double t=0){name = _name; id = _id; worktime = t; salary = t * 100; grade = 3;}void SetTime(double t) { worktime = t; salary = 100 * t; }void DisInform(){cout << "技術人員:" << name << endl;cout << "編號:" << id << endl;cout << "薪水:" << salary << endl;}
};#endif
銷售經理:
#ifndef _SALEMANAGER_H_
#define _SALEMANAGER_H_#include"employee.h"class salemanager :public employee
{double sale;
public:vector<int> MSlist;//銷售經理管理銷售員的名單int MSNum;salemanager(){cout << "請輸入銷售經理的姓名:"; cin >> name;cout << "請輸入銷售經理的編號:"; cin >> id;grade = 3; salary = 5000; sale = 0; MSNum = 0;}salemanager(string _name, string _id){name = _name; id = _id;grade = 3; salary = 5000; sale = 0; MSNum = 0;}salemanager(const salemanager& x){name = x.name; grade = 3; id = x.id; salary = x.salary; sale = x.sale; MSNum = x.MSNum;MSlist.assign(x.MSlist.begin(), x.MSlist.end());}void DisInform(){cout << "銷售經理:" << name << endl;cout << "編號:" << id << endl;cout << "薪水:" << salary << endl;}void SetSale(double t){sale = t; salary += t * 0.005;}void AddSale(double t){sale += t; salary += 0.005 * t;}
};#endif
銷售員:
#ifndef _SALESMAN_H_
#define _SALESMAN_H_#include"employee.h"class salesman :public employee
{double sale;
public:int M;//該銷售員受管轄的銷售經理salesman(){cout << "請輸入銷售員的姓名:"; cin >> name;cout << "請輸入銷售員的編號:"; cin >> id;cout << "請輸入銷售員的銷售額:"; cin >> sale;grade = 1; salary = 0.04 * sale;//cout << "薪水:" << salary << endl;M = -1;}salesman(string _name,string _id,double _sale=0){name = _name; id = _id; sale = _sale; grade = 1; salary = 0.04 * sale; M = -1;}salesman(const salesman& x) //拷貝構造函數{name = x.name; id = x.id; M = x.M; salary = x.salary; sale = x.sale; grade = 1; }void DisInform(){cout << "銷售員:" << name << endl;cout << "編號:" << id << endl;cout << "薪水:" << salary << endl;}void SetSale(double _sale){sale = _sale; salary = 0.04 * sale;}double GetSale(){return sale;}};#endif
銷售部門:
#ifndef _SALESDEPARTMENTS_H_
#define _SALESDEPARTMENTS_H_#include"salesman.h"
#include"salemanager.h"class depart
{depart(){SNum = 0; MNum = 0; sale = 0;}depart(depart& ) = delete;depart& operator=(const depart&) = delete;static depart* p;
public:vector<salesman> Slist; //銷售部門所有銷售員的名單 int SNum;vector<salemanager> Mlist; //銷售部門所有銷售經理的名單int MNum;double sale;//總的銷售額static depart* GetDepart(){if (p == nullptr) p = new depart;return p;}static void DelDepart(){delete p; p = nullptr;}void AddSaleForManager(salemanager& x){cout << "請輸入該銷售經理管理的銷售員ID:[ESC退出輸入]" << endl;//cin.clear();string _ID;while (1){cin >> _ID;if (_ID == "ESC") break;bool flag = false;//標記是否存在該銷售員for (int i = 0; i < SNum; i++) //在部門銷售員列表中查詢{if (p->Slist[i].GetId() == _ID)//找到該銷售員{p->Mlist[MNum - 1].MSlist.push_back(i);//將該銷售員加入到銷售經理的名單中 p->Mlist[MNum - 1].MSNum++;p->Mlist[MNum - 1].AddSale(p->Slist[i].GetSale());//改變銷售經理當月的銷售額 p->Slist[i].M = MNum - 1;//記錄該銷售員對應的銷售經理flag = true; break;//標記找到了并退出查找}}if (!flag)//沒有找到{cout << "對不起,該銷售員沒有登記,請先到管理部門登記" << endl;}//cin.clear();}}void CreatNewManager(){p->Mlist.push_back(salemanager()); MNum++;AddSaleForManager(p->Mlist[MNum - 1]); //為該銷售經理添加銷售員}void UpgradeManger(string _name,string _Id){p->Mlist.push_back(salemanager(_name, _Id)); MNum++;AddSaleForManager(p->Mlist[MNum - 1]); //為該銷售經理添加銷售員}void CreatNewManager(int x){while (x--){p->Mlist.push_back(salemanager()); MNum++;AddSaleForManager(p->Mlist[MNum - 1]); //為該銷售經理添加銷售員}}void CreatNewSales(){p->Slist.push_back(salesman()); SNum++;}void CreatNewSales(int x){while (x--){p->Slist.push_back(salesman()); SNum++;}}};depart* depart::p = nullptr;
#endif
公司的類:
#ifndef _COMPANY_H_
#define _COMPANY_H_#include"manager.h"
#include"salemanager.h"
#include"salemanager.h"
#include"salesdepartment.h"
#include"salesman.h"
#include"technician.h"class company
{int num = 0;//公司人數
public:vector<manager> MMList; int MMNum;vector<technician> TList; int TNum;int t;company(){system("cls");cout << "創建公司:" << endl;cout << "請輸入經理人數:"; cin >> MMNum; num += MMNum;for (int i = 0; i < MMNum; i++){MMList.push_back(manager());}system("cls");cout << "創建公司:" << endl;cout << "請輸入技術人員人數:"; cin >> TNum; num += TNum;for (int i = 0; i < TNum; i++){TList.push_back(technician());}system("cls");cout << "創建公司:" << endl;depart* Dp=depart::GetDepart(); //創建銷售部門cout << "請輸入銷售員人數:"; cin >> t; num += t; Dp->CreatNewSales(t);system("cls");cout << "創建公司:" << endl;cout << "請輸入銷售經理的人數:"; cin >> t; num += t; Dp->CreatNewManager(t);}void DisplayManager(){system("cls");cout << "公司經理信息:"<<endl;for (int i = 0; i < MMNum; i++){MMList[i].DisInform();}system("pause");}void DisplayTechnician(){system("cls");cout << "公司技術人員信息:" << endl;for (int i = 0; i < TNum; i++){TList[i].DisInform();}system("pause");}void DisplaySale(){system("cls");cout << "公司銷售員信息:" << endl;depart* Dp = depart::GetDepart();for (int i = 0; i < Dp->SNum; i++){Dp->Slist[i].DisInform();cout << "上司姓名:" << ((Dp->Slist[i].M == -1) ? "無" : Dp->Mlist[Dp->Slist[i].M].GetName()) << endl;cout << "上司編號:" << ((Dp->Slist[i].M == -1) ? "無" : Dp->Mlist[Dp->Slist[i].M].GetId()) << endl;}system("pause");}void DisplaySaleManager(){system("cls");cout << "公司銷售經理信息:" << endl;depart* Dp = depart::GetDepart();for (int i = 0; i < Dp->MNum; i++){Dp->Mlist[i].DisInform();cout << "管理銷售員名單:" << endl;for (int j = 0; j < Dp->Mlist[i].MSNum; j++){cout << "銷售員編號:" << Dp->Slist[Dp->Mlist[i].MSlist[j]].GetId() << "\t" << "銷售員姓名:" << Dp->Slist[Dp->Mlist[i].MSlist[j]].GetName() << endl;}}system("pause");}void SalesmanUpgrade()//將銷售員升級為銷售經理{cout << "請輸入需要升級的銷售員ID:[ESC退出輸入]" << endl;cin.clear();string _ID; depart* Dp = depart::GetDepart();while (1){cin >> _ID;if (_ID == "ESC") break;//cout << "ok!!" << endl;bool flag = false;salesman* tmp = nullptr;int index;for (int i = 0; i < Dp->SNum; i++){if (Dp->Slist[i].GetId() == _ID){tmp = new salesman(Dp->Slist[i]);index = i;flag = true; break;}}if (!flag){cout << "不存在該銷售員!" << endl;continue;}//刪除在銷售管理部門和銷售經理的名單if (tmp->M != -1){int num = Dp->Mlist[tmp->M].MSNum;for (int i = 0; i < num; i++){if (Dp->Slist[Dp->Mlist[tmp->M].MSlist[i]].GetId() == tmp->GetId()){Dp->Mlist[tmp->M].MSlist.erase(Dp->Mlist[tmp->M].MSlist.begin() + i);Dp->Mlist[tmp->M].MSNum--;break;}}}Dp->Slist.erase(Dp->Slist.begin() + index); Dp->SNum--;//printf("test\n");//將銷售員升級為銷售經理Dp->UpgradeManger(tmp->GetName(), tmp->GetId());delete tmp;}//cin.clear();system("pause");}~company(){depart::DelDepart();}
};#endif
測試程序:
#include"company.h"int main()
{company A;A.DisplayManager();A.DisplayTechnician();A.DisplaySaleManager();A.DisplaySale();A.SalesmanUpgrade();A.DisplaySaleManager();A.DisplaySale();}
運行結果:
總結
在實現過程中遇到了一些問題,主要就是我剛開始讀入的時候用的是while(cin>>x)
,然后發現后面的讀入就會發生異常,然后調試了一會發現是cin
的問題,我上網查到這種輸入方式當輸入Ctrl+Z
以后會使得cin
失效,需要用cin.clear()
,我嫌棄太麻煩就換了一種寫法。
還有一個就是我在寫對銷售員升級的時候總會出錯,觀察代碼才發現是在寫刪去銷售員所在銷售經理那里它的名字的時候沒有判斷這個銷售員是否有銷售經理在管他,如果沒有的話訪問銷售經理就會出錯。