2023.5.7 职工管理系统

发布时间 2023-05-07 20:48:04作者: 牟兆迪
 1 //boss.h
 2 #pragma once
 3 #include <iostream>
 4 using namespace std;
 5 #include "worker.h"
 6 class Boss :public Worker
 7 {
 8 public:
 9     //构造函数
10     Boss(int id, string name, int dId);
11     //显示个人信息
12     void showInfo();
13     //获取岗位名称
14     string getDeptName();
15 };
 1 //employee.h
 2 #pragma once
 3 #include <iostream>
 4 using namespace std;
 5 #include <string>
 6 #include "worker.h"
 7 class Employee :public Worker
 8 {
 9 public:
10     //构造函数
11     Employee(int id,string name,int dId);
12     //显示个人信息
13     void showInfo();
14     //获取岗位名称
15     string getDeptName();
16 };
 1 //manager.h
 2 #pragma once
 3 #include <iostream>
 4 using namespace std;
 5 #include "worker.h"
 6 class Manager :public Worker
 7 {
 8 public:
 9     //构造函数
10     Manager(int id, string name, int dId);
11     //显示个人信息
12     void showInfo();
13     //获取岗位名称
14     string getDeptName();
15 };
 1 //worker.h
 2 //worker是boss,manager,employee的父类
 3 #pragma once
 4 #include <iostream>
 5 using namespace std;
 6 #include <string>
 7 class Worker
 8 {
 9 public:
10     //显示个人信息
11     virtual void showInfo() = 0;
12     
13     //获取岗位名称
14     virtual string getDeptName() = 0;
15 
16     int m_ID;
17     string m_Name;
18     int m_DeptID;
19 };
 1 //workerManager.h
 2 #pragma once
 3 #include <iostream>
 4 #include "worker.h"
 5 #include "employee.h"
 6 #include "manager.h"
 7 #include "boss.h"
 8 #include <fstream>
 9 #define FILENAME "empFile.txt"
10 using namespace std;
11 class WorkerManager
12 {
13 public:
14     WorkerManager();
15     ~WorkerManager();
16     void show_Menu();//展示菜单
17     void ExitSystem();//退出系统
18     int m_EmpNum; //记录职工人数
19     Worker** m_EmpArray;//职工数组指针
20     void Add_Emp();//添加职工
21     void save();//保存文件
22     bool m_FileIsEmpty;//标志文件是否为空
23     int get_Empnum();//统计文件中的人数
24     void init_Emp();//初始化职工
25     void Show_Emp();//显示职工
26     void Del_Emp();//删除职工
27     int IsExist(int id);//判断职工是否存在
28     void Mod_Emp();//修改职工
29     void Find_Emp();
30     void Sort_Emp();
31     void Clean_File();
32 };
 1 //boss.cpp
 2 #include "boss.h"
 3 Boss::Boss(int id, string name, int dId)
 4 {
 5     this->m_ID = id;
 6     this->m_Name = name;
 7     this->m_DeptID = dId;
 8 }
 9 void Boss::showInfo()
10 {
11     cout << "职工编号:" << this->m_ID
12         << "\t职工姓名:" << this->m_Name
13         << "\t岗位:" << this->getDeptName()
14         << "\t岗位:管理公司所有事务" << endl;
15 }
16 string Boss::getDeptName()
17 {
18     return string("老板");
19 }
 1 //employee.cpp
 2 #include "employee.h"
 3 Employee::Employee(int id, string name, int dId)
 4 {
 5     this->m_ID = id;
 6     this->m_Name = name;
 7     this->m_DeptID = dId;
 8 }
 9 void Employee::showInfo()
10 {
11     cout << "职工编号:" << this->m_ID
12         << "\t职工姓名:" << this->m_Name
13         <<"\t岗位:" << this->getDeptName()
14         << "\t岗位:完成经理交给的任务"  << endl;
15 }
16 string Employee::getDeptName()
17 {
18     return string("员工");
19 }
 1 //manager.cpp
 2 #include "manager.h"
 3 Manager::Manager(int id, string name, int dId)
 4 {
 5     this->m_ID = id;
 6     this->m_Name = name;
 7     this->m_DeptID = dId;
 8 }
 9 void Manager::showInfo()
