1.boos

2.employee

3.manager

4.workManage

5.worker.h

6.职工管理系统.cpp


1.boos

​//boss头文件
#pragma once
#include<iostream>
using namespace std;
#include "worker.h"

class Boss :public Worker
{

public:
	//构造函数
	Boss(int id, string name, int did);
	//显示个人信息
	virtual void showinfo();
	//获取岗位名称
	virtual string getdepartname();
};




​

 

#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->getdepartname()
		<< "\t岗位职责:完成公司所有的任务" << endl;
}
//获取岗位名称
string Boss::getdepartname()
{
	return string("老板");
}

 

2.employee

//普通员工头文件
#pragma once
#include<iostream>
using namespace std;
#include "worker.h"

class Employee:public Worker
{

public:
	//构造函数
	Employee(int id, string name, int did);
	//显示个人信息
	virtual void showinfo() ;
	//获取岗位名称
	virtual string getdepartname();
};





 

#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->getdepartname()
		<< "\t岗位职责:完成经理交给的任务" << endl;
}
//获取岗位名称
string Employee::getdepartname()
{
	return string("员工");
}

 

3.manager

//经理头文件
#pragma once
#include<iostream>
using namespace std;
#include "worker.h"

class Manager :public Worker
{
public:
	//构造函数
	Manager(int id, string name, int did);
	//显示个人信息
	virtual void showinfo() ;
	//获取岗位名称
	virtual string getdepartname();

};








 

#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->getdepartname()
		<< "\t岗位职责:完成老板交给的任务" << endl;
}

//岗位名称
string Manager::getdepartname()
{
	return string("经理");
}

 

4.workManage

#pragma once //防止头文件重复
#include<iostream>	//包含输入输出流头文件
using namespace std;//使用标准命名空间
#include"worker.h"
#include <fstream>
#define FILENAME "empfile.txt"
class WorkManage
{
public:
	//构造函数
	WorkManage();
















































	//显示菜单
	void showmenu();














    //退出功能
	void Exit();

	//记录职工数
	int m_num;
	//记录职工数组指针
	Worker ** m_emparray;
	//增加员工
	void add_emp();

















































































    //保存
	void save();
	bool file_isempty;













	//统计文件中的人数
	int get_empnum();
















	//初始化员工
	void init_emp();































	//显示职工
	void show_emp();



















	//删除职工
	void del_emp();




































	//判断职工是否存在
	int isexist(int id);














	//修改职工信息
	void modify_emp();

































































	//查找职工信息
	void find_emp();








































































	// 职工编号排序
	void sort_emp();






















































	//清空文件
	void clear_file();






























//析构函数
	~WorkManage();
};






 

#include "workManage.h"
#include "employee.h"
#include "manager.h"
#include "boss.h"


WorkManage::WorkManage()
{
	//1.文件不存在
	ifstream ifs;
	ifs.open(FILENAME, ios::in);
	if (!ifs.is_open())
	{
		cout << "文件不存在" << endl;
		//初始化属性
		//初始化记录人数
		this->m_num = 0;
		//初始化数组指针
		this->m_emparray = NULL;
		//初始化文件是否存在
		this->file_isempty = true;
		ifs.close();
		return;
	}
	//2.文件存在,文件为空
	char ch;
	ifs >> ch;
	if (ifs.eof())
	{
		cout << "文件为空" << endl;
		//初始化属性
		//初始化记录人数
		this->m_num = 0;
		//初始化数组指针
		this->m_emparray = NULL;
		//初始化文件是否为空
		this->file_isempty = true;
		ifs.close();
		return;
	}
	//3.文件存在记录数据
	int num  = this->get_empnum();
	//cout << "文件中职工人数为" << num << endl;
	this->m_num = num;

	//3.初始化员工
	//开辟空间
	this->m_emparray = new Worker*[this->m_num];
	//将文件中数据,存到数组中
	this->init_emp();

	////测试代码遍历
	//for (int i = 0; i<this->m_num; i++)
	//{
	//	cout << "职工编号 " << this->m_emparray[i]->m_id
	//		<< " 姓名 " << this->m_emparray[i]->m_name
	//		<< " 部门 " << this->m_emparray[i]->m_deptid << endl;
	//}
}
//显示菜单
void WorkManage::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;

}
//退出功能
void WorkManage::Exit()
{
	cout << "欢迎下次使用" << endl;
	system("pause");
	exit(0); //退出程序
}
//添加职工
void WorkManage::add_emp()
{
	cout << "请输入添加职工数量" << endl;
	int addnum = 0; //保存用户的输入数量
	cin >> addnum;
	if (addnum > 0)
	{
		//添加
		//计算添加新空间大小
		int newsize = this->m_num + addnum; //新空间人数=原来记录人数+新增人数
		//开辟新空间
		Worker** newspace = new Worker * [newsize];
		//将原来空间下数据拷贝新空间下
		if (this->m_emparray != NULL)
		{
			for (int i = 0; i < this->m_num; 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 << "请输入第" << i + 1 << "个新职工部门" << 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_num + i] = worker;

		}
		//释放原有空间
		delete[] this->m_emparray;
		//更新新空间指向
		this->m_emparray = newspace;
		//更新新的职工人数
		this->m_num = newsize;
		//更新职工文件不为空
		bool file_isempty = false;

		//提示添加成功
		cout << "成功添加" << addnum << "名新职工" << endl;

		save(); //保存文件
		//清屏
		system("pause");
		system("cls");

	}
	else
	{
		cout << "输入有误" << endl;

	}
	
}

