C++核心编程(六)—— 案例:职工管理系统(下)
2021/5/19 22:27:17
本文主要是介绍C++核心编程(六)—— 案例:职工管理系统(下),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
C++系列内容的学习目录 → \rightarrow →C++学习系列内容汇总。
- 1. 管理系统需求
- 2. 创建项目
- 3. 创建管理类
- 4. 菜单功能
- 5. 退出功能
- 6. 创建职工类
- 7. 添加职工
- 8. 文件交互 —— 写文件
- 9. 文件交互 —— 读文件
- 10. 显示职工
- 11. 删除职工
- 12. 修改职工
- 13. 查找职工
- 14. 排序
- 15. 清空文件
- 16. 附录:完整代码
- 16.1 职工管理系统.cpp
- 16.2 WorkerManager.h
- 16.3 WorkerManager.cpp
- 16.4 worker.h
- 16.5 employee.h
- 16.6 employee.cpp
- 16.7 manager.h
- 16.8 manager.cpp
- 16.9 boss.h
- 16.10 boss.cpp
本案例由于内容较多,故分为三个篇章。
1-9部分的内容见C++核心编程(六)—— 案例:职工管理系统(上)
10-15部分的内容见C++核心编程(六)—— 案例:职工管理系统(中)
16部分的内容见C++核心编程(六)—— 案例:职工管理系统(下)
1-9部分的内容见C++核心编程(六)—— 案例:职工管理系统(上)。
10. 显示职工 11. 删除职工 12. 修改职工 13. 查找职工 14. 排序 15. 清空文件10-15部分的内容见C++核心编程(六)—— 案例:职工管理系统(中)。
16. 附录:完整代码职工管理系统的完整代码,点击 → \rightarrow → Github链接进行查看。
16.1 职工管理系统.cpp
#include<iostream> using namespace std; #include"workerManager.h" #include"worker.h" #include"employee.h" #include"manager.h" #include"boss.h" //void test() //{ // //测试代码 // Worker *worker = NULL; // worker = new Employee(1, "张三", 1); // worker->showInfo(); // delete worker; // // worker = new Manager(2, "李四", 2); // worker->showInfo(); // delete worker; // // worker = new Boss(3, "王五", 3); // worker->showInfo(); // delete worker; //} int main() { //test(); //实例化管理者对象 WorkerManager wm; int choice = 0; //用来存储用户的选项 while (true) { //调用展示菜单成员函数 wm.Show_Menu(); cout << "请输入您的选择:" << endl; cin >> choice; //接受用户的选项 switch (choice) { case 0: //0. 退出管理程序 wm.ExitSystem(); break; case 1: //1. 增加职工信息 wm.Add_Emp(); break; case 2: //2. 显示职工信息 wm.Show_Emp(); break; case 3: //3. 删除离职职工 wm.Del_Emp(); break; case 4: //4. 修改职工信息 wm.Mod_Emp(); break; case 5: //5. 查找职工信息 wm.Find_Emp(); break; case 6: //6. 按照编号排序 wm.Sort_Emp(); break; case 7: //7. 清空所有文档 wm.Clean_File(); break; default: system("cls"); //输入0-7之外的数字,清屏 break; } } system("pause"); return 0; }
16.2 WorkerManager.h
#pragma once //防止头文件重复包含 #include<iostream> //包含输入输出流头文件 using namespace std; //使用标准命名空间 #include"worker.h" #include"employee.h" #include"manager.h" #include"boss.h" #include<fstream> #define FILENAME "empFile.txt" class WorkerManager { public: WorkerManager(); //构造函数(在.h文件中,只做声明,不做实现) void Show_Menu(); //展示菜单 void ExitSystem(); //退出系统 int m_EmpNum; //记录职工人数 Worker ** m_EmpArray; //职工数组指针 void Add_Emp(); //添加职工 void save(); //保存文件 bool m_FileIsEmpty; //判断文件是否为空的标志 int get_EmpNum(); //统计文件中的人数 void init_Emp(); //初始化员工 void Show_Emp(); //显示职工信息 int IsExist(int id); //判断职工是否存在,如果存在,返回职工所在数组,如果不存在,返回-1 void Del_Emp(); //删除职工 void Mod_Emp(); //修改职工 void Find_Emp(); //查找职工 void Sort_Emp(); //排序职工 void Clean_File(); //清空文件 ~WorkerManager(); //析构函数 };
16.3 WorkerManager.cpp
#include"workerManager.h" //构造函数 WorkerManager::WorkerManager() { //1. 文件不存在 ifstream ifs; ifs.open(FILENAME, ios::in); //读文件 if (!ifs.is_open()) { //cout << "文件不存在!" << endl; //测试代码 //初始化属性 this->m_EmpNum = 0; //初始化人数为0 this->m_EmpArray = NULL; //初始化数组的指针为空 this->m_FileIsEmpty = true; //初始化文件是否为空 ifs.close(); //关闭文件 return; } //2. 文件存在,但是数据被用户清空 char ch; ifs >> ch; //读取文件的一个字符,如果是eof(文件尾部)的标志,说明文件读完了。如果文件真的为空,相当于里面只有一个eof的标志,我们把这个标志读走,然后判断这个文件是否为空。 if (ifs.eof()) //如果ifs.eof()为真,代表文件读完了 { //cout << "文件为空!" << endl; //测试代码 this->m_EmpNum = 0; //初始化人数为0 this->m_EmpArray = NULL; //初始化数组的指针为空 this->m_FileIsEmpty = true; //初始化文件是否为空 ifs.close(); //关闭文件 return; } //3. 文件存在,并且保存职工的所有数据 int num = this->get_EmpNum(); //cout << "职工人数:" << num << endl; this->m_EmpNum = num; //开辟空间 this->m_EmpArray = new Worker*[this->m_EmpNum]; //将文件中的数据存到数组中 this->init_Emp(); //测试代码 //for (int i = 0; i < this->m_EmpNum; i++) //{ // cout << "职工编号:" << this->m_EmpArray[i]->m_Id // << "\t职工姓名:" << this->m_EmpArray[i]->m_Name // << "\t部门编号:" << this->m_EmpArray[i]->m_DeptId << endl; //} } //展示菜单 void WorkerManager::Show_Menu() { cout << "*************************************" << endl; cout << "******* 欢迎使用职工管理系统 ********" << endl; cout << "********** 0. 退出管理程序 **********" << endl; cout << "********** 1. 增加职工信息 **********" << endl; cout << "********** 2. 显示职工信息 **********" << endl; cout << "********** 3. 删除离职职工 **********" << endl; cout << "********** 4. 修改职工信息 **********" << endl; cout << "********** 5. 查找职工信息 **********" << endl; cout << "********** 6. 按照编号排序 **********" << endl; cout << "********** 7. 清空所有文档 **********" << endl; cout << "*************************************" << endl; cout << endl; } //退出系统 void WorkerManager::ExitSystem() { cout << "欢迎下次使用!" << endl; system("pause"); exit(0); //退出程序 } //添加职工 void WorkerManager::Add_Emp() { cout << "请输入添加职工的数量:" << endl; int addNum = 0; //保存用户输入的数量 cin >> addNum; if (addNum > 0) { //添加 //计算添加新的空间大小 int newSize = this->m_EmpNum + addNum; //新空间大小 = 原来记录人数 + 新增人数 //开辟新空间 Worker ** newSpace = new Worker *[newSize]; //将原来空间下的数据拷贝到新空间下 if (this->m_EmpArray != NULL) { for (int i = 0; i < this->m_EmpNum; i++) { newSpace[i] = this->m_EmpArray[i]; } } //添加新数据 for (int i = 0; i < addNum; i++) { int id; //职工编号 string name; //职工姓名 int deptSelect; //岗位选择 cout << "请输入第" << i + 1 << "个新职工的编号:" << endl; cin >> id; cout << "请输入第" << i + 1 << "个新职工的姓名:" << endl; cin >> name; cout << "请选择第" << i + 1 << "个新职工的岗位:" << endl; cout << "1. 员工" << endl; cout << "2. 经理" << endl; cout << "3. 老板" << endl; cin >> deptSelect; Worker * worker = NULL; switch (deptSelect) { case 1: worker = new Employee(id, name, 1); break; case 2: worker = new Manager(id, name, 2); break; case 3: worker = new Boss(id, name, 3); break; default: break; } //将创建的职工指针保存到数组中 newSpace[this->m_EmpNum + i] = worker; } //释放原有空间 delete[] this->m_EmpArray; //更改新空间的指向 this->m_EmpArray = newSpace; //更新新的职工人数 this->m_EmpNum = newSize; this->m_FileIsEmpty = false; //成功添加一个职工后,文件就不为空了 //提示添加成功 cout << "成功添加了" << addNum << "名新职工!" << endl; //保存数据到文件中 this->save(); } else { cout << "输入数据有误!" << endl; } //按任意键后清屏,回到上级目录 system("pause"); system("cls"); } //保存文件 void WorkerManager::save() { ofstream ofs; ofs.open(FILENAME, ios::out); //用输出的方式打开文件——写文件 //将每个人的数据写入到文件中 for (int i = 0; i < this->m_EmpNum; i++) { ofs << this->m_EmpArray[i]->m_Id << " " << this->m_EmpArray[i]->m_Name << " " << this->m_EmpArray[i]->m_DeptId << endl; } //关闭文件 ofs.close(); } //统计文件中的人数 int WorkerManager::get_EmpNum() { ifstream ifs; ifs.open(FILENAME, ios::in); //打开文件——读 int id; string name; int deptId; int num = 0; //num是统计人数的变量 while (ifs>>id && ifs>>name && ifs>>deptId) //读入所有数据 { num++; } return num; } //初始化员工 void WorkerManager::init_Emp() { ifstream ifs; ifs.open(FILENAME, ios::in); int id; string name; int deptId; int index = 0; //下标 while (ifs >> id && ifs >> name && ifs >> deptId) { Worker * worker = NULL; //初始化对象worker为空 if (deptId == 1) //普通职工 { worker = new Employee(id, name, deptId); } else if (deptId == 2) //经理 { worker = new Manager(id, name, deptId); } else //老板 { worker = new Boss(id, name, deptId); } this->m_EmpArray[index] = worker; index++; } //关闭文件 ifs.close(); } //显示职工信息 void WorkerManager::Show_Emp() { //判断文件是否为空 if (this->m_FileIsEmpty) { cout << "文件不存在或者记录为空!" << endl; } else { for (int i = 0; i < m_EmpNum; i++) { //利用多态调用程序接口 this->m_EmpArray[i]->showInfo(); } } //按任意键后清屏 system("pause"); system("cls"); } //删除职工 void WorkerManager::Del_Emp() { if (this->m_FileIsEmpty) { cout << "文件不存在或记录为空!" << endl; } else { //按照职工编号删除 cout << "请输入想要删除的职工编号:" << endl; int id = 0; cin >> id; int index = this->IsExist(id); if (index != -1) //说明职工存在,并且要删掉index位置上的职工 { //数据前移 for (int i = index; i < this->m_EmpNum - 1; i++) { this->m_EmpArray[i] = this->m_EmpArray[i + 1]; } this->m_EmpNum--; //更新数组中记录人员个数 //数据同步更新到文件中 this->save(); cout << "删除成功!" << endl; } else { cout << "删除失败,未找到该职工!" << endl; } } //按任意键清屏 system("pause"); system("cls"); } //判断职工是否存在,如果存在,返回职工所在数组,如果不存在,返回-1 int WorkerManager::IsExist(int id) { int index = -1; for (int i = 0; i < this->m_EmpNum; i++) { if (this->m_EmpArray[i]->m_Id == id) { //找到职工 index = i; break; } } return index; } //修改职工 void WorkerManager::Mod_Emp() { if (this->m_FileIsEmpty) { cout << "文件不存在或记录为空!" << endl; } else { cout << "请输入需要修改的职工的编号:" << endl; int id; cin >> id; int ret = this->IsExist(id); if (ret != -1) { //查到需要修改的编号的职工 delete this->m_EmpArray[ret]; //要创建新的人,需先把堆区数据释放干净 int newId = 0; string newName = ""; int newdeptSelect = 0; cout << "查到编号为 " << id << " 号的职工,请输入新的职工编号:" << endl; cin >> newId; cout << "请输入新的姓名:" << endl; cin >> newName; cout << "请输入新的岗位:" << endl; cout << "1. 员工" << endl; cout << "2. 经理" << endl; cout << "3. 老板" << endl; cin >> newdeptSelect; Worker * worker = NULL; switch (newdeptSelect) { case 1: worker = new Employee(newId, newName, newdeptSelect); break; case 2: worker = new Manager(newId, newName, newdeptSelect); break; case 3: worker = new Boss(newId, newName, newdeptSelect); break; default: break; } //更新数据到数组中 this->m_EmpArray[ret] = worker; cout << "修改成功!" << endl; //保存到文件中 this->save(); } else { cout << "修改失败,查无此人!" << endl; } } system("pause"); system("cls"); } //查找职工 void WorkerManager::Find_Emp() { if (this->m_FileIsEmpty) { cout << "文件不存在或记录为空!" << endl; } else { cout << "请输入查找的方式:" << endl; cout << "1. 按照职工编号查找" << endl; cout << "2. 按照职工姓名查找" << endl; int select = 0; cin >> select; if (select == 1) { //按照职工编号查找 int id; cout << "请输入要查找职工的编号:" << endl; cin >> id; int ret = IsExist(id); if(ret != -1) { //找到职工 cout << "查找成功!该职工信息如下:" << endl; this->m_EmpArray[ret]->showInfo(); } else { cout << "查找失败,查无此人!" << endl; } } else if (select == 2) { //按照职工姓名查找 string name; cout << "请输入要查找职工的姓名:" << endl; cin >> name; //加入判断是否查找到职工的标志 bool flag = false; //默认未找到职工 for (int i = 0; i < m_EmpNum; i++) { if (this->m_EmpArray[i]->m_Name == name) { cout << "查找成功!该职工信息如下:" << endl; this->m_EmpArray[i]->showInfo(); //调用显示信息的接口 flag = true; } } if (flag == false) { cout << "查找失败,查无此人!" << endl; } } else { cout << "输入的选项有误!" << endl; } } system("pause"); system("cls"); } //排序职工 void WorkerManager::Sort_Emp() { if (this->m_FileIsEmpty) { cout << "文件不存在或记录为空!" << endl; system("pause"); system("cls"); } else { cout << "请选择排序方式:" << endl; cout << "1. 按照职工编号进行升序" << endl; cout << "2. 按照职工编号进行降序" << endl; int select = 0; cin >> select; for (int i = 0; i < m_EmpNum; i++) { int MinOrMax = i; //声明最小值或最大值下标 for (int j = i + 1; j < m_EmpNum; j++) { if (select == 1) //升序(认定最小值下标) { if (this->m_EmpArray[MinOrMax]->m_Id > this->m_EmpArray[j]->m_Id) { MinOrMax = j; } } else //降序(认定最大值下标) { if (this->m_EmpArray[MinOrMax]->m_Id < this->m_EmpArray[j]->m_Id) { MinOrMax = j; } } } //判断一开始认定的最小值或最大值是不是计算的最小值或最大值,如果不是,交换数据 if (i != MinOrMax) { Worker * temp = this->m_EmpArray[i]; this->m_EmpArray[i] = this->m_EmpArray[MinOrMax]; this->m_EmpArray[MinOrMax] = temp; } } cout << "排序成功!排序后的结果为:" << endl; this->save(); //排序后的结果保存到文件中 this->Show_Emp(); } } //清空文件 void WorkerManager::Clean_File() { cout << "是否确认清空?" << endl; cout << "1. 是" << endl; cout << "2. 否" << endl; int select = 0; cin >> select; if (select == 1) { //清空文件 ofstream ofs(FILENAME, ios::trunc); //删除文件后重新创建 ofs.close(); if (this->m_EmpArray != NULL) { //删除堆区的每个职工对象 for (int i = 0; i < this->m_EmpNum; i++) { delete this->m_EmpArray[i]; this->m_EmpArray[i] = NULL; } //删除堆区数组指针 delete[] this->m_EmpArray; this->m_EmpArray = NULL; this->m_EmpNum = 0; this->m_FileIsEmpty = true; } cout << "清空成功!" << endl; } system("pause"); system("cls"); } //析构函数 WorkerManager::~WorkerManager() { if (this->m_EmpArray != NULL) { for (int i = 0; i < this->m_EmpNum; i++) { if (this->m_EmpArray[i] != NULL) { delete this->m_EmpArray[i]; } } delete[] this->m_EmpArray; this->m_EmpArray = NULL; } }
16.4 worker.h
#pragma once #include<iostream> using namespace std; #include<string> //职工抽象类(不做任何实现,不用创建.cpp文件) class Worker { public: //显示个人信息 virtual void showInfo() = 0; //获取岗位名称 virtual string getDeptName() = 0; int m_Id; //职工编号 string m_Name; //职工姓名 int m_DeptId; //职工所在部门名称编号 };
16.5 employee.h
#pragma once #include<iostream> using namespace std; #include"worker.h" #include<string> //普通员工文件 class Employee :public Worker { public: //构造函数 Employee(int id, string name, int deptId); //显示个人信息 virtual void showInfo(); //获取岗位名称 virtual string getDeptName(); };
16.6 employee.cpp
#include"employee.h" //构造函数 Employee::Employee(int id, string name, int deptId) { this->m_Id = id; //自身属性的初始化 this->m_Name = name; this->m_DeptId = deptId; } //显示个人信息 void Employee::showInfo() { cout << "职工编号:" << this->m_Id << "\t职工姓名:" << this->m_Name << "\t岗位名称:" << this->getDeptName() << "\t岗位职责:完成经理交给的任务" << endl; } //获取岗位名称 string Employee::getDeptName() { return string("员工"); }
16.7 manager.h
#pragma once #include<iostream> using namespace std; #include"worker.h" #include<string> //经理类 class Manager :public Worker { public: //构造函数 Manager(int id, string name, int deptId); //显示个人信息 virtual void showInfo(); //获取岗位名称 virtual string getDeptName(); };
16.8 manager.cpp
#include"manager.h" //构造函数 Manager::Manager(int id, string name, int deptId) { this->m_Id = id; this->m_Name = name; this->m_DeptId = deptId; } //显示个人信息 void Manager::showInfo() { cout<< "职工编号:" << this->m_Id << "\t职工姓名:" << this->m_Name << "\t岗位名称:" << this->getDeptName() << "\t岗位职责:完成老板交给的任务,并下发任务给员工" << endl; } //获取岗位名称 string Manager::getDeptName() { return string("经理"); }
16.9 boss.h
#pragma once #include<iostream> using namespace std; #include"worker.h" #include<string> //老板类 class Boss :public Worker { public: //构造函数 Boss(int id, string name, int deptId); //显示个人信息 virtual void showInfo(); //获取岗位名称 virtual string getDeptName(); };
16.10 boss.cpp
#include"boss.h" //构造函数 Boss::Boss(int id, string name, int deptId) { this->m_Id = id; this->m_Name = name; this->m_DeptId = deptId; } //显示个人信息 void Boss::showInfo() { cout << "职工编号:" << this->m_Id << "\t职工姓名:" << this->m_Name << "\t岗位名称:" << this->getDeptName() << "\t岗位职责:管理公司所有事务" << endl; } //获取岗位名称 string Boss::getDeptName() { return string("老板"); }
这篇关于C++核心编程(六)—— 案例:职工管理系统(下)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26MATLAB 中 A(7)=[];什么意思?-icode9专业技术文章分享
- 2024-11-26UniApp 中如何实现使用输入法时保持页面列表不动的效果?-icode9专业技术文章分享
- 2024-11-26在 UniApp 中怎么实现输入法弹出时禁止页面向上滚动?-icode9专业技术文章分享
- 2024-11-26WebSocket是什么,怎么使用?-icode9专业技术文章分享
- 2024-11-26页面有多个ref 要动态传入怎么实现?-icode9专业技术文章分享
- 2024-11-26在 UniApp 中实现一个底部输入框的常见方法有哪些?-icode9专业技术文章分享
- 2024-11-26RocketMQ入门指南:搭建与使用全流程详解
- 2024-11-26RocketMQ入门教程:轻松搭建与使用指南
- 2024-11-26手写RocketMQ:从入门到实践的简单教程
- 2024-11-25【机器学习(二)】分类和回归任务-决策树(Decision Tree,DT)算法-Sentosa_DSML社区版