文章目录
- 一、管理系统概述
- 二、功能简述
- 三、代码实现
一、管理系统概述
职工管理系统可以用来管理公司内所有员工的信息
本节主要利用C++来实现一个基于多态的职工管理系统
公司中职工分为三类:普通员工、经理、老板,显示信息时,需要显示职工编号、职工姓名、职工岗位、以及职责
普通员工职责:完成经理交给的任务
经理职责:完成老板交给的任务,并下发任务给员工
老板职责:管理公司所有事务
二、功能简述
管理系统中需要实现的功能如下:
●退出管理程序:退出当前管理系统
●增加职工信息:实现批量添加职工功能,将信息录入到文件中,职工信息为:职工编号、姓名、
部门编号
●显示职工信息:显示公司内部所有职工的信息
●删除离职职工:按照编号删除指定的职工
●修改职工信息:按照编号修改职工个人信息
●查找职工信息:按照职工的编号或者职工的姓名进行查找相关的人员信息
●按照编号排序:按照职工编号,进行排序,排序规则由用户指定
●清空所有文档:清空文件中记录的所有职工信息(清空前需要再次确认,防止误删)
初始化界面:
三、代码实现
main.cpp
#include<iostream>
#include<string>
#include"WorkerManager.h"
#include"worker.h"
#include"employee.h"
#include"manager.h"
#include"boss.h"
using namespace std;int main()
{WorkerManager wm;int chice=0;while(true){wm.Show_Menu(); //显示菜单cout<<"请输入您的选择:"<<endl;cin>>chice;switch(chice){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;
}
WorkerManager.h
#ifndef __WORKMANAGER_H_
#define __WORKMANAGER_H_#include<iostream>
#include<string>
#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();~WorkerManager();void Show_Menu(); //展示菜单 void ExitSystem(); //退出系统 void Add_Emp(); //添加职工 void save(); //保存文件 void init_Emp(); //初始化员工 void Show_Emp(); //显示职工void Del_Emp(); //删除职工int IsExist(int id); //按照职工编号判断职工是否存在,若存在返回职工在数组中的位置,不存在返回-1 void Mod_Emp(); //修改职工 void Find_Emp(); //查找职工 void Sort_Emp(); //排序职工 void Clean_File(); //清空文件 int EmpNum; //记录职工人数 Worker **EmpArray; //职工数组指针 bool FileIsEmpty; //判断文件是否为空 标志int get_EmpNum(); //统计文件中人数 };#endif
WorkerManager.cpp
#include"WorkerManager.h"WorkerManager::WorkerManager()
{ifstream ifs;ifs.open(FILENAME,ios::in); //读文件// 1、文件不存在情况 if(!ifs.is_open()) {
// cout<<"文件不存在"<<endl;this->EmpNum=0; //初始化记录人数 this->EmpArray=NULL; //初始化数组指针this->FileIsEmpty=true; //初始化文件是否位空 ifs.close(); //关闭文件 return;}// 2、文件存在,但数据为空char ch;ifs>>ch;if(ifs.eof()) {
// cout<<"文件为空!"<<endl;this->EmpNum=0; //初始化记录人数 this->EmpArray=NULL; //初始化数组指针this->FileIsEmpty=true; //初始化文件是否位空 ifs.close(); //关闭文件 return;} // 3、文件存在,并且记录数据int num=this->get_EmpNum();
// cout<<"职工人数为:"<<num<<endl;this->EmpNum=num; this->EmpArray=new Worker*[this->EmpNum]; //开辟空间this->init_Emp(); //将文件中的数据 存到数组中 、//测试
// for(int i=0;i<this->EmpNum;i++)
// {
// cout<<"职工编号:"<<this->EmpArray[i]->Id<<"\t姓名:"<<this->EmpArray[i]->Name<<"\t部门编号:"<<this->EmpArray[i]->DeptId<<endl;
// } }WorkerManager::~WorkerManager()
{if(this->EmpArray!=NULL){for(int i=0;i<this->EmpNum;i++){if(this->EmpArray[i]!=NULL){delete this->EmpArray[i];}}delete[] this->EmpArray;this->EmpArray=NULL;}
}//菜单
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->EmpNum+addNum; //新空间人数=原来记录人数 + 新增人数Worker **newSpace=new Worker *[newSize]; //开辟新空间if(this->EmpArray!=NULL){for(int i=0;i<this->EmpNum;i++){newSpace[i]=this->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->EmpNum+i]=worker; }delete[] this->EmpArray; //释放原有空间 this->EmpArray=newSpace; //更新新空间指向 this->EmpNum=newSize; //更新新的职工人数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->EmpNum;i++){ofs<<this->EmpArray[i]->Id<<" "<<this->EmpArray[i]->Name<<" "<<this->EmpArray[i]->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->EmpArray[index]=worker;index++; } ifs.close(); //关闭文件
} //显示职工
void WorkerManager::Show_Emp()
{if(this->FileIsEmpty){cout<<"文件不存在或记录为空!"<<endl;}else{for(int i=0;i<EmpNum;i++){this->EmpArray[i]->showInfo(); //利用多态调用接口 }}system("pause");system("cls");
} //删除职工
void WorkerManager:: Del_Emp()
{if(this->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->get_EmpNum()-1;i++){this->EmpArray[i]=this->EmpArray[i+1];}this->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->EmpNum;i++){if(this->EmpArray[i]->Id==id){index=i;break;}} return index;
}//修改职工
void WorkerManager:: Mod_Emp()
{if(this->FileIsEmpty){cout<<"文件不存在或记录为空!"<<endl;}else{cout<<"请输入修改职工的编号:"<<endl;int id;cin>>id;int ret=this->IsExist(id);if(ret!=-1) //查找到编号的职工 {delete this->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->EmpArray[ret]=worker; //更新数据 到数组中cout<<"修改成功!"<<endl;this->save(); //保存到文件中 }else {cout<<"修改失败,查无此人!"<<endl;} }system("pause");system("cls");
} //查找职工
void WorkerManager::Find_Emp()
{if(this->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->EmpArray[ret]->showInfo();}else{cout<<"查找失败,查无此人!"<<endl;}}else if(select==2) //按姓名查找{string name;cout<<"请输入要查找的姓名:"<<endl;cin>>name;bool flag=false; //查找到的标志for(int i=0;i<EmpNum;i++){if(EmpArray[i]->Name==name){cout<<"查找成功,职工编号:"<<EmpArray[i]->Id<<"号的信息如下:"<<endl;flag=true;this->EmpArray[i]->showInfo();}}if(flag==false){cout<<"查找失败,查无此人"<<endl;} }else{cout<<"输入选项有误!"<<endl;} }system("pause");system("cls");
}//排序职工
void WorkerManager::Sort_Emp()
{if(this->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<EmpNum;i++){int minOrMax=i;for(int j=i+1;j<EmpNum;j++){if(select==1) //升序{if(EmpArray[minOrMax]->Id > EmpArray[j]->Id){minOrMax=j;}}else //降序 {if(EmpArray[minOrMax]->Id < EmpArray[j]->Id){minOrMax=j;}} }if(i!=minOrMax){Worker *temp=EmpArray[i];EmpArray[i]=EmpArray[minOrMax];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->EmpArray!=NULL){for(int i=0;i<this->EmpNum;i++){if(this->EmpArray[i]!=NULL){delete this->EmpArray[i];}}this->EmpNum=0;delete[] this->EmpArray;this->EmpArray=NULL;this->FileIsEmpty=true;}cout<<"清空成功!"<<endl;}system("pause");system("cls");
}