C++ 学习心得第二期 基于多态的职工管理系统

一、基于work.h 为基类的员工类设计

1、work.h

#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;
};

2、boss.h

#include"worker.h"
class Boss :public Worker{
public:
	Boss(int id, string name, int dId);
	void showInfo();
	string getDeptName();
};

3、boss.cpp

	#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("老板");
	}

4、employee.h

#pragma
#include"worker.h"

class Employee:public Worker {
public:
	//构造函数
	//显示个人信息
	//获取职位名称
	Employee(int id,string name,int dId);
	 void showInfo() ;
	 string getDeptName() ;

};

5、employee.cpp

#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("员工");
}

6、manager.h

#include"worker.h"
class Manager :public Worker{
public:
	Manager(int id, string name, int dId);
	void showInfo();
	string getDeptName();
};

7、manager.cpp

#include"worker.h"
class Manager :public Worker{
public:
	Manager(int id, string name, int dId);
	void showInfo();
	string getDeptName();
};

二、员工控制类的设计与实现

1.workerManager.h

#pragma once
#include<iostream>
#include<string>
using namespace std;
#include"employee.h"
#include"manager.h"
#include"boss.h"
#include<fstream>
#define FILENAME "empFile.txt"
class WorkerManager{
public:
	WorkerManager();
	//展示菜单出
	void Show_Menu();
	//退出菜单
	void existSystem();
	//记录文件中的人数
	int m_EmpNum;
	//员工的数组指针
	Worker** m_EmpArray;
	//增加员工
	void Add_Emp();
	//保存文件
	void save();
	//设置判断文件是否为空的标志
	bool m_FileIsEmpty;
	//统计人数
	int get_EmpNum();
	//初始化数组
	void init_Emp();
	//显示职工
	void Show_Emp();
	//测试职工是否存在
	int IsExist(int id);
	//删除职工
	void Del_Emp();
	//修改职工
	void Mod_Emp();
	//查找职工
	void Find_Emp();
	//排序
	void Sort_Emp();
	//清空文件
	void Clean_File();
	~WorkerManager();

};

2.workerManager.cpp

#include "workerManager.h"
WorkerManager::WorkerManager()
{
	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;
	}
	//文件存在为空情况下
	char ch;
	ifs >> ch;
	if (ifs.eof())
	{
		cout <<"文件为空!" << endl;
		this->m_EmpNum = 0;
		this->m_EmpArray = NULL;
		this->m_FileIsEmpty = true;
		ifs.close();
		return;
	}
	//文在存在需要加载
	int num = this->get_EmpNum();
	this->m_EmpNum = num;
	this->m_EmpArray = new Worker*[this->m_EmpNum];
	init_Emp();


}

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::existSystem(){

	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;
			while (true)
			{
				bool flag=false;
				cout <<"请输入第" <<i+1<<"个新职工编号"<< endl;
				cin >> id;
				int ret = IsExist(id);
				if (ret==-1)
				{
					break;
				}
				else
				{
					cout <<"输入编号重复请重新输入" << endl;
				}

			}

			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,dSelect);
				break;
			case 2:
				worker = new Manager(id, name, dSelect);
				break;
			case 3:
				worker = new Boss(id, name, dSelect);
				break;
			}
			newSpace[this->m_EmpNum + i] = worker;
		}
		//释放原来的空间
		delete[] this->m_EmpArray;
		//更新空间的指向
		this->m_EmpArray = newSpace;
		//更新个数
		this->m_EmpNum = newSize;
		//提示信息
		cout <<"添加完毕" <<addNum<<"名员工"<< endl;
		this->save();
		this->m_FileIsEmpty = false;
	}
	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++;
	}
	ifs.close();
	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->m_EmpArray[index] = worker;
		index++;

	}
}
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");
}
//判断编号是否存在
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)
		{
			for (int i = index;i<this->m_EmpNum;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];
			string newname;
			int selectId;
			cout << "请修改职工的名字" << endl;
			cin >> newname;
			cout << "请修改职工的部门编号"<< endl;
			cin >> selectId;
			Worker *worker = NULL;
			switch (selectId)
			{
			case 1:
				worker = new Employee(id,newname,selectId);
				break;
			case 2:
				worker = new Manager(id, newname, selectId);
				break;
			case 3:
				worker = new Boss(id, newname, selectId);
				break;
			}
			//将数据更改到数组中
			this->m_EmpArray[ret] = worker;
			//保存到文件中
			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<this->m_EmpNum;i++)
			{
				if (m_EmpArray[i]->m_Name==name)
				{
					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<this->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)
	{
		ofstream ofs(FILENAME,ios::trunc);
		ofs.close();
		if (this->m_EmpArray!=NULL)
		{
			for (int i = 0;i<this->m_EmpNum;i++)
			{
				if (this->m_EmpArray[i] != NULL)
				{
					delete m_EmpArray[i];
				}
				this->m_EmpNum = 0;
				delete[] m_EmpArray;
				this->m_EmpArray = NULL;
				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++)
		{

			delete m_EmpArray[i];
			m_EmpArray[i] = NULL;
		}

	}
}

三、职工管理类的设计与实现

1、职工管理系统.cpp

#include"workerManager.h"
//测试manager boss employee 等类的构建
//void test()
//{
//	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;
//}
int main()
{
	WorkerManager wm;
	int choice = 0;
	while (true)
	{
		wm.Show_Menu();
		cout << "请输入您的选择" << endl;
		cin >> choice;
		switch (choice)
		{
		case 0://退出系统
			wm.existSystem();
			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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值