职工管理系统
系统简介
管理系统中需要实现的功能如下:
0、退出管理程序:退出当前管理系统。
1、增加职工信息:实现批量添加职工功能,将信息录入到文件中,职工信息为:职工编号、姓名、部门编号
2、显示职工信息:显示公司内部所有职工的信息
3、删除离职职工:按照编号删除指定的职工
4、修改职工信息:按照编号修改职工个人信息
5、查找职工信息:按照职工的编号或者职工的姓名进行查找相关的人员信息
6、按照编导排序:按照职工编号,进行排序,排序规则由用户指定
7、清空所有文档:清空文件中记录的所有职工信息(清空前需要再次确认,防止误删)
公司中职工分为三类:普通员工、经理、老板,显示信息时需要显示职工编号、职工姓名、职工岗位、以及职责。普通员工职责:完成经理交给的任务;经理职责:完成老板交给的任务,并下发任务给员工;老板职责:管理公司所有事务。
首先先创建一个管理类class WorkerManager{};
管理类负责的内容如下:
与用户的沟通菜单界面
对职工进行增删查改的操作
与文件的读写交互
在管理类中定义构造函数:WorkerManage ();
展示功能的菜单界面:void showMenu();
。菜单界面的函数实现如下:
//菜单界面
void WorkerManage ::showMenu ()
{
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;
}
0、退出管理程序
退出管理程序即退出当前管理系统。实现相对来说比较简单。首先先在管理类的头文件中声明一个退出程序的函数:void exitSystem();
函数的具体实现如下:
//0.退出管理程序
void WorkerManage ::exitSystem ()
{
cout<<"欢迎下次使用"<<endl;
system ("pause");
exit(0);//只要调用此函数,程序退出
}
1、增加职工信息
1.1 创建职工类
在增加职工信息这一块需要实现的功能有批量增加职工功能。并且要将这些职工信息保存到一个文本文档中。这里我们创造一个职工类作为父类,然后创建普通员工、经理、老板三个类作为子类,继承父类。类的声明如下:
class Worker{
public:
//显示个人信息
virtual void showInfo()=0;
//获取岗位信息
virtual string getDeptName()=0;
virtual int getID()=0;
virtual string getname()=0;
int m_id;
string m_name;
int m_deptid;
};
class employee:public Worker {
public:
//构造函数
employee (int id, string name,int dId);
//显示个人信息
void showInfo();
//获取岗位信息
string getDeptName();
};
class Manager:public Worker {
public:
//构造函数
Manager (int id, string name,int dId);
//显示个人信息
void showInfo();
//获取岗位信息
string getDeptName();
};
class boss:public Worker {
public:
//构造函数
boss (int id, string name,int dId);
//显示个人信息
void showInfo();
//获取岗位信息
string getDeptName();
};
1.2 添加职工信息
在管理类的头文件中声明增加职工信息的函数void addEmp();
在具体的函数实现如下:
//1.增加职工信息
void WorkerManage ::addEmp (){
cout<<"请输入增加职工数量:"<<endl;
int addNum=0;
cin>>addNum ;
if(addNum >0)
{
//计算新的空间大小
int newsize=m_EmpNum +addNum;
//开辟新空间
Worker ** newSpace=new Worker *[newsize];
//将原空间下的内容存放到新空间下
if(m_EmpArray !=NULL)
{
for (int i=0;i<m_EmpNum ;i++)
{
newSpace [i]=m_EmpArray [i];
}
}
//批量添加新成员
for (int i=0;i<addNum ;i++)
{
int id,dSlect;
string name;
cout<<"请输入第"<<i+1<<"个新员工编号: ";
cin>>id;
cout<<endl;
cout<<"请输入第"<<i+1<<"个新员工姓名: ";
cin>>name ;
cout<<endl;
cout<<"请输入第"<<i+1<<"个新员工岗位: ";
cout<<"1、普通员工";
cout<<"2、经理";
cout<<"3、老板"<<endl;
cin>>dSlect ;
cout<<endl;
Worker * worker =NULL;
switch(dSlect )
{
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 [m_EmpNum +i]=worker ;
}
//释放原有空间
delete[] m_EmpArray ;
//更新新空间指向
m_EmpArray =newSpace ;
//更新新的个数
m_EmpNum =newsize ;
//文件是否为空
m_FILEISEMPTY =false;
//提示信息
cout<<"成功添加"<<addNum <<"名新职员"<<endl;
//成功添加后保存到文件中
this->save();
}
else
{
cout<<"输入有误!"<<endl;
}
system ("pause");
system("cls");
}
1.3 文件交互
同时定义一个把职工信息写到文件中的函数void save();
具体函数实现如下:
//把职工信息写到文件中
void WorkerManage ::save(){
//创建文件流
ofstream ofs;
ofs.open (FILENAME ,ios::out );
for(int i=0;i<m_EmpNum ;i++)
{
ofs<<m_EmpArray [i]->m_id <<" ";
ofs <<m_EmpArray [i]->m_name <<" ";
ofs<<m_EmpArray [i]->m_deptid <<endl;
}
ofs.close ();
}
2、显示职工信息
显示职工信息即将文本文件中的内容读出来。具体的函数实现如下:
//构造函数
WorkerManage ::WorkerManage ()
{
m_FILEISEMPTY =false;
m_EmpNum =0;
m_EmpArray =NULL;
ifstream ifs;
ifs.open (FILENAME ,ios::in);
//1、文件不存在情况
if(!ifs.is_open() )
{
m_EmpNum =0;
m_FILEISEMPTY =true;
m_EmpArray =NULL;
ifs.close ();
return;
}
//2、文件存在,并且没有记录
char ch;
ifs>>ch;
if(ifs.eof())
{
m_EmpNum =0;
m_FILEISEMPTY =true;
m_EmpArray =NULL;
ifs.close ();
return;
}
//3、文件存在,并且记录数据
int num=get_empNum ();
// cout<<"职工人数为:"<<num<<endl;
m_EmpNum =num;
//根据职工数创建数组 开辟空间
m_EmpArray =new Worker *[m_EmpNum ];
//初始化职工 将文件中的数据存在数组中
init_Emp ();
}
}
//2.显示职工信息
void WorkerManage ::show_Emp(){
if(m_FILEISEMPTY )
{
cout<<"文件不存在或记录为空!"<<endl;
}
else
{
for(int i=0;i<m_EmpNum ;i++)
{
//利用多态调用接口
m_EmpArray [i]->showInfo ();
}
}
system ("pause");
system("cls");
}
3、删除离职职工
数组中删除的本质就是数据前移从删除位置的开始,将其后一位前移
//3.删除离职职工
void WorkerManage ::Del_Emp(){
if(m_FILEISEMPTY )
{
cout<<"没有可以删除的人!"<<endl;
}
else
{
//按照职工编号删除
cout<<"请输入要删除职工的编号:";
int DelID=0;
cin>>DelID ;
cout<<endl;
if(IsExist (DelID )==-1){
//职工不存在
cout<<"职工不存在!删除失败"<<endl;
}
else{
//职工存在且要删除该位置的职工(删除的本质即数据前移)
for(int i=IsExist (DelID );i<m_EmpNum ;i++)
{
m_EmpArray [i]=m_EmpArray [i+1];
}
m_EmpNum --;
//同步更新到文件中
save ();
cout<<"删除成功!"<<endl;
}
}
system ("pause");
system("cls");
}
4、修改职工信息
//4.修改职工信息
void WorkerManage ::Mod_Emp()
{
if(m_FILEISEMPTY )
{
cout<<"文件不存在或记录为空"<<endl;
}
else
{
cout<<"请输入要修改的职工编号:";
int MODID;
cin>>MODID ;
cout<<endl;
if(IsExist (MODID )==-1)
{
cout<<"编号不存在!"<<endl;
}
else
{
delete this->m_EmpArray [IsExist (MODID )];
int id=0,dSlect=0;
string name="";
cout<<"请输入修改后的员工编号: ";
cin>>id;
cout<<endl;
cout<<"请输入修改后的员工姓名: ";
cin>>name ;
cout<<endl;
cout<<"请输入修改后的员工岗位: ";
cout<<"1、普通员工";
cout<<"2、经理";
cout<<"3、老板"<<endl;
cin>>dSlect ;
cout<<endl;
Worker * worker =NULL;
switch(dSlect )
{
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;
}
m_EmpArray [IsExist (MODID )]=worker ;
//同步更新到文件中
save ();
cout<<"修改成功!"<<endl;
}
}
system ("pause");
system("cls");
}
5、查找职工信息
//5.查找职工信息 两种查找方式:按职工编号 按职工姓名
void WorkerManage ::Find_Emp()
{
if(m_FILEISEMPTY )
{
cout<<"文件不存在或记录为空!"<<endl;
}
else
{
cout<<"请输入查找方式:1、按职工编号 2、按职工姓名";
int select=0;
cin>>select ;
cout<<endl;
if(select ==1)
{
//按职工编号查找
cout<<"请输入要查找职工的编号";
int FindID;
cin>>FindID ;
cout<<endl;
if(IsExist(FindID ) ==-1)
{
cout<<"查找的职工不存在!"<<endl;
}
else
{
m_EmpArray [IsExist (FindID )]->showInfo ();
}
}
else if(select ==2)
{
//按职工姓名查找
cout<<"请输入要查找职工的姓名:";
string FindName;
cin>>FindName ;
cout<<endl;
bool flag=false;
for(int i=0;i<m_EmpNum ;i++)
{
if(m_EmpArray [i]->m_name ==FindName )
{
m_EmpArray [i]->showInfo ();
cout<<endl;
flag=true;
}
}
if(!flag)
{
cout<<"查无此人!"<<endl;
}
}
else
{
cout<<"输入有误!"<<endl;
}
}
system ("pause");
system("cls");
}
6、按照编号排序
//6.按照编号排序(选择排序法) 两种排序方式:1、按职工号升序 2、按职工号降序
void WorkerManage ::Sort_Emp()
{
if(m_FILEISEMPTY )
{
cout<<"文件不存在或记录为空!"<<endl;
}
else
{
cout<<"请选择排序方式:1、按职工号升序 2、按职工号降序"<<endl;
int select;
cin>>select ;
cout<<endl;
for(int i=0;i<m_EmpNum ;i++)
{
int MinorMax=i;
for(int j=i+1;j<m_EmpNum ;j++)
{
if(select ==1)
{
//1、按职工号升序
if(m_EmpArray [MinorMax ]->m_id >m_EmpArray [j]->m_id )
{
MinorMax =j;
}
}
else
{
//2、按职工号降序
if(m_EmpArray [MinorMax ]->m_id <m_EmpArray [j]->m_id )
{
MinorMax =j;
}
}
}
if(i!=MinorMax )
{
Worker *temp=m_EmpArray [MinorMax ];
m_EmpArray [MinorMax ]=m_EmpArray [i];
m_EmpArray [i]=temp ;
}
}
cout<<"排序后的结果为:"<<endl;
save ();
show_Emp ();
}
system ("pause");
system("cls");
}
7、清空所有文档
//7.清空所有文档
void WorkerManage ::Clear_Emp()
{
if(m_FILEISEMPTY )
{
cout<<"文件不存在或记录为空!"<<endl;
}
else
{
cout<<"请您再次确定是否要清空职工信息:1、清空 2、返回"<<endl;
int select;
cin>>select;
cout<<endl;
if(select !=1)
{
cout<<"即将退回到上一步!"<<endl;
}
else
{
ofstream ofs(FILENAME ,ios::trunc );
ofs.close ();
if(m_EmpArray !=NULL)
{
for (int i=0;i<m_EmpNum ;i++)
{
if(m_EmpArray [i]!=NULL)
{
delete this->m_EmpArray [i];
}
}
m_EmpNum =0;
delete[] this ->m_EmpArray;
m_EmpArray =NULL;
m_FILEISEMPTY=true ;
}
cout<<"职工信息已清空!"<<endl;
}
}
system ("pause");
system("cls");
}
主函数的调用
#include<iostream>
#include<string>
using namespace std;
#include<fstream>
#include"WorkerManager.h"
#include"Worker.h"
int main()
{
//实例化管理者对象
WorkerManage WM;
int choice=0;
while(true)
{
WM.showMenu();
cout<<"请输入你的选择:"<<endl;
cin>>choice ;
switch(choice )
{
case 0: //0.退出管理程序
WM.exitSystem ();
break ;
case 1: //1.增加职工信息
WM .addEmp ();
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 .Clear_Emp ();
break ;
default:
system ("cls");
break;
}
}
system ("pause");
return 0;
}