1 C++職工管理系統
2 該專案實現 八個 功能
3 1-增加功能 2-顯示功能 3-刪除功能 4-修改功能
4 5-查詢功能 6-排序功能 7-清空功能 8-退出功能
5 實現多個功能使用了多個C++知識
增加功能:可以按著提示 增加員工的資訊 並儲存到初始化檔案中,增加資訊(數量 編號 姓名 崗位)
顯示功能:沒有存員工資訊 提示 沒有 有的話可以顯示出來
刪除功能:沒有 提供沒有的提示 如果有按著編號來刪除
修改功能:提供修改已有的職工編號 來修改職工資訊
查詢功能:2種查詢方法:按編號查詢 按姓名查詢 找到將資訊顯示 找不到提示資訊
排序功能:按職工的編號來升序 降序 排列
清空功能:將所有儲存的資訊清空
退出功能:退出整個程式

  1 EmployeeManagementSystem.cpp
2 /**
3 *專案名稱:基於多型的職工管理系統
4 *時 間:2021.08
5 *作 者:ByteZero!-zhenglei
6 */
7
8 #include<iostream>
9 #include "workerManger.h"
10 using namespace std;
11
12 #include "worker.h"
13 #include "employee.h"
14 #include"manager.h"
15 #include"boss.h"
16
17 int main()
18 {
19
20 ////測試程式碼
21 ////員工
22 //Worker* worker = NULL;
23 //worker = new Employee(1, "張三",1);
24 //worker->showInfo();
25 //delete worker;
26
27 ////經理
28 //worker = new Manager(2, "李四", 2);
29 //worker->showInfo();
30 //delete worker;
31
32 ////老闆
33 //worker = new Boss(3, "王五", 3);
34 //worker->showInfo();
35 //delete worker;
36
37
38 //例項化管理者的物件
39 WorkerManger wm;
40
41 int choice = 0; //用來儲存使用者的選項
42
43
44 while (true)
45 {
46
47 //呼叫展示選單的成員函式
48 wm.Show_Menu();
49
50 cout << "請輸入您的選擇: " << endl;
51 cin >> choice; //接收使用者的選項
52
53 //選擇選單
54 switch (choice)
55 {
56 case 0: //退出系統
57 wm.ExitSystem();
58 break;
59 case 1: //增加職工
60 wm.Add_Emp();
61 break;
62 case 2: //顯示職工
63 wm.Show_Emp();
64 break;
65 case 3: //刪除職工
66 //{
67 // //測試
68 // int ret = wm.IsExist(5);
69 // if (ret != -1)
70 // {
71 // cout << "職工存在" << endl;
72 // }
73 // else
74 // {
75 // cout << "職工不存在" << endl;
76 // }
77 // break;
78 //}
79 wm.Del_Emp();
80 break;
81 case 4: //修改職工
82 wm.Mod_Emp();
83 break;
84 case 5: //查詢職工
85 wm.Find_Emp();
86 break;
87 case 6: //排序職工
88 wm.Sort_Emp();
89 break;
90 case 7: //清空文件
91 wm.Clean_File();
92 break;
93 default:
94 system("cls"); //清屏操作
95 break;
96 }
97
98 }
99
100
101
102 system("pause");
103
104 return 0;
105
106 }
  1 workerManger.cpp
