C++实例2--职工管理系统

职工管理系统

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++教程

posted @   Thomas_kaka  阅读(446)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· 地球OL攻略 —— 某应届生求职总结
点击右上角即可分享
微信分享提示