黑馬程序員 - 職工管理系統(tǒng)

本文章是本人黑馬程序員 C++| 匠心之作 從0到1入門學(xué)編程的學(xué)習(xí)筆記


前置文章:


1、管理系統(tǒng)需求

職工管理系統(tǒng)可以用來管理公司內(nèi)所有員工的信息

本教程主要利用C++來實現(xiàn)一個基于多態(tài)的職工管理系統(tǒng)

公司中職工分為三類:普通員工牍颈、經(jīng)理弓叛、老板槐雾,顯示信息時甫题,需要顯示職工編號符欠、職工姓名蛹批、職工崗位、以及職責(zé)

普通員工職責(zé):完成經(jīng)理交給的任務(wù)

經(jīng)理職責(zé):完成老板交給的任務(wù)荆陆,并下發(fā)任務(wù)給員工

老板職責(zé):管理公司所有事務(wù)

管理系統(tǒng)中需要實現(xiàn)的功能如下:

  • 退出管理程序:退出當(dāng)前管理系統(tǒng)
  • 增加職工信息:實現(xiàn)批量添加職工功能滩届,將信息錄入到文件中,職工信息為:職工編號慎宾、姓名丐吓、部門編號
  • 顯示職工信息:顯示公司內(nèi)部所有職工的信息
  • 刪除離職職工:按照編號刪除指定的職工
  • 修改職工信息:按照編號修改職工個人信息
  • 查找職工信息:按照職工的編號或者職工的姓名進(jìn)行查找相關(guān)的人員信息
  • 按照編號排序:按照職工編號,進(jìn)行排序趟据,排序規(guī)則由用戶指定
  • 清空所有文檔:清空文件中記錄的所有職工信息(清空前需要再次確認(rèn)券犁,防止誤刪)

2、創(chuàng)建項目

創(chuàng)建項目步驟如下

  • 創(chuàng)建新項目
  • 添加文件

3汹碱、創(chuàng)建管理類

管理類負(fù)責(zé)的內(nèi)容如下:

  • 與用戶的溝通菜單界面
  • 對職工增刪查改的操作
  • 與文件的讀寫交互

3.1 創(chuàng)建文件

創(chuàng)建workerManager.h頭文件和workerManager.cpp源文件

3.2 頭文件實現(xiàn)

workerManager.h中設(shè)計管理類

代碼如下:

//workerManager.h
#pragma once

#include <iostream>

using namespace std;

void clear();

void pause();

class WorkerManager {
  public:
  //構(gòu)造函數(shù)
  WorkerManager();

  //析構(gòu)函數(shù)
  ~WorkerManager();
};

3.3 源文件實現(xiàn)

workerManager.cpp中將構(gòu)造和析構(gòu)函數(shù)空實現(xiàn)補(bǔ)全

//workerManager.cpp
#include "workerManager.h"

void clear() { system("clear||cls"); }

void pause() { system("echo 請按任意鍵繼續(xù) . . . && ( read x 2> nul; rm nul || pause > nul )"); }

WorkerManager::WorkerManager() {

}

WorkerManager::~WorkerManager() {

}

4粘衬、菜單功能

功能描述:與用戶的溝通界面

4.1 添加成員函數(shù)

在管理類workerManager.h中添加成員函數(shù)void showMenu()

//workerManager.h
#pragma once

#include <iostream>

using namespace std;

class WorkerManager {
  public:
  //構(gòu)造函數(shù)
  WorkerManager();

  //顯示菜單
  void showMenu();

  //析構(gòu)函數(shù)
  ~WorkerManager();
};

4.2 菜單功能實現(xiàn)

在管理類workerManager.cpp中實現(xiàn)showMenu()函數(shù)

//workerManager.cpp
...  
void WorkerManager::showMenu() {
  cout << "************************" << endl;
  cout << "** 歡迎使用職工管理系統(tǒng)! **" << 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;
}
...

4.3 測試菜單功能

main.cpp中測試菜單功能

//main.cpp
#include <iostream>
#include "workerManager.h"

using namespace std;

int main() {
  WorkerManager vm;
  vm.showMenu();

  pause();
  return 0;
}  

5、退出功能

5.1 提供功能接口

main函數(shù)中提供分支選擇咳促,提供每個功能接口

