C++小型公司管理系統

項目要求:

編寫一個程序實現小型公司的人員信息管理系統。該公司雇員(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(),我嫌棄太麻煩就換了一種寫法。

還有一個就是我在寫對銷售員升級的時候總會出錯,觀察代碼才發現是在寫刪去銷售員所在銷售經理那里它的名字的時候沒有判斷這個銷售員是否有銷售經理在管他,如果沒有的話訪問銷售經理就會出錯。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383809.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383809.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383809.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux網絡編程“驚群”問題總結

http://www.cnblogs.com/Anker/p/7071849.html 1、前言 我從事Linux系統下網絡開發將近4年了&#xff0c;經常還是遇到一些問題&#xff0c;只是知其然而不知其所以然&#xff0c;有時候和其他人交流&#xff0c;搞得非常尷尬。如今計算機都是多核了&#xff0c;網絡編程框架也…

【Java學習筆記六】常用數據對象之String

字符串 在Java中系統定義了兩種類型的字符串類&#xff1a;String和StringBuffer String類對象的值和長度都不能改變&#xff0c;稱為常量字符串類&#xff0c;其中每個值稱為常量字符串。 StringBuffer類對象的值和長度都可以改變&#xff0c;稱為變量字符串類&#xff0c;其…

【Java學習筆記七】常用數據對象之數組

同一般的對象創建和定義一樣&#xff0c;數組的定義和創建可以分開進行也可以合并一起進行。 一維數組定義格式&#xff1a; <元素類型>[] <數組名>;//[]也可以放在數組名的后面一維數組創建格式&#xff1a; new <元素類型>[<元素個數>];執行new運…

yfan.qiu linux硬鏈接與軟鏈接

http://www.cnblogs.com/yfanqiu/archive/2012/06/11/2545556.html Linux 系統中有軟鏈接和硬鏈接兩種特殊的“文件”。 軟鏈接可以看作是Windows中的快捷方式&#xff0c;可以讓你快速鏈接到目標檔案或目錄。 硬鏈接則透過文件系統的inode來產生新檔名&#xff0c;而不是產生…

【Java學習筆記八】包裝類和vector

包裝類 在Java語言中&#xff0c;每一種基本的數據類型都有相應的對象類型&#xff0c;稱為他們基本類型的包裝類&#xff08;包裹類&#xff09;。 字節byte&#xff1a;Byte、短整數型short&#xff1a;Short 標準整數型int&#xff1a;Integer、長整數型long&#xff1a;Lo…

Linux C++線程池實例

http://www.cnblogs.com/danxi/p/6636095.html 想做一個多線程服務器測試程序&#xff0c;因此參考了github的一些實例&#xff0c;然后自己動手寫了類似的代碼來加深理解。 目前了解的線程池實現有2種思路&#xff1a; 第一種&#xff1a; 主進程創建一定數量的線程&#xff0…

Java編寫簡單的自定義異常類

除了系統中自己帶的異常&#xff0c;我們也可以自己寫一些簡單的異常類來幫助我們處理問題。 所有的異常命名都是以Exception結尾&#xff0c;并且都是Exception的子類。 假設我們要編寫一個人類的類&#xff0c;為了判斷年齡的輸入是否合法&#xff0c;我們編寫了一個名為Il…

shared_ptr簡介以及常見問題

http://blog.csdn.net/stelalala/article/details/19993425 本文中的shared_ptr以vs2010中的std::tr1::shared_ptr作為研究對象。可能和boost中的有些許差異&#xff0c;特此說明。 基本功能 shared_ptr提供了一個管理內存的簡單有效的方法。shared_ptr能在以下方面給開發提供便…

【Java學習筆記九】多線程

程序&#xff1a;計算機指令的集合&#xff0c;它以文件的形式存儲在磁盤上&#xff0c;是應用程序執行的藍本。 進程&#xff1a;是一個程序在其自身的地址空間中的一次執行活動。進程是資源申請、調度和獨立運行的單位&#xff0c;因此&#xff0c;它使用系統中的運行資源。而…

【C++11新特性】 C++11智能指針之weak_ptr

http://blog.csdn.net/xiejingfa/article/details/50772571 原創作品&#xff0c;轉載請標明&#xff1a;http://blog.csdn.net/Xiejingfa/article/details/50772571 如題&#xff0c;我們今天要講的是C11引入的三種智能指針中的最后一個&#xff1a;weak_ptr。在學習weak_ptr之…

【C++學習筆記四】運算符重載

當調用一個重載函數和重載運算符時&#xff0c;編譯器通過把您所使用的參數類型和定義中的參數類型相比較&#xff0c;巨鼎選用最合適的定義。&#xff08;重載決策&#xff09; 重載運算符時帶有特殊名稱的函數&#xff0c;函數名是由關鍵字operator和其后要重載的運算符符號…

【C++11新特性】 C++11智能指針之unique_ptr

原創作品&#xff0c;轉載請標明&#xff1a;http://blog.csdn.net/Xiejingfa/article/details/50759210 在前面一篇文章中&#xff0c;我們了解了C11中引入的智能指針之一shared_ptr&#xff0c;今天&#xff0c;我們來介紹一下另一種智能指針unique_ptr。 unique_ptr介紹 uni…

C++派生類對象和基類對象賦值

在C中&#xff0c;我們允許 將派生類對象賦給基類對象。&#xff08;不允許將基類對象賦給派生類對象&#xff09; 只會將基類對象成員賦值用基類指針指向派生類對象。&#xff08;不允許用派生類指針指向基類對象&#xff09; 基類指針只能操作基類中的成員基類引用作為派生類…

【C++11新特性】 C++11智能指針之shared_ptr

http://blog.csdn.net/Xiejingfa/article/details/50750037 原創作品&#xff0c;轉載請標明&#xff1a;http://blog.csdn.net/Xiejingfa/article/details/50750037 C中的智能指針首先出現在“準”標準庫boost中。隨著使用的人越來越多&#xff0c;為了讓開發人員更方便、更安…

C++(純)虛函數重寫時訪問權限更改問題

我們知道在Java中是自動實現多態的&#xff0c;Java中規定重寫的方法的訪問權限不能縮小。那么在C中我們實現多態的時候是否可以更改&#xff08;縮小&#xff09;訪問權限呢&#xff1f; 經過測試&#xff0c;得到的答案如下&#xff1a;如果用基類指針指向派生類對象實現多態…

C++ — 智能指針的簡單實現以及循環引用問題

http://blog.csdn.net/dawn_sf/article/details/70168930 智能指針 ____________________________________________________ 今天我們來看一個高大上的東西&#xff0c;它叫智能指針。 哇這個名字聽起來都智能的不得了&#xff0c;其實等你了解它你一定會有一點失望的。。。。因…

C++(靜態)(常量)數據進行初始化問題以及靜態變量析構

在C11標準以前我們都不可以在類中對數據成員初始化&#xff0c;僅能在構造函數中進行初始化&#xff1a; class A {int a,b; double c; string d;A():a(1),b(2),c(3),d(""){} };在C11標準以后我們可以在類中對非靜態成員進行初始化。實際上的機制是在調用構造函數的…

C++this指針的用法

參考博客&#xff1a;https://www.cnblogs.com/zhengfa-af/p/8082959.html 在 訪問對象的非靜態成員時會隱式傳遞一個參數&#xff0c;即對象本身的指針&#xff0c;這個指針名為this。 例如&#xff1a; class A {int a1;public:A(){}void GetA(int a){cout<<this-&g…

C++開發者都應該使用的10個C++11特性

http://blog.jobbole.com/44015/ 感謝馮上&#xff08;治不好你我就不是獸醫 &#xff09;的熱心翻譯。如果其他朋友也有不錯的原創或譯文&#xff0c;可以嘗試推薦給伯樂在線。】 在C11新標準中&#xff0c;語言本身和標準庫都增加了很多新內容&#xff0c;本文只涉及了一些皮…

C++不能被聲明為虛函數

虛函數是為了實現多態&#xff0c;但是顯然并不是所有函數都可以聲明為虛函數的。 不能被聲明為虛函數的函數有兩類&#xff1a; 不能被繼承的函數不能被重寫的函數 因此&#xff0c;這些函數都不能被聲明為虛函數 普通函數構造函數 如果構造函數定義為虛函數&#xff0c;則…