164 职工管理系统代码问题

在这里插入图片描述

#pragma once//防止头文件重复包含
#include<iostream>//包含输入输出流头文件
using namespace std;//使用标准命名空间,使用cout cin
#include"worker.h"
#include"employee.h"
#include"manager.h"
#include"boss.h"

#include<fstream>
#define FILENAME "empFile.txt"

class WManager//在头文件里制作声明不作实现
{
public:
	WManager();//构造函数
	 
	void show_menu();//展示函数
	void Exitsystem();//退出界面函数声明
	int m_EmpNum;//记录职工人数
	Worker ** m_EmpAray;//创建职工数组指针的指针
	void Add_Emp();//添加职工函数
	void savef();//保存文件函数声明
	bool FileIsEmpty; //判断文件是否为空的标志
	int get_EmpNum();//如果文件不为空,获取文件中的员工人数
	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();//文件清空功能


	~WManager();//析构函数

};

#include"worker manager.h"
WManager::WManager()//在构造函数中初始化属性
{
	//情况1 文件不存在
	ifstream ifs;
	ifs.open(FILENAME, ios::in);
	if (!ifs.is_open())
	{
		cout << "文件不存在!" << endl;
		this->m_EmpNum = 0;//初始化人数为0
		this->m_EmpAray = NULL;//初始化数组指针为空
		this->FileIsEmpty = true;
		ifs.close();
		return;
	}
	//情况2 文件存在但是被清空了
	char ch;//创建一个字符
	ifs >> ch;//只读1个字符,如果这个字符时文件为标志
	if (ifs.eof())//判断字符是否文件尾标志,如果这个函数ifs.eof()为真 就是文件尾  代表文件为空没有数据
	{
		cout << "文件存在为空!" << endl;
		this->m_EmpNum = 0;//初始化人数为0
		this->m_EmpAray = NULL;//初始化数组指针为空
		this->FileIsEmpty = true;
		ifs.close();
		return;

	}

	//情况3 文件存在且有数据
	int num = this->get_EmpNum();
	cout << "职工的人数为: " << num << endl;
	this->m_EmpNum = num;//更新成员属性的人数m_EmpNum
	
	this->m_EmpAray = new Worker * [this->m_EmpNum];//开辟空间
	this->init_emp() ;//将文件中的数据存入数组中

	//测试代码
	/*for (int i = 0; i < this->m_EmpNum; i++)
	{
		cout << "职工编号: " << this->m_EmpAray[i]->m_ID <<
			"    职工姓名: " << this->m_EmpAray[i]->m_Name <<
			"    岗位编号: " << this->m_EmpAray[i]->m_DeptID << endl;

	}*/
}

void WManager::show_menu()//展示函数
{
	cout << "-------------------------------------------------" << endl;
	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;
	cout << endl;
}

void WManager::Exitsystem()//退出界面函数实现
{
	cout << "欢迎下次使用!" << endl;
	system("pause");
	exit(0);//退出程序
}

void WManager::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_EmpAray != NULL)//将原来的数据拷贝到新空间
		{
			for (int i = 0;i < this->m_EmpNum;i++)
			{
				newSpace[i] = this->m_EmpAray[i];
			}
		}

		for (int i = 0; i < addNum; i++)//批量添加新数据
		{
			int id;//职工编号
			string name;//职工姓名
			int depId;//职工部门
			cout << "请输入第 " << i + 1 << " 人的职工编号" << endl;
			cin >> id;

			for (int i = 0; i < this->m_EmpNum; i++)
			{
				if (this->m_EmpAray[i]->m_ID == id)//遍历数组找到职工(遇到的问题,在条件里面必须是==,!=的格式其他的代码都会出错)
				{
					cout << "请勿重复输入同一个职工编号!请重新输入编号" << endl;
					cin >> id;
				}
			}

			cout << "请输入第 " << i + 1 << " 人的职工姓名" << endl;
			cin >> name;
			for (int i = 0; i < this->m_EmpNum; i++)
			{
				if (this->m_EmpAray[i]->m_Name == name)
				{
					cout << "请勿重复输入同一个姓名!请重新输入姓名" << endl;
					cin >> name;

				}
			}

			cout << "请选择职工岗位编号 :" << endl;
			cout << "1 - 普通职工" << endl;
			cout << "2 - 经理" << endl;
			cout << "3 - 老板" << endl;
			cin >> depId;
			Worker* worker01 = NULL;//利用多态的方式,根据不同职工创建不同对象
			switch (depId)
			{
			case 1:
				worker01 = new Employee(id, name, 1);
				break;
			case 2:
				worker01 = new Manager(id, name, 2);
				break;
			case 3:
				worker01 = new Boss(id, name, 3);
				break;

			default:
				break;

			}
			//将创建的职工指针保存到数组里
			newSpace[this->m_EmpNum + i] = worker01;

		}
		delete[] this->m_EmpAray;//释放原有空间,释放数组要写成delete[]
		this->m_EmpAray = newSpace;//更改新空间指向
		this->m_EmpNum = newSize;//更改新人数

		this->FileIsEmpty = false;//添加员工后更新文件不为空

		cout << "成功添加 " << addNum << "名员工!!!" << endl;
		this->savef();//调用添加文件函数
	}




	else
	{
		cout << "输入有误!" << endl;
	}
	
	//按任意键后 回到上级目录
	system("pause");
	system("cls");

}