//main.cpp
#include <iostream>
#include "workerManager.h"

using namespace std;

int main() {
  WorkerManager vm;
  int choice = -1;

  clear();
  while (choice != 0) {
    vm.showMenu();
    cout << "請輸入您的選擇(數(shù)字):" << endl;
    cin >> choice;

    switch (choice) {
      case 0:     //退出系統(tǒng)
        break;
      case 1:     //添加職工
        break;
      case 2:     //顯示職工
        break;
      case 3:     //刪除職工
        break;
      case 4:     //修改職工
        break;
      case 5:     //查找職工
        break;
      case 6:     //排序職工
        break;
      case 7:     //清空文件
        break;
      default:
        clear();
        break;
    }
  }

  pause();
  return 0;
}

5.2 實現(xiàn)退出功能

workerManager.h中提供退出系統(tǒng)的成員函數(shù)void exitSystem();

workManager.cpp中提供具體的功能實現(xiàn)

//workerManager.h
...
  //退出程序
  void exitSystem();
...
//workManager.cpp
...
void WorkerManager::exitSystem() {
  cout << "歡迎下次使用稚新!" << endl;
  pause();
  exit(0);
}
...

5.3 測試功能

main函數(shù)switch分支0選項中,調(diào)用退出程序的接口

//main.cpp
...
      case 0:     //退出系統(tǒng)
        wm.exitSystem();
        break;
...

6跪腹、創(chuàng)建職工類

6.1 創(chuàng)建職工抽象類

職工的分類為:普通員工褂删、經(jīng)理、老板

將三種職工抽象到一個類(worker)中冲茸,利用多態(tài)管理不同職工種類

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

職工的行為為:崗位職責(zé)信息描述轴术,獲取崗位名稱

頭文件文件夾下創(chuàng)建文件worker.h文件并且添加如下代碼:

//worker.h
#pragma once

#include <iostream>
#include <string>

using namespace std;

//職工抽象基類
class Worker {
  public:
  //顯示個人信息
  virtual void showInfo() = 0;

  //獲取崗位名稱
  virtual string getDepName() = 0;

  //崗位職責(zé)
  virtual string getResponsibility() = 0;

  //純虛析構(gòu)
  virtual ~Worker() = 0;

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

源文件下創(chuàng)建worker.cpp實現(xiàn)純虛析構(gòu):

//worker.cpp
#include "worker.h"

Worker::~Worker() {}

6.2 創(chuàng)建普通員工類

普通員工繼承職工抽象類难衰,并重寫父類中純虛函數(shù)

在頭文件和源文件的文件夾下分別創(chuàng)建employee.hemployee.cpp

employee.h中代碼如下:

//employee.h
#pragma once

#include <iostream>
#include "worker.h"

using namespace std;

//員工類
class Employee : public Worker {
public:
  //構(gòu)造函數(shù)
  Employee(int id, string name, int deptID);

  //顯示個人信息
  virtual void showInfo();

  //獲取崗位名稱
  virtual string getDepName();

  //獲取崗位職責(zé)
  virtual string getResponsibility();
};

employee.cpp中代碼如下:

//employee.cpp
#include "employee.h"

//構(gòu)造函數(shù)
Employee::Employee(int id, string name, int deptID) {
  this->m_ID = id;
  this->m_Name = name;
  this->m_DeptID = deptID;
}

//顯示個人信息
void Employee::showInfo() {
  cout << "職工編號:" << this->m_ID;
  cout << "\t職工姓名:" << this->m_Name;
  cout << "\t崗位:" << this->getDepName();
  cout << "\t崗位職責(zé):" << this->getResponsibility() << endl;
}

//獲取崗位名稱
string Employee::getDepName() {
  return string("員工");
}

//獲取崗位職責(zé)
string Employee::getResponsibility() {
  return string("完成經(jīng)理交代的任務(wù)");
}

6.3 創(chuàng)建經(jīng)理類

經(jīng)理類繼承職工抽象類,并重寫父類中純虛函數(shù)逗栽,和普通員工類似

在頭文件和源文件的文件夾下分別創(chuàng)建manager.hmanager.cpp

manager.h代碼如下

//manager.h
#pragma once

#include <iostream>
#include "worker.h"

using namespace std;

//員工類
class Employee : public Worker {
public:
  //構(gòu)造函數(shù)
  Employee(int id, string name, int deptID);

