主頁 > 移動端開發 > C++學習記錄 四、基于多型的企業職工系統

C++學習記錄 四、基于多型的企業職工系統

2020-10-05 03:22:44 移動端開發

再系統地過一次,夯實基礎

學習目標:

過一遍黑馬程式員C/C++學習視頻

文章目錄

  • 學習目標:
  • 學習內容:
    • 一、C++基礎入門
    • 二、通訊錄管理系統
    • 三、C++核心編程
    • 三、 C++核心編程(面向物件) 繼承
    • 四、基于多型的企業職工系統
      • 1. 管理系統需求
      • 3. 創建管理類
        • 3.1 創建檔案
        • 3.2 頭檔案實作
        • 3.3 源檔案實作
      • 4. 選單功能
        • 4.1 添加成員函式
        • 4.2 選單功能實作
      • 5. 推出功能
        • 5.1 提供功能介面
        • 5.2 實作退出功能
      • 6. 創建職工類
        • 6.1 創建職工抽象類
        • 6.2 創建普通員工類
        • 6.3 創建經理類
        • 6.4 創建老板類
        • 6.5 測驗多型
      • 7.添加職工
        • 7.1 功能分析
        • 7.2 功能實作
      • 8. 檔案互動 - 寫檔案
        • 8.1 設定檔案路徑
        • 8.2 成員函式宣告
        • 8.3 保存檔案功能實作
        • 8.4 保存檔案功能測驗
      • 9. 檔案互動 - 讀檔案
        • 9.1 檔案未創建
        • 9.2 檔案存在且資料為空
        • 9.3 檔案存在且保存職工資料
          • 9.3.1 獲取記錄的職工人數
          • 9.3.2 初始化陣列
      • 10. 顯示員工
        • 10.1 顯示職工函式宣告
        • 10.2 顯示職工函式實作
      • 11. 洗掉職工
        • 11.1 洗掉職工的函式宣告
        • 11.2 職工是否存在函式宣告
        • 11.3 職工是否存在函式實作
        • 11.4 洗掉職工函式實作
      • 12. 修改職工
        • 12.1 修改職工函式宣告
        • 12.2 修改職工函式實作
      • 13. 查找職工
        • 13.1 查找職工函式宣告
        • 13.2 查找職工函式實作
      • 14. 排序
        • 14.1 排序函式宣告
      • 15. 清空檔案
        • 15.1 清空函式宣告
        • 15.2 清空函式實作
    • 五、C++提高編程
    • 六、基于STL泛化編程的演講比賽
    • 七、C++實戰專案機房預約管理系統
  • 學習產出:

學習內容:

一、C++基礎入門


二、通訊錄管理系統


三、C++核心編程

三、 C++核心編程(面向物件) 繼承


四、基于多型的企業職工系統

1. 管理系統需求

職工管理系統可以用來管理公司內所有員工的資訊

公司中職工分為三類:普通員工共、經理、老板,顯示資訊時,需要顯示職工編號、職工姓名、職工崗位,以及職責

普通員工職責:完成經理交給的任務

經理職責:完成老板交給的任務,并下發任務給員工

老板職責:管理公司所有事物

管理系統中需要實作的功能如下:

  • 退出管理程式:退出當前管理系統
  • 增加職工資訊:實作批量添加職工功能,將資訊錄入到檔案中,職工資訊為:職工編號、姓名、部門編號
  • 顯示職工資訊:顯示公司內部所有職工的資訊
  • 洗掉離職職工:按照編號洗掉指定的職工
  • 修改職工資訊:按照編號修改職工個人資訊
  • 查找職工資訊:按照職工的編號或者職工的姓名進行查找相關的人員資訊
  • 按照編號排序:按照職工編號,進行排序,排序規則由用戶指定
  • 清空所有檔案:清空檔案中記錄的所有員工資訊(清空前需要在此確認,防止誤刪)

3. 創建管理類

管理類負責的內容如下:

  • 與用戶的溝通選單界面
  • 對職工增刪改查的操作
  • 對檔案的讀寫互動

3.1 創建檔案

在頭檔案和源檔案的檔案夾下分別創建workerManager.h和workerManager.cpp檔案
在這里插入圖片描述

3.2 頭檔案實作

在workerManager.h中設計管理類

#pragma once
#include<iostream>
using namespace std;

class WorkerManager {
public:
	//定義 實作在cpp
	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;
}

5. 推出功能

5.1 提供功能介面

main()函式中提供分支選擇,提供每個功能介面

	int choice;
	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;
	}

5.2 實作退出功能

在workerManager.h中提供退出系統的成員函式void exitSystem();
在workerManager.cpp中提供功能實作

