C++实例2--职工管理系统
阅读原文时间:2022年05月05日阅读:1

职工管理系统

1.  头文件

1.1 workerManager.h

  系统类

1 #pragma once // 防止头文件重复包含
2 #include // 包含输入输出流头文件
3 #include // 文件读写头文件
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
3 #include
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
3 #include
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
3 #include
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
3 #include
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
2 #include
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++教程

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章