  //顯示個人信息
  virtual void showInfo();

  //獲取崗位名稱
  virtual string getDepName();

  //獲取崗位職責(zé)
  virtual string getResponsibility();
};

manager.cpp代碼如下

//manager.cpp
#include "manager.h"

//構(gòu)造函數(shù)
Manager::Manager(int id, string name, int deptID) {
  this->m_ID = id;
  this->m_Name = name;
  this->m_DeptID = deptID;
}

//顯示個人信息
void Manager::showInfo() {
  cout << "職工編號:" << this->m_ID;
  cout << "\t職工姓名:" << this->m_Name;
  cout << "\t崗位:" << this->getDepName();
  cout << "\t崗位職責(zé):" << this->getResponsibility() << endl;
}

//獲取崗位名稱
string Manager::getDepName() {
  return string("經(jīng)理");
}

//獲取崗位職責(zé)
string Manager::getResponsibility() {
  return string("完成老板交代的任務(wù)盖袭,并給普通員工下發(fā)任務(wù)");
}

6.4 創(chuàng)建老板類

老板類繼承職工抽象類,并重寫父類中純虛函數(shù)彼宠,和普通員工以及經(jīng)理類似

在頭文件和源文件的文件夾下分別創(chuàng)建boss.hboss.cpp

boss.h代碼如下

//boss.h
#pragma once

#include <iostream>
#include "worker.h"

using namespace std;

//經(jīng)理類
class Boss : public Worker {
  public:
  //構(gòu)造函數(shù)
  Boss(int id, string name, int deptID);

  //顯示個人信息
  virtual void showInfo();

  //獲取崗位名稱
  virtual string getDepName();

  //獲取崗位職責(zé)
  virtual string getResponsibility();
};

boss.cpp代碼如下

//boss.cpp
#include "boss.h"

//構(gòu)造函數(shù)
Boss::Boss(int id, string name, int deptID) {
  this->m_ID = id;
  this->m_Name = name;
  this->m_DeptID = deptID;
}

//顯示個人信息
void Boss::showInfo() {
  cout << "職工編號:" << this->m_ID;
  cout << "\t職工姓名:" << this->m_Name;
  cout << "\t崗位:" << this->getDepName();
  cout << "\t崗位職責(zé):" << this->getResponsibility() << endl;
}

//獲取崗位名稱
string Boss::getDepName() {
  return string("老板");
}

//獲取崗位職責(zé)
string Boss::getResponsibility() {
  return string("管理公司所有事物");
}

7鳄虱、添加職工

功能描述:批量添加職工,并保存到文本中

7.1 功能分析

用戶在批量創(chuàng)建時兵志,可能會創(chuàng)建不同種類的職工

如果想將所有不同種類的員工都放入到一個數(shù)組中醇蝴,可以將所有員工的指針維護(hù)到一個數(shù)組里

如果想在程序中維護(hù)這個不定長度的數(shù)組,可以將數(shù)組創(chuàng)建到堆區(qū)想罕,并利用Worker **的指針維護(hù)

7.2 功能實現(xiàn)

workerManager.h中添加成員屬性

//workerManager.h
...
#include "worker.h"
...
  //記錄文件中的人數(shù)個數(shù)
  int m_EmpNum;
    //員工數(shù)組的指針
    Worker **m_EmpArray;
};

workerManaer.cpp構(gòu)造函數(shù)中初始化屬性

//workerManager.cpp
...
  WorkerManager::WorkerManager() {
  //初始化人數(shù)
  this->m_EmpNum = 0;
  //初始化數(shù)組指針
  this->m_EmpArray = NULL;
}
...

workerManager.h中添加成員函數(shù)

//workerManager.h
...
#include "employee.h"
#include "manager.h"
#include "boss.h"
...
  //添加職工
  void addEmp();
...

workerManaer.cpp中實現(xiàn)該函數(shù)

