主頁 >  其他 > C++學習記錄 四、基于多型的企業職工系統

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

2020-10-05 04:08:07 其他

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

學習目標:

過一遍黑馬程式員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/qita/156354.html

標籤:AI

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

下一篇: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)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more