「C++實戰」職工管理系統

職場 發佈 2020-01-12T19:43:43+00:00

1、管理系統需求職工管理系統可以用來管理公司內所有員工的信息本教程主要利用C++來實現一個基於多態的職工管理系統公司中職工分為三類:普通員工、經理、老闆,顯示信息時,需要顯示職工編號、職工姓名、職工崗位、以及職責普通員工職責:完成經理交給的任務經理職責:完成老闆交給的任務,並下發

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、文件交互 - 讀文件

功能描述:將文件中的內容讀取到程序中

雖然我們實現了添加職工後保存到文件的操作,但是每次開始運行程序,並沒有將文件中數據讀取到程序中

而我們的程序功能中還有清空文件的需求

因此構造函數初始化數據的情況分為三種

  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 = 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 選項中,調用清空文件接口

測試:確認清空文件

再次查看文件中數據,記錄已為空

打開文件,裡面數據已確保清空,該功能需要慎用!

隨著清空文件功能實現,本案例製作完畢 ^ _ ^

關鍵字: