主頁 > 前端設計 > C++學習記錄 四、基于多型的企業職工系統

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

2020-10-05 04:22:38 前端設計

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

學習目標:

過一遍黑馬程式員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/qianduan/156388.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)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more