職工管理系統 1. 頭文件 1.1 workerManager.h 系統類 1 #pragma once // 防止頭文件重覆包含 2 #include<iostream> // 包含輸入輸出流頭文件 3 #include<fstream> // 文件讀寫頭文件 4 using namespace ...
職工管理系統
1. 頭文件
1.1 workerManager.h
系統類
1 #pragma once // 防止頭文件重覆包含 2 #include<iostream> // 包含輸入輸出流頭文件 3 #include<fstream> // 文件讀寫頭文件 4 using namespace std; // 使用標準命名空間 5 #include "worker.h" 6 #include "employee.h" 7 #include "manager.h" 8 #include "boss.h" 9 10 #define FILENAME "employee.txt" 11 12 class WorkerManager { 13 public: 14 15 // 構造函數 16 WorkerManager(); 17 18 // 展示菜單 19 void Show_Menu(); 20 21 // 退出系統 22 void exitSystem(); 23 24 // 記錄文件中人數的個數 25 int m_EmpNum; 26 27 // 員工數組的指針 28 Worker** m_EmpArray; 29 30 // 增加職工 31 void Add_Emp(); 32 33 // 保存文件 34 void save(); 35 36 // 標誌文件是否為空 37 bool m_FileIsEmpty; 38 39 // 統計人數 40 int get_EmpNum(); 41 42 // 初始化員工 43 void init_Emp(); 44 45 // 顯示職工 46 void Show_Emp(); 47 48 // 判斷職工是否存在(未刪除做準備) 49 int IsExit(int id); 50 51 // 刪除職工 52 void Del_Emp(); 53 54 // 修改職工 55 void Mod_Emp(); 56 57 // 查找職工 58 void Find_Emp(); 59 60 // 排序職工 61 void Sort_Emp(); 62 63 // 清空文件 64 void Clean_File(); 65 66 // 析構函數 67 ~WorkerManager(); 68 69 70 };
1.2 worker.h
員工基類(抽象類)
1 #pragma once 2 #include <iostream> 3 #include <string> 4 5 using namespace std; 6 7 // 職工抽象類 8 class Worker { 9 public: 10 11 // 顯示個人信息 12 virtual void showInfo() = 0; 13 14 // 獲取崗位信息 15 virtual string getDeptName() = 0; 16 17 int m_Id; // 職工編號 18 string m_Name; // 職工姓名 19 int m_DeptId; // 職工所在部門名稱編號 20 };
1.3 employee.h
員工類
1 #pragma once 2 #include <iostream> 3 #include <string> 4 using namespace std; 5 6 #include "worker.h" 7 8 // 員工類 9 class Employee : public Worker { 10 public: 11 // 構造函數 12 Employee(int id, string name, int dId); 13 14 // 顯示個人信息 15 virtual void showInfo(); 16 17 // 獲取職工崗位名稱 18 virtual string getDeptName(); 19 20 };
1.4 manager.h
經理類
1 #pragma once 2 #include <iostream> 3 #include <string> 4 using namespace std; 5 6 #include "worker.h" 7 8 // 經理類 9 class Manager: public Worker { 10 public: 11 // 構造函數 12 Manager(int id, string name, int dId); 13 14 // 顯示個人信息 15 virtual void showInfo(); 16 17 // 獲取職工崗位名稱 18 virtual string getDeptName(); 19 20 };
1.5 boss.h
老闆類
1 #pragma once 2 #include <iostream> 3 #include <string> 4 using namespace std; 5 6 #include "worker.h" 7 8 // 經理類 9 class Boss : public Worker { 10 public: 11 // 構造函數 12 Boss(int id, string name, int dId); 13 14 // 顯示個人信息 15 virtual void showInfo(); 16 17 // 獲取職工崗位名稱 18 virtual string getDeptName(); 19 20 };
2. 源文件
2.1 workerManager.cpp
系統類
1 #include "workerManager.h" 2 3 4 WorkerManager::WorkerManager() { 5 6 ifstream ifs; 7 ifs.open(FILENAME, ios::in); // 讀文件 8 9 // 1.文件不存在情況 10 if (!ifs.is_open()) { 11 cout << "文件不存在" << endl; // 測試輸出 12 this->m_EmpNum = 0; // 初始化人數 13 this->m_FileIsEmpty = true; // 初始化文件為空標誌 14 this->m_EmpArray = NULL; // 初始化數組指針 15 ifs.close(); // 關閉文件 16 return; 17 } 18 19 // 2.文件存在情況 20 char ch; 21 ifs >> ch; 22 if (ifs.eof()) { 23 cout << "文件為空" << endl; 24 this->m_EmpNum = 0; 25 this->m_FileIsEmpty = true; 26 this->m_EmpArray = NULL; 27 ifs.close(); 28 return; 29 } 30 31 // 3.文件存在,並且記錄數據 32 int num = this->get_EmpNum(); 33 //cout << "職工個數為:" << num << endl; // 測試代碼 34 this->m_EmpNum = num; // 更新成員屬性 35 36 // 根據職工數創建數組(開闢空間) 37 this->m_EmpArray = new Worker * [this->m_EmpNum]; 38 // 初始化職工(將文件中的數據,存放到數組中) 39 init_Emp(); 40 41 42 } 43 44 WorkerManager::~WorkerManager() { 45 if (this->m_EmpArray != NULL) { 46 delete[] this->m_EmpArray; 47 this->m_EmpArray = NULL; 48 } 49 } 50 51 // 展示菜單 52 void WorkerManager::Show_Menu() { 53 54 cout << "***************************************************" << endl; 55 cout << "************** 歡迎使用職工管理系統 *************" << endl; 56 cout << "***************** 0.退出管理系統 ****************" << endl; 57 cout << "***************** 1.增加職工信息 ****************" << endl; 58 cout << "***************** 2.顯示職工信息 ****************" << endl; 59 cout << "***************** 3.刪除離職職工 ****************" << endl; 60 cout << "***************** 4.修改離職職工 ****************" << endl; 61 cout << "***************** 5.查找職工信息 ****************" << endl; 62 cout << "***************** 6.按照編號排序 ****************" << endl; 63 cout << "***************** 7.清空所有文檔 ****************" << endl; 64 cout << "***************************************************" << endl; 65 cout << endl; 66 67 } 68 69 // 退出系統 70 void WorkerManager::exitSystem() 71 { 72 cout << "歡迎下次使用!" << endl; 73 system("pause"); 74 exit(0); // 退出系統 75 } 76 77 // 保存文件 78 void WorkerManager::save() { 79 ofstream ofs; 80 ofs.open(FILENAME, ios::out); 81 82 for (int i = 0; i < this->m_EmpNum; i++) { 83 84 ofs << this->m_EmpArray[i]->m_Id << " " 85 << this->m_EmpArray[i]->m_Name << " " 86 << this->m_EmpArray[i]->m_DeptId << endl; 87 } 88 89 ofs.close(); 90 91 } 92 93 // 增加職工 94 void WorkerManager::Add_Emp() { 95 cout << "請輸入增加職工的數量:" << endl; 96 int addNum = 0; 97 cin >> addNum; 98 99 if (addNum > 0) { 100 // 計算新空間大小 101 int newSize = this->m_EmpNum + addNum; // 新空間人數 = 原來記錄人數 + 新增人數 102 103 // 開闢新空間 104 Worker** newSpace = new Worker * [newSize]; 105 106 // 將原空間下的內容放到新空間下 107 if (this->m_EmpArray != NULL) { 108 for (int i = 0; i < this->m_EmpNum; i++) { 109 newSpace[i] = this->m_EmpArray[i]; 110 } 111 } 112 113 // 添加新數據 114 for (int i = 0; i < addNum; i++) { 115 int id; // 職工編號 116 string name; // 職工姓名 117 int dSelect; // 部門選擇 118 119 cout << "請輸入第" << i + 1 << "個新職工編號:" << endl; 120 cin >> id; 121 122 cout << "請輸入第" << i + 1 << "個新職工姓名:" << endl; 123 cin >> name; 124 125 cout << "請選擇該職工的崗位:" << endl; 126 cout << "1、普通員工" << endl; 127 cout << "2、經理" << endl; 128 cout << "3、老闆" << endl; 129 cin >> dSelect; 130 131 Worker* worker = NULL; 132 switch (dSelect) 133 { 134 case 1: // 普通員工 135 worker = new Employee(id, name, 1); 136 break; 137 case 2: // 經理 138 worker = new Manager(id, name, 2); 139 break; 140 case 3: // 老闆 141 worker = new Boss(id, name, 3); 142 break; 143 default: 144 break; 145 } 146 147 newSpace[this->m_EmpNum + i] = worker; 148 149 } 150 151 // 釋放原有空間 152 delete[] this->m_EmpArray; 153 154 // 更改新空間的指向 155 this->m_EmpArray = newSpace; 156 157 // 更新新的個數 158 this->m_EmpNum = newSize; 159 160 // 更新職工不為空標誌 161 this->m_FileIsEmpty = false; 162 163 // 提示信息 164 cout << "成功添加" << addNum << "名新職工!" << endl; 165 166 // 保存到文件中 167 this->save(); 168 169 } 170 else 171 { 172 cout << "輸入有誤!" << endl; 173 } 174 175 // 按任意鍵後,清屏,返回到上級目錄 176 system("pause"); 177 system("cls"); 178 179 } 180 181 // 獲取當前職工數量 182 int WorkerManager::get_EmpNum() { 183 ifstream ifs; 184 ifs.open(FILENAME, ios::in); 185 186 int id; 187 string name; 188 int dId; 189 190 int num = 0; 191 192 while (ifs >> id && ifs >> name && ifs >> dId) { 193 194 // 記錄人數 195 num++; 196 } 197 ifs.close(); 198 199 return num; 200 } 201 202 // 初始化員工 203 void WorkerManager::init_Emp() { 204 ifstream ifs; 205 ifs.open(FILENAME, ios::in); 206 207 int id; 208 string name; 209 int dId; 210 211 int index = 0; 212 while (ifs >> id && ifs >> name && ifs >> dId) 213 { 214 Worker* worker = NULL; 215 // 根據不同的部門ID創建不同對象 216 217 if (dId == 1) { // 1 普通員工 218 worker = new Employee(id, name, dId); 219 } 220 else if (dId == 2) { // 2 經理 221 worker = new Manager(id, name, dId); 222 } 223 else { // 3 老闆 224 worker = new Boss(id, name, dId); 225 } 226 227 // 存放在數組中 228 this->m_EmpArray[index] = worker; 229 index++; 230 } 231 232 // 關閉文件 233 ifs.close(); 234 } 235 236 // 顯示職工 237 void WorkerManager::Show_Emp() { 238 if (this->m_FileIsEmpty) { 239 cout << "文件不存在或記錄為空!" << endl; 240 } 241 else { 242 for (int i = 0; i < m_EmpNum; i++) { 243 // 利用多態調用介面 244 this->m_EmpArray[i]->showInfo(); 245 } 246 } 247 248 system("pause"); 249 system("cls"); 250 } 251 252 // 判斷職工是否存在 253 int WorkerManager::IsExit(int id) { 254 // 按照職工編號判斷職工是否存在 255 // 存在則返回職工在數組中的位置,不存在返回-1 256 int index = -1; 257 258 for (int i = 0; i < this->m_EmpNum; i++) { 259 if (this->m_EmpArray[i]->m_Id == id) { 260 index =