//workerManager.cpp
...
  void WorkerManager::addEmp() {
  cout << "請輸入增加職工數(shù)量:" << endl;

  int addNum = 0;
  cin >> addNum;

  if (addNum > 0) {
    //計算新空間大小
    int newSize = this->m_EmpNum + addNum;

    //開辟新空間
    Worker **newSpace = new Worker *[newSize];

    //將原來空間下內(nèi)容存放到新空間下
    if (this->m_EmpArray != NULL) {
      for (int i = 0; i < this->m_EmpNum; i++) {
        newSpace[i] = this->m_EmpArray[i];
      }
    }

    //輸入新數(shù)據(jù)
    for (int i = 0; i < addNum; ++i) {
      int id;
      string name;
      int deptSelect;

      cout << "請輸入第" << i + 1 << "個新職工的編號" << endl;
      cin >> id;

      cout << "請輸入第" << i + 1 << "個新職工的姓名" << endl;
      cin >> name;

      cout << "請選擇該職工崗位(數(shù)字):\n\t1、普通職工\n\t2、經(jīng)理\n\t3按价、老板" << endl;
      cin >> deptSelect;

      Worker *worker = NULL;
      switch (deptSelect) {
        case 1: //普通員工
          worker = new Employee(id, name, 1);
          break;
        case 2: //經(jīng)理
          worker = new Employee(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;
    //更改新的個數(shù)
    this->m_EmpNum = newSize;
    //提示信息
    cout << "成功添加" << addNum << "名員工惭适!" << endl;
  } else {
    cout << "輸入有誤!" << endl;
  }

  pause();
  clear();
}

WorkerManager::~WorkerManager() {
  if (this->m_EmpArray != NULL) {
    delete[]this->m_EmpArray;
    this->m_EmpArray = NULL;
  }
}

5.3 測試功能

main函數(shù)switch分支1選項中楼镐,調(diào)用添加職工的接口

//main.cpp
...
      case 1:     //添加職工
        wm.addEmp();
        break;
...

8癞志、文件交互 - 寫文件

功能描述:對文件進(jìn)行讀寫

? 在上一個添加功能中,我們只是將所有的數(shù)據(jù)添加到了內(nèi)存中框产,一旦程序結(jié)束就無法保存了

? 因此文件管理類需要一個與文件進(jìn)行交互的功能凄杯,對文件進(jìn)行讀寫操作

8.1 設(shè)定文件路徑

首先我們將文件路徑,在workerManager.h中添加宏常量秉宿,并包含頭文件fstream

//workerManager.h
...
#include <fstream>
...
#define FILENAME "empFile.txt"

8.2 成員函數(shù)聲明

workerManager.h中類里添加成員函數(shù)void save();

//workerManager.h
...
  //保存文件
  void save();
...

8.3 保存文件功能實現(xiàn)

//workManager.cpp
...
  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 保存文件功能測試

在添加職工功能中添加成功后添加保存文件函數(shù)

//workManager.cpp
...
  void WorkerManager::addEmp() {
  ...
    //提示信息
    cout << "成功添加" << addNum << "名員工戒突!" << endl;
    //保存到文件中
    this->save();
  ...
...

9、文件交互 - 讀文件

功能描述:將文件中的內(nèi)容讀取到程序中

雖然我們實現(xiàn)了添加職工后保存到文件的操作描睦,但是每次開始運(yùn)行程序膊存,并沒有將文件中數(shù)據(jù)讀取到程序中

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

因此構(gòu)造函數(shù)初始化數(shù)據(jù)的情況分為三種:

  1. 第一次使用,文件未創(chuàng)建
  2. 文件存在忱叭,但是數(shù)據(jù)被用戶清空
  3. 文件存在隔崎,并且保存職工的所有數(shù)據(jù)

9.1 文件未創(chuàng)建

workerManager.h中添加新的成員屬性m_IsFileEmpty標(biāo)志文件是否為空

//workerManager.h
...
  bool m_IsFileEmpty;
};

修改workerManager.cpp中構(gòu)造函數(shù)代碼

//workerManager.cpp
...
WorkerManager::WorkerManager() {
  ifstream ifs;
  ifs.open(FILENAME, ios::in);
  //文件不存在情況
  if (!ifs.is_open()) {
//  cout << "文件不存在!" << endl;   //測試輸出
    this->m_EmpNum = 0;             //初始化人數(shù)
    this->m_IsFileEmpty = true;     //初始化 文件為空 標(biāo)簽
    this->m_EmpArray = NULL;        //初始化數(shù)組
    ifs.close();                    //關(guān)閉文件
    return;
  }
}
...

9.2 文件存在且數(shù)據(jù)為空

workerManager.cpp中追加代碼

//workerManager.cpp
...
  //文件存在韵丑,并且沒有記錄
  char ch;
    ifs >> ch;
    if (ifs.eof()) {
//  cout << "文件為空疙描!" << endl;    //測試輸出
    this->m_EmpNum = 0;             //初始化人數(shù)
    this->m_IsFileEmpty = true;     //初始化 文件為空 標(biāo)簽
    this->m_EmpArray = NULL;        //初始化數(shù)組
    ifs.close();                    //關(guān)閉文件
    return;
  }
}

將文件創(chuàng)建后清空文件內(nèi)容藏姐,并測試該情況下初始化功能

我們發(fā)現(xiàn)文件不存在或者為清空,m_IsFileEmpty都為true,那何時為false脉执?

成功添加職工后,應(yīng)該更改文件不為空的標(biāo)志

vodi workerManager::AddEmp()成員函數(shù)中添加:

//workerManager.cpp
...
  //更新職工不為空標(biāo)志
  this->m_IsFileEmpty = false;
...

9.3 文件存在且保存職工數(shù)據(jù)

9.3.1 獲取記錄的職工人數(shù)

workerManager.h中添加成員函數(shù)int getEmpNum();

//workerManager.h
...
  //統(tǒng)計人數(shù)
  int getEmpNum();
...

workerManager.cpp中實現(xiàn)

//workerManager.cpp
...
int WorkerManager::getEmpNum() {
  ifstream ifs;
  ifs.open(FILENAME, ios::in);

  int ID;
  string name;
  int deptID;

  int num = 0;

  while (ifs >> ID && ifs >> name && ifs >> deptID) {
    //記錄人數(shù)
    num++;
  }
  ifs.close();

  return num;
}
...

workerManager.cpp構(gòu)造函數(shù)中追加代碼

//workerManager.cpp
...
  //文件存在嫩痰,且保存職工數(shù)據(jù)
  int num = this->getEmpNum();
  //  cout << "職工個數(shù)為" << num << endl; //測試代碼
  this->m_EmpNum = num;              //更新成員屬性
}
...

9.3.2 初始化數(shù)組

根據(jù)職工的數(shù)數(shù)據(jù)以及職工數(shù)量睹限,初始化WorkerManager中的Worker **m_EmpArray

workerManager.h中添加成員函數(shù)void initEmp();

//`workerManager.h
...
    //初始化員工
  void initEmp();
...

workerManager.cpp中實現(xiàn)

//workerManager.cpp
...
  void WorkerManager::initEmp() {
  ifstream ifs;
  ifs.open(FILENAME, ios::in);

  int ID;
  string name;
  int deptID;

  int index = 0;

  while (ifs >> ID && ifs >> name && ifs >> deptID) {
    Worker *worker = NULL;
    //根據(jù)不同的部門ID創(chuàng)建不同的對象
    if (deptID == 0) {
      //普通員工
      worker = new Employee(ID, name, deptID);
    } else if (deptID == 1) {
      //經(jīng)理
      worker = new Manager(ID, name, deptID);
    } else {
      //老板
      worker = new Boss(ID, name, deptID);
    }
    //存放在數(shù)組中
    this->m_EmpArray[index] = worker;
    index++;
  }
  //關(guān)閉文件
  ifs.close();
}
...

workerManager.cpp構(gòu)造函數(shù)中追加代碼

//workerManager.cpp
...
  //開辟空間
  this->m_EmpArray = new Worker *[this->m_EmpNum];
  //將文件中的數(shù)據(jù)儲存到數(shù)組
  this->initEmp();

    /* 測試代碼
  for (int i = 0; i < this->m_EmpNum; ++i) {
    cout << "職工編號:" << this->m_EmpArray[i]->m_ID
             << "\t姓名:" << this->m_EmpArray[i]->m_Name
             << "\t部門編號:" << this->m_EmpArray[i]->m_DeptID << endl;
    } */
}
...

