参考博客:链接
代码结构:
以下是所有代码:
头文件:
worker.h
#pragma once #include<iostream> using namespace std; #include<string> //职工抽象类 class Worker { public: //显示个人信息 virtual void showInfo() = 0; //获取岗位名称 virtual string getDeptName() = 0; //职工编号 int m_Id; //职工姓名 string m_Name; //部门编号 int m_DeptId; };
boss.h
#pragma once #include<iostream> using namespace std; #include "worker.h" //Boss类 class Boss :public Worker { public: //构造函数 Boss(int id, string name, int did); //显示个人信息 void showInfo(); //获取岗位名称 string getDeptName(); };
manager.h
#pragma once #include<iostream> using namespace std; #include "worker.h" //经理类 class Manager :public Worker { public: //构造函数 Manager(int id, string name, int did); //显示个人信息 void showInfo(); //获取岗位名称 string getDeptName(); };
employee.h
//普通员工文件 #pragma once #include<iostream> using namespace std; #include "worker.h" class Employee :public Worker { public: //构造函数 Employee(int id, string name, int did); //显示个人信息 void showInfo(); //获取岗位名称 string getDeptName(); };
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(); //展示菜单 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(); //删除职工 void Del_Emp(); //判断职工 是否存在 如果存在返回职工所在数组中的位置,不存在返回-1 int IsExist(int id); //修改职工 void Mod_Emp(); //查找职工 void Find_Emp(); //按照职工编号排序 void Sort_Emp(); //清空文件 void Clean_File(); //析构函数 ~WorkerManager(); };
源文件
boss.cpp
#include<iostream> using namespace std; #include"boss.h" //构造函数 Boss::Boss(int id, string name, int did) { this->m_Id = id; this->m_Name = name; this->m_DeptId = did; } //显示个人信息 void Boss::showInfo() { cout << "职工编号:" << this->m_Id << "\t职工姓名:" << this->m_Name << "\t岗位:" << this->getDeptName() << "\t岗位职责:管理公司所有事务" << endl; } //获取岗位名称 string Boss::getDeptName() { return string("老板"); }
manager.cpp
#include<iostream> using namespace std; #include"manager.h" //构造函数 Manager::Manager(int id, string name, int did) { this->m_Id = id; this->m_Name = name; this->m_DeptId = did; } //显示个人信息 void Manager::showInfo() { cout << "职工编号:" << this->m_Id << "\t职工姓名:" << this->m_Name << "\t岗位:" << this->getDeptName() << "\t岗位职责:完成老板交给的任务,并且下发任务给员工" << endl; } //获取岗位名称 string Manager::getDeptName() { return string("经理"); }
employee.cpp
#include<iostream> using namespace std; #include "employee.h" //构造函数 Employee::Employee(int id, string name, int did) { this->m_Id = id; this->m_Name = name; this->m_DeptId = did; } //显示个人信息 void Employee::showInfo() { cout << "职工编号:" << this->m_Id << "\t职工姓名:" << this->m_Name << "\t岗位:" << this->getDeptName() << "\t岗位职责:完成经理交给的任务" << endl; } //获取岗位名称 string Employee::getDeptName() { return string("员工"); }
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; //初始化数组指针 this->m_EmpArray = NULL; //初始化文件是否为空 this->m_FileIsEmpty = true; ifs.close(); return; } //2、文件存在 但是为空 char ch; ifs >> ch; if (ifs.eof()) { //文件为空 cout << "文件为空!" << endl; //初始化记录人数 this->m_EmpNum = 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 dSelect; //部门选择 cout << "请输入第" << i + 1 << "个新职工编号:" << endl; cin >> id; cout << "请输入第" << i + 1 << "个新职工姓名:" << endl; cin >> name; cout << "请选择该职工岗位:" << endl; cout << "1、普通职工" << endl; cout << "2、经理" << endl; cout << "3、老板" << endl; cin >> dSelect; Worker* worker = NULL; switch (dSelect) { 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 did; int num = 0; while(ifs >> id && ifs >> name && ifs >> did) { //统计人数 num++; } return num; } //初始化员工 void WorkerManager::init_Emp() { ifstream ifs; ifs.open(FILENAME, ios::in); int id; string name; int did; int index = 0; while (ifs >> id && ifs >> name && ifs >> did) { Worker* worker = NULL; if (did == 1) { //普通职工 worker = new Employee(id, name, did); } else if (did == 2) { //经理 worker = new Manager(id, name, did); } else { //老板 worker = new Boss(id, name, did); } 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) { //说明职工存在 //数据前移 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 dSelect = 0; cout << "查到:" << id << "号职工,请输入新的职工号:" << endl; cin >> newId; cout << "请输入新姓名:" << endl; cin >> newName; cout << "请输入岗位:" << endl; cout << "1、普通职工" << endl; cout << "2、经理" << endl; cout << "3、老板" << endl; cin >> dSelect; Worker* worker = NULL; switch (dSelect) { case 1: worker = new Employee(newId, newName, dSelect); break; case 2: worker = new Manager(newId, newName, dSelect); break; case 3: worker = new Boss(newId, newName, dSelect); 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 << "查找成功!职工编号为:" << this->m_EmpArray[i]->m_Id << "号职工信息如下:" << endl; flag = true; //调用显示信息接口 this->m_EmpArray[i]->showInfo(); } } 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 < this->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; } }
职工管理系统.cpp
#include<iostream> using namespace std; #include "workerManager.h" #include "worker.h" #include "employee.h" #include"manager.h" #include"boss.h" int main() { //测试代码: //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; //return 0; //实例化管理者对象 WorkerManager wm; int choice = 0; //用来存储用户的选项 while (true) { //调用展示菜单成员函数 wm.Show_Menu(); cout << "请输入您的选择:" << endl; cin >> choice; //接收选项 switch (choice) { case 0: //退出系统 wm.ExitSystem(); break; case 1: //增加职工 wm.Add_Emp(); break; case 2: //显示职工 wm.Show_Emp(); break; case 3: //删除职工 wm.Del_Emp(); break; case 4: //修改职工 wm.Mod_Emp(); break; case 5: //查找职工 wm.Find_Emp(); break; case 6: //排序职工 wm.Sort_Emp(); break; case 7: //清空职工 wm.Clean_File(); break; default: system("cls"); //清屏 break; } } system("pause"); //按任意键继续 return 0; }