• C++——基于多态的职工管理系统


    一个基于多态的C++项目,断断续续写了两三天。获得一些收获和大家分享。欢迎指正交流。

    一、包含功能

    *********  欢迎使用职工管理系统  *********
    ************  0.退出管理系统  ************
    ************  1.增加职工信息  ************
    ************  2.显示职工信息  ************
    ************  3.删除离职职工  ************
    ************  4.修改职工信息  ************
    ************  5.查找职工信息  ************
    ************  6.按照编号排序  ************
    ************  7.清空所有文档  ************
    ******************************************

    二、主要实现技术总结

    (一)多态

    职工类为接口,派生出老板类、经理类、员工类,分别实现不同的岗位名称和岗位职责的输出。

    (二)对象

    C++有一种万物皆可为对象的概念,整个程序就可以视作一个管理程序的对象,创建WorkerManager类,逐一实现:菜单展示、增加职工、显示职工、删除职工、修改职工、查找职工以及排序、清空等多种功能。

    (三)循环

    程序的交互过程均需要用到循环,在循环过程中处理交互的各种情况。例如:

    1、用户的主菜单选择以及返回主菜单。

    2、用户的输入不合法时,重新输入。

    3、用户完成工作后,返回上级或者返回主菜单。

    (四)文件读写

    通过文件读写实现数据的操作,写文件时先将职工数量写入第一行,方便后续操作

    三、作业总结

    根据程序的不同需求设置清晰的架构脉络,主线程序代码要足够健壮(没有bug),再逐一实现其他功能函数。将程序分割为多个模块再组合起来实现复杂的需求,是一个项目成功的必备条件,这也是C++的封装特性的体现。

    四、上代码

    main.cpp
    1. #include
    2. using namespace std;
    3. #include"workerManager.h"
    4. #include"Worker.h"
    5. int main(int argc, char const *argv[]) {
    6. //创建职工管理类对象
    7. workerManager WM;
    8. //定义用户选项
    9. int choice = -1;
    10. while (true) {
    11. WM.Show_Menu();
    12. cout << "请输入您的选择" << endl;
    13. cin >> choice;
    14. switch (choice) {
    15. case 0: //退出系统
    16. WM.Exit_System();
    17. break;
    18. case 1: //增加职工
    19. WM.Add_Worker();
    20. break;
    21. case 2: //显示职工
    22. WM.Show_Worker();
    23. break;
    24. case 3: //删除职工
    25. WM.Del_Worker();
    26. break;
    27. case 4: //修改职工
    28. WM.Mod_Worker();
    29. break;
    30. case 5: //查找职工
    31. WM.Search_Worker();
    32. break;
    33. case 6: //编号排序
    34. WM.Sort_ID();
    35. break;
    36. case 7: //清空文档
    37. WM.Clear_Worker();
    38. break;
    39. }
    40. system("pause");
    41. system("cls");
    42. }
    43. return 0;
    44. }
    Worker.h——职工类
    1. #pragma once
    2. #include
    3. using namespace std;
    4. #include
    5. #include //c++标准库,主要功能设置输出格式
    6. enum Post
    7. {
    8. BOSS,
    9. MANAGER,
    10. EMPLOYEE,
    11. POSTCOUNT
    12. };
    13. //职工类
    14. class Worker
    15. {
    16. public:
    17. int m_id; //职工编号
    18. string m_name; //职工姓名
    19. int m_post; //岗位编号
    20. //显示职工信息
    21. virtual void show_Info() = 0;
    22. //获得职工岗位
    23. virtual string get_Postname() = 0;
    24. };
    25. //老板类
    26. class Boss :public Worker {
    27. public:
    28. Boss(int id, string name, int post);
    29. void show_Info();
    30. string get_Postname();
    31. };
    32. //经理类
    33. class Manager :public Worker {
    34. public:
    35. Manager(int id, string name, int post);
    36. void show_Info();
    37. string get_Postname();
    38. };
    39. //普通员工类
    40. class Employee :public Worker {
    41. public:
    42. Employee(int id, string name, int post);
    43. void show_Info();
    44. string get_Postname();
    45. };
    Worker.cpp——职工类成员函数实现
    1. #include "Worker.h"
    2. Boss::Boss(int id, string name, int post)
    3. {
    4. m_id = id;
    5. m_name = name;
    6. m_post = post;
    7. }
    8. void Boss::show_Info()
    9. {
    10. //设置输出编号占两个字符宽度,空位用'0'填充,通过setiosflag(ios::left/right)可以调整靠左或者靠右
    11. cout << "序号:" << setw(2) << setfill('0') << m_id
    12. << "\t姓名:" << m_name
    13. << "\t岗位:" << get_Postname()
    14. << "\t岗位职责:负责公司全面工作,安排经理的工作" << endl;
    15. }
    16. string Boss::get_Postname()
    17. {
    18. return string("老板");
    19. }
    20. Manager::Manager(int id, string name, int post)
    21. {
    22. m_id = id;
    23. m_name = name;
    24. m_post = post;
    25. }
    26. void Manager::show_Info()
    27. {
    28. cout << "序号:" << setw(2) << setfill('0') << m_id
    29. << "\t姓名:" << m_name
    30. << "\t岗位:" << get_Postname()
    31. << "\t岗位职责:完成老板交办任务,安排员工的工作" << endl;
    32. }
    33. string Manager::get_Postname()
    34. {
    35. return string("经理");
    36. }
    37. Employee::Employee(int id, string name, int post)
    38. {
    39. m_id = id;
    40. m_name = name;
    41. m_post = post;
    42. }
    43. void Employee::show_Info()
    44. {
    45. cout << "序号:" << setw(2) << setfill('0') << m_id
    46. << "\t姓名:" << m_name
    47. << "\t岗位:" << get_Postname()
    48. << "\t岗位职责:完成经理交办任务" << endl;
    49. }
    50. string Employee::get_Postname()
    51. {
    52. return string("员工");
    53. }
    workerManager.h——管理类
    1. #pragma once //防止头文件重复包含
    2. #include //包含输入输出流头文件
    3. using namespace std;//使用标准命名空间
    4. #include"Worker.h"
    5. #define FILENAME "Worker.txt"
    6. //职工管理类
    7. class workerManager
    8. {
    9. public:
    10. //职工指针数组
    11. Worker** ptr_Worker_array;
    12. //职工人数
    13. int m_count;
    14. //文件为空标志
    15. bool m_EmptyFile;
    16. //构造函数
    17. workerManager();
    18. //展示菜单函数
    19. void Show_Menu();
    20. //退出系统
    21. void Exit_System();
    22. //增加职工
    23. void Add_Worker();
    24. //显示职工
    25. void Show_Worker();
    26. //删除职工
    27. void Del_Worker();
    28. //修改职工
    29. void Mod_Worker();
    30. //查找职工
    31. void Search_Worker();
    32. //获得文件中人数
    33. int get_count();
    34. //保存数据到文件中
    35. int save();
    36. //查找编号,返回下标
    37. void Search_ID();
    38. //查找姓名,返回相同姓名职工的个数
    39. void Search_Name();
    40. //按照编号排序
    41. void Sort_ID();
    42. //清空文件
    43. void Clear_Worker();
    44. ~workerManager();
    45. };
    workerManager.cpp——管理类各种功能实现
    1. #include "workerManager.h"
    2. #include
    3. //workerManager构造函数
    4. workerManager::workerManager() {
    5. ifstream ifs;
    6. ifs.open(FILENAME, ios::in);
    7. //1、无文件
    8. if (!ifs.is_open()) {
    9. cout << "文件不存在" << endl;
    10. m_EmptyFile = true;
    11. m_count = 0;
    12. ptr_Worker_array = NULL;
    13. }
    14. else {
    15. //读取职工数量
    16. ifs >> m_count;
    17. //2、空文件
    18. if (!m_count) {
    19. cout << "文件为空" << endl;
    20. m_EmptyFile = true;
    21. m_count = 0;
    22. ptr_Worker_array = NULL;
    23. }
    24. //3、存在数据
    25. else {
    26. m_EmptyFile = false;
    27. ptr_Worker_array = new Worker*[m_count];
    28. Worker* newWorker = NULL;
    29. int id = 0, num = 0, IDnum = 0;
    30. string name;
    31. int post = -1;
    32. while (ifs >> id && ifs >> name && ifs >> post) {
    33. switch (post) {
    34. case BOSS:newWorker = new Boss(id, name, post);
    35. break;
    36. case MANAGER:newWorker = new Manager(id, name, post);
    37. break;
    38. case EMPLOYEE:newWorker = new Employee(id, name, post);
    39. break;
    40. }
    41. ptr_Worker_array[num++] = newWorker;
    42. }
    43. }
    44. ifs.close();
    45. }
    46. }
    47. //显示主界面
    48. void workerManager::Show_Menu()
    49. {
    50. cout << "******************************************" << endl;
    51. cout << "********* 欢迎使用职工管理系统 *********" << endl;
    52. cout << "************ 0.退出管理系统 ************" << endl;
    53. cout << "************ 1.增加职工信息 ************" << endl;
    54. cout << "************ 2.显示职工信息 ************" << endl;
    55. cout << "************ 3.删除离职职工 ************" << endl;
    56. cout << "************ 4.修改职工信息 ************" << endl;
    57. cout << "************ 5.查找职工信息 ************" << endl;
    58. cout << "************ 6.按照编号排序 ************" << endl;
    59. cout << "************ 7.清空所有文档 ************" << endl;
    60. cout << "******************************************" << endl;
    61. cout << endl;
    62. }
    63. //退出系统
    64. void workerManager::Exit_System()
    65. {
    66. if (this->save()) {
    67. cout << "信息保存成功,欢迎下次使用" << endl;
    68. system("pause");
    69. exit(0);
    70. }
    71. else {
    72. cout << "信息保存失败,请重新保存" << endl;
    73. }
    74. }
    75. //添加职工
    76. void workerManager::Add_Worker()
    77. {
    78. int newWorker = 0;
    79. cout << "请输入添加职工数量:" << endl;
    80. cin >> newWorker;
    81. Worker** ptr = new Worker*[m_count + newWorker];
    82. if (m_count) {
    83. for (int i = 0; i < m_count; i++) {
    84. ptr[i] = ptr_Worker_array[i];
    85. }
    86. delete ptr_Worker_array;
    87. }
    88. ptr_Worker_array = ptr;
    89. int id = -1;
    90. string name;
    91. int post = -1;
    92. Worker *worker = NULL;
    93. for (int i = 0; i < newWorker; i++) {
    94. cout << "请输入第" << i + 1 << "个职工的编号(输入0返回上级):" << endl;
    95. cin >> id;
    96. while (true) {
    97. if (id < 0) {
    98. cout << "输入不合法,请重新输入:" << endl;
    99. }
    100. else if (id == 0) {
    101. return;
    102. }
    103. else {
    104. int j = 0;
    105. for (j = 0; j < m_count; j++) {
    106. if (id == ptr_Worker_array[j]->m_id) {
    107. cout << "编号已被占用,请重新输入:" << endl;
    108. cin >> id;
    109. break;
    110. }
    111. }
    112. if (j == m_count) {
    113. break;
    114. }
    115. }
    116. }
    117. cout << "请输入第" << i + 1 << "个职工的姓名:" << endl;
    118. cin >> name;
    119. cout << "请选择该职工岗位:" << endl;
    120. cout << "1.老板" << endl;
    121. cout << "2.经理" << endl;
    122. cout << "3.员工" << endl;
    123. cin >> post;
    124. switch (post - 1) {
    125. case BOSS:
    126. worker = new Boss(id, name, BOSS);
    127. break;
    128. case MANAGER:
    129. worker = new Manager(id, name, MANAGER);
    130. break;
    131. case EMPLOYEE:
    132. worker = new Employee(id, name, EMPLOYEE);
    133. break;
    134. }
    135. ptr_Worker_array[m_count] = worker;
    136. m_count++;
    137. }
    138. if (this->save()) {
    139. cout << "成功添加 " << newWorker << " 名职工信息" << endl;
    140. m_EmptyFile = false;
    141. }
    142. }
    143. //显示职工
    144. void workerManager::Show_Worker()
    145. {
    146. if (m_count && !m_EmptyFile) {
    147. for (int i = 0; i < m_count; i++) {
    148. ptr_Worker_array[i]->show_Info();
    149. }
    150. }
    151. }
    152. //删除职工
    153. void workerManager::Del_Worker()
    154. {
    155. if (m_EmptyFile) {
    156. cout << "文件不存在" << endl;
    157. }
    158. else if (m_count == 0) {
    159. cout << "文件为空" << endl;
    160. }
    161. else {
    162. cout << "请输入要删除的职工编号(输入0返回上级):" << endl;
    163. int id = 0, i = 0;
    164. cin >> id;
    165. while (id != ptr_Worker_array[i]->m_id) {
    166. if (id < 0) {
    167. cout << "输入不合法,请重新输入:" << endl;
    168. cin >> id;
    169. }
    170. else if (id == 0) {
    171. return;
    172. }
    173. else {
    174. for (i = 0; i < m_count; i++) {
    175. if (id == ptr_Worker_array[i]->m_id) {
    176. break;
    177. }
    178. }
    179. if (i == m_count) {
    180. cout << "查无此人,请重新输入:" << endl;
    181. cin >> id;
    182. i = 0;
    183. }
    184. }
    185. }
    186. delete ptr_Worker_array[i];
    187. ptr_Worker_array[i] = NULL;
    188. for (; i < m_count - 1; i++) {
    189. ptr_Worker_array[i] = ptr_Worker_array[i + 1];
    190. }
    191. m_count--;
    192. if (m_count == 0) m_EmptyFile = true;
    193. if (this->save()) {
    194. cout << "删除成功" << endl;
    195. }
    196. }
    197. }
    198. //修改职工
    199. void workerManager::Mod_Worker()
    200. {
    201. if (m_EmptyFile) {
    202. cout << "文件不存在" << endl;
    203. }
    204. else if (m_count == 0) {
    205. cout << "文件为空" << endl;
    206. }
    207. else {
    208. cout << "请输入要修改的职工编号(输入0返回上级):" << endl;
    209. int id = 0, i = 0;
    210. cin >> id;
    211. while (id != ptr_Worker_array[i]->m_id) {
    212. if (id < 0) {
    213. cout << "输入不合法,请重新输入:" << endl;
    214. cin >> id;
    215. }
    216. else if (id == 0) {
    217. return;
    218. }
    219. else {
    220. for (i = 0; i < m_count; i++) {
    221. if (id == ptr_Worker_array[i]->m_id) {
    222. break;
    223. }
    224. }
    225. if (i == m_count) {
    226. cout << "查无此人,请重新输入:" << endl;
    227. cin >> id;
    228. i = 0;
    229. }
    230. }
    231. }
    232. int newID = 0;
    233. string newName;
    234. int newPost = -1;
    235. cout << "请输入新编号:" << endl;
    236. cin >> newID;
    237. while (true) {
    238. if (newID <= 0) {
    239. cout << "输入不合法,请重新输入:" << endl;
    240. cin >> newID;
    241. }
    242. else {
    243. int j = 0;
    244. for (j = 0; j < m_count; j++) {
    245. if (newID == ptr_Worker_array[j]->m_id&&i != j) {
    246. cout << "编号已被占用,请重新输入:" << endl;
    247. cin >> newID;
    248. break;
    249. }
    250. }
    251. if (j == m_count) {
    252. break;
    253. }
    254. }
    255. }
    256. cout << "请输入新姓名:" << endl;
    257. cin >> newName;
    258. cout << "请选择职工岗位:" << endl;
    259. cout << "1.老板" << endl;
    260. cout << "2.经理" << endl;
    261. cout << "3.员工" << endl;
    262. cin >> newPost;
    263. delete ptr_Worker_array[i];
    264. ptr_Worker_array[i] = NULL;
    265. switch (newPost - 1) {
    266. case BOSS:ptr_Worker_array[i] = new Boss(newID, newName, BOSS);
    267. break;
    268. case MANAGER:ptr_Worker_array[i] = new Manager(newID, newName, MANAGER);
    269. break;
    270. case EMPLOYEE:ptr_Worker_array[i] = new Employee(newID, newName, EMPLOYEE);
    271. break;
    272. }
    273. if (save()) {
    274. cout << "修改成功" << endl;
    275. }
    276. }
    277. }
    278. void workerManager::Search_Worker()
    279. {
    280. cout << "请选择查找条件(输入0返回上级):" << endl;
    281. cout << "1.职工编号" << endl;
    282. cout << "2.职工姓名" << endl;
    283. int choice = 0;
    284. cin >> choice;
    285. while (choice) {
    286. if (choice == 1) {
    287. Search_ID();
    288. break;
    289. }
    290. else if (choice == 2) {
    291. Search_Name();
    292. break;
    293. }
    294. else {
    295. cout << "输入不合法,请重新输入:" << endl;
    296. cin >> choice;
    297. }
    298. }
    299. }
    300. int workerManager::get_count()
    301. {
    302. int cnt = 0;
    303. ifstream ifs;
    304. ifs.open(FILENAME, ios::in);
    305. if (ifs.is_open()) {
    306. ifs >> cnt;
    307. ifs.close();
    308. }
    309. return cnt;
    310. }
    311. int workerManager::save()
    312. {
    313. int res = 1;
    314. ofstream ofs;
    315. ofs.open(FILENAME, ios::out);
    316. if (ofs.is_open()) {
    317. ofs << m_count << endl;
    318. for (int i = 0; i < m_count; i++) {
    319. ofs << ptr_Worker_array[i]->m_id << " "
    320. << ptr_Worker_array[i]->m_name << " "
    321. << ptr_Worker_array[i]->m_post << endl;
    322. }
    323. ofs.close();
    324. }
    325. else {
    326. res = 0;
    327. }
    328. return res;
    329. }
    330. void workerManager::Search_ID()
    331. {
    332. cout << "请输入要查找的编号(输入0返回上级):" << endl;
    333. int id = -1;
    334. cin >> id;
    335. while (id) {
    336. if (id < 0) {
    337. cout << "输入不合法,请重新输入:" << endl;
    338. cin >> id;
    339. }
    340. else {
    341. for (int i = 0; i < m_count; i++) {
    342. if (id == ptr_Worker_array[i]->m_id) {
    343. ptr_Worker_array[i]->show_Info();
    344. id = 0;
    345. break;
    346. }
    347. if (i == m_count - 1 && id != 0) {
    348. cout << "查无此人,请重新输入:" << endl;
    349. cin >> id;
    350. }
    351. }
    352. }
    353. }
    354. }
    355. void workerManager::Search_Name()
    356. {
    357. int cnt = 0;
    358. cout << "请输入要查找的姓名(输入0返回上级):" << endl;
    359. string name;
    360. cin >> name;
    361. while (name != "0") {
    362. for (int i = 0; i < m_count; i++) {
    363. if (name == ptr_Worker_array[i]->m_name) {
    364. cnt++;
    365. ptr_Worker_array[i]->show_Info();
    366. if (i == m_count - 1) name = "0";
    367. }
    368. if (i == m_count - 1 && cnt == 0) {
    369. system("pause");
    370. cout << "查无此人,请重新输入:" << endl;
    371. cin >> name;
    372. }
    373. }
    374. }
    375. }
    376. void workerManager::Sort_ID()
    377. {
    378. for (int i = 0; i < m_count - 1; i++) {
    379. int MinOrMax = i;
    380. for (int j = i + 1; j < m_count; j++) {
    381. if (ptr_Worker_array[i]->m_id < ptr_Worker_array[j]->m_id) {
    382. MinOrMax = j;
    383. }
    384. }
    385. if (MinOrMax != i) {
    386. Worker* temp = ptr_Worker_array[MinOrMax];
    387. ptr_Worker_array[MinOrMax] = ptr_Worker_array[i];
    388. ptr_Worker_array[i] = temp;
    389. }
    390. }
    391. cout << "排序成功" << endl;
    392. }
    393. void workerManager::Clear_Worker()
    394. {
    395. if (m_count) {
    396. for (int i = 0; i < m_count; i++) {
    397. if (ptr_Worker_array[i])
    398. delete ptr_Worker_array[i];
    399. ptr_Worker_array[i] = NULL;
    400. }
    401. m_count = 0;
    402. }
    403. if (save()) {
    404. cout << "清空文件成功" << endl;
    405. }
    406. }
    407. workerManager::~workerManager() {
    408. if (m_count) {
    409. for (int i = 0; i < m_count; i++) {
    410. if (ptr_Worker_array[i])
    411. delete ptr_Worker_array[i];
    412. ptr_Worker_array[i] = NULL;
    413. }
    414. }
    415. delete[] ptr_Worker_array;
    416. ptr_Worker_array = NULL;
    417. }

  • 相关阅读:
    高德地图 web js端 出现 INVALID_USER_SCODE 10008 MD5安全码未通过验证
    springMvc注解式开发方法以及参数传递方法
    Revit的链接文件随同主文件导出到navisworks的设置方法?
    Hystrix Dashboard断路监控仪表盘
    探索C嘎嘎的奇妙世界:第二关---C++的输入与输出
    From High-Level Deep Neural Models to FPGAs
    fisco Java-sdk 快速入门案例
    牛客网:NC55 最长公共前缀
    【JavaWeb】第七章 Tomcat
    【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 最小配对和(100分) - 三语言AC题解(Python/Java/Cpp)
  • 原文地址:https://blog.csdn.net/qq_42106610/article/details/134092242