void WorkerManager::exitSystem() {
	cout << "歡迎下次使用" << endl;
	system("pause");
	//退出程式
	exit(0);
}

6. 創建職工類

6.1 創建職工抽象類

職工的分類為:普通員工、經理、老板

將三種職工抽象到一個類(worker)中,利用多型管理不同職工類

職工的屬性為:職工編號、職工姓名、職工所在部門編號

職工的行為為:崗位職責資訊描述,獲取崗位名稱

在頭檔案夾中創建worker.h

//職工抽象類
class Worker {
public:
	//顯示個人資訊
	virtual void showInfo() = 0;
	//獲取崗位名稱
	virtual void getDeptName() = 0;

	int m_Id;//職工編號
	string m_Name;//職工姓名
	int m_DeptId;//職工所在部門名稱編號
};

6.2 創建普通員工類

普通員工類繼承職工抽象類,并重寫父類中純虛函式
在頭檔案和源檔案夾中分別創建employee.h 和 employee.cpp檔案

#pragma once
#include<iostream>
using namespace std;
#include "woker.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檔案

#pragma once
#include <iostream>
#include "employee.h"
using namespace std;

class Manager :public Worker {
public:
	//建構式
	Manager(int id, string name, int dId);

	void showInfo();
	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檔案

class Boss :public Worker{
public:
	//建構式
	Boss(int id, string name, int dId);

	void showInfo();
	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 "總裁";
}

6.5 測驗多型

在職工管理系統.cpp中添加測驗函式,并且運行能夠產生多型

#include <iostream>
#include "boss.h"
#include "manager.h"
#include "employee.h"
using namespace std;

void test() {
	Worker* worker = nullptr;
	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 = nullptr;
}

在WorkerManager.h添加成員函式

//增加職工
void Add_Emp();

在WorkerManager.cpp中實作該函式

#include "workerManager.h"
#include "employee.h"
#include "manager.h"
#include "boss.h"

//添加職工
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;
			while (true) {
				cin >> id;
				int flag = 0;
				for (int i = 0; i < this->m_EmpNum; i++) {
					if (id == this->m_EmpArray[i]->m_Id) {
						cout << "Id已存在,請重新輸入" << endl;
						flag = 1;
						break;
					}
				}
				if (flag == 0)
					break;
			}
			cout << "請輸入第" << i + 1 << "個新職工的姓名: " << endl;
			cin >> name;
			cout << "請選擇的該職工的崗位: " << endl;
			cout << "1、普通職工" << endl;
			cout << "2、經理" << endl;
			cout << "3、老板" << endl;
			cin >> dSelect;

			Worker* worker = nullptr;
			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:
				cout << "輸入有誤:";
				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::~WorkerManager() {
	if (this->m_EmpArray != nullptr) {
		delete[] this->m_EmpArray;
		this->m_EmpArray = nullptr;
	}
}

8. 檔案互動 - 寫檔案

功能描述:對檔案進行讀寫

在上一個添加功能中,我們只是將所有的資料添加到了記憶體中,一旦程式結束就無法保存了

8.1 設定檔案路徑

首先我們將檔案的路徑,在workerManager.h中田間宏常量,并且包含頭檔案fstream

#include <fstream>
constexpr auto 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 保存檔案功能測驗

在添加職工功能中添加成功后添加保存檔案函式

		//提示添加成功
		cout << "成功添加" << addNum << "名新職工" << endl;
		//保存到檔案中
		this->save();

9. 檔案互動 - 讀檔案

功能描述:將檔案中的內容讀取到程式中

雖然我們實作了添加職工后保存到檔案的操作,但是每次開始運行程式,并沒有將檔案中資料讀取到程式中

而我們的程式功能中還有清空檔案的需求

因此建構式初始化資料的情況分為三種

  1. 第一次使用,檔案未創建
  2. 檔案存在,但是資料被用戶清空
  3. 檔案存在,并且保存職工的所有資料

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 = nullptr;//初始化陣列
		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 = nullptr;
		ifs.close();
		return;
	}
}