10、顯示職工

功能描述:顯示當(dāng)前所有職工信息

10.1 顯示職工函數(shù)聲明

workerManager.h中添加成員函數(shù)void showEmp();

//workerManager.h
...
  //顯示職工
  void showEmp();
...

10.2 顯示職工函數(shù)實現(xiàn)

workerManager.cpp中實現(xiàn)成員函數(shù)void workerManager::showEmp()

//workerManager.cpp
...
void WorkerManager::showEmp() {
  if (this->m_IsFileEmpty) { cout << "暫時沒有員工拾弃!" << endl; }
  else{
    for (int i = 0; i < this->m_EmpNum; ++i) {
      //利用多態(tài)調(diào)用接口
      this->m_EmpArray[i]->showInfo();
    }
  }

  pause();
  clear();
}
...

10.3 測試顯示職工

main函數(shù)switch分支2選項中值桩,調(diào)用顯示職工的接口

//main.cpp
...
      case 2:     //顯示職工
        wm.showEmp();
        break;
...

11、刪除職工

功能描述:按照職工的編號進(jìn)行刪除后職工的工作

11.1 刪除職工函數(shù)聲明

workerManager.h中添加成員函數(shù)void delEmp();

//workerManager.h
...
  //刪除職工
  void delEmp();
...

