效果
添加
显示
删除
查找
排序(不演示了)
清空所有
头文件
员工类
#pragma once
#include <iostream>
#include <string>
using namespace std;//职工抽象基类
class Worker
{
public://显示个人信息virtual void showInfo() = 0;//获取岗位名称virtual string getDeptName() = 0;//职工编号int m_Id;//职工姓名string m_Name;//部门编号int m_DeptId;
};
职员类
//普通员工文件
#pragma once
#include <iostream>
#include "worker.h"
using namespace std;class Employee :public Worker
{
public://构造函数Employee(int id,string name,int dId);//显示个人信息virtual void showInfo();//获取岗位名称virtual string getDeptName();
};
经理类
#pragma once
#include <iostream>
#include "worker.h"
using namespace std;
//经理类
class Manager :public Worker
{
public://构造函数Manager(int id, string name, int dId);//显示个人信息virtual void showInfo();//获取岗位名称virtual string getDeptName();
};
老板类
#pragma once
#include <iostream>
#include "worker.h"
using namespace std;
//老板类
class Boss :public Worker
{
public://构造函数Boss(int id, string name, int dId);//显示个人信息virtual void showInfo();//获取岗位名称virtual string getDeptName();
};
员工管理类
#pragma once
#include <iostream>
#include"worker.h"
#include"employee.h"
#include "manager.h"
#include "boss.h"
#include <fstream>
#define FILENAME "empFile.txt"using namespace std;
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();//按照职工编号判断职工是否存在,若存在返回职工在数组中位置,不存在返回-1int IsExist(int id);//修改职工void Mod_Emp();//查找职工 void Find_Emp();//排序职工void Sort_Emp();//清空文件void Clean_File();//析构函数~WorkerManager();
};
源文件
职员类
#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("员工");
}
经理类
#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("经理");
}
老板类
#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("总裁");
}
员工管理类
#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 < 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::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;//根据不同的部门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");
}//按照职工编号判断职工是否存在,若存在返回职工在数组中位置,不存在返回-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::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");
}//修改职工
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 (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++){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;}}
主函数
#include <iostream>
#include "workerManager.h"
using namespace std;int main()
{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:break;}}system("pause");return 0;
}