基于多态的职工管理系统

    科技2022-07-10  168

    1.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; };

    2.manager.h

    #pragma once #include<iostream> using namespace std; #include<string> #include"worker.h" class Manager :public Worker { public: //构造函数 Manager(int id, string name, int dId); //显示个人信息 virtual void showInfo(); //获取岗位名称 virtual string getDeptName(); };

    3.employee.h

    #pragma once #include<iostream> using namespace std; #include<string> #include"worker.h" class Employee :public Worker { public: //构造函数 Employee(int id,string name,int dId); //显示个人信息 virtual void showInfo(); //获取岗位名称 virtual string getDeptName(); };

    4.boss.h

    #pragma once #include<iostream> using namespace std; #include<string> #include"worker.h" class Boss :public Worker { public: //构造函数 Boss(int id, string name, int dId); //显示个人信息 virtual void showInfo(); //获取岗位名称 virtual string getDeptName(); };

    5.workermanager.h

    #pragma once//防止头文件重复包含 #include<iostream> #include"worker.h" using namespace std; #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 save(); //添加职工 void Add_Emp(); //判断文件是否为空标志 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(); };

    6.manager.cpp

    #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("经理"); }

    7.employee.cpp

    #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("员工"); } boss.cpp #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("老板"); }

    9.workermanager.cpp

    #include"workerManger.h" WorkerManager::WorkerManager() { //1.文件不存在 ifstream ifs; ifs.open(FILENAME, ios::in); //文件不存在情况 if (!ifs.is_open()) { //cout << "文件不存在" << endl; //测试输出 this->m_EmpNum = 0; //初始化人数 this->m_FileIsEmpty = true; //初始化文件为空标志 this->m_EmpArray = NULL; //初始化数组 ifs.close(); //关闭文件 return; } //2.文件存在,数据为空 char ch; ifs >> ch; if(ifs.eof()) { //cout << "文件为空!" << endl; //测试输出 this->m_EmpNum = 0; //初始化人数 this->m_FileIsEmpty = true; //初始化文件为空标志 this->m_EmpArray = NULL; //初始化数组 ifs.close(); //关闭文件 } //3.文件存在,并且记录数据 int num = this->get_EmpNum(); /*cout << "职工个数为:" << num << endl;*/ //测试代码 this->m_EmpNum = num; //更新成员属性 //初始化属性 //开辟空间 this->m_EmpArray = new Worker*[this->m_EmpNum]; //初始化职工 init_Emp(); //测试代码 /*for (int i = 0; i < m_EmpNum; i++) { cout << "职工号: " << this->m_EmpArray[i]->m_Id << " 职工姓名: " << this->m_EmpArray[i]->m_Name << " 部门编号: " << this->m_EmpArray[i]->m_DeptId << endl; }*/ } //添加职工 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 << "个新职工编号:"; cin >> id; cout << "请输入第" << i + 1 << "个新职工姓名:"; 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; cout<<"成功添加"<<addNum<<"名新职工"<<endl; this->m_FileIsEmpty = false; //保存数据到文件中 this->save(); } else { cout << "数据有误" << endl; } //按任意键后,清屏回到上级目录 system("pause"); system("cls"); } //展示函数 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::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++; } ifs.close(); 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; //根据不同的部门Id创建不同对象 if (dId == 1) // 1普通员工 { worker = new Employee(id, name, dId); } else if (dId == 2) //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]->m_Id = this->m_EmpArray[i + 1]->m_Id; this->m_EmpArray[i]->m_Name = this->m_EmpArray[i + 1]->m_Name; this->m_EmpArray[i]->m_DeptId = this->m_EmpArray[i + 1]->m_DeptId; } this->m_EmpNum--;//更新数组中记录人员个数 //数据同步更新到文件中 this->save(); cout << "删除成功!" << endl; } else { cout << "删除失败,未找到该职工" << endl; } //按任意键清屏 system("pause"); system("cls"); } } 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 << "请输入修改职工的编号:"; 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 (m_EmpArray[i]->m_Name == name) { cout << "查找成功,职工编号为:" << 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 < m_EmpNum; j++) { if (select == 1) //升序 { if (m_EmpArray[minOrMax]->m_Id > m_EmpArray[j]->m_Id) { minOrMax = j; } } else //降序 { if (m_EmpArray[minOrMax]->m_Id < m_EmpArray[j]->m_Id) { minOrMax = j; } } } if (i != minOrMax) { Worker * temp = m_EmpArray[i]; m_EmpArray[i] = m_EmpArray[minOrMax]; 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) { //打开模式 ios::trunc 如果存在删除文件并重新创建 ofstream ofs(FILENAME, ios::trunc); ofs.close(); 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]; } } this->m_EmpNum = 0; delete[] this->m_EmpArray; this->m_EmpArray = NULL; this->m_FileIsEmpty = true; } cout << "清空成功!" << endl; } system("pause"); system("cls"); } WorkerManager::~WorkerManager() { if (this->m_EmpArray != NULL) { delete[]this->m_EmpArray; this->m_EmpArray = NULL; } }

    10.main.cpp

    #include<iostream> using namespace std; #include "workerManger.h" #include"worker.h" #include"employee.h" #include"boss.h" #include"manager.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; */ //实例化管理者对象 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; }
    Processed: 0.043, SQL: 8