11.2 職工是否存在函數(shù)聲明

很多功能都需要用到根據(jù)職工是否存在來進(jìn)行操作豪椿,如:刪除員工奔坟、修改員工、查找員工

因此添加該公告函數(shù)搭盾,以便后續(xù)調(diào)用

workerManager.h中添加成員函數(shù)int isExi(int id)

//workerManager.h
...
  //按照職工編號判斷職工是否存在咳秉,若存在返回職工在數(shù)組中位置,不存在返回-1
  int isExist(int id);
...

11.3 職工是否存在函數(shù)實現(xiàn)

workerManager.cpp中實現(xiàn)成員函數(shù)int workerManager::isExist()

//workerManager.cpp
...
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 刪除職工函數(shù)實現(xiàn)

workerManager.cpp中實現(xiàn)成員函數(shù)void workerManager::delEmp()

//workerManager.cpp
...
void WorkerManager::delEmp() {
  if (this->m_IsFileEmpty) { cout << "暫時沒有員工鸯隅!" << endl; }
  else {
    //按照職工編號刪除
    cout << "請輸入想要刪除職工的編號:";
    int id = 0;
    cin >> id;

    int index = this->isExist(id);

    if (index != -1) {   //說明職工存在澜建,并且要刪除掉index位置上的職工
      //數(shù)據(jù)前移
      for (int i = index; i < this->m_EmpNum; i++) {
        this->m_EmpArray[i] = this->m_EmpArray[i + 1];
      }
      //更新數(shù)組中記錄的人員個數(shù)
      this->m_EmpNum--;
      //更新同步到文件中
      this->save();

      cout << "職工id " << id << " 刪除成功向挖!" << endl;
    } else { cout << "刪除失敗,未找到該員工炕舵!" << endl; }
  }
  pause();
  clear();
}
...

11.5 測試刪除職工

main函數(shù)switch分支3選項中何之,調(diào)用刪除職工的接口

//main.cpp
...
      case 3:     //刪除職工
        wm.delEmp();
        break;
...

12、 修改職工

功能描述:能夠按照職工的編號對職工信息進(jìn)行修改并保存

12.1修改職工函數(shù)聲明

workerManager.h中添加成員函數(shù)void modEmp();

//workerManager.h
...
  //修改職工
  void modEmp();
...

12.2 修改職工函數(shù)實現(xiàn)

workerManager.cpp中實現(xiàn)成員函數(shù)void modEmp()

