本文章是本人黑馬程序員 C++| 匠心之作 從0到1入門學(xué)編程的學(xué)習(xí)筆記
前置文章:
1、管理系統(tǒng)需求
職工管理系統(tǒng)可以用來管理公司內(nèi)所有員工的信息
本教程主要利用C++來實現(xiàn)一個基于多態(tài)的職工管理系統(tǒng)
公司中職工分為三類:普通員工牍颈、經(jīng)理弓叛、老板槐雾,顯示信息時甫题,需要顯示職工編號符欠、職工姓名蛹批、職工崗位、以及職責(zé)
普通員工職責(zé):完成經(jīng)理交給的任務(wù)
經(jīng)理職責(zé):完成老板交給的任務(wù)荆陆,并下發(fā)任務(wù)給員工
老板職責(zé):管理公司所有事務(wù)
管理系統(tǒng)中需要實現(xiàn)的功能如下:
- 退出管理程序:退出當(dāng)前管理系統(tǒng)
- 增加職工信息:實現(xiàn)批量添加職工功能滩届,將信息錄入到文件中,職工信息為:職工編號慎宾、姓名丐吓、部門編號
- 顯示職工信息:顯示公司內(nèi)部所有職工的信息
- 刪除離職職工:按照編號刪除指定的職工
- 修改職工信息:按照編號修改職工個人信息
- 查找職工信息:按照職工的編號或者職工的姓名進(jìn)行查找相關(guān)的人員信息
- 按照編號排序:按照職工編號,進(jìn)行排序趟据,排序規(guī)則由用戶指定
- 清空所有文檔:清空文件中記錄的所有職工信息(清空前需要再次確認(rèn)券犁,防止誤刪)
2、創(chuàng)建項目
創(chuàng)建項目步驟如下
- 創(chuàng)建新項目
- 添加文件
3汹碱、創(chuàng)建管理類
管理類負(fù)責(zé)的內(nèi)容如下:
- 與用戶的溝通菜單界面
- 對職工增刪查改的操作
- 與文件的讀寫交互
3.1 創(chuàng)建文件
創(chuàng)建workerManager.h
頭文件和workerManager.cpp
源文件
3.2 頭文件實現(xiàn)
在workerManager.h
中設(shè)計管理類
代碼如下:
//workerManager.h
#pragma once
#include <iostream>
using namespace std;
void clear();
void pause();
class WorkerManager {
public:
//構(gòu)造函數(shù)
WorkerManager();
//析構(gòu)函數(shù)
~WorkerManager();
};
3.3 源文件實現(xiàn)
在workerManager.cpp
中將構(gòu)造和析構(gòu)函數(shù)空實現(xiàn)補(bǔ)全
//workerManager.cpp
#include "workerManager.h"
void clear() { system("clear||cls"); }
void pause() { system("echo 請按任意鍵繼續(xù) . . . && ( read x 2> nul; rm nul || pause > nul )"); }
WorkerManager::WorkerManager() {
}
WorkerManager::~WorkerManager() {
}
4粘衬、菜單功能
功能描述:與用戶的溝通界面
4.1 添加成員函數(shù)
在管理類workerManager.h
中添加成員函數(shù)void showMenu()
//workerManager.h
#pragma once
#include <iostream>
using namespace std;
class WorkerManager {
public:
//構(gòu)造函數(shù)
WorkerManager();
//顯示菜單
void showMenu();
//析構(gòu)函數(shù)
~WorkerManager();
};
4.2 菜單功能實現(xiàn)
在管理類workerManager.cpp
中實現(xiàn)showMenu()
函數(shù)
//workerManager.cpp
...
void WorkerManager::showMenu() {
cout << "************************" << endl;
cout << "** 歡迎使用職工管理系統(tǒng)! **" << endl;
cout << "***** 0.退出管理程序 *****" << endl;
cout << "***** 1.增加職工信息 *****" << endl;
cout << "***** 2.顯示職工信息 *****" << endl;
cout << "***** 3.刪除離職職工 *****" << endl;
cout << "***** 4.修改職工信息 *****" << endl;
cout << "***** 5.查找職工信息 *****" << endl;
cout << "***** 6.按照編號排序 *****" << endl;
cout << "***** 7.清空所有文檔 *****" << endl;
cout << "************************" << endl;
}
...
4.3 測試菜單功能
在main.cpp
中測試菜單功能
//main.cpp
#include <iostream>
#include "workerManager.h"
using namespace std;
int main() {
WorkerManager vm;
vm.showMenu();
pause();
return 0;
}
5、退出功能
5.1 提供功能接口
在main
函數(shù)中提供分支選擇咳促,提供每個功能接口
//main.cpp
#include <iostream>
#include "workerManager.h"
using namespace std;
int main() {
WorkerManager vm;
int choice = -1;
clear();
while (choice != 0) {
vm.showMenu();
cout << "請輸入您的選擇(數(shù)字):" << endl;
cin >> choice;
switch (choice) {
case 0: //退出系統(tǒng)
break;
case 1: //添加職工
break;
case 2: //顯示職工
break;
case 3: //刪除職工
break;
case 4: //修改職工
break;
case 5: //查找職工
break;
case 6: //排序職工
break;
case 7: //清空文件
break;
default:
clear();
break;
}
}
pause();
return 0;
}
5.2 實現(xiàn)退出功能
在workerManager.h
中提供退出系統(tǒng)的成員函數(shù)void exitSystem();
在workManager.cpp
中提供具體的功能實現(xiàn)
//workerManager.h
...
//退出程序
void exitSystem();
...
//workManager.cpp
...
void WorkerManager::exitSystem() {
cout << "歡迎下次使用稚新!" << endl;
pause();
exit(0);
}
...
5.3 測試功能
在main
函數(shù)switch
分支0
選項中,調(diào)用退出程序的接口
//main.cpp
...
case 0: //退出系統(tǒng)
wm.exitSystem();
break;
...
6跪腹、創(chuàng)建職工類
6.1 創(chuàng)建職工抽象類
職工的分類為:普通員工褂删、經(jīng)理、老板
將三種職工抽象到一個類(worker
)中冲茸,利用多態(tài)管理不同職工種類
職工的屬性為:職工編號屯阀、職工姓名、職工所在部門編號
職工的行為為:崗位職責(zé)信息描述轴术,獲取崗位名稱
頭文件文件夾下創(chuàng)建文件worker.h
文件并且添加如下代碼:
//worker.h
#pragma once
#include <iostream>
#include <string>
using namespace std;
//職工抽象基類
class Worker {
public:
//顯示個人信息
virtual void showInfo() = 0;
//獲取崗位名稱
virtual string getDepName() = 0;
//崗位職責(zé)
virtual string getResponsibility() = 0;
//純虛析構(gòu)
virtual ~Worker() = 0;
int m_ID; //職工編號
string m_Name; //職工姓名
int m_DeptID; //職工所在部門名稱編號
};
源文件下創(chuàng)建worker.cpp
實現(xiàn)純虛析構(gòu):
//worker.cpp
#include "worker.h"
Worker::~Worker() {}
6.2 創(chuàng)建普通員工類
普通員工繼承職工抽象類难衰,并重寫父類中純虛函數(shù)
在頭文件和源文件的文件夾下分別創(chuàng)建employee.h
和employee.cpp
employee.h
中代碼如下:
//employee.h
#pragma once
#include <iostream>
#include "worker.h"
using namespace std;
//員工類
class Employee : public Worker {
public:
//構(gòu)造函數(shù)
Employee(int id, string name, int deptID);
//顯示個人信息
virtual void showInfo();
//獲取崗位名稱
virtual string getDepName();
//獲取崗位職責(zé)
virtual string getResponsibility();
};
employee.cpp
中代碼如下:
//employee.cpp
#include "employee.h"
//構(gòu)造函數(shù)
Employee::Employee(int id, string name, int deptID) {
this->m_ID = id;
this->m_Name = name;
this->m_DeptID = deptID;
}
//顯示個人信息
void Employee::showInfo() {
cout << "職工編號:" << this->m_ID;
cout << "\t職工姓名:" << this->m_Name;
cout << "\t崗位:" << this->getDepName();
cout << "\t崗位職責(zé):" << this->getResponsibility() << endl;
}
//獲取崗位名稱
string Employee::getDepName() {
return string("員工");
}
//獲取崗位職責(zé)
string Employee::getResponsibility() {
return string("完成經(jīng)理交代的任務(wù)");
}
6.3 創(chuàng)建經(jīng)理類
經(jīng)理類繼承職工抽象類,并重寫父類中純虛函數(shù)逗栽,和普通員工類似
在頭文件和源文件的文件夾下分別創(chuàng)建manager.h
和manager.cpp
manager.h
代碼如下
//manager.h
#pragma once
#include <iostream>
#include "worker.h"
using namespace std;
//員工類
class Employee : public Worker {
public:
//構(gòu)造函數(shù)
Employee(int id, string name, int deptID);
//顯示個人信息
virtual void showInfo();
//獲取崗位名稱
virtual string getDepName();
//獲取崗位職責(zé)
virtual string getResponsibility();
};
manager.cpp
代碼如下
//manager.cpp
#include "manager.h"
//構(gòu)造函數(shù)
Manager::Manager(int id, string name, int deptID) {
this->m_ID = id;
this->m_Name = name;
this->m_DeptID = deptID;
}
//顯示個人信息
void Manager::showInfo() {
cout << "職工編號:" << this->m_ID;
cout << "\t職工姓名:" << this->m_Name;
cout << "\t崗位:" << this->getDepName();
cout << "\t崗位職責(zé):" << this->getResponsibility() << endl;
}
//獲取崗位名稱
string Manager::getDepName() {
return string("經(jīng)理");
}
//獲取崗位職責(zé)
string Manager::getResponsibility() {
return string("完成老板交代的任務(wù)盖袭,并給普通員工下發(fā)任務(wù)");
}
6.4 創(chuàng)建老板類
老板類繼承職工抽象類,并重寫父類中純虛函數(shù)彼宠,和普通員工以及經(jīng)理類似
在頭文件和源文件的文件夾下分別創(chuàng)建boss.h
和boss.cpp
boss.h
代碼如下
//boss.h
#pragma once
#include <iostream>
#include "worker.h"
using namespace std;
//經(jīng)理類
class Boss : public Worker {
public:
//構(gòu)造函數(shù)
Boss(int id, string name, int deptID);
//顯示個人信息
virtual void showInfo();
//獲取崗位名稱
virtual string getDepName();
//獲取崗位職責(zé)
virtual string getResponsibility();
};
boss.cpp
代碼如下
//boss.cpp
#include "boss.h"
//構(gòu)造函數(shù)
Boss::Boss(int id, string name, int deptID) {
this->m_ID = id;
this->m_Name = name;
this->m_DeptID = deptID;
}
//顯示個人信息
void Boss::showInfo() {
cout << "職工編號:" << this->m_ID;
cout << "\t職工姓名:" << this->m_Name;
cout << "\t崗位:" << this->getDepName();
cout << "\t崗位職責(zé):" << this->getResponsibility() << endl;
}
//獲取崗位名稱
string Boss::getDepName() {
return string("老板");
}
//獲取崗位職責(zé)
string Boss::getResponsibility() {
return string("管理公司所有事物");
}
7鳄虱、添加職工
功能描述:批量添加職工,并保存到文本中
7.1 功能分析
用戶在批量創(chuàng)建時兵志,可能會創(chuàng)建不同種類的職工
如果想將所有不同種類的員工都放入到一個數(shù)組中醇蝴,可以將所有員工的指針維護(hù)到一個數(shù)組里
如果想在程序中維護(hù)這個不定長度的數(shù)組,可以將數(shù)組創(chuàng)建到堆區(qū)想罕,并利用Worker **
的指針維護(hù)
7.2 功能實現(xiàn)
在workerManager.h
中添加成員屬性
//workerManager.h
...
#include "worker.h"
...
//記錄文件中的人數(shù)個數(shù)
int m_EmpNum;
//員工數(shù)組的指針
Worker **m_EmpArray;
};
在workerManaer.cpp
構(gòu)造函數(shù)中初始化屬性
//workerManager.cpp
...
WorkerManager::WorkerManager() {
//初始化人數(shù)
this->m_EmpNum = 0;
//初始化數(shù)組指針
this->m_EmpArray = NULL;
}
...
在workerManager.h
中添加成員函數(shù)
//workerManager.h
...
#include "employee.h"
#include "manager.h"
#include "boss.h"
...
//添加職工
void addEmp();
...
在workerManaer.cpp
中實現(xiàn)該函數(shù)
//workerManager.cpp
...
void WorkerManager::addEmp() {
cout << "請輸入增加職工數(shù)量:" << endl;
int addNum = 0;
cin >> addNum;
if (addNum > 0) {
//計算新空間大小
int newSize = this->m_EmpNum + addNum;
//開辟新空間
Worker **newSpace = new Worker *[newSize];
//將原來空間下內(nèi)容存放到新空間下
if (this->m_EmpArray != NULL) {
for (int i = 0; i < this->m_EmpNum; i++) {
newSpace[i] = this->m_EmpArray[i];
}
}
//輸入新數(shù)據(jù)
for (int i = 0; i < addNum; ++i) {
int id;
string name;
int deptSelect;
cout << "請輸入第" << i + 1 << "個新職工的編號" << endl;
cin >> id;
cout << "請輸入第" << i + 1 << "個新職工的姓名" << endl;
cin >> name;
cout << "請選擇該職工崗位(數(shù)字):\n\t1、普通職工\n\t2、經(jīng)理\n\t3按价、老板" << endl;
cin >> deptSelect;
Worker *worker = NULL;
switch (deptSelect) {
case 1: //普通員工
worker = new Employee(id, name, 1);
break;
case 2: //經(jīng)理
worker = new Employee(id, name, 2);
break;
case 3: //老板
worker = new Boss(id, name, 3);
break;
default:
break;
}
newSpace[this->m_EmpNum + i] = worker;
}
//釋放原有空間
delete[] this->m_EmpArray;
//更改新空間的指向
this->m_EmpArray = newSpace;
//更改新的個數(shù)
this->m_EmpNum = newSize;
//提示信息
cout << "成功添加" << addNum << "名員工惭适!" << endl;
} else {
cout << "輸入有誤!" << endl;
}
pause();
clear();
}
WorkerManager::~WorkerManager() {
if (this->m_EmpArray != NULL) {
delete[]this->m_EmpArray;
this->m_EmpArray = NULL;
}
}
5.3 測試功能
在main
函數(shù)switch
分支1
選項中楼镐,調(diào)用添加職工的接口
//main.cpp
...
case 1: //添加職工
wm.addEmp();
break;
...
8癞志、文件交互 - 寫文件
功能描述:對文件進(jìn)行讀寫
? 在上一個添加功能中,我們只是將所有的數(shù)據(jù)添加到了內(nèi)存中框产,一旦程序結(jié)束就無法保存了
? 因此文件管理類需要一個與文件進(jìn)行交互的功能凄杯,對文件進(jìn)行讀寫操作
8.1 設(shè)定文件路徑
首先我們將文件路徑,在workerManager.h
中添加宏常量秉宿,并包含頭文件fstream
//workerManager.h
...
#include <fstream>
...
#define FILENAME "empFile.txt"
8.2 成員函數(shù)聲明
在workerManager.h
中類里添加成員函數(shù)void save();
//workerManager.h
...
//保存文件
void save();
...
8.3 保存文件功能實現(xiàn)
//workManager.cpp
...
void WorkerManager::save() {
ofstream ofs;
ofs.open(FILENAME, ios::out);
for (int i = 0; i < this->m_EmpNum; ++i) {
ofs << this->m_EmpArray[i]->m_ID << " "
<< this->m_EmpArray[i]->m_Name << " "
<< this->m_EmpArray[i]->m_DeptID << endl;
}
ofs.close();
}
...
8.4 保存文件功能測試
在添加職工功能中添加成功后添加保存文件函數(shù)
//workManager.cpp
...
void WorkerManager::addEmp() {
...
//提示信息
cout << "成功添加" << addNum << "名員工戒突!" << endl;
//保存到文件中
this->save();
...
...
9、文件交互 - 讀文件
功能描述:將文件中的內(nèi)容讀取到程序中
雖然我們實現(xiàn)了添加職工后保存到文件的操作描睦,但是每次開始運(yùn)行程序膊存,并沒有將文件中數(shù)據(jù)讀取到程序中
而我們的程序功能中還有清空文件的需求
因此構(gòu)造函數(shù)初始化數(shù)據(jù)的情況分為三種:
- 第一次使用,文件未創(chuàng)建
- 文件存在忱叭,但是數(shù)據(jù)被用戶清空
- 文件存在隔崎,并且保存職工的所有數(shù)據(jù)
9.1 文件未創(chuàng)建
在workerManager.h
中添加新的成員屬性m_IsFileEmpty
標(biāo)志文件是否為空
//workerManager.h
...
bool m_IsFileEmpty;
};
修改workerManager.cpp
中構(gòu)造函數(shù)代碼
//workerManager.cpp
...
WorkerManager::WorkerManager() {
ifstream ifs;
ifs.open(FILENAME, ios::in);
//文件不存在情況
if (!ifs.is_open()) {
// cout << "文件不存在!" << endl; //測試輸出
this->m_EmpNum = 0; //初始化人數(shù)
this->m_IsFileEmpty = true; //初始化 文件為空 標(biāo)簽
this->m_EmpArray = NULL; //初始化數(shù)組
ifs.close(); //關(guān)閉文件
return;
}
}
...
9.2 文件存在且數(shù)據(jù)為空
在workerManager.cpp
中追加代碼
//workerManager.cpp
...
//文件存在韵丑,并且沒有記錄
char ch;
ifs >> ch;
if (ifs.eof()) {
// cout << "文件為空疙描!" << endl; //測試輸出
this->m_EmpNum = 0; //初始化人數(shù)
this->m_IsFileEmpty = true; //初始化 文件為空 標(biāo)簽
this->m_EmpArray = NULL; //初始化數(shù)組
ifs.close(); //關(guān)閉文件
return;
}
}
將文件創(chuàng)建后清空文件內(nèi)容藏姐,并測試該情況下初始化功能
我們發(fā)現(xiàn)文件不存在或者為清空,m_IsFileEmpty
都為true
,那何時為false
脉执?
成功添加職工后,應(yīng)該更改文件不為空的標(biāo)志
在vodi workerManager::AddEmp()
成員函數(shù)中添加:
//workerManager.cpp
...
//更新職工不為空標(biāo)志
this->m_IsFileEmpty = false;
...
9.3 文件存在且保存職工數(shù)據(jù)
9.3.1 獲取記錄的職工人數(shù)
在workerManager.h
中添加成員函數(shù)int getEmpNum();
//workerManager.h
...
//統(tǒng)計人數(shù)
int getEmpNum();
...
workerManager.cpp
中實現(xiàn)
//workerManager.cpp
...
int WorkerManager::getEmpNum() {
ifstream ifs;
ifs.open(FILENAME, ios::in);
int ID;
string name;
int deptID;
int num = 0;
while (ifs >> ID && ifs >> name && ifs >> deptID) {
//記錄人數(shù)
num++;
}
ifs.close();
return num;
}
...
在workerManager.cpp
構(gòu)造函數(shù)中追加代碼
//workerManager.cpp
...
//文件存在嫩痰,且保存職工數(shù)據(jù)
int num = this->getEmpNum();
// cout << "職工個數(shù)為" << num << endl; //測試代碼
this->m_EmpNum = num; //更新成員屬性
}
...
9.3.2 初始化數(shù)組
根據(jù)職工的數(shù)數(shù)據(jù)以及職工數(shù)量睹限,初始化WorkerManager
中的Worker **m_EmpArray
在workerManager.h
中添加成員函數(shù)void initEmp();
//`workerManager.h
...
//初始化員工
void initEmp();
...
workerManager.cpp
中實現(xiàn)
//workerManager.cpp
...
void WorkerManager::initEmp() {
ifstream ifs;
ifs.open(FILENAME, ios::in);
int ID;
string name;
int deptID;
int index = 0;
while (ifs >> ID && ifs >> name && ifs >> deptID) {
Worker *worker = NULL;
//根據(jù)不同的部門ID創(chuàng)建不同的對象
if (deptID == 0) {
//普通員工
worker = new Employee(ID, name, deptID);
} else if (deptID == 1) {
//經(jīng)理
worker = new Manager(ID, name, deptID);
} else {
//老板
worker = new Boss(ID, name, deptID);
}
//存放在數(shù)組中
this->m_EmpArray[index] = worker;
index++;
}
//關(guān)閉文件
ifs.close();
}
...
在workerManager.cpp
構(gòu)造函數(shù)中追加代碼
//workerManager.cpp
...
//開辟空間
this->m_EmpArray = new Worker *[this->m_EmpNum];
//將文件中的數(shù)據(jù)儲存到數(shù)組
this->initEmp();
/* 測試代碼
for (int i = 0; i < this->m_EmpNum; ++i) {
cout << "職工編號:" << this->m_EmpArray[i]->m_ID
<< "\t姓名:" << this->m_EmpArray[i]->m_Name
<< "\t部門編號:" << this->m_EmpArray[i]->m_DeptID << endl;
} */
}
...
10、顯示職工
功能描述:顯示當(dāng)前所有職工信息
10.1 顯示職工函數(shù)聲明
在workerManager.h
中添加成員函數(shù)void showEmp();
//workerManager.h
...
//顯示職工
void showEmp();
...
10.2 顯示職工函數(shù)實現(xiàn)
workerManager.cpp
中實現(xiàn)成員函數(shù)void workerManager::showEmp()
//workerManager.cpp
...
void WorkerManager::showEmp() {
if (this->m_IsFileEmpty) { cout << "暫時沒有員工拾弃!" << endl; }
else{
for (int i = 0; i < this->m_EmpNum; ++i) {
//利用多態(tài)調(diào)用接口
this->m_EmpArray[i]->showInfo();
}
}
pause();
clear();
}
...
10.3 測試顯示職工
在main
函數(shù)switch
分支2
選項中值桩,調(diào)用顯示職工的接口
//main.cpp
...
case 2: //顯示職工
wm.showEmp();
break;
...
11、刪除職工
功能描述:按照職工的編號進(jìn)行刪除后職工的工作
11.1 刪除職工函數(shù)聲明
在workerManager.h
中添加成員函數(shù)void delEmp();
//workerManager.h
...
//刪除職工
void delEmp();
...
11.2 職工是否存在函數(shù)聲明
很多功能都需要用到根據(jù)職工是否存在來進(jìn)行操作豪椿,如:刪除員工奔坟、修改員工、查找員工
因此添加該公告函數(shù)搭盾,以便后續(xù)調(diào)用
在workerManager.h
中添加成員函數(shù)int isExi(int id)
//workerManager.h
...
//按照職工編號判斷職工是否存在咳秉,若存在返回職工在數(shù)組中位置,不存在返回-1
int isExist(int id);
...
11.3 職工是否存在函數(shù)實現(xiàn)
在workerManager.cpp
中實現(xiàn)成員函數(shù)int workerManager::isExist()
//workerManager.cpp
...
int WorkerManager::isExist(int id) {
int index = -1;
for (int i = 0; i < this->m_EmpNum; ++i) {
if (this->m_EmpArray[i]->m_ID == id) {
index = i;
break;
}
}
return index;
}
...
11.4 刪除職工函數(shù)實現(xiàn)
在workerManager.cpp
中實現(xiàn)成員函數(shù)void workerManager::delEmp()
//workerManager.cpp
...
void WorkerManager::delEmp() {
if (this->m_IsFileEmpty) { cout << "暫時沒有員工鸯隅!" << endl; }
else {
//按照職工編號刪除
cout << "請輸入想要刪除職工的編號:";
int id = 0;
cin >> id;
int index = this->isExist(id);
if (index != -1) { //說明職工存在澜建,并且要刪除掉index位置上的職工
//數(shù)據(jù)前移
for (int i = index; i < this->m_EmpNum; i++) {
this->m_EmpArray[i] = this->m_EmpArray[i + 1];
}
//更新數(shù)組中記錄的人員個數(shù)
this->m_EmpNum--;
//更新同步到文件中
this->save();
cout << "職工id " << id << " 刪除成功向挖!" << endl;
} else { cout << "刪除失敗,未找到該員工炕舵!" << endl; }
}
pause();
clear();
}
...
11.5 測試刪除職工
在main
函數(shù)switch
分支3
選項中何之,調(diào)用刪除職工的接口
//main.cpp
...
case 3: //刪除職工
wm.delEmp();
break;
...
12、 修改職工
功能描述:能夠按照職工的編號對職工信息進(jìn)行修改并保存
12.1修改職工函數(shù)聲明
在workerManager.h
中添加成員函數(shù)void modEmp();
//workerManager.h
...
//修改職工
void modEmp();
...
12.2 修改職工函數(shù)實現(xiàn)
在workerManager.cpp
中實現(xiàn)成員函數(shù)void modEmp()
//workerManager.cpp
...
void WorkerManager::modEmp() {
if (this->m_IsFileEmpty) { cout << "暫時沒有員工咽筋!" << endl; }
else {
cout << "請輸入想要修改的職工編號:";
int id;
cin >> id;
int ret = this->isExist(id);
if (ret != -1) {
//查找到職工的編號
delete this->m_EmpArray[ret];
int newID = 0;
string newName = "";
int newDeptSelect = 0;
cout << "查找到職工編號為 " << id << " 的員工溶推,請輸入新的職工編號:";
cin >> newID;
cout << "請輸入姓名:";
cin >> newName;
cout << "請選擇該職工崗位(數(shù)字):\n\t1、普通職工\n\t2奸攻、經(jīng)理\n\t3蒜危、老板" << endl;
cin >> newDeptSelect;
Worker *worker = NULL;
switch (newDeptSelect) {
case 1: //普通員工
worker = new Employee(newID, newName, 1);
break;
case 2: //經(jīng)理
worker = new Employee(newID, newName, 2);
break;
case 3: //老板
worker = new Boss(newID, newName, 3);
break;
default:
break;
}
//更改數(shù)據(jù)到數(shù)組中
this->m_EmpArray[ret] = worker;
cout << "新員工 " << this->m_EmpArray[ret]->m_Name << " 修改成功!" << endl;
//保存到文件中
this->save();
} else { cout << "刪除失敗睹耐,未找到該員工辐赞!" << endl; }
}
pause();
clear();
}
...
12.3 測試修改職工
在main
函數(shù)switch
分支4
選項中,調(diào)用修改職工的接口
//main.cpp
...
case 4: //修改職工
wm.modEmp();
break;
...
13疏橄、 查找職工
功能描述:提供兩種查找職工方式占拍,一種按照職工編號,一種按照職工姓名
13.1 查找職工函數(shù)證明
在workerManager.h
中添加成員函數(shù)void findEmp();
//workerManager.h
...
//查找職工
void findEmp();
...
13.2 查找職工函數(shù)實現(xiàn)
在workerManager.cpp
中實現(xiàn)成員函數(shù)void findEmp()
//workerManager.cpp
...
void WorkerManager::findEmp() {
if (this->m_IsFileEmpty) { cout << "暫時沒有員工捎迫!" << endl; }
else {
cout << "請輸入查找的方式:\n"
<< "1. 按職工編號查找\n"
<< "2. 站姓名查找" << endl;
int select;
cin >> select;
if (select == 1) { //按職工編號查找
int id;
cout << "請輸入想要查找的職工編號:" << endl;
cin >> id;
int ret = this->isExist(id);
if (ret != -1) {
clear();
cout << "該職工信息如下:" << endl;
this->m_EmpArray[ret]->showInfo();
} else { cout << "查無此人晃酒!沒有編號為 " << id << " 的員工!" << endl; }
} else if (select == 2) { //按照姓名查找
string name;
cout << "請輸入想要查找的姓名:";
cin >> name;
bool isFound = false; //找到的標(biāo)志
for (int i = 0; i < m_EmpNum; i++) {
if (this->m_EmpArray[i]->m_Name == name) {
if (isFound == false) {
isFound = true;
clear();
}
this->m_EmpArray[i]->showInfo();
}
}
if (isFound == false) {
cout << "職工 " << name << " 查無此人窄绒!" << endl;
}
} else { cout << "輸入選項有誤贝次!" << endl; }
}
pause();
clear();
}
...
13.3 測試查找職工
在main
函數(shù)switch
分支5
選項中,調(diào)用查找職工的接口
//main.cpp
...
case 5: //查找職工
wm.findEmp();
break;
...
14彰导、排序員工
功能描述:按照職工編號進(jìn)行排序蛔翅,排序的順序由用戶指定
14.1 查找職工函數(shù)證明
在workerManager.h
中添加成員函數(shù)void sortEmp();
//workerManager.h
...
//排序職工
void sortEmp();
...
14.2 排序職工函數(shù)實現(xiàn)
在workerManager.cpp
中實現(xiàn)成員函數(shù)void sortEmp()
//workerManager.cpp
...
void WorkerManager::sortEmp() {
if (this->m_IsFileEmpty) {
cout << "暫時沒有員工!" << endl;
pause();
clear();
} else {
cout << "請選擇排序方式:\n"
<< "1. 按照職工編號進(jìn)行升序\n"
<< "2. 按照職工編號進(jìn)行降序" << endl;
int select = 0;
cin >> select;
for (int i = 0; i < m_EmpNum; i++) {
int minOrMaxIndex = i;
for (int j = i + 1; j < m_EmpNum; j++) {
if (select == 1) { //升序
if (this->m_EmpArray[minOrMaxIndex]->m_ID > this->m_EmpArray[j]->m_ID) { minOrMaxIndex = j; }
} else if (select == 2) { //降序
if (this->m_EmpArray[minOrMaxIndex]->m_ID < this->m_EmpArray[j]->m_ID) { minOrMaxIndex = j; }
}
}
if (i != minOrMaxIndex) {
Worker *temp = this->m_EmpArray[i];
this->m_EmpArray[i] = this->m_EmpArray[minOrMaxIndex];
this->m_EmpArray[minOrMaxIndex] = temp;
}
}
this->save();
cout << "排序成功位谋!新的結(jié)果為:" << endl;
this->showEmp();
}
}
...
14.3 測試排序職工
在main
函數(shù)switch
分支6
選項中山析,調(diào)用排序職工的接口
//main.cpp
...
case 6: //排序職工
wm.sortEmp();
break;
...
15、清空文件
功能描述:將文件中記錄數(shù)據(jù)清空
14.1 清空文件函數(shù)證明
在workerManager.h
中添加成員函數(shù)void clearFile();
//workerManager.h
...
//清空文件
void clearFile();
...
14.2 清空文件函數(shù)實現(xiàn)
在workerManager.cpp
中實現(xiàn)成員函數(shù)void clearFile()
//workerManager.cpp
...
void WorkerManager::clearFile() {
cout << "是否確認(rèn)清空掏父?確認(rèn)操作后所有數(shù)據(jù)將會丟失笋轨!\n"
<< "1. 確認(rèn)\n"
<< "2. 取消" << endl;
short selection = 0;
cin >> selection;
if (selection == 1) {
//打開模式:ios::trunc 如果存在,刪除文件并重新創(chuàng)建
ofstream ofs(FILENAME, ios::trunc);
ofs.close();
//維護(hù)指針
if (this->m_EmpArray != NULL) {
for (int i = 0; i < this->m_EmpNum; ++i) {
if (this->m_EmpArray[i] != NULL) { delete this->m_EmpArray[i]; }
}
delete[] this->m_EmpArray;
this->m_EmpArray = NULL;
this->m_EmpNum = 0;
this->m_IsFileEmpty = true;
}
cout << "職工數(shù)據(jù)清除成功赊淑!" << endl;
pause();
}
clear();
}
...
修改workerManager.cpp
中的析構(gòu)函數(shù)
//workerManager.cpp
...
...
15.3 測試清空文件
在main
函數(shù)switch
分支7
選項中爵政,調(diào)用清空文件的接口
//main.cpp
...
case 7: //清空文件
wm.clearFile();
break;
...