1、管理系統需求
職工管理系統可以用來管理公司內所有員工的信息
本教程主要利用C++來實現一個基於多態的職工管理系統
公司中職工分為三類:普通員工、經理、老闆,顯示信息時,需要顯示職工編號、職工姓名、職工崗位、以及職責
普通員工職責:完成經理交給的任務
經理職責:完成老闆交給的任務,並下發任務給員工
老闆職責:管理公司所有事務
管理系統中需要實現的功能如下:
- 退出管理程序:退出當前管理系統
- 增加職工信息:實現批量添加職工功能,將信息錄入到文件中,職工信息為:職工編號、姓名、部門編號
- 顯示職工信息:顯示公司內部所有職工的信息
- 刪除離職職工:按照編號刪除指定的職工
- 修改職工信息:按照編號修改職工個人信息
- 查找職工信息:按照職工的編號或者職工的姓名進行查找相關的人員信息
- 按照編號排序:按照職工編號,進行排序,排序規則由用戶指定
- 清空所有文檔:清空文件中記錄的所有職工信息 (清空前需要再次確認,防止誤刪)
系統介面效果圖如下:
需根據用戶不同的選擇,完成不同的功能!
2、創建項目
創建項目步驟如下:
- 創建新項目
- 添加文件
2.1 創建項目
打開vs2017後,點擊創建新項目,創建新的C++項目
填寫項目名稱以及項目路徑,點擊確定
2.2 添加文件
右鍵源文件,進行添加文件操作
至此,項目已創建完畢
3、創建管理類
管理類負責的內容如下:
- 與用戶的溝通菜單介面
- 對職工增刪改查的操作
- 與文件的讀寫交互
3.1創建文件
在頭文件和源文件的文件夾下分別創建workerManager.h 和 workerManager.cpp文件
3.2 頭文件實現
在workerManager.h中設計管理類
代碼如下:
#pragma once
#include<iostream>
using namespace std;
class WorkerManager
{
public:
//構造函數
WorkerManager();
//析構函數
~WorkerManager();
};
3.3 源文件實現
在workerManager.cpp中將構造和析構函數空實現補全
#include "workerManager.h"
WorkerManager::WorkerManager()
{
}
WorkerManager::~WorkerManager()
{
}
至此職工管理類以創建完畢
4、菜單功能
功能描述:與用戶的溝通介面
4.1 添加成員函數
在管理類workerManager.h中添加成員函數 void Show_Menu();
4.2 菜單功能實現
在管理類workerManager.cpp中實現 Show_Menu()函數
void WorkerManager::Show_Menu()
{
cout << "********************************************" << endl;
cout << "********* 歡迎使用職工管理系統! **********" << 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;
cout << endl;
}
4.3 測試菜單功能
在職工管理系統.cpp中測試菜單功能
代碼:
#include<iostream>
using namespace std;
#include "workerManager.h"
int main() {
WorkerManager wm;
wm.Show_Menu();
system("pause");
return 0;
}
運行效果如圖:
5、退出功能
5.1 提供功能接口
在main函數中提供分支選擇,提供每個功能接口
代碼:
int main() {
WorkerManager wm;
int choice = 0;
while (true)
{
//展示菜單
wm.Show_Menu();
cout << "請輸入您的選擇:" << endl;
cin >> choice;
switch (choice)
{
case 0: //退出系統
break;
case 1: //添加職工
break;
case 2: //顯示職工
break;
case 3: //刪除職工
break;
case 4: //修改職工
break;
case 5: //查找職工
break;
case 6: //排序職工
break;
case 7: //清空文件
break;
default:
system("cls");
break;
}
}
system("pause");
return 0;
}
5.2 實現退出功能
在workerManager.h中提供退出系統的成員函數 void exitSystem();
在workerManager.cpp中提供具體的功能實現
void WorkerManager::exitSystem()
{
cout << "歡迎下次使用" << endl;
system("pause");
exit(0);
}
5.3測試功能
在main函數分支 0 選項中,調用退出程序的接口
運行測試效果如圖:
6、創建職工類
6.1 創建職工抽象類
職工的分類為:普通員工、經理、老闆
將三種職工抽象到一個類(worker)中,利用多態管理不同職工種類
職工的屬性為:職工編號、職工姓名、職工所在部門編號
職工的行為為:崗位職責信息描述,獲取崗位名稱
頭文件文件夾下 創建文件worker.h 文件並且添加如下代碼:
#pragma once
#include<iostream>
#include<string>
using namespace std;
//職工抽象基類
class Worker
{
public:
//顯示個人信息
virtual void showInfo() = 0;
//獲取崗位名稱
virtual string getDeptName() = 0;
int m_Id; //職工編號
string m_Name; //職工姓名
int m_DeptId; //職工所在部門名稱編號
};
6.2 創建普通員工類
普通員工類繼承職工抽象類,並重寫父類中純虛函數
在頭文件和源文件的文件夾下分別創建employee.h 和 employee.cpp文件
employee.h中代碼如下:
#pragma once
#include<iostream>
using namespace std;
#include "worker.h"
//員工類
class Employee :public Worker
{
public:
//構造函數
Employee(int id, string name, int dId);
//顯示個人信息
virtual void showInfo();
//獲取職工崗位名稱
virtual string getDeptName();
};
employee.cpp中代碼如下:
#include "employee.h"
Employee::Employee(int id, string name, int dId)
{
this->m_Id = id;
this->m_Name = name;
this->m_DeptId = dId;
}
void Employee::showInfo()
{
cout << "職工編號: " << this->m_Id
<< " \t職工姓名: " << this->m_Name
<< " \t崗位:" << this->getDeptName()
<< " \t崗位職責:完成經理交給的任務" << endl;
}
string Employee::getDeptName()
{
return string("員工");
}
6.3 創建經理類
經理類繼承職工抽象類,並重寫父類中純虛函數,和普通員工類似
在頭文件和源文件的文件夾下分別創建manager.h 和 manager.cpp文件
manager.h中代碼如下:
#pragma once
#include<iostream>
using namespace std;
#include "worker.h"
//經理類
class Manager :public Worker
{
public:
Manager(int id, string name, int dId);
//顯示個人信息
virtual void showInfo();
//獲取職工崗位名稱
virtual string getDeptName();
};
manager.cpp中代碼如下:
#include "manager.h"
Manager::Manager(int id, string name, int dId)
{
this->m_Id = id;
this->m_Name = name;
this->m_DeptId = dId;
}
void Manager::showInfo()
{
cout << "職工編號: " << this->m_Id
<< " \t職工姓名: " << this->m_Name
<< " \t崗位:" << this->getDeptName()
<< " \t崗位職責:完成老闆交給的任務,並下發任務給員工" << endl;
}
string Manager::getDeptName()
{
return string("經理");
}
6.4 創建老闆類
老闆類繼承職工抽象類,並重寫父類中純虛函數,和普通員工類似
在頭文件和源文件的文件夾下分別創建boss.h 和 boss.cpp文件
boss.h中代碼如下:
#pragma once
#include<iostream>
using namespace std;
#include "worker.h"
//老闆類
class Boss :public Worker
{
public:
Boss(int id, string name, int dId);
//顯示個人信息
virtual void showInfo();
//獲取職工崗位名稱
virtual string getDeptName();
};
boss.cpp中代碼如下:
#include "boss.h"
Boss::Boss(int id, string name, int dId)
{
this->m_Id = id;
this->m_Name = name;
this->m_DeptId = dId;
}
void Boss::showInfo()
{
cout << "職工編號: " << this->m_Id
<< " \t職工姓名: " << this->m_Name
<< " \t崗位:" << this->getDeptName()
<< " \t崗位職責:管理公司所有事務" << endl;
}
string Boss::getDeptName()
{
return string("總裁");
}
6.5 測試多態
在職工管理系統.cpp中添加測試函數,並且運行能夠產生多態
測試代碼如下:
#include "worker.h"
#include "employee.h"
#include "manager.h"
#include "boss.h"
void test()
{
Worker * worker = NULL;
worker = new Employee(1, "張三", 1);
worker->showInfo();
delete worker;
worker = new Manager(2, "李四", 2);
worker->showInfo();
delete worker;
worker = new Boss(3, "王五", 3);
worker->showInfo();
delete worker;
}
運行效果如圖:
測試成功後,測試代碼可以注釋保留,或者選擇刪除
7、添加職工
功能描述:批量添加職工,並且保存到文件中
7.1 功能分析
分析:
用戶在批量創建時,可能會創建不同種類的職工
如果想將所有不同種類的員工都放入到一個數組中,可以將所有員工的指針維護到一個數組裡
如果想在程序中維護這個不定長度的數組,可以將數組創建到堆區,並利用Worker **的指針維護
7.2 功能實現
在WokerManager.h頭文件中添加成員屬性 代碼:
//記錄文件中的人數個數
int m_EmpNum;
//員工數組的指針
Worker ** m_EmpArray;
在WorkerManager構造函數中初始化屬性
WorkerManager::WorkerManager()
{
//初始化人數
this->m_EmpNum = 0;
//初始化數組指針
this->m_EmpArray = NULL;
}
在workerManager.h中添加成員函數
//增加職工
void Add_Emp();
workerManager.cpp中實現該函數
//增加職工
void WorkerManager::Add_Emp()
{
cout << "請輸入增加職工數量: " << endl;
int addNum = 0;
cin >> addNum;
if (addNum > 0)
{
//計算新空間大小
int newSize = this->m_EmpNum + addNum;
//開闢新空間
Worker ** newSpace = new Worker*[newSize];
//將原空間下內容存放到新空間下
if (this->m_EmpArray != NULL)
{
for (int i = 0; i < this->m_EmpNum; i++)
{
newSpace[i] = this->m_EmpArray[i];
}
}
//輸入新數據
for (int i = 0; i < addNum; i++)
{
int id;
string name;
int dSelect;
cout << "請輸入第 " << i + 1 << " 個新職工編號:" << endl;
cin >> id;
cout << "請輸入第 " << i + 1 << " 個新職工姓名:" << endl;
cin >> name;
cout << "請選擇該職工的崗位:" << endl;
cout << "1、普通職工" << endl;
cout << "2、經理" << endl;
cout << "3、老闆" << endl;
cin >> dSelect;
Worker * worker = NULL;
switch (dSelect)
{
case 1: //普通員工
worker = new Employee(id, name, 1);
break;
case 2: //經理
worker = new Manager(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;
//更新新的個數
this->m_EmpNum = newSize;
//提示信息
cout << "成功添加" << addNum << "名新職工!" << endl;
}
else
{
cout << "輸入有誤" << endl;
}
system("pause");
system("cls");
}
在WorkerManager.cpp的析構函數中,釋放堆區數據
WorkerManager::~WorkerManager()
{
if (this->m_EmpArray != NULL)
{
delete[] this->m_EmpArray;
}
}
7.3 測試添加
在main函數分支 1 選項中,調用添加職工接口
效果如圖:
至此,添加職工到程序中功能實現完畢
8、文件交互 - 寫文件
功能描述:對文件進行讀寫
在上一個添加功能中,我們只是將所有的數據添加到了內存中,一旦程序結束就無法保存了
因此文件管理類中需要一個與文件進行交互的功能,對於文件進行讀寫操作
8.1 設定文件路徑
首先我們將文件路徑,在workerManager.h中添加宏常量,並且包含頭文件 fstream
#include <fstream>
#define FILENAME "empFile.txt"
8.2 成員函數聲明
在workerManager.h中類里添加成員函數 void save()
//保存文件
void save();
8.3 保存文件功能實現
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 保存文件功能測試
在添加職工功能中添加成功後添加保存文件函數
再次運行代碼,添加職工
同級目錄下多出文件,並且保存了添加的信息
9、文件交互 - 讀文件
功能描述:將文件中的內容讀取到程序中
雖然我們實現了添加職工後保存到文件的操作,但是每次開始運行程序,並沒有將文件中數據讀取到程序中
而我們的程序功能中還有清空文件的需求
因此構造函數初始化數據的情況分為三種
- 第一次使用,文件未創建
- 文件存在,但是數據被用戶清空
- 文件存在,並且保存職工的所有數據
9.1 文件未創建
在workerManager.h中添加新的成員屬性 m_FileIsEmpty標誌文件是否為空
//標誌文件是否為空
bool m_FileIsEmpty;
修改WorkerManager.cpp中構造函數代碼
WorkerManager::WorkerManager()
{
ifstream ifs;
ifs.open(FILENAME, ios::in);
//文件不存在情況
if (!ifs.is_open())
{
cout << "文件不存在" << endl; //測試輸出
this->m_EmpNum = 0; //初始化人數
this->m_FileIsEmpty = true; //初始化文件為空標誌
this->m_EmpArray = NULL; //初始化數組
ifs.close(); //關閉文件
return;
}
}
刪除文件後,測試文件不存在時初始化數據功能
9.2 文件存在且數據為空
在workerManager.cpp中的構造函數追加代碼:
//文件存在,並且沒有記錄
char ch;
ifs >> ch;
if (ifs.eof())
{
cout << "文件為空!" << endl;
this->m_EmpNum = 0;
this->m_FileIsEmpty = true;
this->m_EmpArray = NULL;
ifs.close();
return;
}
追加代碼位置如圖:
將文件創建後清空文件內容,並測試該情況下初始化功能
我們發現文件不存在或者為空清空 m_FileIsEmpty 判斷文件是否為空的標誌都為真,那何時為假?
成功添加職工後,應該更改文件不為空的標誌
在void WorkerManager::Add_Emp() 成員函數中添加:
//更新職工不為空標誌
this->m_FileIsEmpty = false;
9.3 文件存在且保存職工數據
9.3.1 獲取記錄的職工人數
在workerManager.h中添加成員函數 int get_EmpNum();
//統計人數
int get_EmpNum();
workerManager.cpp中實現
int WorkerManager::get_EmpNum()
{
ifstream ifs;
ifs.open(FILENAME, ios::in);
int id;
string name;
int dId;
int num = 0;
while (ifs >> id && ifs >> name && ifs >> dId)
{
//記錄人數
num++;
}
ifs.close();
return num;
}
在workerManager.cpp構造函數中繼續追加代碼:
int num = this->get_EmpNum();
cout << "職工個數為:" << num << endl; //測試代碼
this->m_EmpNum = num; //更新成員屬性
手動添加一些職工數據,測試獲取職工數量函數
9.3.2 初始化數組
根據職工的數據以及職工數據,初始化workerManager中的Worker ** m_EmpArray 指針
在WorkerManager.h中添加成員函數 void init_Emp();
//初始化員工
void init_Emp();
在WorkerManager.cpp中實現
void WorkerManager::init_Emp()
{
ifstream ifs;
ifs.open(FILENAME, ios::in);
int id;
string name;
int dId;
int index = 0;
while (ifs >> id && ifs >> name && ifs >> dId)
{
Worker * worker = NULL;
//根據不同的部門Id創建不同對象
if (dId == 1) // 1普通員工
{
worker = new Employee(id, name, dId);
}
else if (dId == 2) //2經理
{
worker = new Manager(id, name, dId);
}
else //總裁
{
worker = new Boss(id, name, dId);
}
//存放在數組中
this->m_EmpArray[index] = worker;
index++;
}
}
在workerManager.cpp構造函數中追加代碼
//根據職工數創建數組
this->m_EmpArray = new Worker *[this->m_EmpNum];
//初始化職工
init_Emp();
//測試代碼
for (int i = 0; i < m_EmpNum; i++)
{
cout << "職工號: " << this->m_EmpArray[i]->m_Id
<< " 職工姓名: " << this->m_EmpArray[i]->m_Name
<< " 部門編號: " << this->m_EmpArray[i]->m_DeptId << endl;
}
運行程序,測試從文件中獲取的數據
至此初始化數據功能完畢,測試代碼可以注釋或刪除掉!
10、顯示職工
功能描述:顯示當前所有職工信息
10.1 顯示職工函數聲明
在workerManager.h中添加成員函數 void Show_Emp();
//顯示職工
void Show_Emp();
10.2 顯示職工函數實現
在workerManager.cpp中實現成員函數 void Show_Emp();
//顯示職工
void WorkerManager::Show_Emp()
{
if (this->m_FileIsEmpty)
{
cout << "文件不存在或記錄為空!" << endl;
}
else
{
for (int i = 0; i < m_EmpNum; i++)
{
//利用多態調用接口
this->m_EmpArray[i]->showInfo();
}
}
system("pause");
system("cls");
}
10.3 測試顯示職工
在main函數分支 2 選項中,調用顯示職工接口
測試時分別測試 文件為空和文件不為空兩種情況
測試效果:
測試1-文件不存在或者為空情況
測試2 - 文件存在且有記錄情況
測試完畢,至此,顯示所有職工信息功能實現
11、刪除職工
功能描述:按照職工的編號進行刪除職工操作
11.1 刪除職工函數聲明
在workerManager.h中添加成員函數 void Del_Emp();
//刪除職工
void Del_Emp();
11.2 職工是否存在函數聲明
很多功能都需要用到根據職工是否存在來進行操作如:刪除職工、修改職工、查找職工
因此添加該公告函數,以便後續調用
在workerManager.h中添加成員函數 int IsExist(int id);
//按照職工編號判斷職工是否存在,若存在返回職工在數組中位置,不存在返回-1
int IsExist(int id);
11.3 職工是否存在函數實現
在workerManager.cpp中實現成員函數 int IsExist(int id);
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 刪除職工函數實現
在workerManager.cpp中實現成員函數 void Del_Emp();
//刪除職工
void WorkerManager::Del_Emp()
{
if (this->m_FileIsEmpty)
{
cout << "文件不存在或記錄為空!" << endl;
}
else
{
//按職工編號刪除
cout << "請輸入想要刪除的職工號:" << endl;
int id = 0;
cin >> id;
int index = this->IsExist(id);
if (index != -1) //說明index上位置數據需要刪除
{
for (int i = index; i < this->m_EmpNum - 1; i++)
{
this->m_EmpArray[i] = this->m_EmpArray[i + 1];
}
this->m_EmpNum--;
this->save(); //刪除後數據同步到文件中
cout << "刪除成功!" << endl;
}
else
{
cout << "刪除失敗,未找到該職工" << endl;
}
}
system("pause");
system("cls");
}
11.5 測試刪除職工
在main函數分支 3 選項中,調用刪除職工接口
測試1 - 刪除不存在職工情況
測試2 - 刪除存在的職工情況
刪除成功提示圖:
再次顯示所有職工信息,確保已經刪除
查看文件中信息,再次核實員工已被完全刪除
至此,刪除職工功能實現完畢!
12、修改職工
功能描述:能夠按照職工的編號對職工信息進行修改並保存
12.1 修改職工函數聲明
在workerManager.h中添加成員函數 void Mod_Emp();
//修改職工
void Mod_Emp();
12.2 修改職工函數實現
在workerManager.cpp中實現成員函數 void Mod_Emp();
//修改職工
void WorkerManager::Mod_Emp()
{
if (this->m_FileIsEmpty)
{
cout << "文件不存在或記錄為空!" << endl;
}
else
{
cout << "請輸入修改職工的編號:" << endl;
int id;
cin >> id;
int ret = this->IsExist(id);
if (ret != -1)
{
//查找到編號的職工
delete this->m_EmpArray[ret];
int newId = 0;
string newName = "";
int dSelect = 0;
cout << "查到: " << id << "號職工,請輸入新職工號: " << endl;
cin >> newId;
cout << "請輸入新姓名: " << endl;
cin >> newName;
cout << "請輸入崗位: " << endl;
cout << "1、普通職工" << endl;
cout << "2、經理" << endl;
cout << "3、老闆" << endl;
cin >> dSelect;
Worker * worker = NULL;
switch (dSelect)
{
case1:
worker = new Employee(newId, newName, dSelect);
break;
case2:
worker = new Manager(newId, newName, dSelect);
break;
case 3:
worker = new Boss(newId, newName, dSelect);
break;
default:
break;
}
//更改數據 到數組中
this->m_EmpArray[ret]= worker;
cout << "修改成功!" << endl;
//保存到文件中
this->save();
}
else
{
cout << "修改失敗,查無此人" << endl;
}
}
//按任意鍵 清屏
system("pause");
system("cls");
}
12.3 測試修改職工
在main函數分支 4 選項中,調用修改職工接口
測試1 - 修改不存在職工情況
測試2 - 修改存在職工情況,例如將職工 "李四" 改為 "趙四"
修改後再次查看所有職工信息,並確認修改成功
再次確認文件中信息也同步更新
至此,修改職工功能已實現!
13、查找職工
功能描述:提供兩種查找職工方式,一種按照職工編號,一種按照職工姓名
13.1 查找職工函數聲明
在workerManager.h中添加成員函數 void Find_Emp();
//查找職工
void Find_Emp();
13.2 查找職工函數實現
在workerManager.cpp中實現成員函數 void Find_Emp();
//查找職工
void WorkerManager::Find_Emp()
{
if (this->m_FileIsEmpty)
{
cout << "文件不存在或記錄為空!" << endl;
}
else
{
cout << "請輸入查找的方式:" << endl;
cout << "1、按職工編號查找" << endl;
cout << "2、按姓名查找" << endl;
int select = 0;
cin >> select;
if (select == 1) //按職工號查找
{
int id;
cout << "請輸入查找的職工編號:" << endl;
cin >> id;
int ret = IsExist(id);
if (ret != -1)
{
cout << "查找成功!該職工信息如下:" << endl;
this->m_EmpArray[ret]->showInfo();
}
else
{
cout << "查找失敗,查無此人" << endl;
}
}
else if(select == 2) //按姓名查找
{
string name;
cout << "請輸入查找的姓名:" << endl;
cin >> name;
bool flag = false; //查找到的標誌
for (int i = 0; i < m_EmpNum; i++)
{
if (m_EmpArray[i]->m_Name == name)
{
cout << "查找成功,職工編號為:"
<< m_EmpArray[i]->m_Id
<< " 號的信息如下:" << endl;
flag = true;
this->m_EmpArray[i]->showInfo();
}
}
if (flag == false)
{
//查無此人
cout << "查找失敗,查無此人" << endl;
}
}
else
{
cout << "輸入選項有誤" << endl;
}
}
system("pause");
system("cls");
}
13.3 測試查找職工
在main函數分支 5 選項中,調用查找職工接口
測試1 - 按照職工編號查找 - 查找不存在職工
測試2 - 按照職工編號查找 - 查找存在職工
測試3 - 按照職工姓名查找 - 查找不存在職工
測試4 - 按照職工姓名查找 - 查找存在職工(如果出現重名,也一併顯示,在文件中可以添加重名職工)
例如 添加兩個王五的職工,然後按照姓名查找王五
至此,查找職工功能實現完畢!
14、排序
功能描述:按照職工編號進行排序,排序的順序由用戶指定
14.1 排序函數聲明
在workerManager.h中添加成員函數 void Sort_Emp();
//排序職工
void Sort_Emp();
14.2 排序函數實現
在workerManager.cpp中實現成員函數 void Sort_Emp();
//排序職工
void WorkerManager::Sort_Emp()
{
if (this->m_FileIsEmpty)
{
cout << "文件不存在或記錄為空!" << endl;
system("pause");
system("cls");
}
else
{
cout << "請選擇排序方式: " << endl;
cout << "1、按職工號進行升序" << endl;
cout << "2、按職工號進行降序" << endl;
int select = 0;
cin >> select;
for (int i = 0; i < m_EmpNum; i++)
{
int minOrMax = i;
for (int j = i + 1; j < m_EmpNum; j++)
{
if (select == 1) //升序
{
if (m_EmpArray[minOrMax]->m_Id > m_EmpArray[j]->m_Id)
{
minOrMax = j;
}
}
else //降序
{
if (m_EmpArray[minOrMax]->m_Id < m_EmpArray[j]->m_Id)
{
minOrMax = j;
}
}
}
if (i != minOrMax)
{
Worker * temp = m_EmpArray[i];
m_EmpArray[i] = m_EmpArray[minOrMax];
m_EmpArray[minOrMax] = temp;
}
}
cout << "排序成功,排序後結果為:" << endl;
this->save();
this->Show_Emp();
}
}
14.3 測試排序功能
在main函數分支 6 選項中,調用排序職工接口
測試:
首先我們添加一些職工,序號是無序的,例如:
測試 - 升序排序
文件同步更新
測試 - 降序排序
文件同步更新
至此,職工按照編號排序的功能實現完畢!
15、清空文件
功能描述:將文件中記錄數據清空
15.1 清空函數聲明
在workerManager.h中添加成員函數 void Clean_File();
//清空文件
void Clean_File();
15.2 清空函數實現
在workerManager.cpp中實現員函數 void Clean_File();
//清空文件
void WorkerManager::Clean_File()
{
cout << "確認清空?" << endl;
cout << "1、確認" << endl;
cout << "2、返回" << endl;
int select = 0;
cin >> select;
if (select == 1)
{
//打開模式 ios::trunc 如果存在刪除文件並重新創建
ofstream ofs(FILENAME, ios::trunc);
ofs.close();
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];
}
}
this->m_EmpNum = 0;
delete[] this->m_EmpArray;
this->m_EmpArray = NULL;
this->m_FileIsEmpty = true;
}
cout << "清空成功!" << endl;
}
system("pause");
system("cls");
}
15.3 測試清空文件
在main函數分支 7 選項中,調用清空文件接口
測試:確認清空文件
再次查看文件中數據,記錄已為空
打開文件,裡面數據已確保清空,該功能需要慎用!
隨著清空文件功能實現,本案例製作完畢 ^ _ ^