職工管理系統
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 = i; 261 break; 262 } 263 } 264 return index; 265 } 266 267 // 洗掉職工 268 void WorkerManager::Del_Emp() { 269 if (this->m_FileIsEmpty) { 270 cout << "檔案不存在或者記錄為空!" << endl; 271 } 272 else 273 { 274 // 按照職工編號洗掉 275 cout << "請輸入想要洗掉員工編號:" << endl; 276 int id = 0; 277 cin >> id; 278 279 int index = this->IsExit(id); 280 281 if (index != -1) { // 說明職工存在,并且要洗掉掉index位置上的職工 282 for (int i = 0; i < this->m_EmpNum - 1; i++) { 283 // 資料前移操作(覆寫洗掉) 284 this->m_EmpArray[i] = this->m_EmpArray[i + 1]; 285 } 286 this->m_EmpNum--; // 更新陣列中記錄的人員個數 287 288 // 資料同步更新到檔案中 289 this->save(); 290 cout << "洗掉成功!" << endl; 291 292 } 293 else 294 { 295 cout << "職工不存在,洗掉失敗!" << endl; 296 } 297 298 system("pause"); 299 system("cls"); 300 } 301 } 302 303 // 修改職工 304 void WorkerManager::Mod_Emp() { 305 if (this->m_FileIsEmpty) { 306 cout << "檔案不存在或記錄為空!" << endl; 307 } 308 else 309 { 310 cout << "請輸入修改職工的編號:" << endl; 311 int id; 312 cin >> id; 313 314 int ret = this->IsExit(id); 315 if (ret != -1) { 316 // 查找到編號職工 317 delete this->m_EmpArray[ret]; 318 319 int newId = 0; 320 string newName = ""; 321 int dSelect = 0; 322 323 cout << "查到:" << id << "號職工,請輸入信職工編號:" << endl; 324 cin >> newId; 325 326 cout << "請輸入新姓名:" << endl; 327 cin >> newName; 328 329 cout << "請選擇新崗位:" << endl; 330 cout << "1、普通員工" << endl; 331 cout << "2、經理" << endl; 332 cout << "3、老板" << endl; 333 cin >> dSelect; 334 335 Worker* worker = NULL; 336 switch (dSelect) 337 { 338 case 1: // 普通員工 339 worker = new Employee(newId, newName, dSelect); 340 break; 341 case 2: // 經理 342 worker = new Manager(newId, newName, dSelect); 343 break; 344 case 3: // 老板 345 worker = new Boss(newId, newName, dSelect); 346 break; 347 default: 348 break; 349 } 350 351 // 更改資料到陣列中 352 this->m_EmpArray[ret] = worker; 353 354 cout << "修改成功!" << this->m_EmpArray[ret]->m_DeptId << endl; 355 356 // 保存到檔案中 357 358 this->save(); 359 } 360 else 361 { 362 cout << "修改失敗,查無此人!" << endl; 363 } 364 } 365 system("pause"); 366 system("cls"); 367 } 368 369 // 查找職工 370 void WorkerManager::Find_Emp() { 371 if (this->m_FileIsEmpty) { 372 cout << "檔案不存在或記錄為空!" << endl; 373 } 374 else 375 { 376 cout << "請輸入查找的方式:" << endl; 377 cout << "1.按職工編號查找" << endl; 378 cout << "2.按職工姓名查找" << endl; 379 380 int select = 0; 381 cin >> select; 382 383 if (select == 1) { // 按職工編號查找 384 int id; 385 cout << "請輸入查找的職工編號:" << endl; 386 cin >> id; 387 388 int ret = IsExit(id); 389 if (ret != -1) { 390 cout << "查找成功!該職工資訊如下:" << endl; 391 this->m_EmpArray[ret]->showInfo(); 392 } 393 else { 394 cout << "查找失敗,查無此人!" << endl; 395 } 396 } 397 else if(select == 2) { // 按姓名查找 398 string name; 399 cout << "請輸入查找的姓名:" << endl; 400 cin >> name; 401 402 bool flag = false; // 查找到的標注 403 for (int i = 0; i < m_EmpNum; i++) { 404 if (m_EmpArray[i]->m_Name == name) { 405 cout << "查找成功,職工編號為:" 406 << m_EmpArray[i]->m_Id 407 << "號的資訊如下:" << endl; 408 409 flag = true; 410 411 this->m_EmpArray[i]->showInfo(); 412 } 413 } 414 if (flag == false) { 415 cout << "查找失敗,查無此人!" << endl; 416 } 417 } 418 else { 419 cout << "輸入選項有誤!" << endl; 420 } 421 } 422 system("pause"); 423 system("cls"); 424 } 425 426 // 職工排序 427 void WorkerManager::Sort_Emp() { 428 if (this->m_FileIsEmpty) { 429 cout << "檔案不存在或記錄為空!" << endl; 430 system("pause"); 431 system("cls"); 432 } 433 else { 434 cout << "請選擇排序方式:" << endl; 435 cout << "1.按照職工工號升序" << endl; 436 cout << "1.按照職工工號降序" << endl; 437 438 int select = 0; 439 cin >> select; 440 441 for (int i = 0; i < m_EmpNum; i++) { 442 int MinOrMax = i; 443 for (int j = i + 1; j < m_EmpNum; j++) { 444 if (select == 1) { // 升序 445 if (m_EmpArray[MinOrMax]->m_Id > m_EmpArray[j]->m_Id) { 446 MinOrMax = j; 447 } 448 } 449 else { // 降序 450 if (m_EmpArray[MinOrMax]->m_Id < m_EmpArray[j]->m_Id) { 451 MinOrMax = j; 452 } 453 } 454 } 455 456 if (i != MinOrMax) { 457 Worker* temp = m_EmpArray[i]; 458 m_EmpArray[i] = m_EmpArray[MinOrMax]; 459 m_EmpArray[MinOrMax] = temp; 460 } 461 } 462 cout << "排序成功,排序后的結果為:" << endl; 463 this->save(); 464 this->Show_Emp(); 465 } 466 } 467 468 // 情況檔案 469 void WorkerManager::Clean_File() { 470 cout << "確認情況?" << endl; 471 cout << "1.確認" << endl; 472 cout << "2.回傳" << endl; 473 474 int select = 0; 475 cin >> select; 476 477 if (select == 1) { 478 // 打開模式 ios::trunc 如果檔案存在,洗掉檔案,并重新加載 479 ofstream ofs(FILENAME, ios::trunc); 480 ofs.close(); 481 482 // 同時保證記憶體清空 483 if (this->m_EmpArray != NULL) { 484 for (int i = 0; i < this->m_EmpNum; i++) { 485 if (this->m_EmpArray[i] != NULL) { 486 delete this->m_EmpArray[i]; 487 } 488 } 489 this->m_EmpNum = 0; 490 delete[] this->m_EmpArray; 491 this->m_EmpArray = NULL; 492 this->m_FileIsEmpty = true; 493 } 494 cout << "清空成功!" << endl; 495 } 496 system("pause"); 497 system("cls"); 498 }
2.2 employee.cpp
員工類
1 #include "employee.h" 2 3 Employee::Employee(int id, string name, int dId) { 4 this->m_Id = id; 5 this->m_Name = name; 6 this->m_DeptId = dId; 7 } 8 9 void Employee::showInfo() { 10 cout << "職工編號:" << this->m_Id 11 << "\t職工姓名:" << this->m_Name 12 << "\t職工崗位:" << this->getDeptName() 13 << "\t崗位職責:完成經理交給的任務" << endl; 14 } 15 16 string Employee::getDeptName() { 17 return string("員工"); 18 }
2.3 manager.cpp
經理類
1 #include "manager.h" 2 3 Manager::Manager(int id, string name, int dId) { 4 this->m_Id = id; 5 this->m_Name = name; 6 this->m_DeptId = dId; 7 } 8 9 void Manager::showInfo() { 10 cout << "職工編號:" << this->m_Id 11 << "\t職工姓名:" << this->m_Name 12 << "\t職工崗位:" << this->getDeptName() 13 << "\t崗位職責:完成老板交給的任務,并下發任務給員工" << endl; 14 } 15 16 string Manager::getDeptName() { 17 return string("經理"); 18 }
2.4 Boss.cpp
老板類
1 #include "boss.h" 2 3 Boss::Boss(int id, string name, int dId) { 4 this->m_Id = id; 5 this->m_Name = name; 6 this->m_DeptId = dId; 7 } 8 9 void Boss::showInfo() { 10 cout << "職工編號:" << this->m_Id 11 << "\t職工姓名:" << this->m_Name 12 << "\t職工崗位:" << this->getDeptName() 13 << "\t崗位職責:管理公司所有事物" << endl; 14 } 15 16 string Boss::getDeptName() { 17 return string("老板"); 18 }
2.5 職工管理系統.cpp
主函式
1 #include<iostream> 2 #include<string> 3 4 #include "workerManager.h" 5 //#include "employee.h" 6 //#include "manager.h" 7 //#include "boss.h" 8 9 using namespace std; 10 11 // 職工管理系統 12 13 14 int main() { 15 16 WorkerManager wm; 17 18 int choice = 0; 19 20 while (true) 21 { 22 23 // 展示主選單 24 wm.Show_Menu(); 25 26 cout << "請輸入您的選擇:" << endl; 27 cin >> choice; 28 29 switch (choice) 30 { 31 case 0: // 退出系統 32 wm.exitSystem(); 33 break; 34 case 1: // 添加職工 35 wm.Add_Emp(); 36 break; 37 case 2: // 顯示職工 38 wm.Show_Emp(); 39 break; 40 case 3: // 洗掉職工 41 wm.Del_Emp(); 42 break; 43 case 4: // 修改職工 44 wm.Mod_Emp(); 45 break; 46 case 5: // 查找職工 47 wm.Find_Emp(); 48 break; 49 case 6: // 排序職工 50 wm.Sort_Emp(); 51 break; 52 case 7: // 清空檔案 53 wm.Clean_File(); 54 break; 55 default: 56 system("cls"); 57 break; 58 } 59 } 60 61 system("pause"); 62 63 return 0; 64 65 }
參考:《黑馬程式員》C++教程
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/469677.html
標籤:其他
上一篇:祖傳Python代碼,含淚發出
