职工管理系统

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

最新文章

  1. WCF基础
  2. CSS高效开发实战:CSS 3、LESS、SASS、Bootstrap、Foundation --读书笔记(4)构造尺寸更灵活的背景
  3. 工作需求----表单select多选交互
  4. knockout源码分析之computed(依赖属性)
  5. AngularJS Providers 详解
  6. 看css发现一个pointer-events:none;的东西
  7. 【原】rsync的详细参数
  8. 纯JS焦点图特效(可一个页面多用)
  9. 200. Number of Islands
  10. JMX学习一
  11. ASP.NET MVC5 PagedList分页示例
  12. Android系统匿名共享内存Ashmem(Anonymous Shared Memory)在进程间共享的原理分析
  13. “jquery于each方法和选择”学习笔记
  14. C# 高效字符串连接 StringBuilder介绍
  15. Java语法基础(1)
  16. Adobe Photoshop CC 2019 for Mac v20.0.4 中文版安装教程
  17. 批处理for中字符串截取必须先把循环变量代替出来才行!!!
  18. Linq to SQL -- Insert、Update、Delete
  19. NAND Flash底层原理,SLC MLC TLC比较【转】
  20. Android GUI之View测量

热门文章

  1. python 函数基础知识
  2. 说说对 SQL 语句优化有哪些方法?
  3. js技术之根据name获取input的值
  4. 10本 Linux PDF 书籍免费分享
  5. 1. 了解Git和Github
  6. python学习笔记(七)——内置函数
  7. [译]HTML&amp;CSS Lesson5: 定位
  8. 浅析Node与Element
  9. java中为什么把Checked Exception翻译成受检的异常?
  10. java中接口和抽象类有什么区别,举例!