//成功添加后保存到文件中
void WManager::savef()//保存文件函数
{
	ofstream ofs;
	ofs.open(FILENAME, ios::out);//用输出方式打开文件,相当于写文件
	//将每一个人的数据写入到文件中
	for (int i = 0; i < m_EmpNum; i++)
	{
		ofs << this->m_EmpAray[i]->m_ID << "  "
			<< this->m_EmpAray[i]->m_Name << "  "
			<< this->m_EmpAray[i]->m_DeptID << "  " << endl;

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

int WManager::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)//用for循环把文件中数据依次读入
	{
		num++;
	}
	return num;
}

void WManager::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)//用for循环把文件中数据依次读入
	{
		Worker* worker = NULL;
		if (dId == 0)//是普通职工
		{
			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_EmpAray[index] = worker;
		index++;
	}
	ifs.close();

}

void WManager::show_emp()//显示职工信息
{
	//判断文件是否为空
	if (this->FileIsEmpty)
	{
		cout << "文件不存在或者文件记录为空" << endl;
	}
	else//如果不为空调用每个多态的接口
	{
		for (int i = 0; i < this->m_EmpNum; i++)
		{
			this->m_EmpAray[i]->showInfor();//利用多态调用程序接口
		}
	}
	//按任意键清屏
	system("pause");
	system("cls");
}