2 /**
3 *專案名稱:基於多型的職工管理系統
4 *時 間:2021.08
5 *作 者:ByteZero!-zhenglei
6 */
7 #include "workerManger.h"
8
9 //作用域下的建構函式(初始化)
10 WorkerManger::WorkerManger()
11 {
12 //1.檔案不存在
13 ifstream ifs;
14 ifs.open(FILENAME, ios::in); //讀檔案
15
16 if(!ifs.is_open())
17 {
18 cout << "檔案不存在!" << endl;
19
20 //初始化屬性
21 //初始化記錄人數
22 this->m_EmpNum = 0;
23 //初始化陣列指標
24 this->m_EmpArray = NULL;
25 //初始化檔案是否為空
26 this->m_FileIsEmpty = true;
27
28 ifs.close();
29 return;
30 }
31
32 //2.檔案存在 資料為空
33 char ch;
34 ifs >> ch;
35 if (ifs.eof())
36 {
37 //檔案為空
38 cout << "檔案為空!" << endl;
39 //初始化記錄人數
40 this->m_EmpNum = 0;
41 //初始化陣列指標
42 this->m_EmpArray = NULL;
43 //初始化檔案是否為空
44 this->m_FileIsEmpty = true;
45
46 ifs.close();
47 return;
48 }
49
50 //3.檔案存在 ,並且記錄資料
51 int num = this->get_EmpNum();
52 cout << "職工人數為: " << num << endl;
53 this->m_EmpNum = num;
54 //將檔案中的資料 存到陣列中
55 this->m_EmpArray = new Worker * [this->m_EmpNum];
56 this->init_Emp();
57
58
59 //測試程式碼
60 for (int i = 0; i < this->m_EmpNum; i++)
61 {
62 cout << "職工編號: " << this->m_EmpArray[i]->m_Id
63 << " 姓名: " << this->m_EmpArray[i]->m_Name
64 << " 部門編號: " << this->m_EmpArray[i]->m_DeptId << endl;
65 }
66
67 }
68
69 //展示選單
70 void WorkerManger::Show_Menu()
71 {
72 cout << "********************************************" << endl;
73 cout << "********** 歡迎使用職工管理系統 **********" << endl;
74 cout << "************* 0.退出管理系統 *************" << endl;
75 cout << "************* 1.增加職工資訊 *************" << endl;
76 cout << "************* 2.顯示職工資訊 *************" << endl;
77 cout << "************* 3.刪除離職職工 *************" << endl;
78 cout << "************* 4.修改職工資訊 *************" << endl;
79 cout << "************* 5.查詢職工資訊 *************" << endl;
80 cout << "************* 6.按照編號排序 *************" << endl;
81 cout << "************* 7.清空所有文件 *************" << endl;
82 cout << "********************************************" << endl;
83 cout << endl;
84
85
86 }
87
88
89 //退出系統
90 void WorkerManger::ExitSystem()
91 {
92 cout << "歡迎下次使用 See You ! " << endl;
93 system("pause");
94 exit(0); //退出程式
95 }
96
97
98 //新增職工
99 void WorkerManger:: Add_Emp()
100 {
101 cout << "請輸入新增職工的數量:" << endl;
102
103 int addNum = 0; //儲存使用者的輸入數量
104 cin >> addNum;
105
106
107 if (addNum > 0)
108 {
109 //新增
110 //計算新增空間大小
111 //新空間 = 原來記錄人數 + 新增人數
112 int newSize = this->m_EmpNum + addNum;
113
114 //開闢新空間
115 Worker** newSpace = new Worker * [newSize];
116
117
118 //將原來的空間下資料,拷貝到新空間下
119 if (this->m_EmpArray != NULL)
120 {
121 for (int i = 0; i < this->m_EmpNum; i++)
122 {
123 newSpace[i] = this->m_EmpArray[i];
124 }
125 }
126
127 //批量新增新資料
128 for (int i = 0; i < addNum; i++)
129 {
130 int id; //職工編號
131 string name; //職工姓名
132 int dSelect; //部門選擇
133
134 cout << "請輸入第 " << i + 1 << " 個新職工編號: " << endl;
135 cin >> id;
136 /*int ret= IsExist(id);
137 if (ret == -1)
138 {
139 cout << "新增成功!" << endl;
140 }
141 else
142 {
143 cout << "已有Id,新增失敗!!\n請重新新增:" << endl;
144 return;
145
146 }*/
147
148 cout << "請輸入第 " << i + 1 << " 個新職工姓名: " << endl;
149 cin >> name;
150
151 cout << "請選擇該職工崗位: " << endl;
152 cout << "1,普通職工" << endl;
153 cout << "2,經理" << endl;
154 cout << "3,老闆" << endl;
155 cin >> dSelect;
156
157 Worker* worker = NULL;
158 switch (dSelect)
159 {
160 case 1:
161 worker = new Employee(id, name, 1);
162 break;
163 case 2:
164 worker = new Manager(id, name, 2);
165 break;
166 case 3:
167 worker = new Boss(id, name, 3);
168 break;
169
170 default:
171 break;
172 }
173 //將建立職工指標 儲存到陣列中
174 newSpace[this->m_EmpNum + i] = worker;
175
176
177 }
178
179 //釋放原有的空間
180 delete[] this->m_EmpArray;
181
182 //更改新空間的指向
183 this->m_EmpArray = newSpace;
184
185 //更新新的職工人數
186 this->m_EmpNum = newSize;
187
188 //更新職工不為空標誌
189 this->m_FileIsEmpty = false;
190
191 //成功新增後 儲存檔案中
192
193 //提示新增成功
194 cout << "成功新增" << addNum << "名新職工!" << endl;
195
196 //儲存資料到檔案中
197 this->save();
198
199 }
200 else
201 {
202 cout << "輸入資料有誤" << endl;
203 }
204 //按任意鍵後 清屏 回到上級目錄
205 system("pause");
206 system("cls");
207 }
208
209 //儲存
210 void WorkerManger::save()
211 {
212 ofstream ofs;
213 //用輸出的方式開啟檔案 ----寫檔案
214 ofs.open(FILENAME, ios::out);
215
216 //將每個人的資料寫入到檔案中
217 for (int i = 0; i < this->m_EmpNum; i++)
218 {
219 ofs << this->m_EmpArray[i]->m_Id << " "
220 << this->m_EmpArray[i]->m_Name << " "
221 << this->m_EmpArray[i]->m_DeptId << endl;
222 }
223
224 //關閉檔案
225 ofs.close();
226
227
228
229 }
230
231 //統計檔案中人數
232 int WorkerManger:: get_EmpNum()
233 {
234 ifstream ifs;
235 ifs.open(FILENAME, ios::in); //開啟檔案 讀
236
237 int id;
238 string name;
239 int dId;
240 int num = 0;
241 while (ifs >> id && ifs >> name&& ifs >>dId)
242 {
243 //統計人數
244 num++;
245 }
246 return num;
247
248
249
250 }
251 //初始化員工
252 void WorkerManger::init_Emp()
253 {
254 ifstream ifs;
255 ifs.open(FILENAME, ios::in);
256
257 int id;
258 string name;
259 int dId;
260
261 int index = 0;
262
263 while (ifs >> id && ifs >> name && ifs >> dId)
264 {
265 Worker* worker = NULL;
266
267 if (dId == 1) ///普通職工
268 {
269 worker = new Employee(id, name, dId);
270 }
271 else if (dId == 2) //經理
272 {
273 worker = new Manager(id, name, dId);
274 }
275 else //老闆
276 {
277 worker = new Boss(id, name, dId);
278 }
279 this->m_EmpArray[index] = worker;
280 index++;
281 }
282
283
284 //關閉檔案
285 ifs.close();
286 }
287
288 //顯示職工
289 void WorkerManger::Show_Emp()
290 {
291 //判斷檔案是否為空
292 if (this->m_FileIsEmpty)
293 {
294 cout << "檔案不存在或者記錄為空!" << endl;
295 }
296 else
297 {
298 for (int i = 0; i < m_EmpNum; i++)
299 {
300 //利用多型呼叫程式介面
301 this->m_EmpArray[i]->showInfo();
302
303
304 }
305 }
306 //按任意鍵清屏
307 system("pause");
308 system("cls");
309 }
310
311 //刪除職工
312 void WorkerManger::Del_Emp()
313 {
314 if (this->m_FileIsEmpty)
315 {
316 cout << "檔案不存在或者記錄為空!" << endl;
317 }
318 else
319 {
320 //按照職工編號刪除
321 cout << "請輸入刪除的職工編號!: " << endl;
322 int id = 0;
323 cin >> id;
324
325 int index = this->IsExist(id);
326 if (index != -1) //說明職工存在,並且要刪掉index位置上的職工
327 {
328
329 for (int i = index; i < this->m_EmpNum - 1; i++)
330 {
331 //資料前移
332 this->m_EmpArray[i] = this->m_EmpArray[i + 1];
333
334 }
335
336 //更新陣列中記錄人員個數
337 this->m_EmpNum--;
338
339 //資料同步更新到檔案中
340 this->save();
341
342 cout << "刪除成功!" << endl;
343
344 }
345 else
346 {
347 cout << "刪除失敗,未找到該職工!" << endl;
348 }
349 }
350
351 //按任意鍵 清屏
352 system("pause");
353 system("cls");
354 }
355
356 //判斷職工是否存在 如果存在返回陣列中的位置 不存在返回-1
357 int WorkerManger::IsExist(int id)
358 {
359 int index = -1;
360 for (int i = 0; i < this->m_EmpNum; i++)
361 {
362 if (this->m_EmpArray[i]->m_Id == id)
363 {
364 //找到職工
365 index = i;
366
367 break;
368 }
369 }
370 return index;
371 }
372
373
374 //修改職工
375 void WorkerManger::Mod_Emp()
376 {
377 if (this->m_FileIsEmpty)
378 {
379 cout << "檔案不存在或記錄為空!" << endl;
380 }
381 else
382 {
383 cout << "請輸入修改職工的id編號:" << endl;
384
385 int id;
386 cin >> id;
387
388 int ret = this->IsExist(id);
389
390 if (ret != -1)
391 {
392 //查詢到編號的職工
393 delete this->m_EmpArray[ret];
394
395 int newId = 0;
396 string newName = "";
397 int dSelect = 0;
398
399 cout << "已經查到: " << id << "號職工,\n請輸入新職工號: " << endl;
400 cin >> newId;
401
402 cout << "請輸入新姓名: " << endl;
403 cin >> newName;
404
405 cout << "請輸入崗位:" << endl;
406 cout << "1,普通職工" << endl;
407 cout << "2,經理" << endl;
408 cout << "3,老闆" << endl;
409
410 cin >> dSelect;
411
412 Worker* worker = NULL;
413
414 switch (dSelect)
415 {
416 case 1:
417 worker = new Employee(newId, newName, dSelect);
418 break;
419 case 2:
420 worker = new Manager(newId, newName, dSelect);
421 break;
422 case 3:
423 worker = new Boss(newId, newName, dSelect);
424 break;
425
426
427 default:
428 break;
429 }
430 //更新資料 到陣列中
431 this->m_EmpArray[ret] = worker;
432
433 cout << "修改成功!" << endl;
434
435
436 //儲存到檔案中
437 this->save();
438
439 }
440 else
441 {
442 cout << "修改失敗,查無此人!!" << endl;
443 }
444 }
445
446 //按任意鍵繼續 清屏
447 system("pause");
448 system("cls");
449
450 }
451
452
453 //查詢職工
454 void WorkerManger::Find_Emp()
455 {
456 if (this->m_FileIsEmpty)
457 {
458 cout << "檔案不存在或者記錄為空!" << endl;
459 }
460 else
461 {
462 cout << "請輸入查詢的方式: " << endl;
463 cout << "1,按照職工的編號查詢 " << endl;
464 cout << "2,按照職工的姓名查詢 " << endl;
465
466 int select = 0;
467 cin >> select;
468
469 if (select == 1)
470 {
471 //按照編號查
472 int id;
473 cout << "請輸入查詢的職工編號: " << endl;
474 cin >> id;
475
476 int ret = IsExist(id);
477 if (ret != -1)
478 {
479 //找到了這個職工
480 cout << "查詢成功!\n該職工資訊如下: " << endl;
481 this->m_EmpArray[ret]->showInfo();
482 }
483 else
484 {
485 cout << "查詢失敗,查無此人!" << endl;
486 }
487
488
489
490 }
491 else if (select == 2)
492 {
493 //按照姓名查
494 string name;
495 cout << "請輸入查詢的姓名:" << endl;
496 cin >> name;
497
498 //加入判斷是否查到的標誌
499 bool flag = false; //預設未找到
500
501
502 for (int i = 0; i < m_EmpNum; i++)
503 {
504 if (this->m_EmpArray[i]->m_Name == name)
505 {
506 cout << "查詢工作,職工編號為: "
507 << this->m_EmpArray[i]->m_Id
508 << " 號\n職工資訊如下:" << endl;
509
510 flag = true;
511
512 //呼叫顯示資訊介面
513 this->m_EmpArray[i]->showInfo();
514 }
515 }
516 if (flag == false)
517 {
518 cout << "查詢失敗,查無此人!" << endl;
519 }
520
521 }
522 else
523 {
524 //輸入錯誤
525 cout << "輸入選項有誤,重新輸入!" << endl;
526 }
527 }
528
529 //按任意鍵清屏
530 system("pause");
531 system("cls");
532 }
533
534
535 //排序函式 升序或降序
536 void WorkerManger::Sort_Emp()
537 {
538 if (this->m_FileIsEmpty)
539 {
540 cout << "檔案不存在或記錄為空!" << endl;
541
542 system("pause");
543 system("cls");
544 }
545 else
546 {
547 cout << "請選擇排序方式:" << endl;
548 cout << "1,按照職工號進行升序!" << endl;
549 cout << "2,按照職工號進行降序!" << endl;
550
551
552 int select = 0;
553 cin >> select;
554 for (int i = 0; i < m_EmpNum; i++)
555 {
556 int minOrMax = i; //聲名 最小值 或 最大值下標
557 for (int j = i + 1; j < this->m_EmpNum; j++)
558 {
559 if (select == 1) //升序
560 {
561 if (this->m_EmpArray[minOrMax]->m_Id > this->m_EmpArray[j]->m_Id)
562 {
563 minOrMax = j;
564 }
565
566 }
567 else //降序
568 {
569 if (this->m_EmpArray[minOrMax]->m_Id < this->m_EmpArray[j]->m_Id)
570 {
571 minOrMax = j;
572 }
573 }
574
575 }
576 //判斷一開始認定的最小值 或 最大值 是不計算的最小值或最大值
577 //如果不是 交換資料
578 if (i != minOrMax)
579 {
580 Worker* temp = this->m_EmpArray[i];
581 this->m_EmpArray[i] = this->m_EmpArray[minOrMax];
582 this->m_EmpArray[minOrMax] = temp;
583 }
584 }
585 cout << "排序成功!排序後的結果為: " << endl;
586 this->save(); //排序後結果儲存到檔案中
587 this->Show_Emp(); //展示所有職工
588 }
589 }
590
591
592 //清空檔案
593 void WorkerManger::Clean_File()
594 {
595 cout << "確定清空嗎?" << endl;
596 cout << "1,確定" << endl;
597 cout << "2,返回" << endl;
598
599 int select = 0;
600 cin >> select;
601
602 if (select == 1)
603 {
604 //清空檔案
605 ofstream ofs(FILENAME, ios::trunc);//刪除檔案後重新弄建立
606 ofs.close();
607
608 if (this->m_EmpArray != NULL)
609 {
610 //刪除堆區的每個職工物件
611 for (int i = 0; i < this->m_EmpNum; i++)
612 {
613 delete this->m_EmpArray[i];
614 this->m_EmpArray[i] = NULL;
615 }
616
617 //刪除堆區陣列指標
618 delete[] this->m_EmpArray;
619 this->m_EmpArray = NULL;
620 this->m_EmpNum = 0;
621 this->m_FileIsEmpty = true;
622 }
623
624 cout << "清空成功!" << endl;
625 }
626 system("pause");
627 system("cls");
628
629
630
631 }
632
633
634 //作用域下的解構函式(清理的)
635 WorkerManger::~WorkerManger()
636 {
637 if (this->m_EmpArray != NULL)
638 {
639 for (int i =0;this->m_EmpArray[i]; i++)
640 {
641 if (this->m_EmpArray[i] != NULL)
642 {
643 delete this->m_EmpArray[i];
644 }
645 }
646 delete[] this->m_EmpArray;
647 this->m_EmpArray = NULL;
648 }
649 }
 1 manager.cpp
