职工管理系统

系统简介

管理系统中需要实现的功能如下:
  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;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值