//workerManager.cpp
...
void WorkerManager::modEmp() {
  if (this->m_IsFileEmpty) { cout << "暫時沒有員工咽筋!" << endl; }
  else {
    cout << "請輸入想要修改的職工編號:";
    int id;
    cin >> id;

    int ret = this->isExist(id);
    if (ret != -1) {
      //查找到職工的編號
      delete this->m_EmpArray[ret];

      int newID = 0;
      string newName = "";
      int newDeptSelect = 0;

      cout << "查找到職工編號為 " << id << " 的員工溶推,請輸入新的職工編號:";
      cin >> newID;

      cout << "請輸入姓名:";
      cin >> newName;

      cout << "請選擇該職工崗位(數(shù)字):\n\t1、普通職工\n\t2奸攻、經(jīng)理\n\t3蒜危、老板" << endl;
      cin >> newDeptSelect;

      Worker *worker = NULL;
      switch (newDeptSelect) {
        case 1: //普通員工
          worker = new Employee(newID, newName, 1);
          break;
        case 2: //經(jīng)理
          worker = new Employee(newID, newName, 2);
          break;
        case 3: //老板
          worker = new Boss(newID, newName, 3);
          break;
        default:
          break;
      }

      //更改數(shù)據(jù)到數(shù)組中
      this->m_EmpArray[ret] = worker;

      cout << "新員工 " << this->m_EmpArray[ret]->m_Name << " 修改成功!" << endl;

      //保存到文件中
      this->save();
    } else { cout << "刪除失敗睹耐,未找到該員工辐赞!" << endl; }
  }
  pause();
  clear();
}
...

12.3 測試修改職工

main函數(shù)switch分支4選項中,調(diào)用修改職工的接口

//main.cpp
...
      case 4:     //修改職工
        wm.modEmp();
        break;
...

13疏橄、 查找職工

功能描述:提供兩種查找職工方式占拍,一種按照職工編號,一種按照職工姓名

13.1 查找職工函數(shù)證明

workerManager.h中添加成員函數(shù)void findEmp();

//workerManager.h
...
  //查找職工
  void findEmp();
...

13.2 查找職工函數(shù)實現(xiàn)

workerManager.cpp中實現(xiàn)成員函數(shù)void findEmp()

//workerManager.cpp
...
void WorkerManager::findEmp() {
  if (this->m_IsFileEmpty) { cout << "暫時沒有員工捎迫!" << endl; }
  else {
    cout << "請輸入查找的方式:\n"
      << "1. 按職工編號查找\n"
      << "2. 站姓名查找" << endl;

    int select;
    cin >> select;

    if (select == 1) {          //按職工編號查找
      int id;
      cout << "請輸入想要查找的職工編號:" << endl;
      cin >> id;

      int ret = this->isExist(id);
      if (ret != -1) {
        clear();
        cout << "該職工信息如下:" << endl;
        this->m_EmpArray[ret]->showInfo();
      } else { cout << "查無此人晃酒!沒有編號為 " << id << " 的員工!" << endl; }
    } else if (select == 2) {   //按照姓名查找
      string name;
      cout << "請輸入想要查找的姓名:";
      cin >> name;

      bool isFound = false;      //找到的標(biāo)志
      for (int i = 0; i < m_EmpNum; i++) {
        if (this->m_EmpArray[i]->m_Name == name) {
          if (isFound == false) {
            isFound = true;
            clear();
          }
          this->m_EmpArray[i]->showInfo();
        }
      }
      if (isFound == false) {
        cout << "職工 " << name << " 查無此人窄绒!" << endl;
      }
    } else { cout << "輸入選項有誤贝次!" << endl; }
  }
  pause();
  clear();
}
...

13.3 測試查找職工

main函數(shù)switch分支5選項中,調(diào)用查找職工的接口

//main.cpp
...
      case 5:     //查找職工
        wm.findEmp();
        break;
...

14彰导、排序員工

功能描述:按照職工編號進(jìn)行排序蛔翅,排序的順序由用戶指定

14.1 查找職工函數(shù)證明

workerManager.h中添加成員函數(shù)void sortEmp();

//workerManager.h
...
  //排序職工
  void sortEmp();
...

14.2 排序職工函數(shù)實現(xiàn)

workerManager.cpp中實現(xiàn)成員函數(shù)void sortEmp()