//保存txt文件到文件夹
void WorkManage::save()
{
	ofstream ofs;
	ofs.open(FILENAME, ios::out);	//用输出方式打开文件, 写文件
	//将每个人数据写到文件中
	for (int i = 0; i < m_num; i++)
	{
		ofs << m_emparray[i]->m_id << " "
			<< m_emparray[i]->m_name << " "
			<< m_emparray[i]->m_deptid << endl;
	}
	//关闭文件
	ofs.close();
}

//统计文件中的人数
int WorkManage::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 WorkManage::init_emp()
{
	ifstream ifs;
	ifs.open(FILENAME, ios::in);
	int id;
	string name;
	int did;

	int indext = 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->m_emparray[indext] = worker;
		indext++;

	}
	//关闭文件
	ifs.close();
}

//显示职工
void WorkManage::show_emp()
{
	if (this->file_isempty)
	{
		cout << "文件为空或不存在" << endl;
	}
	else
	{
		for (int i = 0; i < this->m_num; i++)
		{
			//利用多态调用程序接口
			this->m_emparray[i]->showinfo();
		}

	}
	//按任意键清屏
	system("pause");
	system("cls");
}

//删除职工
void WorkManage::del_emp()
{
	if(this->file_isempty)
	{ 
		cout << "文件不存在或记录为空" << endl;
	}
	else
	{
		//按照职工号删除
		cout << "请要输入删除的职工id" << endl;
		int id = 0;
		cin >> id;
		int index = this->isexist(id);
		if (index != -1)	//证明职工存在,并且删掉index上职工
		{
			for (int i = 0; i < this->m_num; i++)
			{
				//数据前移
				this->m_emparray[i] = this->m_emparray[i + 1];
			}
			this->m_num--; //更新记录中人员个数
			this->save(); //数据同步更新保存到文件中
			cout << "删除员工成功" << endl;

		}

		else
		{
			cout << "职工不存在" << endl;

		}
	}
	system("pause");
	system("cls");

}

//判断职工是否存在
int WorkManage::isexist(int id)
{
	int index = -1;
	for (int i = 0; i < this->m_num; i++)
	{
		if (this->m_emparray[i]->m_id == id)
		{
			//找到职工
			index = i;
			break;
		}
		
	}
	return index;
}
//修改职工信息
void WorkManage::modify_emp()
{
	if (this->file_isempty)
	{
		cout << "文件不存在或记录为空" << endl;

	}
	else
	{
		cout << "请输入要修改的职工id" << endl;
		int id = 0;
		cin >> id;
		int index = this->isexist(id);
		if (index != -1)
		{
			//查找员工编号删除员工后在修改,
			delete this->m_emparray[index];
			int new_id = 0;
			string new_name = "";
			int new_did = 0;
			cout << "请输入新的id" << endl;
			cin >> new_id;
			cout << "请输入新的名字" << endl;
			cin >> new_name;

			cout << "请输入新的部门id" << endl;
			cout << "1.普通员工" << endl;
			cout << "2.经理" << endl;
			cout << "3.老板" << endl;
			cin >> new_did;

			Worker* worker = NULL;

			switch (new_did)
			{
			case 1:
				worker = new Employee(new_id, new_name, new_did);
				break;
			case 2:
				worker = new Manager(new_id, new_name, new_did);
				break;
			case 3:
				worker = new Boss(new_id, new_name, new_did);
				break;
			default:
				break;
			}
			//更新数据到数组中
			this->m_emparray[index] = worker;
			
			cout <<"修改成功"<<endl;
			//保存数据
			this->save();

		}
		else
		{
			cout << "修改失败,查无此人" << endl;

		}
	}

	system("pause");
	system("cls");
}