10 {
11     cout << "职工编号:" << this->m_ID
12         << "\t职工姓名:" << this->m_Name
13         <<"\t岗位:" << this->getDeptName()
14         << "\t岗位:完成老板交给的任务,下发任务给普通员工"  << endl;
15 }
16 string Manager::getDeptName()
17 {
18     return string("经理");
19 }
  1 //workerManager.cpp
  2 #include "workerManager.h"
  3 #include"worker.h"
  4 WorkerManager::WorkerManager()
  5 {
  6     ifstream ifs;
  7     ifs.open(FILENAME, ios::in);
  8     //文件不存在情况
  9     if (!ifs.is_open())
 10     {
 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     char ch;
 20     ifs >> ch;
 21     if (ifs.eof())
 22     {
 23         //文件为空
 24         cout << "文件为空" << endl;
 25         this->m_EmpNum = 0;
 26         this->m_FileIsEmpty = true;
 27         this->m_EmpArray = NULL;
 28         ifs.close();
 29         return;
 30     }
 31     //文件存在,并且记录数据
 32     int num = this->get_Empnum();
 33     cout << "职工人数为:" << num << endl;
 34     this->m_EmpNum = num;
 35     //根据职工数创建数组
 36     this->m_EmpArray = new Worker * [this->m_EmpNum];
 37     //初始化职工
 38     init_Emp();
 39 
 40     
 41 }
 42 //WorkerManager::~WorkerManager()
 43 //{
 44 //
 45 //}
 46 void WorkerManager::show_Menu()
 47 {
 48     cout << "*****************************" << endl;
 49     cout << "*****欢迎来到职工管理系统****" << endl;
 50     cout << "****** 0.退出管理程序 *******" << endl;
 51     cout << "****** 1.增加职工信息 *******" << endl;
 52     cout << "****** 2.显示职工信息 *******" << endl;
 53     cout << "****** 3.删除离职职工 *******" << endl;
 54     cout << "****** 4.修改职工信息 *******" << endl;
 55     cout << "****** 5.查找职工信息 *******" << endl;
 56     cout << "****** 6.按照编号排序 *******" << endl;
 57     cout << "****** 7.清空所有文档 *******" << endl;
 58     cout << "*****************************" << endl;
 59     cout << endl;
 60 }
 61 void WorkerManager::ExitSystem()
 62 {
 63     cout << "欢迎下次使用" << endl;
 64     system("pause");
 65     exit(0);//退出程序
 66 }
 67 void WorkerManager::Add_Emp()
 68 {
 69     cout << "请输入添加职工的数量:" << endl;
 70     int addNum = 0;
 71     cin >> addNum;
 72     if (addNum > 0)
 73     {
 74         //新空间的人数 = 原来记录人数+新增人数
 75         int newSize = this->m_EmpNum + addNum;
 76         Worker** newSpace = new Worker * [newSize];//开辟新空间
 77         
 78         //将原来空间下数据,拷贝到新空间下
 79         if (this->m_EmpArray != NULL)
 80         {
 81             for (int i = 0; i < this->m_EmpNum; i++)
 82             {
 83                 newSpace[i] = this->m_EmpArray[i];
 84             }
 85         }
 86         //批量添加新数据
 87         for (int i = 0; i < addNum; i++)
 88         {
 89             int id;
 90             string name;
 91             int dSelect;
 92             cout << "请输入第" << i + 1 << "个新职工编号" << endl;
 93             cin >> id;
 94             cout << "请输入第" << i + 1 << "个新职工姓名" << endl;
 95             cin >> name;
 96             cout << "请选择该职工岗位:" << endl;
 97             cout << "1、普通职工" << endl;
 98             cout << "2、经理" << endl;
 99             cout << "3、老板" << endl;
100             cin >> dSelect;
101 
102             Worker* worker = NULL;
103             switch (dSelect)
104             {
105             case 1:
106                 worker = new Employee(id, name, 1);
107                 break;
108             case 2:
109                 worker = new Manager(id, name, 2);
110                 break;
111             case 3:
112                 worker = new Boss(id, name, 3);
113                 break;
114             default:
115                 break;
116             }
117             //将创建的职工职责,保存到数组中
118             newSpace[this->m_EmpNum + i] = worker;
119         }
120             //释放原有空间
121              delete[] this->m_EmpArray;
122             //更改新空间的指向
123             this->m_EmpArray = newSpace;
124             //更新新的职工人数
125             this->m_EmpNum = newSize;
126             //更新职工不为空
127             this->m_FileIsEmpty = false;
128             
129             //显示添加成功
130             cout << "成功添加" << addNum << "名新职工" << endl;
131 
132             //添加成功后保存到文件中
133             this->save();
134     }
135     else
136     {
137         cout << "输入有误" << endl;
138     }
139     //按任意键清屏回到上一级目录
140     system("pause");
141     system("cls");
142 }
143 
144 WorkerManager::~WorkerManager()
145 {
146     if (this->m_EmpArray != NULL)
147     {
148         for (int i = 0; i < this->m_EmpNum; i++)
149         {
150             if (this->m_EmpArray[i] = NULL)
151             {
152                 delete this->m_EmpArray[i];
153             }
154         }
155         delete[] this->m_EmpArray;
156         this->m_EmpArray = NULL;
157     }
158 }
159 void WorkerManager::save()
160 {
161     ofstream ofs;
162     ofs.open(FILENAME, ios::out);
163     for (int i = 0; i < this->m_EmpNum; i++)
164     {
165         ofs << this->m_EmpArray[i]->m_ID << " "
166             << this->m_EmpArray[i]->m_Name << " "
167             << this->m_EmpArray[i]->m_DeptID << endl;
168     }
169     ofs.close();
170 }
171 int WorkerManager::get_Empnum()
172 {
173     ifstream ifs;
174     ifs.open(FILENAME, ios::in);
175     int id;
176     string name;
177     int dId;
178     int num = 0;
179     while (ifs >> id && ifs >> name && ifs >> dId)
180     {
181         num++;
182     }
183     ifs.close();
184     return  num;
185 }
186 void WorkerManager::init_Emp()
187 {
188     ifstream ifs;
189     ifs.open(FILENAME,ios::in);
190     int id;
191     string name;
192     int dId;
193     int index = 0;
194     while (ifs >> id && ifs >> name && ifs >> dId)
195     {
196         Worker* worker = NULL;
197         if (dId == 1)
198         {
199             worker = new Employee(id, name, dId);
200         }
201         else if (dId == 2)
202         {
203             worker = new Manager(id, name, dId);
204         }
205         else
206         {
207             worker = new Boss(id, name, dId);
208         }
209         //存放在数组中
210         this->m_EmpArray[index] = worker;
211         index++;
212     }
213 }
214 void WorkerManager::Show_Emp()
215 {
216     if (this->m_FileIsEmpty)
217     {
218         cout << "文件不存在或者记录为空" << endl;
219     }
220     else
221     {
222         for (int i = 0; i < m_EmpNum; i++)
223         {
224             this->m_EmpArray[i]->showInfo();
225         }
226     }
227     system("pause");
228     system("cls");
229 }
230 void WorkerManager::Del_Emp()
231 {
232     if (this->m_FileIsEmpty)
233     {
234         cout << "文件不存在或记录为空" << endl;
235     }
236     else
237     {
238         cout << "请输入想要删除职工编号:" << endl;
239         int id = 0;
240         cin >> id;
241         int index = this->IsExist(id);
242         if (index != -1)
243         {
244             for (int i = index; i < this->m_EmpNum - 1; i++)
245             {
246                 this->m_EmpArray[i] = this->m_EmpArray[i + 1];
247             }
248             this->m_EmpNum--; 
249             this->save();
250             cout << "删除成功" << endl;
251         }
252         else
253         {
254             cout << "删除失败,未找到该职工" << endl;
255         }
256     }
257     system("pause");
258     system("cls");
259 }
260 
261 int WorkerManager::IsExist(int id)
262 {
263     int index = -1;
264     for (int i = 0; i < this->m_EmpNum; i++)
265     {
266         if (this->m_EmpArray[i]->m_ID == id)
267         {
268             index = i;
269             break;
270         }
271     }
272     return index;
273 }
274 void WorkerManager::Mod_Emp()
275 {
276     if (this->m_FileIsEmpty)
277     {
278         cout << "文件不存在或记录为空" << endl;
279     }
280     else
281     {
282         cout << "请输入修改职工的编号:" << endl;
283         int id;
284         cin >> id;
285         int ret = this->IsExist(id);
286         if (ret != -1)
287         {
288             delete this->m_EmpArray[ret];
289             int newID = 0;
290             string newName = "";
291             int dSelect = 0;
292             cout << "查到:" << id << "号职工,请输入新职工号:" << endl;
293             cin >> newID;
294             cout << "请输入新姓名:" << endl;
295             cin >> newName;
296             cout << "请输入岗位:" << endl;
297             cout << "1、普通职工" << endl;
298             cout << "2、经理" << endl;
299             cout << "3、老板" << endl;
300             cin >> dSelect;
301 
302             Worker* worker = NULL;
303             switch (dSelect)
304             {
305             case 1:
306                 worker = new Employee(newID, newName, dSelect);
307                 break;
308             case 2:
309                 worker = new Manager(newID, newName, dSelect);
310                 break;
311             case 3:
312                 worker = new Boss(newID, newName, dSelect);
313                 break;
314             default:
315                 break;
316             }
317             this->m_EmpArray[ret] = worker;
318             cout << "修改成功!" << endl;
319             this->save();
320         }
321         else
322         {
323             cout << "修改失败,查无此人" << endl;
324         }
325     }
326     system("pause");
327     system("cls");
328 }
329 void WorkerManager::Find_Emp()
330 {
331     if (this->m_FileIsEmpty)
332     {
333         cout << "文件不存在或记录为空" << endl;
334     }
335     else
336     {
337         cout << "请输入查找的方式" << endl;
338         cout << "1、按照职工编号查找" << endl;
339         cout << "2、按照姓名查找" << endl;
340         int select = 0;
341         cin >> select;
342         if (select == 1)
343         {
344             int id;
345             cout << "请输入查找的职工号:" << endl;
346             cin >> id;
347             int ret = IsExist(id);
348             if (ret != -1)
349             {
350                 cout << "查找成功!职工信息如下:" << endl;
351                 this->m_EmpArray[ret]->showInfo();
352             }
353             else
354             {
355                 cout << "查找失败,查无此人" << endl;
356             }
357         }
358         else if (select == 2)
359         {
360             string name;
361             cout << "请输入查找的姓名:" << endl;
362             cin >> name;
363 
364             bool flag = false;
365             for (int i = 0; i < m_EmpNum; i++)
366             {
367                 if (m_EmpArray[i]->m_Name == name)
368                 {
369                     cout << "查找成功,职工编号为:"
370                         << m_EmpArray[i]->m_ID
371                         << "号的信息如下" << endl;
372                     flag = true;
373                     this->m_EmpArray[i]->showInfo();
374                 }
375             }
376             if (flag == false)
377             {
378                 cout << "查找失败,查无此人" << endl;
379             }
380         }
381     }
382     system("pause");
383     system("cls");
384 }
385 void WorkerManager::Sort_Emp()
386 {
387     if (this->m_FileIsEmpty)
388     {
389         cout << "文件不存在或记录为空" << endl;
390         system("pause");
391         system("cls");
392     }
393     else
394     {
395         cout << "请选择排序方式:" << endl;
396         cout << "1、按职工号升序" << endl;
397         cout << "2、按职工号降序" << endl;
398         int select = 0;
399         cin >> select;
400         for (int i = 0; i < m_EmpNum; i++)
401         {
402             int minOrmax = i;
403             for (int j = i + 1; j < m_EmpNum; j++)
404             {
405                 if (select == 1)
406                 {
407                     if (m_EmpArray[minOrmax]->m_ID < m_EmpArray[j]->m_ID)
408                     {
409                         minOrmax = j;
410                     }
411                 }
412                 else
413                 {
414                     if (m_EmpArray[minOrmax]->m_ID > m_EmpArray[j]->m_ID)
415                     {
416                         minOrmax = j;
417                     }
418                 }
419             }
420             if (i != minOrmax)
421             {
422                 Worker* temp = m_EmpArray[i];
423                 m_EmpArray[i] = m_EmpArray[minOrmax];
424                 m_EmpArray[minOrmax] = temp;
425             }
426         }
427         cout << "排序成功,排序后结果为:" << endl;
428         this->save();
429         this->Show_Emp();
430     }
431 }
432 
433 void WorkerManager::Clean_File()
434 {
435     cout << "确认清空?" << endl;
436     cout << "1、确认" << endl;
437     cout << "2、返回" << endl;
438     int select = 0;
439     cin >> select;
440     if (select == 1)
441     {
442         ofstream ofs(FILENAME, ios::trunc);//删除文件后重新创建
443         ofs.close();
444         if (this->m_EmpArray != NULL)
445         {
446             for (int i = 0; i < this->m_EmpNum; i++)
447             {
448                 if (this->m_EmpArray[i] != NULL)
449                 {
450                     delete this->m_EmpArray[i];
451                 }
452             }
453             this->m_EmpNum = 0;
454             delete[] this->m_EmpArray;
455             this->m_EmpArray = NULL;
456             this->m_FileIsEmpty = true;
457         }
458         cout << "清除成功" << endl;
459     }
460     system("pause");
461     system("cls");
462 }
 1 //职工管理系统.cpp
 2 #include<iostream>
 3 #include "WorkerManager.h"
 4 #include "worker.h"
 5 #include "employee.h"
 6 #include "manager.h"
 7 #include "boss.h"
 8 using namespace std;
 9 
10 int main()
11 {
12     ////测试代码
13     //Worker* worker = NULL;
14     //worker = new Employee(1, "张三", 1);
15     //worker->showInfo();
16     //delete worker;
17     //Manager* manager = NULL;
18     //manager = new Manager(1, "张三", 1);
19     //manager->showInfo();
20     //delete manager;
21     //Boss* boss = NULL;
22     //boss = new Boss(1, "张三", 1);
23     //boss->showInfo();
24     //delete boss;
25     //实例化管理者对象
26     WorkerManager wm;
27     int choice = 0;//用来存储用户的选项
28     while (true)
29     {
30         wm.show_Menu();
31         cout << "请输入您的选择:" << endl;
32         cin >> choice;
33         switch (choice)
34         {
35         case 0:  //退出系统
36             wm.ExitSystem();
37             break;
38         case 1:  //增加职工
39             wm.Add_Emp();
40             break;
41         case 2:  //显示职工
42             wm.Show_Emp();
43             break;
44         case 3:  //删除职工
45             wm.Del_Emp();
46             break;
47         case 4:  //修改职工
48             wm.Mod_Emp();
49             break;
50         case 5:  //查找职工
51             wm.Find_Emp();
52             break;
53         case 6:  //排序职工
54             wm.Sort_Emp();
55             break;
56         case 7:  //清空文档
57             wm.Clean_File();
58             break;
59         default:
60             system("cls");
61             break;
62         }
63     }
64     system("pause");
65     return 0;
66 }