//workerManager.cpp
...
void WorkerManager::sortEmp() {
  if (this->m_IsFileEmpty) {
    cout << "暫時沒有員工!" << endl;
    pause();
    clear();
  } else {
    cout << "請選擇排序方式:\n"
      << "1. 按照職工編號進(jìn)行升序\n"
      << "2. 按照職工編號進(jìn)行降序" << endl;

    int select = 0;
    cin >> select;

    for (int i = 0; i < m_EmpNum; i++) {
      int minOrMaxIndex = i;
      for (int j = i + 1; j < m_EmpNum; j++) {
        if (select == 1) {          //升序
          if (this->m_EmpArray[minOrMaxIndex]->m_ID > this->m_EmpArray[j]->m_ID) { minOrMaxIndex = j; }
        } else if (select == 2) {   //降序
          if (this->m_EmpArray[minOrMaxIndex]->m_ID < this->m_EmpArray[j]->m_ID) { minOrMaxIndex = j; }
        }
      }
      if (i != minOrMaxIndex) {
        Worker *temp = this->m_EmpArray[i];
        this->m_EmpArray[i] = this->m_EmpArray[minOrMaxIndex];
        this->m_EmpArray[minOrMaxIndex] = temp;
      }
    }
    this->save();
    cout << "排序成功位谋!新的結(jié)果為:" << endl;
    this->showEmp();
  }
}
...

14.3 測試排序職工

main函數(shù)switch分支6選項中山析,調(diào)用排序職工的接口

//main.cpp
...
      case 6:     //排序職工
        wm.sortEmp();
        break;
...

15、清空文件

功能描述:將文件中記錄數(shù)據(jù)清空

14.1 清空文件函數(shù)證明

workerManager.h中添加成員函數(shù)void clearFile();

//workerManager.h
...
  //清空文件
  void clearFile();
...

14.2 清空文件函數(shù)實現(xiàn)

workerManager.cpp中實現(xiàn)成員函數(shù)void clearFile()

//workerManager.cpp
...
void WorkerManager::clearFile() {
  cout << "是否確認(rèn)清空掏父?確認(rèn)操作后所有數(shù)據(jù)將會丟失笋轨!\n"
    << "1. 確認(rèn)\n"
    << "2. 取消" << endl;

  short selection = 0;
  cin >> selection;

  if (selection == 1) {
    //打開模式:ios::trunc   如果存在,刪除文件并重新創(chuàng)建
    ofstream ofs(FILENAME, ios::trunc);
    ofs.close();

    //維護(hù)指針
    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]; }
      }
      delete[] this->m_EmpArray;
      this->m_EmpArray = NULL;
      this->m_EmpNum = 0;
      this->m_IsFileEmpty = true;
    }
    cout << "職工數(shù)據(jù)清除成功赊淑!" << endl;
    pause();
  }
  clear();
}
...

修改workerManager.cpp中的析構(gòu)函數(shù)

//workerManager.cpp
...
  
...

15.3 測試清空文件

main函數(shù)switch分支7選項中爵政,調(diào)用清空文件的接口

//main.cpp
...
      case 7:     //清空文件
        wm.clearFile();
        break;
...
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市陶缺,隨后出現(xiàn)的幾起案子钾挟,更是在濱河造成了極大的恐慌,老刑警劉巖饱岸,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掺出,死亡現(xiàn)場離奇詭異徽千,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蛛砰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門罐栈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來黍衙,“玉大人泥畅,你說我怎么就攤上這事±欧” “怎么了位仁?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長方椎。 經(jīng)常有香客問我聂抢,道長,這世上最難降的妖魔是什么棠众? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任琳疏,我火速辦了婚禮,結(jié)果婚禮上闸拿,老公的妹妹穿的比我還像新娘空盼。我一直安慰自己,他們只是感情好新荤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布揽趾。 她就那樣靜靜地躺著,像睡著了一般苛骨。 火紅的嫁衣襯著肌膚如雪篱瞎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天痒芝,我揣著相機(jī)與錄音俐筋,去河邊找鬼。 笑死严衬,一個胖子當(dāng)著我的面吹牛澄者,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播瞳步,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼闷哆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了单起?” 一聲冷哼從身側(cè)響起抱怔,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嘀倒,沒想到半個月后屈留,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體局冰,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年灌危,在試婚紗的時候發(fā)現(xiàn)自己被綠了康二。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡勇蝙,死狀恐怖沫勿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情味混,我是刑警寧澤产雹,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站翁锡,受9級特大地震影響蔓挖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜馆衔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一瘟判、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧角溃,春花似錦拷获、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至邪财,卻和暖如春陕壹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背树埠。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工糠馆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人怎憋。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓又碌,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绊袋。 傳聞我的和親對象是個殘疾皇子毕匀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容