//查找职工信息
void WorkManage::find_emp()
{
	if (this->file_isempty)
	{
		cout << "查找文件不存在或记录为空" << endl;
		system("pause");
		system("cls");
	}
	else
	{
		cout << "请输入查找选项" << endl;
		cout << "1.按职工[编号]查找" << endl;
		cout << "2.按职工[姓名]查找" << endl;
		int select = 0;
		cin >> select;
		if (select == 1)
		{
			//2.按编号查找
			cout << "请输入查找的编号id" << endl;
			int id = 0;
			cin >> id;
			int ret = isexist(id);
			if (ret != -1)
			{
				cout << "按id找到此人,信息如下" << endl;
				this->m_emparray[ret]->showinfo();
				
			}
			else
			{
				cout << "查无此人" << endl;
			}

		}
		else if (select == 2)
		{
			//2.按姓名查找
			cout << "请输入查找姓名" << endl;
			string name;
			cin >> name;
			//加入是否查到标
			bool flag = false; //默认未找到职工
			for (int i = 0; i < this->m_num; i++)
			{
				
				if (this->m_emparray[i]->m_name == name)
				{
					cout << "找到id为:[" << this->m_emparray[i]->m_id << "]的员工,信息如下" << endl;
					//调用显示信息接口
					this->m_emparray[i]->showinfo();
					bool flage = true;
				}

			}
			if (flag == false)
			{
				cout << "按姓名查无此人" << endl;

			}
			
		}
		else
		{
			cout << "输入有误,请重新输入" << endl;
		}


	}
	system("pause");
	system("cls");
}


// 职工编号排序
void WorkManage::sort_emp()
{
	if (this->file_isempty)
	{
		cout << "文件不存在或记录为空" << endl;
	}
	else
	{
		cout << "请输入排序的方式(职工编号)" << endl;
		cout << "1.按升序排序" << endl;
		cout << "2.按降序排序" << endl;
		int select = 0;
		cin >> select;
		
		for (int i = 0; i < this->m_num; i++)
		{
			int maxormin = i; //声明最小值 或最大值下标
			for (int j = i + 1; j < m_num; j++)
			{
				if (select == 1) //升序

				{
					if (this->m_emparray[maxormin]->m_id > this->m_emparray[j]->m_id)
					{
						maxormin = j; //最小值下标更新
					}
				}
				else //降序
				{
					if (this->m_emparray[maxormin]->m_id < this->m_emparray[j]->m_id)
					{
						maxormin = j;//最大值下标更新
					}
				}
				
			}
			//判断一开始认定,最小值或最大值是不是计算的最小值或最大值,如果不是交换数据
			if (i != maxormin)
			{
				Worker* temp = this->m_emparray[i];
				this->m_emparray[i] = this->m_emparray[maxormin];
				this->m_emparray[maxormin] = temp;
			}

		}

		cout << "排序成功:结果为" << endl;
		this->save();
		this->show_emp(); //显示所有员工

	}
	

}

//清空文件
void WorkManage::clear_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->m_emparray != NULL)
		{
			//删除堆区的每个职工对象
			for (int i = 0; i < this->m_num; i++)
			{
				delete this->m_emparray[i];
				this->m_emparray[i] = NULL;
			}
			delete[] this->m_emparray;
			this->m_emparray = NULL;
			this->m_num = 0;
			this->file_isempty = true;

		}
		cout << "清空成功" << endl;
	}
	system("pause");
	system("cls");
}
//析构函数
WorkManage::~WorkManage()
{
	if (m_emparray != NULL)
	{
		delete[] this->m_emparray;
		this->m_emparray = NULL;
	}
}

 

 

 5.worker.h

#pragma once
#include <iostream>
using namespace std;
//职工抽象类
class Worker
{
public:
	//显示个人信息
	virtual void showinfo() = 0;
	//获取岗位名称
	virtual string getdepartname() = 0;

	//职工编号
	int m_id;
	//职工姓名
	string m_name;
	//部门编号
	int m_deptid;
};

 6.职工管理系统.cpp

#include<iostream>
using namespace std;
# include "workManage.h"
# include "employee.h"
#include "worker.h"
#include "manager.h"
#include "boss.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;

	//实例化管理者对象
	WorkManage wm;
	
	int choice = 0;
	while (true)
	{
		wm.showmenu();
		cout << "请输入您的选择" << endl;
		cin >> choice;

		switch (choice)
		{
		case 0: //退出系统
			wm.Exit();
			break;
		case 1: //增加职工信息
			wm.add_emp();
			break;
		case 2://显示职工信息
			wm.show_emp();
			break;
		case 3://删除离职职工
			wm.del_emp();
		//	//测试
		//{
		//	int ret = wm.isexist(-1);
		//	if (ret != -1)
		//	{
		//		cout << "职工存在" << endl;
		//	}
		//	else
		//	{
		//		cout << "职工不存在" << endl;
		//	}
		//}
			break;
		case 4://修改职工信息
			wm.modify_emp();
			break;
		case 5://查找职工信息
			wm.find_emp();
			break;
		case 6: //按照编号排序
			wm.sort_emp();
			break;
		case 7: //清空所有文档
			wm.clear_file();
			break;
		default:
			system("cls");
			break;

		}

	}
	
	system("pause");
	return 0;
}