2 /**
3 *專案名稱:基於多型的職工管理系統
4 *時 間:2021.08
5 *作 者:ByteZero!-zhenglei
6 */
7 #include "manager.h"
8
9 //建構函式
10 Manager::Manager(int id, string name, int dId)
11 {
12 this->m_Id = id;
13 this->m_Name = name;
14 this->m_DeptId = dId;
15 }
16
17 //顯示個人資訊
18 void Manager:: showInfo()
19 {
20 cout << "職工編號: " << this->m_Id
21 << "\t職工的姓名: " << this->m_Name
22 << "\t崗位: " << this->getDeptName()
23 << "\t崗位職責:完成老闆交給的任務,並且給普通員工下發任務!" << endl;
24 }
25
26 //獲取崗位名稱
27 string Manager:: getDeptName()
28 {
29 return string("經理");
30 }
 1 employee.cpp
2 /**
3 *專案名稱:基於多型的職工管理系統
4 *時 間:2021.08
5 *作 者:ByteZero!-zhenglei
6 */
7 #include "employee.h"
8
9
10 //建構函式
11 Employee::Employee(int id, string name, int dId)
12 {
13 this->m_Id = id;
14 this->m_Name = name;
15 this->m_DeptId = dId;
16 }
17
18
19
20 //顯示個人資訊
21 void Employee::showInfo()
22 {
23 cout << "職工編號: " << this->m_Id
24 << "\t職工的姓名: " << this->m_Name
25 << "\t崗位: " << this->getDeptName()
26 << "\t崗位職責:完成經理交給的任務!" << endl;
27 }
28
29 //獲取崗位名稱
30 string Employee::getDeptName()
31 {
32 return string("員工");
33 }
booss.cpp
/**
*專案名稱:基於多型的職工管理系統
*時 間:2021.08
*作 者:ByteZero!-zhenglei
*/
#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("老闆");
}

1.新增員工功能

2.顯示功能

3.刪除功能

4.修改功能

5查詢

6.排序

新增5個員工

7.清空文件

//0退出