void WManager::Del_emp()//删除职工
{
	if (this->FileIsEmpty)
	{
		cout << "文件为空或者不存在!!!" << endl;
	}
	else
	{
		cout << "请输入删除的职工编号:" << endl;
		int id = 0;
		cin >> id;
		int index = this->IsExist(id);//把职工所在数组编号传到index
		if (index != -1)//index != -1说明职工存在执行删除功能
		{
			
			for (int i = index; i < this->m_EmpNum - 1; i++)
			{
				this->m_EmpAray[i] = this->m_EmpAray[i + 1];//数据前移
			}
			this->m_EmpNum--;//更新员工个数
			this->savef();//更新后保存到文件中
			cout << "删除成功!!!" << endl;

		}
		else
		{
			cout << "无此员工!" << endl;
		}

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

int WManager::IsExist(int id)//判断职工是否存在
{
	int index = -1;
	for (int i = 0; i < this->m_EmpNum; i++)
	{
		if (this->m_EmpAray[i]->m_ID ==id)//遍历数组找到职工(遇到的问题,在条件里面必须是==,!=的格式其他的代码都会出错)
		{
			index = i;
			break;//找到的话就结束循环
		}
	}
	return index;
}

void WManager::Mod_Emp()//修改职工信息
{
	if (this->FileIsEmpty)
	{
		cout << "文件为空或者不存在!!!" << endl;
	}
	else
	{
		cout << "请输入要修改的职工编号:" << endl;
		int id = 0;
		cin >> id;
		int index = this->IsExist(id);//把职工所在数组编号传到index
		if (index != -1)//index != -1说明职工存在执行删除功能
		{
			delete this->m_EmpAray[index];//把要删除的职工信息清空
			//创建新参数
			int newID = 0;
			string newName = "";//新名字为空字符
			int newDid = 0;
			cout << "查找到ID号为: " << id << " 的职工,请输入职工新编号: " << endl;
			cin >> newID;
			cout << "请输入新的名字: " << endl;
			cin >> newName;
			cout << "请输入新的部门编号: " << endl;
			cout << "请选择职工岗位编号 :" << endl;
			cout << "1 - 普通职工" << endl;
			cout << "2 - 经理" << endl;
			cout << "3 - 老板" << endl;
			cin >> newDid;

			Worker* worker01 = NULL;//利用多态的方式,根据不同职工创建不同对象
			switch (newDid)
			{
			case 1:
				worker01 = new Employee(newID, newName, newDid);
				break;
			case 2:
				worker01 = new Manager(newID, newName, newDid);
				break;
			case 3:
				worker01 = new Boss(newID, newName, newDid);
				break;

			default:
				break;

			}
			//更新数据 将创建的职工指针保存到数组里
			this->m_EmpAray[index] = worker01;
			this->savef();//保存到文件中
			cout << "修改成功!!!" << endl;


		}
		else
		{
			cout << "无此员工!" << endl;
		}

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


}

void WManager::Find_Emp()//查找职工
{
	if (this->FileIsEmpty)
	{
		cout << "文件为空或者不存在!!!" << endl;
	}
	else
	{
		cout << "请输入查找的方式:" << endl;
		cout << "1. 按职工编号查找 " << endl;
		cout << "2. 按职工姓名查找 " << endl;
		int select = 0;
		cin >> select;
		if (select == 1)//1. 按职工编号查找
		{
			int id = 0;
			cout << "请输入查找职工的编号: " << endl;
			cin >> id;

			int ret = this->IsExist(id);
			if (ret != -1)
			{
				cout << "找到这个人!  该职工的信息如下:   " << endl;
				this->m_EmpAray[ret]->showInfor();
			}
			else
			{
				cout << "查无此人!!" << endl;
			}
			
		}
		else if (select == 2)//2. 按职工姓名查找
		{
			string name;
			cout << "请输入要查找到姓名: " << endl;
			cin >> name;

			bool flag = false;//在for循环中插入一个是否查找到的标志
			for (int i = 0; i < m_EmpNum; i++)
			{
				if (this->m_EmpAray[i]->m_Name == name)
				{
					cout << "找到此人!这个人的编号为:"<<
						this->m_EmpAray[i]->m_ID<<"      此人的信息如下:" << endl;
					flag = true;
					 this->m_EmpAray[i]->showInfor() ;
				}
			
			}
			if (flag == false)
			{
				cout << "查找失败,无此人!!" << endl;
			}
		}
		else
		{
			cout << "输入有误,请重新输入!" << endl;
		}



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

void WManager::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<m_EmpNum;i++)
		{
			int minORmax = i;//声明一个最小值或者最大值(用户可能选择升序或者降序)
			for (int j = i + 1; j < this->m_EmpNum; j++)
			{
				if (select == 1)//升序
				{
					if (this->m_EmpAray[minORmax]->m_ID > this->m_EmpAray[j]->m_ID)
					{
						minORmax = j;
					}
				}
				else//降序
				{
					if (this->m_EmpAray[minORmax]->m_ID < this->m_EmpAray[j]->m_ID)
					{
						minORmax = j;
					}
				}
			}
			//判断一开始认定的 最大值或最小值 是不是遍历后的最大值或者最小值,如果不是交换数据
			if (i != minORmax)
			{
				Worker* temp = this->m_EmpAray[i];
				this->m_EmpAray[i] = this->m_EmpAray[minORmax];
				this->m_EmpAray[minORmax] = temp;
			}
			
		}
		cout << "排序成功,排序后的结果为:" << endl;
		this->savef();//把排序后的结果保存到文件里
		this->show_emp();//展示所有的职工,因为show_emp()函数有按任意键清屏所以这个函数不用重复清屏
	}












}


void WManager::clean_File()//文件清空功能
{
	cout << "确定清空吗?" << endl;
	cout << "1.YES" << endl;
	cout << "2.NO" << endl;

	int select = 0;
	cin >>select;

	if (select == 1)//清空文件
	{
		ofstream ofs(FILENAME, ios::trunc);//删除文件后重新创建
		ofs.close();
		if (this->m_EmpAray != NULL)
		{
			for (int i = 0; i < m_EmpNum; i++)//删除堆区的每个职工对象
			{
				delete this->m_EmpAray[i];
				this->m_EmpAray[i] = NULL;
			}
			//删除堆区数组指针
			delete[]this->m_EmpAray;
			this->m_EmpAray = NULL;
			this->m_EmpNum = 0;
			this->FileIsEmpty = true;
			
		}
		cout << "清空成功!" << endl;

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

}










WManager::~WManager()
{
	
	if (this->m_EmpAray != NULL)
	{
		delete[] this->m_EmpAray;//释放原有空间,释放数组要写成delete[]
		this->m_EmpAray = NULL;
	}
}



/*1.先创建一个职工管理类:用户沟通,文件读写删除增添显示*/
#pragma once//防止头文件重复包含
#include<iostream>//引入标准io流
#include<string>//输出字符串流
using namespace std;



/*创建职工抽象类:由于职工分为普通员工,经理,老板,可以将三个职工抽象到一个(worker)类中,利用多态对不同职工进行管理
(父类中写纯虚函数,子类中继承写具体实现,分别创建头文件和源文件继承父类)职工的属性有:职工编号,姓名,部门编号
职工的写为:岗位职责信息描述,获取岗位名称 */


//职工抽象类
class Worker//Worker类是一个抽象类,不需要任何实现,所以不需要创建Worker源文件,可以直接创建其子类
{
public:

	//显示个人信息
	virtual void showInfor() = 0;
	//获取部门名称
	virtual string getDeptName() = 0;

	//职工编号
	int m_ID;
	//姓名
	string m_Name;
	//部门编号
	int m_DeptID;
};
//普通员工头文件
#pragma once
#include<iostream>
#include"worker.h"
using namespace std;
class Employee:public Worker//出错是因为没有包含worker类的头文件
{//在头文件中只做声明,子类重写父类中的虚函数,virtual可删可不删
public:
	Employee(int ID,string name,int deID);//需要构造函数初始化成员属性变量

	//显示个人信息
	virtual void showInfor();
	
	//获取部门名称
	virtual string getDeptName();
	

};
#include"employee.h"

Employee::Employee(int ID, string name, int deID)//需要构造函数初始化成员属性变量
{
	this->m_ID = ID;
	this->m_Name = name;
	this->m_DeptID = deID;
}

	//显示个人信息
void Employee::showInfor()//具体实现时不写关键字virtual
{
	cout << "职工编号:" << this->m_ID
		<< "\t职工姓名:" << this->m_Name
		<< "\t所在部门:" << this->getDeptName()
		<<"\t岗位职责:完成经理交给的任务!"<< endl;
}
//获取部门名称
string Employee::getDeptName()
{
	return string("普通员工");
}

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

class Manager :public Worker//出错是因为没有包含worker类的头文件
{//在头文件中只做声明,子类重写父类中的虚函数,virtual可删可不删
public:
	Manager(int ID, string name, int deID);//需要构造函数初始化成员属性变量

	//显示个人信息
	virtual void showInfor();

	//获取部门名称
	virtual string getDeptName();


};
#include"manager.h"

Manager::Manager(int ID, string name, int deID)//需要构造函数初始化成员属性变量
{
	this->m_ID = ID;
	this->m_Name = name;
	this->m_DeptID = deID;
}

//显示个人信息
void Manager::showInfor()//具体实现时不写关键字virtual
{
	cout << "职工编号:" << this->m_ID
		<< "\t职工姓名:" << this->m_Name
		<< "\t所在部门:" << this->getDeptName()
		<< "\t        岗位职责:完成老板交给的任务,传达老板的命令!" << endl;
}
//获取部门名称
string Manager::getDeptName()
{
	return string("经理");
}

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

class Boss :public Worker//出错是因为没有包含worker类的头文件
{//在头文件中只做声明,子类重写父类中的虚函数,virtual可删可不删
public:
	Boss(int ID, string name, int deID);//需要构造函数初始化成员属性变量

	//显示个人信息
	virtual void showInfor();

	//获取部门名称
	virtual string getDeptName();


};

#include"boss.h"

Boss::Boss(int ID, string name, int deID)//需要构造函数初始化成员属性变量
{
	this->m_ID = ID;
	this->m_Name = name;
	this->m_DeptID = deID;
}

//显示个人信息
void Boss::showInfor()//具体实现时不写关键字virtual
{
	cout << "职工编号:" << this->m_ID
		<< "\t职工姓名:" << this->m_Name
		<< "\t所在部门:" << this->getDeptName()
		<< "\t        岗位职责:下达命令,监督经理和员工完成任务!" << endl;
}
//获取部门名称
string Boss::getDeptName()
{
	return string("老板");
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

磁生电

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值