再在添加職工代碼塊中的 //更新新的職工人數之后添加更新不為空標志

		//更新新的職工人數
		this->m_EmpNum = newSize;

		//更新職工不為空標志
		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 = nullptr;
		//根據不同的部門ID創建不同物件
		if (dId == 1) {//1、普通員工
			worker = new Employee(id, name, dId);
		}
		else if (dId == 2) {//2、經理
			worker = new Manager(id, name, dId);
		}
		else if (dId == 3) {//3、Boss
			worker = new Manager(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 ShowEmp();

10.2 顯示職工函式實作

在WorkerManager.cpp中實作成員函式 void Show_Emp();


//顯示職工
void WorkerManager::ShowEmp() {
	if (this->m_FileIsEmpty) {
		cout << "檔案夾不存在或記錄為空" << endl;
	}
	else {
		for (int i = 0; i < m_EmpNum; i++) {
			//利用多型呼叫介面
			this->m_EmpArray[i]->showInfo();
		}
	}
	system("pause");
	system("cls");
}

11. 洗掉職工

功能描述:按照職工的編號進行洗掉職工操作

11.1 洗掉職工的函式宣告

在WorkerManager.h中添加成員函式 void Del_Emp();

//洗掉職工
void Del_Emp();

11.2 職工是否存在函式宣告

很多功能都需要用到根據職工是否存在來進行操作如:洗掉職工、修改職工、查找職工

因此添加該公告函式,以便后續呼叫

在Workermanager.h中添加成員函式 int IsExist(int id;

//按照職工編號判斷職工是否存在, 若存在回傳職工在陣列中位置,不存在回傳-1
int IsExit(int id);

11.3 職工是否存在函式實作

在WorkerMananger.cpp中實作成員函式 int IsExit(int id);


int WorkerManager::IsExit(int id)
{
	int index = -1;
	for (int i = 0; i < m_EmpNum; i++) {
		if (this->m_EmpArray[i]->m_Id == id) {
			index = i;
			break;
		}
	}
	return index;
}

11.4 洗掉職工函式實作

void WorkerManager::Del_Emp() {
	if (this->m_FileIsEmpty) {
		cout << "檔案不存在或記錄為空" << endl;
	}
	else {
		//按照職工的編號進行洗掉
		cout << "請輸入要洗掉的職工編號" << endl;
		int id = -1;
		cin >> id;
		int index = this->IsExit(id);
		if (index != -1) {//說明職工存在,并且要洗掉掉相關職工
			//資料前移
			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");
}

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->IsExit(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 = nullptr;
			switch (dSelect) {
			case 1:
				worker = new Employee(newId, newName, dSelect);
				break;
			case 2:
				worker = new Manager(newId, newName, dSelect);
				break;
			case 3:
				worker = new Boss(newId, newName, dSelect);
				break;
			default:
				cout << "輸入有誤" << endl;
				break;
			}

			//更新資料 到陣列中
			this->m_EmpArray[ret] = worker;
			cout << "修改成功!" << endl;
			//保存到檔案中
			this->save();
		}
		else {
			cout << "修改失敗,查無此人" << endl;
		}
	}

	system("pause");
	system("cls");
}

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 = IsExit(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;
					m_EmpArray[i]->showInfo();
					flag = true;
				}
			}
			if (flag == false) {
				cout << "查找失敗,查無此人" << endl;
			}
		}
		else {
			cout << "輸入選項有誤" << endl;
		}
	}

	system("pause");
	system("cls");
}

14. 排序

功能描述:按照職工編號進行排序,,排序功能由用戶指定

14.1 排序函式宣告

在WorkerManager.h中添加成員函式 void Sort_Emp();

//排序職工
void Sort_Emp();

在WorkerManager.cpp中實作成員函式void Sort_Emp();

void WorkerManager::Sort_Emp() {
	if (this->m_FileIsEmpty) {
		cout << "檔案不存在或記錄為空!" << endl;
		system("pause");
		system("cls");
	}
	else{
		cout << "1、按職工號進行升序" << endl;
		cout << "2、按職工號進行降序" << endl;
		int select;
		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->ShowEmp();
	}
}

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 != nullptr) {
			//釋放堆區陣列
			for (int i = 0; i < this->m_EmpNum; i++) {

				//物件存在先清楚物件
				if (this->m_EmpArray[i] != nullptr) {
					delete this->m_EmpArray[i];
				}
			}
			this->m_EmpNum = 0;
			//清楚陣列物件
			delete[] this->m_EmpArray;
			this->m_EmpArray = nullptr;
			this->m_FileIsEmpty = true;
		}
		cout << "清除成功" << endl;
	}
	system("pause");
	system("cls");
}

更新解構式

WorkerManager::~WorkerManager() {
	if (this->m_EmpArray != nullptr) {
		for(int i = 0; i < this->m_EmpNum; i++){
			if (this->m_EmpArray[i] != nullptr) {
				delete this->m_EmpArray[i];
			}
		}
		delete[] this->m_EmpArray;
	}
}

五、C++提高編程


六、基于STL泛化編程的演講比賽


七、C++實戰專案機房預約管理系統


學習產出:

1、github 啃STL簡化專案,能夠自己實作STL相關專案
2、做一個微信小程式,具體功能暫定

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/156261.html

標籤:其他

上一篇:女程式員在互聯網界到底有沒有被歧視?

下一篇:Codeforces 1110D Jongmah dp

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more