C++职工管理系统,eof()函数,选择排序

news2024/11/22 22:11:27

目录

 1.创建管理类

 1.1头文件实现,在workerManager.h中设计管理类

1.2源文件实现,在workerManager.cpp中将构造和析构函数的空实现补全

2.菜单功能

2.1在管理类workerManager.h中添加菜单成员函数

 2.2在管理类workerManager.cpp中写实现

 3.退出功能

3.1在main函数中提供分支选择,system("cls");

 3.2实现退出功能,exit(0)

​编辑 3.2.1 .h中提供退出系统的成员函数 ​编辑

3.2.3在main函数中调用

4.创建职工类

4.1创建职工抽象类

 4.2创建普通员工类

 4.2.1创建.h头文件

 4.2.2创建.cpp的源文件

4.2.3main函数测试 

4.3创建经理类

​编辑4.3.1创建.h头文件

4.3.2创建.cpp的源文件 

4.3.3main函数中测试

 4.4创建老板类

4.4.1创建.h的头文件

4.4.2创建.cpp的源文件

4.4.3main函数测试 ,多态,一个接口有多种形态,创建的对象不同,形态也不同

5.添加职工

6.文件交互--写文件

6.1 设定文件路径

6.2源文件中实现保存的具体代码

6.3main函数测试

7.文件交互-读文件

 7.1第一次使用文件未创建

 7.2文件为空,eof()函数

7.3文件存在且保存职工数据

 7.3.1初始化职工人数

7.3.2初始化职工数组

7.4读文件的三种情况都已测试完毕可以将测试代码注释掉了

8.显示职工

8.1显示职工函数实现 

8.2main函数测试

9.删除职工

9.1职工是否存在函数实现以及删除职工函数实现 

9.2main函数测试

10.修改职工

10.1cpp中写实现 

 10.2main函数测试

11.查找职工

 11.1查找职工实现

11.2main函数测试

12.排序--选择排序

 12.1选择排序实现

12.2main函数测试

13.清空文件

 13.1析构函数的改进,以前写的有瑕疵

13.2清空函数实现

13.3main函数测试

 1.创建管理类

 1.1头文件实现,在workerManager.h中设计管理类

#pragma once//防止头文件重复包含
#include<iostream>//包含输入输出流头文件
using namespace std;//使用标准命名空间
class WorkManager
{
public:
	//构造函数
	WorkManager();

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

1.2源文件实现,在workerManager.cpp中将构造和析构函数的空实现补全

#include"workManager.h"

WorkManager::WorkManager()
{

}
WorkManager::~WorkManager()
{

}

2.菜单功能

2.1在管理类workerManager.h中添加菜单成员函数

#pragma once//防止头文件重复包含
#include<iostream>//包含输入输出流头文件
using namespace std;//使用标准命名空间
class WorkManager
{
public:
	//构造函数
	WorkManager();

	//展示菜单
	void Show_Menu();

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

 2.2在管理类workerManager.cpp中写实现

#include"workManager.h"

WorkManager::WorkManager()
{

}
WorkManager::~WorkManager()
{

}
void WorkManager::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;

}

在职工管理系统.cpp main函数中调用菜单展示

#include<iostream>
using namespace std;
#include"workManager.h"
int main()
{
	//实例化管理者对象
	WorkManager wm;

	//调用展示菜单的成员函数
	wm.Show_Menu();
	system("pause");

	return 0;
}

 3.退出功能

3.1在main函数中提供分支选择,system("cls");

#include<iostream>
using namespace std;
#include"workManager.h"
int main()
{
	//实例化管理者对象
	WorkManager wm;

	int choice = 0;//用来存储用户的选择
	while (true)
	{
		//调用展示菜单的成员函数
		wm.Show_Menu();
		cout << "请输入您的选择:" << endl;
		cin >> choice;
		switch (choice)
		{
		case 0://退出系统
			break;
		case 1://增加职工
			break;
		case 2://显示职工
			break;
		case 3://删除职工
			break;
		case 4://修改职工
			break;
		case 5://查找职工
			break;
		case 6://排序职工
			break;
		case 7://清空文档
			break;
		default:
			system("cls");//清屏操作
			//输入的不是0-7,就会删除掉输入,在循环
				break;
	    }
	}
	
	system("pause");

	return 0;
}

 3.2实现退出功能,exit(0)



 3.2.1 .h中提供退出系统的成员函数 

#pragma once//防止头文件重复包含
#include<iostream>//包含输入输出流头文件
using namespace std;//使用标准命名空间
class WorkManager
{
public:
	//构造函数
	WorkManager();

	//展示菜单
	void Show_Menu();

	//退出系统
	void ExitSystem();
	//析构函数
	~WorkManager();
};

3.2.2在.cpp中写具体实现 

#include"workManager.h"

WorkManager::WorkManager()
{

}
WorkManager::~WorkManager()
{

}
void WorkManager::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;

}
void WorkManager::ExitSystem()
{
	cout << "欢迎下次使用" << endl;
	system("pause");
	exit(0);//退出程序
	//不管在哪个地方调用,exit(0)都会退出
}

3.2.3在main函数中调用

#include<iostream>
using namespace std;
#include"workManager.h"
int main()
{
	//实例化管理者对象
	WorkManager wm;

	int choice = 0;//用来存储用户的选择
	while (true)
	{
		//调用展示菜单的成员函数
		wm.Show_Menu();
		cout << "请输入您的选择:" << endl;
		cin >> choice;
		switch (choice)
		{
		case 0://退出系统
			wm.ExitSystem();
			break;
		case 1://增加职工
			break;
		case 2://显示职工
			break;
		case 3://删除职工
			break;
		case 4://修改职工
			break;
		case 5://查找职工
			break;
		case 6://排序职工
			break;
		case 7://清空文档
			break;
		default:
			system("cls");//清屏操作
			//输入的不是0-7,就会删除掉输入,在循环
				break;
	    }
	}
	
	system("pause");

	return 0;
}

4.创建职工类

4.1创建职工抽象类

 抽象类不需要做任何实现,所以不需要写个.cpp来弄具体的实现

#pragma once
#include<iostream>
using namespace std;

//职工抽象类
class Worker
{
public:
	//显示个人信息
	virtual void showInfo() = 0;

	//获取岗位名称
	virtual string getDeptName() = 0;
	

	//职工编号
	int m_Id;
	//职工姓名
	string m_Name;
	//部门编号
	int m_DeptId;
}

 4.2创建普通员工类

 4.2.1创建.h头文件

//普通员工文件
#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();
	
	
	//获取岗位名称
	string getDeptName();
};

 4.2.2创建.cpp的源文件

#include"employee.h"

//构造函数
Employee::Employee(int id, string name, int dId)
{
	m_Id = id;
	m_Name = name;
	m_DeptId = dId;
}

//显示个人信息
//这里不需要写virtual 要把virtual删除
void Employee::showInfo()
{
	cout << "职工编号: " << m_Id
		<< "\t职工姓名:" << m_Name
		<< "\t岗位:" << getDeptName()
		<<"\t岗位职责:完成经理交给的任务" << endl;

}


//获取岗位名称
string Employee::getDeptName()
{
	return string("员工");
	//直接写"员工",是一个const char *的类型
	//最好转换一下,不转换编译器也会默认转换
}

或者

#include"employee.h"

//构造函数
Employee::Employee(int id, string name, int dId)
{
	this->m_Id = id;
	this->m_Name = name;
	this->m_DeptId = dId;
}

//显示个人信息
//这里不需要写virtual 要把virtual删除
void Employee::showInfo()
{
	cout << "职工编号: " << this->m_Id
		<< "\t职工姓名:" << this->m_Name
		<< "\t岗位:" << this->getDeptName()
		<<"\t岗位职责:完成经理交给的任务" << endl;

}


//获取岗位名称
string Employee::getDeptName()
{
	return string("员工");
	//直接写"员工",是一个const char *的类型
	//最好转换一下,不转换编译器也会默认转换
}

4.2.3main函数测试 

#include<iostream>
using namespace std;
#include"workManager.h"


#include"worker.h"
#include"employee.h"

int main()
{

	//测试代码
	Worker* worker=NULL;
	worker = new Employee(1, "张三", 2);
	worker->showInfo();

	/*
	//实例化管理者对象
	WorkManager wm;

	int choice = 0;//用来存储用户的选择
	while (true)
	{
		//调用展示菜单的成员函数
		wm.Show_Menu();
		cout << "请输入您的选择:" << endl;
		cin >> choice;
		switch (choice)
		{
		case 0://退出系统
			wm.ExitSystem();
			break;
		case 1://增加职工
			break;
		case 2://显示职工
			break;
		case 3://删除职工
			break;
		case 4://修改职工
			break;
		case 5://查找职工
			break;
		case 6://排序职工
			break;
		case 7://清空文档
			break;
		default:
			system("cls");//清屏操作
			//输入的不是0-7,就会删除掉输入,在循环
				break;
		}
	}
	*/
	

	system("pause");

	return 0;
}

4.3创建经理类

4.3.1创建.h头文件

#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 getDeptName();
};

4.3.2创建.cpp的源文件 

#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->getDeptName()
		<< "\t岗位职责:完成老板交给的任务,并且下发任务给员工" << endl;
}

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

4.3.3main函数中测试

#include<iostream>
using namespace std;
#include"workManager.h"


#include"worker.h"
#include"employee.h"
#include"manager.h"

int main()
{

	//测试代码
	Worker* worker=new Manager(1, "张三", 2);
	worker->showInfo();

	/*
	//实例化管理者对象
	WorkManager wm;

	int choice = 0;//用来存储用户的选择
	while (true)
	{
		//调用展示菜单的成员函数
		wm.Show_Menu();
		cout << "请输入您的选择:" << endl;
		cin >> choice;
		switch (choice)
		{
		case 0://退出系统
			wm.ExitSystem();
			break;
		case 1://增加职工
			break;
		case 2://显示职工
			break;
		case 3://删除职工
			break;
		case 4://修改职工
			break;
		case 5://查找职工
			break;
		case 6://排序职工
			break;
		case 7://清空文档
			break;
		default:
			system("cls");//清屏操作
			//输入的不是0-7,就会删除掉输入,在循环
				break;
		}
	}
	*/
	

	system("pause");

	return 0;
}

 4.4创建老板类

4.4.1创建.h的头文件

#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 getDeptName();
};

4.4.2创建.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.4.3main函数测试 ,多态,一个接口有多种形态,创建的对象不同,形态也不同

#include<iostream>
using namespace std;
#include"workManager.h"


#include"worker.h"
#include"employee.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();

	//多态,一个接口有多种形态,创建的对象不同,形态也不同
	//不同的对象调showInfo()是不一样的
	/*
	//实例化管理者对象
	WorkManager wm;

	int choice = 0;//用来存储用户的选择
	while (true)
	{
		//调用展示菜单的成员函数
		wm.Show_Menu();
		cout << "请输入您的选择:" << endl;
		cin >> choice;
		switch (choice)
		{
		case 0://退出系统
			wm.ExitSystem();
			break;
		case 1://增加职工
			break;
		case 2://显示职工
			break;
		case 3://删除职工
			break;
		case 4://修改职工
			break;
		case 5://查找职工
			break;
		case 6://排序职工
			break;
		case 7://清空文档
			break;
		default:
			system("cls");//清屏操作
			//输入的不是0-7,就会删除掉输入,在循环
				break;
		}
	}
	*/
	

	system("pause");

	return 0;
}

5.添加职工

用户在批量创建时可能会创建不同种类的员工,但是数组种所有数据的数据类型都相同。那我们应该怎么办呢?父类的指针可以指向子类的对象,那么我们可以让数组保存父类的指针。在堆区开辟这样的数组,返回相应类型的指针,所以我们需要在workManager.h中创建相应的指针接收。

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

	//展示菜单
	void Show_Menu();

	//退出系统
	void ExitSystem();

	//记录职工的人数
	int m_EmpNum;

	//职工数组的指针
	Worker** m_EmpArray;//包含一下头文件#include"worker.h"
	//即Worker** m_EmpArray=new Worker*[5];
	//new Worker*[5]返回数组的首地址

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

#include"workManager.h"

WorkManager::WorkManager()
{
	m_EmpNum = 0;
	m_EmpArray = NULL;
}
WorkManager::~WorkManager()
{

}
void WorkManager::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;

}
void WorkManager::ExitSystem()
{
	cout << "欢迎下次使用" << endl;
	system("pause");
	exit(0);//退出程序
	//不管在哪个地方调用,exit(0)都会退出
}

 

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

	//展示菜单
	void Show_Menu();

	//退出系统
	void ExitSystem();

	//记录职工的人数
	int m_EmpNum;

	//职工数组的指针
	Worker** m_EmpArray;//包含一下头文件#include"worker.h"
	//即Worker** m_EmpArray=new Worker*[5];
	//new Worker*[5]返回数组的首地址

	//添加职工的函数
	void Add_Emp();
	//析构函数
	~WorkManager();
};
#include"workManager.h"

WorkManager::WorkManager()
{
	m_EmpNum = 0;
	m_EmpArray = NULL;
}
WorkManager::~WorkManager()
{
    //堆区的数据,不写程序也会释放,最好还是写一下
	if (m_EmpArray != NULL)
	{
		delete[] m_EmpArray;
		m_EmpArray = NULL;
	}
}
void WorkManager::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;

}
//退出系统
void WorkManager::ExitSystem()
{
	cout << "欢迎下次使用" << endl;
	system("pause");
	exit(0);//退出程序
	//不管在哪个地方调用,exit(0)都会退出
}
//添加职工的函数
void WorkManager::Add_Emp()
{
	cout << "请输入添加职工的数量" << endl;
	int addNum = 0;//保存用户输入的数量
	cin >> addNum;
	if (addNum > 0)
	{
		//添加

		//计算添加新空间的大小
		//比如假设有三个人了,用户在添加的时候,需要开辟一个更大的
		//把原来的挪过来
		int newSize = m_EmpNum + addNum;//新空间人数 = 原来记录人数 + 新增人数
        
		//开辟新空间,动态的数组
		Worker** newSpace = new Worker * [newSize];
		//数组里的数据是work* 类型,
		// 用new返回的是这个数组的首地址,
	   //也就是work* 类型的指针,所以是work**

	   //将原来空间下的数据,拷贝到新空间下
		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;//职工编号
			string name;//职工姓名
			int dSelect;//部门选择
			cout << "请输入第" << i + 1 << "个新职工编号:" << endl;
			cin >> id;
			
			cout << "请输入第" << i + 1 << "个新职工姓名:" << endl;
			cin >> name;
			
			cout << "请选择该职工的岗位" << endl;
			cout << "1、普通职工" << endl;
			cout << "2、经理" << endl;
			cout << "3、老板" << endl;
			while (1)
			{
				cin >> dSelect;
				if (dSelect == 1 || dSelect == 2 || dSelect == 3)
					break;
				else
					cout << "输入有误,重新输入" << endl;
			}
			Worker* worker = NULL;
			switch (dSelect)
			{
			case 1:
				worker = new Employee(id, name, dSelect);
				//需要在workManager.h里添加employee.h
				break;
			case 2:
				worker = new Manager(id, name, dSelect);
				break;
			case 3:
				worker = new Boss(id, name, dSelect);
				break;
			default:
				break;
			}
			//将创建的职工保存到数组中
			newSpace[m_EmpNum + i] = worker;
			
			//释放原有空间
			delete[] m_EmpArray;

			//更改新空间的指向
			m_EmpArray = newSpace;

			//更新新的职工人数
			m_EmpNum = newSize;

		}
		//提示添加成功
		cout << "成功添加" << addNum << "名新职工" << endl;
		
		//按任意键后清屏 回到上级目录
		system("pause");
		system("cls");
		//直接清屏的话看不到提示添加成功的话

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

}

6.文件交互--写文件

6.1 设定文件路径

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

#include<fstream>
#define FILENAME "empFile.txt"
class WorkManager
{
public:
	//构造函数
	WorkManager();

	//展示菜单
	void Show_Menu();

	//退出系统
	void ExitSystem();

	//记录职工的人数
	int m_EmpNum;

	//职工数组的指针
	Worker** m_EmpArray;//包含一下头文件#include"worker.h"
	//即Worker** m_EmpArray=new Worker*[5];
	//new Worker*[5]返回数组的首地址

	//添加职工的函数
	void Add_Emp();

	//保存文件
	void save();

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

6.2源文件中实现保存的具体代码

#include"workManager.h"

WorkManager::WorkManager()
{
	m_EmpNum = 0;
	m_EmpArray = NULL;
}
WorkManager::~WorkManager()
{
	if (m_EmpArray != NULL)
	{
		delete[] m_EmpArray;
		m_EmpArray = NULL;
	}
}
void WorkManager::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;

}
//退出系统
void WorkManager::ExitSystem()
{
	cout << "欢迎下次使用" << endl;
	system("pause");
	exit(0);//退出程序
	//不管在哪个地方调用,exit(0)都会退出
}
//添加职工的函数
void WorkManager::Add_Emp()
{
	cout << "请输入添加职工的数量" << endl;
	int addNum = 0;//保存用户输入的数量
	cin >> addNum;
	if (addNum > 0)
	{
		//添加

		//计算添加新空间的大小
		//比如假设有三个人了,用户在添加的时候,需要开辟一个更大的
		//把原来的挪过来
		int newSize = m_EmpNum + addNum;//新空间人数 = 原来记录人数 + 新增人数
        
		//开辟新空间,动态的数组
		Worker** newSpace = new Worker * [newSize];
		//数组里的数据是work* 类型,
		// 用new返回的是这个数组的首地址,
	   //也就是work* 类型的指针,所以是work**

	   //将原来空间下的数据,拷贝到新空间下
		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;//职工编号
			string name;//职工姓名
			int dSelect;//部门选择
			cout << "请输入第" << i + 1 << "个新职工编号:" << endl;
			cin >> id;
			
			cout << "请输入第" << i + 1 << "个新职工姓名:" << endl;
			cin >> name;
			
			cout << "请选择该职工的岗位" << endl;
			cout << "1、普通职工" << endl;
			cout << "2、经理" << endl;
			cout << "3、老板" << endl;
			while (1)
			{
				cin >> dSelect;
				if (dSelect == 1 || dSelect == 2 || dSelect == 3)
					break;
				else
					cout << "输入有误,重新输入" << endl;
			}
			Worker* worker = NULL;
			switch (dSelect)
			{
			case 1:
				worker = new Employee(id, name, dSelect);
				//需要在workManager.h里添加employee.h
				break;
			case 2:
				worker = new Manager(id, name, dSelect);
				break;
			case 3:
				worker = new Boss(id, name, dSelect);
				break;
			default:
				break;
			}
			//将创建的职工保存到数组中
			newSpace[m_EmpNum + i] = worker;
			
			//释放原有空间
			delete[] m_EmpArray;

			//更改新空间的指向
			m_EmpArray = newSpace;

			//更新新的职工人数
			m_EmpNum = newSize;

		}

		//保存数据到文件中
		save();
		//提示添加成功
		cout << "成功添加" << addNum << "名新职工" << endl;
		
		//按任意键后清屏 回到上级目录
		system("pause");
		system("cls");
		//直接清屏的话看不到提示添加成功的话

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

}
//保存文件
void WorkManager::save()
{
	ofstream ofs;
	ofs.open(FILENAME, ios::out);

	//将每个人的数据写入文件中
	for (int i = 0; i < m_EmpNum; i++)
	{
		ofs << m_EmpArray[i]->m_Id << " "
			<< m_EmpArray[i]->m_Name << " "
			<< m_EmpArray[i]->m_DeptId << endl;
	}
	//关闭文件
	ofs.close();
}

6.3main函数测试

#include<iostream>
using namespace std;
#include"workManager.h"


int main()
{
	

	//实例化管理者对象
	WorkManager wm;

	int choice = 0;//用来存储用户的选择
	while (true)
	{
		//调用展示菜单的成员函数
		wm.Show_Menu();
		cout << "请输入您的选择:" << endl;
		cin >> choice;
		switch (choice)
		{
		case 0://退出系统
			wm.ExitSystem();
			break;
		case 1://增加职工
			wm.Add_Emp();
			break;
		case 2://显示职工
			break;
		case 3://删除职工
			break;
		case 4://修改职工
			break;
		case 5://查找职工
			break;
		case 6://排序职工
			break;
		case 7://清空文档
			break;
		default:
			system("cls");//清屏操作
			//输入的不是0-7,就会删除掉输入,在循环
				break;
		}
	}
	

	system("pause");

	return 0;
}

7.文件交互-读文件

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

#include<fstream>
#define FILENAME "empFile.txt"
class WorkManager
{
public:
	//构造函数
	WorkManager();

	//展示菜单
	void Show_Menu();

	//退出系统
	void ExitSystem();

	//记录职工的人数
	int m_EmpNum;

	//职工数组的指针
	Worker** m_EmpArray;//包含一下头文件#include"worker.h"
	//即Worker** m_EmpArray=new Worker*[5];
	//new Worker*[5]返回数组的首地址

	//添加职工的函数
	void Add_Emp();

	//保存文件
	void save();

	//判断文件是否为空的标志
	bool m_FileIsEmpty;
	
	//析构函数
	~WorkManager();
};

 

 7.1第一次使用文件未创建

#include"workManager.h"

WorkManager::WorkManager()
{
	//文件不存在
	ifstream ifs;
	ifs.open(FILENAME, ios::in);//读文件

	//判断文件是否打开成功,文件名写错,或者文件不存在
	//都会打开失败
	if (!ifs.is_open())
	{
		cout << "文件不存在" << endl;
		//初始化记录人数
		m_EmpNum = 0;
		//初始化数组指针
		m_EmpArray = NULL;
		//初始化文件是否为空
		m_FileIsEmpty = true;
		ifs.close();
		return;//文件不存在不进行后续操作,直接return代码
	}
	
}
WorkManager::~WorkManager()
{
	if (m_EmpArray != NULL)
	{
		delete[] m_EmpArray;
		m_EmpArray = NULL;
	}
}
void WorkManager::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;

}
//退出系统
void WorkManager::ExitSystem()
{
	cout << "欢迎下次使用" << endl;
	system("pause");
	exit(0);//退出程序
	//不管在哪个地方调用,exit(0)都会退出
}
//添加职工的函数
void WorkManager::Add_Emp()
{
	cout << "请输入添加职工的数量" << endl;
	int addNum = 0;//保存用户输入的数量
	cin >> addNum;
	if (addNum > 0)
	{
		//添加

		//计算添加新空间的大小
		//比如假设有三个人了,用户在添加的时候,需要开辟一个更大的
		//把原来的挪过来
		int newSize = m_EmpNum + addNum;//新空间人数 = 原来记录人数 + 新增人数
        
		//开辟新空间,动态的数组
		Worker** newSpace = new Worker * [newSize];
		//数组里的数据是work* 类型,
		// 用new返回的是这个数组的首地址,
	   //也就是work* 类型的指针,所以是work**

	   //将原来空间下的数据,拷贝到新空间下
		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;//职工编号
			string name;//职工姓名
			int dSelect;//部门选择
			cout << "请输入第" << i + 1 << "个新职工编号:" << endl;
			cin >> id;
			
			cout << "请输入第" << i + 1 << "个新职工姓名:" << endl;
			cin >> name;
			
			cout << "请选择该职工的岗位" << endl;
			cout << "1、普通职工" << endl;
			cout << "2、经理" << endl;
			cout << "3、老板" << endl;
			while (1)
			{
				cin >> dSelect;
				if (dSelect == 1 || dSelect == 2 || dSelect == 3)
					break;
				else
					cout << "输入有误,重新输入" << endl;
			}
			Worker* worker = NULL;
			switch (dSelect)
			{
			case 1:
				worker = new Employee(id, name, dSelect);
				//需要在workManager.h里添加employee.h
				break;
			case 2:
				worker = new Manager(id, name, dSelect);
				break;
			case 3:
				worker = new Boss(id, name, dSelect);
				break;
			default:
				cout << "输入有误 请重新输入" << endl;
				break;
			}
			//将创建的职工保存到数组中
			newSpace[m_EmpNum + i] = worker;
			
			//释放原有空间
			delete[] m_EmpArray;

			//更改新空间的指向
			m_EmpArray = newSpace;

			//更新新的职工人数
			m_EmpNum = newSize;

		}

		//保存数据到文件中
		save();
		//提示添加成功
		cout << "成功添加" << addNum << "名新职工" << endl;
		
		//按任意键后清屏 回到上级目录
		system("pause");
		system("cls");
		//直接清屏的话看不到提示添加成功的话

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

}
//保存文件
void WorkManager::save()
{
	ofstream ofs;
	ofs.open(FILENAME, ios::out);

	//将每个人的数据写入文件中
	for (int i = 0; i < m_EmpNum; i++)
	{
		ofs << m_EmpArray[i]->m_Id << " "
			<< m_EmpArray[i]->m_Name << " "
			<< m_EmpArray[i]->m_DeptId << endl;
	}
	//关闭文件
	ofs.close();
}

main函数测试,运行职工管理系统.cpp

 7.2文件为空,eof()函数

并在添加职工时 将文件是否为空的标志设为不空

#include"workManager.h"

WorkManager::WorkManager()
{
	//文件不存在
	ifstream ifs;
	ifs.open(FILENAME, ios::in);//读文件

	//判断文件是否打开成功,文件名写错,或者文件不存在
	//都会打开失败
	if (!ifs.is_open())
	{
		cout << "文件不存在" << endl;
		//初始化记录人数
		m_EmpNum = 0;
		//初始化数组指针
		m_EmpArray = NULL;
		//初始化文件是否为空
		m_FileIsEmpty = true;
		ifs.close();
		return;//文件不存在不进行后续操作,直接return代码
	}

	//2.文件存在,数据为空
	char ch;
	//读入一个字符看是不是文件尾
	//ifs.eof()如果它为真,代表文件为空,读到了文件尾
	if ((ch = ifs.get()) == EOF)//等价于 if(ifs.eof())
	{
		cout << "文件为空" << endl;
		//初始化记录人数
		m_EmpNum = 0;
		//初始化数组指针
		m_EmpArray = NULL;
		//初始化文件是否为空
		m_FileIsEmpty = true;
		ifs.close();
		return;

	}
}
WorkManager::~WorkManager()
{
	if (m_EmpArray != NULL)
	{
		delete[] m_EmpArray;
		m_EmpArray = NULL;
	}
}
void WorkManager::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;

}
//退出系统
void WorkManager::ExitSystem()
{
	cout << "欢迎下次使用" << endl;
	system("pause");
	exit(0);//退出程序
	//不管在哪个地方调用,exit(0)都会退出
}
//添加职工的函数
void WorkManager::Add_Emp()
{
	cout << "请输入添加职工的数量" << endl;
	int addNum = 0;//保存用户输入的数量
	cin >> addNum;
	if (addNum > 0)
	{
		//添加

		//计算添加新空间的大小
		//比如假设有三个人了,用户在添加的时候,需要开辟一个更大的
		//把原来的挪过来
		int newSize = m_EmpNum + addNum;//新空间人数 = 原来记录人数 + 新增人数
        
		//开辟新空间,动态的数组
		Worker** newSpace = new Worker * [newSize];
		//数组里的数据是work* 类型,
		// 用new返回的是这个数组的首地址,
	   //也就是work* 类型的指针,所以是work**

	   //将原来空间下的数据,拷贝到新空间下
		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;//职工编号
			string name;//职工姓名
			int dSelect;//部门选择
			cout << "请输入第" << i + 1 << "个新职工编号:" << endl;
			cin >> id;
			
			cout << "请输入第" << i + 1 << "个新职工姓名:" << endl;
			cin >> name;
			
			cout << "请选择该职工的岗位" << endl;
			cout << "1、普通职工" << endl;
			cout << "2、经理" << endl;
			cout << "3、老板" << endl;
			while (1)
			{
				cin >> dSelect;
				if (dSelect == 1 || dSelect == 2 || dSelect == 3)
					break;
				else
					cout << "输入有误,重新输入" << endl;
			}
			Worker* worker = NULL;
			switch (dSelect)
			{
			case 1:
				worker = new Employee(id, name, dSelect);
				//需要在workManager.h里添加employee.h
				break;
			case 2:
				worker = new Manager(id, name, dSelect);
				break;
			case 3:
				worker = new Boss(id, name, dSelect);
				break;
			default:
				break;
			}
			//将创建的职工保存到数组中
			newSpace[m_EmpNum + i] = worker;	

		}
		//释放原有空间
		delete[] m_EmpArray;

		//更改新空间的指向
		m_EmpArray = newSpace;

		//更新新的职工人数
		m_EmpNum = newSize;

		//更新职工不为空的标志
		m_FileIsEmpty = false;

		//保存数据到文件中
		save();
		//提示添加成功
		cout << "成功添加" << addNum << "名新职工" << endl;
		
		//按任意键后清屏 回到上级目录
		system("pause");
		system("cls");
		//直接清屏的话看不到提示添加成功的话

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

}
//保存文件
void WorkManager::save()
{
	ofstream ofs;
	ofs.open(FILENAME, ios::out);

	//将每个人的数据写入文件中
	for (int i = 0; i < m_EmpNum; i++)
	{
		ofs << m_EmpArray[i]->m_Id << " "
			<< m_EmpArray[i]->m_Name << " "
			<< m_EmpArray[i]->m_DeptId << endl;
	}
	//关闭文件
	ofs.close();
}

7.3文件存在且保存职工数据

 7.3.1初始化职工人数

#include"workManager.h"

WorkManager::WorkManager()
{
	//文件不存在
	ifstream ifs;
	ifs.open(FILENAME, ios::in);//读文件

	//判断文件是否打开成功,文件名写错,或者文件不存在
	//都会打开失败
	if (!ifs.is_open())
	{
		cout << "文件不存在" << endl;
		//初始化记录人数
		m_EmpNum = 0;
		//初始化数组指针
		m_EmpArray = NULL;
		//初始化文件是否为空
		m_FileIsEmpty = true;
		ifs.close();
		return;//文件不存在不进行后续操作,直接return代码
	}

	//2.文件存在,数据为空
	char ch;
	//读入一个字符看是不是文件尾
	//ifs.eof()如果它为真,代表文件为空,读到了文件尾
	if ((ch = ifs.get()) == EOF)
	{
		cout << "文件为空!!" << endl;
		//初始化记录人数
		m_EmpNum = 0;
		//初始化数组指针
		m_EmpArray = NULL;
		//初始化文件是否为空
		m_FileIsEmpty = true;
		ifs.close();
		return;

	}

	//3.文件存在,并且有数据
	int num = get_EmpNum();
	cout << "职工人数为:"<<num << endl;
	m_EmpNum = num;
}
WorkManager::~WorkManager()
{
	if (m_EmpArray != NULL)
	{
		delete[] m_EmpArray;
		m_EmpArray = NULL;
	}
}
void WorkManager::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;

}
//退出系统
void WorkManager::ExitSystem()
{
	cout << "欢迎下次使用" << endl;
	system("pause");
	exit(0);//退出程序
	//不管在哪个地方调用,exit(0)都会退出
}
//添加职工的函数
void WorkManager::Add_Emp()
{
	cout << "请输入添加职工的数量" << endl;
	int addNum = 0;//保存用户输入的数量
	cin >> addNum;
	if (addNum > 0)
	{
		//添加

		//计算添加新空间的大小
		//比如假设有三个人了,用户在添加的时候,需要开辟一个更大的
		//把原来的挪过来
		int newSize = m_EmpNum + addNum;//新空间人数 = 原来记录人数 + 新增人数
        
		//开辟新空间,动态的数组
		Worker** newSpace = new Worker * [newSize];
		//数组里的数据是work* 类型,
		// 用new返回的是这个数组的首地址,
	   //也就是work* 类型的指针,所以是work**

	   //将原来空间下的数据,拷贝到新空间下
		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;//职工编号
			string name;//职工姓名
			int dSelect;//部门选择
			cout << "请输入第" << i + 1 << "个新职工编号:" << endl;
			cin >> id;
			
			cout << "请输入第" << i + 1 << "个新职工姓名:" << endl;
			cin >> name;
			
			cout << "请选择该职工的岗位" << endl;
			cout << "1、普通职工" << endl;
			cout << "2、经理" << endl;
			cout << "3、老板" << endl;
			while (1)
			{
				cin >> dSelect;
				if (dSelect == 1 || dSelect == 2 || dSelect == 3)
					break;
				else
					cout << "输入有误,重新输入" << endl;
			}
			Worker* worker = NULL;
			switch (dSelect)
			{
			case 1:
				worker = new Employee(id, name, dSelect);
				//需要在workManager.h里添加employee.h
				break;
			case 2:
				worker = new Manager(id, name, dSelect);
				break;
			case 3:
				worker = new Boss(id, name, dSelect);
				break;
			default:
				break;
			}
			//将创建的职工保存到数组中
			newSpace[m_EmpNum + i] = worker;	

		}
		//释放原有空间
		delete[] m_EmpArray;

		//更改新空间的指向
		m_EmpArray = newSpace;

		//更新新的职工人数
		m_EmpNum = newSize;

		//更新职工不为空的标志
		m_FileIsEmpty = false;

		//保存数据到文件中
		save();
		//提示添加成功
		cout << "成功添加" << addNum << "名新职工" << endl;
		
		//按任意键后清屏 回到上级目录
		system("pause");
		system("cls");
		//直接清屏的话看不到提示添加成功的话

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

}
//保存文件
void WorkManager::save()
{
	ofstream ofs;
	ofs.open(FILENAME, ios::out);

	//将每个人的数据写入文件中
	for (int i = 0; i < m_EmpNum; i++)
	{
		ofs << m_EmpArray[i]->m_Id << " "
			<< m_EmpArray[i]->m_Name << " "
			<< m_EmpArray[i]->m_DeptId << endl;
	}
	//关闭文件
	ofs.close();
}

//统计文件中的人数
int WorkManager::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)
	string buf;
	while(getline(ifs,buf))//像上面那样读也可以
	{
		//统计人数
		num++;
	}
	return num;
}

7.3.2初始化职工数组

#include"workManager.h"

WorkManager::WorkManager()
{
	//文件不存在
	ifstream ifs;
	ifs.open(FILENAME, ios::in);//读文件

	//判断文件是否打开成功,文件名写错,或者文件不存在
	//都会打开失败
	if (!ifs.is_open())
	{
		cout << "文件不存在" << endl;
		//初始化记录人数
		m_EmpNum = 0;
		//初始化数组指针
		m_EmpArray = NULL;
		//初始化文件是否为空
		m_FileIsEmpty = true;
		ifs.close();
		return;//文件不存在不进行后续操作,直接return代码
	}

	//2.文件存在,数据为空
	char ch;
	//读入一个字符看是不是文件尾
	//ifs.eof()如果它为真,代表文件为空,读到了文件尾
	if ((ch = ifs.get()) == EOF)
	{
		cout << "文件为空!!" << endl;
		//初始化记录人数
		m_EmpNum = 0;
		//初始化数组指针
		m_EmpArray = NULL;
		//初始化文件是否为空
		m_FileIsEmpty = true;
		ifs.close();
		return;

	}

	//3.文件存在,并且有数据
	//先看文件中有多少人
	int num = get_EmpNum();
	cout << "职工人数为:"<<num << endl;
	m_EmpNum = num;

	//按照文件人数开辟空间
	m_EmpArray = new Worker * [m_EmpNum];
	//并且将文件中的数据,存到数组中
	init_Emp();

	//测试代码
	//输出的姓名如果为乱码,把文件另存为时把下面的编码改为ANSI
	for (int i = 0; i < m_EmpNum; i++)
	{
		cout << "职工编号:" << m_EmpArray[i]->m_Id
			<< " 姓名:" << m_EmpArray[i]->m_Name
			<< " 部门编号:" << m_EmpArray[i]->m_DeptId << endl;
	}
}
WorkManager::~WorkManager()
{
	if (m_EmpArray != NULL)
	{
		delete[] m_EmpArray;
		m_EmpArray = NULL;
	}
}
void WorkManager::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;

}
//退出系统
void WorkManager::ExitSystem()
{
	cout << "欢迎下次使用" << endl;
	system("pause");
	exit(0);//退出程序
	//不管在哪个地方调用,exit(0)都会退出
}
//添加职工的函数
void WorkManager::Add_Emp()
{
	cout << "请输入添加职工的数量" << endl;
	int addNum = 0;//保存用户输入的数量
	cin >> addNum;
	if (addNum > 0)
	{
		//添加

		//计算添加新空间的大小
		//比如假设有三个人了,用户在添加的时候,需要开辟一个更大的
		//把原来的挪过来
		int newSize = m_EmpNum + addNum;//新空间人数 = 原来记录人数 + 新增人数
        
		//开辟新空间,动态的数组
		Worker** newSpace = new Worker * [newSize];
		//数组里的数据是work* 类型,
		// 用new返回的是这个数组的首地址,
	   //也就是work* 类型的指针,所以是work**

	   //将原来空间下的数据,拷贝到新空间下
		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;//职工编号
			string name;//职工姓名
			int dSelect;//部门选择
			cout << "请输入第" << i + 1 << "个新职工编号:" << endl;
			cin >> id;
			
			cout << "请输入第" << i + 1 << "个新职工姓名:" << endl;
			cin >> name;
			
			cout << "请选择该职工的岗位" << endl;
			cout << "1、普通职工" << endl;
			cout << "2、经理" << endl;
			cout << "3、老板" << endl;
			while (1)
			{
				cin >> dSelect;
				if (dSelect == 1 || dSelect == 2 || dSelect == 3)
					break;
				else
					cout << "输入有误,重新输入" << endl;
			}
			Worker* worker = NULL;
			switch (dSelect)
			{
			case 1:
				worker = new Employee(id, name, dSelect);
				//需要在workManager.h里添加employee.h
				break;
			case 2:
				worker = new Manager(id, name, dSelect);
				break;
			case 3:
				worker = new Boss(id, name, dSelect);
				break;
			default:
				break;
			}
			//将创建的职工保存到数组中
			newSpace[m_EmpNum + i] = worker;	

		}
		//释放原有空间
		delete[] m_EmpArray;

		//更改新空间的指向
		m_EmpArray = newSpace;

		//更新新的职工人数
		m_EmpNum = newSize;

		//更新职工不为空的标志
		m_FileIsEmpty = false;

		//保存数据到文件中
		save();
		//提示添加成功
		cout << "成功添加" << addNum << "名新职工" << endl;
		
		//按任意键后清屏 回到上级目录
		system("pause");
		system("cls");
		//直接清屏的话看不到提示添加成功的话

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

}
//保存文件
void WorkManager::save()
{
	ofstream ofs;
	ofs.open(FILENAME, ios::out);

	//将每个人的数据写入文件中
	for (int i = 0; i < m_EmpNum; i++)
	{
		ofs << m_EmpArray[i]->m_Id << " "
			<< m_EmpArray[i]->m_Name << " "
			<< m_EmpArray[i]->m_DeptId << endl;
	}
	//关闭文件
	ofs.close();
}

//统计文件中的人数
int WorkManager::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)
	string buf;
	while(getline(ifs,buf))//像上面那样读也可以
	{
		//统计人数
		num++;
	}
	return num;
}
//初始化员工
void WorkManager::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);
		}
		m_EmpArray[index] = worker;
		index++;
	}
	//关闭文件
	ifs.close();
}

7.4读文件的三种情况都已测试完毕可以将测试代码注释掉了

#include"workManager.h"

WorkManager::WorkManager()
{
	//文件不存在
	ifstream ifs;
	ifs.open(FILENAME, ios::in);//读文件

	//判断文件是否打开成功,文件名写错,或者文件不存在
	//都会打开失败
	if (!ifs.is_open())
	{
		//cout << "文件不存在" << endl;
		//初始化记录人数
		m_EmpNum = 0;
		//初始化数组指针
		m_EmpArray = NULL;
		//初始化文件是否为空
		m_FileIsEmpty = true;
		ifs.close();
		return;//文件不存在不进行后续操作,直接return代码
	}

	//2.文件存在,数据为空
	char ch;
	//读入一个字符看是不是文件尾
	//ifs.eof()如果它为真,代表文件为空,读到了文件尾
	if ((ch = ifs.get()) == EOF)
	{
		//cout << "文件为空!!" << endl;
		//初始化记录人数
		m_EmpNum = 0;
		//初始化数组指针
		m_EmpArray = NULL;
		//初始化文件是否为空
		m_FileIsEmpty = true;
		ifs.close();
		return;

	}

	//3.文件存在,并且有数据
	//先看文件中有多少人
	int num = get_EmpNum();
	cout << "职工人数为:"<<num << endl;
	m_EmpNum = num;

	//按照文件人数开辟空间
	m_EmpArray = new Worker * [m_EmpNum];
	//并且将文件中的数据,存到数组中
	init_Emp();

	//测试代码
	//输出的姓名如果为乱码,把文件另存为时把下面的编码改为ANSI
	/*
	for (int i = 0; i < m_EmpNum; i++)
	{
		cout << "职工编号:" << m_EmpArray[i]->m_Id
			<< " 姓名:" << m_EmpArray[i]->m_Name
			<< " 部门编号:" << m_EmpArray[i]->m_DeptId << endl;
	}
	*/
}
WorkManager::~WorkManager()
{
	if (m_EmpArray != NULL)
	{
		delete[] m_EmpArray;
		m_EmpArray = NULL;
	}
}
void WorkManager::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;

}
//退出系统
void WorkManager::ExitSystem()
{
	cout << "欢迎下次使用" << endl;
	system("pause");
	exit(0);//退出程序
	//不管在哪个地方调用,exit(0)都会退出
}
//添加职工的函数
void WorkManager::Add_Emp()
{
	cout << "请输入添加职工的数量" << endl;
	int addNum = 0;//保存用户输入的数量
	cin >> addNum;
	if (addNum > 0)
	{
		//添加

		//计算添加新空间的大小
		//比如假设有三个人了,用户在添加的时候,需要开辟一个更大的
		//把原来的挪过来
		int newSize = m_EmpNum + addNum;//新空间人数 = 原来记录人数 + 新增人数
        
		//开辟新空间,动态的数组
		Worker** newSpace = new Worker * [newSize];
		//数组里的数据是work* 类型,
		// 用new返回的是这个数组的首地址,
	   //也就是work* 类型的指针,所以是work**

	   //将原来空间下的数据,拷贝到新空间下
		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;//职工编号
			string name;//职工姓名
			int dSelect;//部门选择
			cout << "请输入第" << i + 1 << "个新职工编号:" << endl;
			cin >> id;
			
			cout << "请输入第" << i + 1 << "个新职工姓名:" << endl;
			cin >> name;
			
			cout << "请选择该职工的岗位" << endl;
			cout << "1、普通职工" << endl;
			cout << "2、经理" << endl;
			cout << "3、老板" << endl;
			while (1)
			{
				cin >> dSelect;
				if (dSelect == 1 || dSelect == 2 || dSelect == 3)
					break;
				else
					cout << "输入有误,重新输入" << endl;
			}
			Worker* worker = NULL;
			switch (dSelect)
			{
			case 1:
				worker = new Employee(id, name, dSelect);
				//需要在workManager.h里添加employee.h
				break;
			case 2:
				worker = new Manager(id, name, dSelect);
				break;
			case 3:
				worker = new Boss(id, name, dSelect);
				break;
			default:
				break;
			}
			//将创建的职工保存到数组中
			newSpace[m_EmpNum + i] = worker;	

		}
		//释放原有空间
		delete[] m_EmpArray;

		//更改新空间的指向
		m_EmpArray = newSpace;

		//更新新的职工人数
		m_EmpNum = newSize;

		//更新职工不为空的标志
		m_FileIsEmpty = false;

		//保存数据到文件中
		save();
		//提示添加成功
		cout << "成功添加" << addNum << "名新职工" << endl;
		
		//按任意键后清屏 回到上级目录
		system("pause");
		system("cls");
		//直接清屏的话看不到提示添加成功的话

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

}
//保存文件
void WorkManager::save()
{
	ofstream ofs;
	ofs.open(FILENAME, ios::out);

	//将每个人的数据写入文件中
	for (int i = 0; i < m_EmpNum; i++)
	{
		ofs << m_EmpArray[i]->m_Id << " "
			<< m_EmpArray[i]->m_Name << " "
			<< m_EmpArray[i]->m_DeptId << endl;
	}
	//关闭文件
	ofs.close();
}

//统计文件中的人数
int WorkManager::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)
	string buf;
	while(getline(ifs,buf))//像上面那样读也可以
	{
		//统计人数
		num++;
	}
	return num;
}
//初始化员工
void WorkManager::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);
		}
		m_EmpArray[index] = worker;
		index++;
	}
	//关闭文件
	ifs.close();
}

8.显示职工

8.1显示职工函数实现 

#include"workManager.h"

WorkManager::WorkManager()
{
	//文件不存在
	ifstream ifs;
	ifs.open(FILENAME, ios::in);//读文件

	//判断文件是否打开成功,文件名写错,或者文件不存在
	//都会打开失败
	if (!ifs.is_open())
	{
		//cout << "文件不存在" << endl;
		//初始化记录人数
		m_EmpNum = 0;
		//初始化数组指针
		m_EmpArray = NULL;
		//初始化文件是否为空
		m_FileIsEmpty = true;
		ifs.close();
		return;//文件不存在不进行后续操作,直接return代码
	}

	//2.文件存在,数据为空
	char ch;
	//读入一个字符看是不是文件尾
	//ifs.eof()如果它为真,代表文件为空,读到了文件尾
	if ((ch = ifs.get()) == EOF)
	{
		//cout << "文件为空!!" << endl;
		//初始化记录人数
		m_EmpNum = 0;
		//初始化数组指针
		m_EmpArray = NULL;
		//初始化文件是否为空
		m_FileIsEmpty = true;
		ifs.close();
		return;

	}

	//3.文件存在,并且有数据
	//先看文件中有多少人
	int num = get_EmpNum();
	//cout << "职工人数为:"<<num << endl;
	m_EmpNum = num;

	//按照文件人数开辟空间
	m_EmpArray = new Worker * [m_EmpNum];
	//并且将文件中的数据,存到数组中
	init_Emp();

	//测试代码
	//输出的姓名如果为乱码,把文件另存为时把下面的编码改为ANSI
	/*
	for (int i = 0; i < m_EmpNum; i++)
	{
		cout << "职工编号:" << m_EmpArray[i]->m_Id
			<< " 姓名:" << m_EmpArray[i]->m_Name
			<< " 部门编号:" << m_EmpArray[i]->m_DeptId << endl;
	}
	*/
}
WorkManager::~WorkManager()
{
	if (m_EmpArray != NULL)
	{
		delete[] m_EmpArray;
		m_EmpArray = NULL;
	}
}
void WorkManager::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;

}
//退出系统
void WorkManager::ExitSystem()
{
	cout << "欢迎下次使用" << endl;
	system("pause");
	exit(0);//退出程序
	//不管在哪个地方调用,exit(0)都会退出
}
//添加职工的函数
void WorkManager::Add_Emp()
{
	cout << "请输入添加职工的数量" << endl;
	int addNum = 0;//保存用户输入的数量
	cin >> addNum;
	if (addNum > 0)
	{
		//添加

		//计算添加新空间的大小
		//比如假设有三个人了,用户在添加的时候,需要开辟一个更大的
		//把原来的挪过来
		int newSize = m_EmpNum + addNum;//新空间人数 = 原来记录人数 + 新增人数
        
		//开辟新空间,动态的数组
		Worker** newSpace = new Worker * [newSize];
		//数组里的数据是work* 类型,
		// 用new返回的是这个数组的首地址,
	   //也就是work* 类型的指针,所以是work**

	   //将原来空间下的数据,拷贝到新空间下
		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;//职工编号
			string name;//职工姓名
			int dSelect;//部门选择
			cout << "请输入第" << i + 1 << "个新职工编号:" << endl;
			cin >> id;
			
			cout << "请输入第" << i + 1 << "个新职工姓名:" << endl;
			cin >> name;
			
			cout << "请选择该职工的岗位" << endl;
			cout << "1、普通职工" << endl;
			cout << "2、经理" << endl;
			cout << "3、老板" << endl;
			while (1)
			{
				cin >> dSelect;
				if (dSelect == 1 || dSelect == 2 || dSelect == 3)
					break;
				else
					cout << "输入有误,重新输入" << endl;
			}
			Worker* worker = NULL;
			switch (dSelect)
			{
			case 1:
				worker = new Employee(id, name, dSelect);
				//需要在workManager.h里添加employee.h
				break;
			case 2:
				worker = new Manager(id, name, dSelect);
				break;
			case 3:
				worker = new Boss(id, name, dSelect);
				break;
			default:
				break;
			}
			//将创建的职工保存到数组中
			newSpace[m_EmpNum + i] = worker;	

		}
		//释放原有空间
		delete[] m_EmpArray;

		//更改新空间的指向
		m_EmpArray = newSpace;

		//更新新的职工人数
		m_EmpNum = newSize;

		//更新职工不为空的标志
		m_FileIsEmpty = false;

		//保存数据到文件中
		save();
		//提示添加成功
		cout << "成功添加" << addNum << "名新职工" << endl;
		
		//按任意键后清屏 回到上级目录
		system("pause");
		system("cls");
		//直接清屏的话看不到提示添加成功的话

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

}
//保存文件
void WorkManager::save()
{
	ofstream ofs;
	ofs.open(FILENAME, ios::out);

	//将每个人的数据写入文件中
	for (int i = 0; i < m_EmpNum; i++)
	{
		ofs << m_EmpArray[i]->m_Id << " "
			<< m_EmpArray[i]->m_Name << " "
			<< m_EmpArray[i]->m_DeptId << endl;
	}
	//关闭文件
	ofs.close();
}

//统计文件中的人数
int WorkManager::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)
	string buf;
	while(getline(ifs,buf))//像上面那样读也可以
	{
		//统计人数
		num++;
	}
	return num;
}
//初始化员工
void WorkManager::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);
		}
		m_EmpArray[index] = worker;
		index++;
	}
	//关闭文件
	ifs.close();
}
//显示职工
void WorkManager::Show_Emp()
{
	//判断文件是否为空
	if (m_FileIsEmpty)
	{
		cout << "文件不存在或记录为空" << endl;
	}
	else
	{
		for (int i = 0; i < m_EmpNum; i++)
		{
			//利用多态调用程序接口
			m_EmpArray[i]->showInfo();
		}
	}
	system("pause");
	system("cls");
}

8.2main函数测试

#include<iostream>
using namespace std;
#include"workManager.h"


int main()
{
	

	//实例化管理者对象
	WorkManager wm;

	int choice = 0;//用来存储用户的选择
	while (true)
	{
		//调用展示菜单的成员函数
		wm.Show_Menu();
		cout << "请输入您的选择:" << endl;
		cin >> choice;
		switch (choice)
		{
		case 0://退出系统
			wm.ExitSystem();
			break;
		case 1://增加职工
			wm.Add_Emp();
			break;
		case 2://显示职工
			wm.Show_Emp();
			break;
		case 3://删除职工
			break;
		case 4://修改职工
			break;
		case 5://查找职工
			break;
		case 6://排序职工
			break;
		case 7://清空文档
			break;
		default:
			system("cls");//清屏操作
			//输入的不是0-7,就会删除掉输入,在循环
				break;
		}
	}
	

	system("pause");

	return 0;
}

9.删除职工

9.1职工是否存在函数实现以及删除职工函数实现 

#include"workManager.h"

WorkManager::WorkManager()
{
	//文件不存在
	ifstream ifs;
	ifs.open(FILENAME, ios::in);//读文件

	//判断文件是否打开成功,文件名写错,或者文件不存在
	//都会打开失败
	if (!ifs.is_open())
	{
		//cout << "文件不存在" << endl;
		//初始化记录人数
		m_EmpNum = 0;
		//初始化数组指针
		m_EmpArray = NULL;
		//初始化文件是否为空
		m_FileIsEmpty = true;
		ifs.close();
		return;//文件不存在不进行后续操作,直接return代码
	}

	//2.文件存在,数据为空
	char ch;
	//读入一个字符看是不是文件尾
	//ifs.eof()如果它为真,代表文件为空,读到了文件尾
	if ((ch = ifs.get()) == EOF)
	{
		//cout << "文件为空!!" << endl;
		//初始化记录人数
		m_EmpNum = 0;
		//初始化数组指针
		m_EmpArray = NULL;
		//初始化文件是否为空
		m_FileIsEmpty = true;
		ifs.close();
		return;

	}

	//3.文件存在,并且有数据
	//先看文件中有多少人
	int num = get_EmpNum();
	//cout << "职工人数为:"<<num << endl;
	m_EmpNum = num;

	//按照文件人数开辟空间
	m_EmpArray = new Worker * [m_EmpNum];
	//并且将文件中的数据,存到数组中
	init_Emp();

	//测试代码
	//输出的姓名如果为乱码,把文件另存为时把下面的编码改为ANSI
	/*
	for (int i = 0; i < m_EmpNum; i++)
	{
		cout << "职工编号:" << m_EmpArray[i]->m_Id
			<< " 姓名:" << m_EmpArray[i]->m_Name
			<< " 部门编号:" << m_EmpArray[i]->m_DeptId << endl;
	}
	*/
}
WorkManager::~WorkManager()
{
	if (m_EmpArray != NULL)
	{
		delete[] m_EmpArray;
		m_EmpArray = NULL;
	}
}
void WorkManager::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;

}
//退出系统
void WorkManager::ExitSystem()
{
	cout << "欢迎下次使用" << endl;
	system("pause");
	exit(0);//退出程序
	//不管在哪个地方调用,exit(0)都会退出
}
//添加职工的函数
void WorkManager::Add_Emp()
{
	cout << "请输入添加职工的数量" << endl;
	int addNum = 0;//保存用户输入的数量
	cin >> addNum;
	if (addNum > 0)
	{
		//添加

		//计算添加新空间的大小
		//比如假设有三个人了,用户在添加的时候,需要开辟一个更大的
		//把原来的挪过来
		int newSize = m_EmpNum + addNum;//新空间人数 = 原来记录人数 + 新增人数
        
		//开辟新空间,动态的数组
		Worker** newSpace = new Worker * [newSize];
		//数组里的数据是work* 类型,
		// 用new返回的是这个数组的首地址,
	   //也就是work* 类型的指针,所以是work**

	   //将原来空间下的数据,拷贝到新空间下
		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;//职工编号
			string name;//职工姓名
			int dSelect;//部门选择
			cout << "请输入第" << i + 1 << "个新职工编号:" << endl;
			cin >> id;
			
			cout << "请输入第" << i + 1 << "个新职工姓名:" << endl;
			cin >> name;
			
			cout << "请选择该职工的岗位" << endl;
			cout << "1、普通职工" << endl;
			cout << "2、经理" << endl;
			cout << "3、老板" << endl;
			while (1)
			{
				cin >> dSelect;
				if (dSelect == 1 || dSelect == 2 || dSelect == 3)
					break;
				else
					cout << "输入有误,重新输入" << endl;
			}
			Worker* worker = NULL;
			switch (dSelect)
			{
			case 1:
				worker = new Employee(id, name, dSelect);
				//需要在workManager.h里添加employee.h
				break;
			case 2:
				worker = new Manager(id, name, dSelect);
				break;
			case 3:
				worker = new Boss(id, name, dSelect);
				break;
			default:
				break;
			}
			//将创建的职工保存到数组中
			newSpace[m_EmpNum + i] = worker;	

		}
		//释放原有空间
		delete[] m_EmpArray;

		//更改新空间的指向
		m_EmpArray = newSpace;

		//更新新的职工人数
		m_EmpNum = newSize;

		//更新职工不为空的标志
		m_FileIsEmpty = false;

		//保存数据到文件中
		save();
		//提示添加成功
		cout << "成功添加" << addNum << "名新职工" << endl;
		
		//按任意键后清屏 回到上级目录
		system("pause");
		system("cls");
		//直接清屏的话看不到提示添加成功的话

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

}
//保存文件
void WorkManager::save()
{
	ofstream ofs;
	ofs.open(FILENAME, ios::out);

	//将每个人的数据写入文件中
	for (int i = 0; i < m_EmpNum; i++)
	{
		ofs << m_EmpArray[i]->m_Id << " "
			<< m_EmpArray[i]->m_Name << " "
			<< m_EmpArray[i]->m_DeptId << endl;
	}
	//关闭文件
	ofs.close();
}

//统计文件中的人数
int WorkManager::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)
	string buf;
	while(getline(ifs,buf))//像上面那样读也可以
	{
		//统计人数
		num++;
	}
	return num;
}
//初始化员工
void WorkManager::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);
		}
		m_EmpArray[index] = worker;
		index++;
	}
	//关闭文件
	ifs.close();
}
//显示职工
void WorkManager::Show_Emp()
{
	//判断文件是否为空
	if (m_FileIsEmpty)
	{
		cout << "文件不存在或记录为空" << endl;
	}
	else
	{
		for (int i = 0; i < m_EmpNum; i++)
		{
			//利用多态调用程序接口
			m_EmpArray[i]->showInfo();
		}
	}
	system("pause");
	system("cls");
}
//删除职工
void WorkManager::Del_Emp()
{
	if (m_FileIsEmpty)
	{
		cout << "文件不存在或记录为空" << endl;
	}
	else
	{
		//按照职工编号删除职工
		cout << "请输入想要删除的职工的编号" << endl;
		int id;
		cin >> id;
		int index = IsExit(id);
		if ( index!= -1)
		{
			//说明职工存在,并且要删除index位置上的职工
			for (int i = index+1; i < m_EmpNum; i++)
			{
				m_EmpArray[i - 1] = m_EmpArray[i];
			}
			/*
			一个意思
			for (int i = index; i < m_EmpNum-1; i++)
			{
				m_EmpArray[i] = m_EmpArray[i+1];
			}
			*/
			//更新记录的人员个数
			m_EmpNum--;
			//同步更新到文件中
			save();

			cout << "删除成功" << endl;
		}
		else
		{
			cout << "删除失败,未找到该职工" << endl;
		}
	}
	system("pause");//按任意键继续
	system("cls");
}

//判断职工是否存在
//如果存在返回职工所在数组中的位置,不存在返回-1
int WorkManager::IsExit(int id)
{
	int index = -1;
	for (int i = 0; i < m_EmpNum; i++)
	{
		if (m_EmpArray[i]->m_Id == id)
		{
			//找到职工
			index = i;
			break;
		}
	}
	return index;
}

9.2main函数测试

#include<iostream>
using namespace std;
#include"workManager.h"


int main()
{
	

	//实例化管理者对象
	WorkManager wm;

	int choice = 0;//用来存储用户的选择
	while (true)
	{
		//调用展示菜单的成员函数
		wm.Show_Menu();
		cout << "请输入您的选择:" << endl;
		cin >> choice;
		switch (choice)
		{
		case 0://退出系统
			wm.ExitSystem();
			break;
		case 1://增加职工
			wm.Add_Emp();
			break;
		case 2://显示职工
			wm.Show_Emp();
			break;
		case 3://删除职工
			wm.Del_Emp();
			break;
		case 4://修改职工
			break;
		case 5://查找职工
			break;
		case 6://排序职工
			break;
		case 7://清空文档
			break;
		default:
			system("cls");//清屏操作
			//输入的不是0-7,就会删除掉输入,在循环
				break;
		}
	}
	

	system("pause");

	return 0;
}

10.修改职工

10.1cpp中写实现 

#include"workManager.h"

WorkManager::WorkManager()
{
	//文件不存在
	ifstream ifs;
	ifs.open(FILENAME, ios::in);//读文件

	//判断文件是否打开成功,文件名写错,或者文件不存在
	//都会打开失败
	if (!ifs.is_open())
	{
		//cout << "文件不存在" << endl;
		//初始化记录人数
		m_EmpNum = 0;
		//初始化数组指针
		m_EmpArray = NULL;
		//初始化文件是否为空
		m_FileIsEmpty = true;
		ifs.close();
		return;//文件不存在不进行后续操作,直接return代码
	}

	//2.文件存在,数据为空
	char ch;
	//读入一个字符看是不是文件尾
	//ifs.eof()如果它为真,代表文件为空,读到了文件尾
	if ((ch = ifs.get()) == EOF)
	{
		//cout << "文件为空!!" << endl;
		//初始化记录人数
		m_EmpNum = 0;
		//初始化数组指针
		m_EmpArray = NULL;
		//初始化文件是否为空
		m_FileIsEmpty = true;
		ifs.close();
		return;

	}

	//3.文件存在,并且有数据
	//先看文件中有多少人
	int num = get_EmpNum();
	//cout << "职工人数为:"<<num << endl;
	m_EmpNum = num;

	//按照文件人数开辟空间
	m_EmpArray = new Worker * [m_EmpNum];
	//并且将文件中的数据,存到数组中
	init_Emp();

	//测试代码
	//输出的姓名如果为乱码,把文件另存为时把下面的编码改为ANSI
	/*
	for (int i = 0; i < m_EmpNum; i++)
	{
		cout << "职工编号:" << m_EmpArray[i]->m_Id
			<< " 姓名:" << m_EmpArray[i]->m_Name
			<< " 部门编号:" << m_EmpArray[i]->m_DeptId << endl;
	}
	*/
}
WorkManager::~WorkManager()
{
	if (m_EmpArray != NULL)
	{
		delete[] m_EmpArray;
		m_EmpArray = NULL;
	}
}
void WorkManager::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;

}
//退出系统
void WorkManager::ExitSystem()
{
	cout << "欢迎下次使用" << endl;
	system("pause");
	exit(0);//退出程序
	//不管在哪个地方调用,exit(0)都会退出
}
//添加职工的函数
void WorkManager::Add_Emp()
{
	cout << "请输入添加职工的数量" << endl;
	int addNum = 0;//保存用户输入的数量
	cin >> addNum;
	if (addNum > 0)
	{
		//添加

		//计算添加新空间的大小
		//比如假设有三个人了,用户在添加的时候,需要开辟一个更大的
		//把原来的挪过来
		int newSize = m_EmpNum + addNum;//新空间人数 = 原来记录人数 + 新增人数
        
		//开辟新空间,动态的数组
		Worker** newSpace = new Worker * [newSize];
		//数组里的数据是work* 类型,
		// 用new返回的是这个数组的首地址,
	   //也就是work* 类型的指针,所以是work**

	   //将原来空间下的数据,拷贝到新空间下
		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;//职工编号
			string name;//职工姓名
			int dSelect;//部门选择
			cout << "请输入第" << i + 1 << "个新职工编号:" << endl;
			cin >> id;
			
			cout << "请输入第" << i + 1 << "个新职工姓名:" << endl;
			cin >> name;
			
			cout << "请选择该职工的岗位" << endl;
			cout << "1、普通职工" << endl;
			cout << "2、经理" << endl;
			cout << "3、老板" << endl;
			while (1)
			{
				cin >> dSelect;
				if (dSelect == 1 || dSelect == 2 || dSelect == 3)
					break;
				else
					cout << "输入有误,重新输入" << endl;
			}
			Worker* worker = NULL;
			switch (dSelect)
			{
			case 1:
				worker = new Employee(id, name, dSelect);
				//需要在workManager.h里添加employee.h
				break;
			case 2:
				worker = new Manager(id, name, dSelect);
				break;
			case 3:
				worker = new Boss(id, name, dSelect);
				break;
			default:
				break;
			}
			//将创建的职工保存到数组中
			newSpace[m_EmpNum + i] = worker;	

		}
		//释放原有空间
		delete[] m_EmpArray;

		//更改新空间的指向
		m_EmpArray = newSpace;

		//更新新的职工人数
		m_EmpNum = newSize;

		//更新职工不为空的标志
		m_FileIsEmpty = false;

		//保存数据到文件中
		save();
		//提示添加成功
		cout << "成功添加" << addNum << "名新职工" << endl;
		
		//按任意键后清屏 回到上级目录
		system("pause");
		system("cls");
		//直接清屏的话看不到提示添加成功的话

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

}
//保存文件
void WorkManager::save()
{
	ofstream ofs;
	ofs.open(FILENAME, ios::out);

	//将每个人的数据写入文件中
	for (int i = 0; i < m_EmpNum; i++)
	{
		ofs << m_EmpArray[i]->m_Id << " "
			<< m_EmpArray[i]->m_Name << " "
			<< m_EmpArray[i]->m_DeptId << endl;
	}
	//关闭文件
	ofs.close();
}

//统计文件中的人数
int WorkManager::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)
	string buf;
	while(getline(ifs,buf))//像上面那样读也可以
	{
		//统计人数
		num++;
	}
	return num;
}
//初始化员工
void WorkManager::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);
		}
		m_EmpArray[index] = worker;
		index++;
	}
	//关闭文件
	ifs.close();
}
//显示职工
void WorkManager::Show_Emp()
{
	//判断文件是否为空
	if (m_FileIsEmpty)
	{
		cout << "文件不存在或记录为空" << endl;
	}
	else
	{
		for (int i = 0; i < m_EmpNum; i++)
		{
			//利用多态调用程序接口
			m_EmpArray[i]->showInfo();
		}
	}
	system("pause");
	system("cls");
}
//删除职工
void WorkManager::Del_Emp()
{
	if (m_FileIsEmpty)
	{
		cout << "文件不存在或记录为空" << endl;
	}
	else
	{
		//按照职工编号删除职工
		cout << "请输入想要删除的职工的编号" << endl;
		int id;
		cin >> id;
		int index = IsExit(id);
		if ( index!= -1)
		{
			//说明职工存在,并且要删除index位置上的职工
			for (int i = index+1; i < m_EmpNum; i++)
			{
				m_EmpArray[i - 1] = m_EmpArray[i];
			}
			/*
			一个意思
			for (int i = index; i < m_EmpNum-1; i++)
			{
				m_EmpArray[i] = m_EmpArray[i+1];
			}
			*/
			//更新记录的人员个数
			m_EmpNum--;
			//同步更新到文件中
			save();

			cout << "删除成功" << endl;
		}
		else
		{
			cout << "删除失败,未找到该职工" << endl;
		}
	}
	system("pause");//按任意键继续
	system("cls");
}

//判断职工是否存在
//如果存在返回职工所在数组中的位置,不存在返回-1
int WorkManager::IsExit(int id)
{
	int index = -1;
	for (int i = 0; i < m_EmpNum; i++)
	{
		if (m_EmpArray[i]->m_Id == id)
		{
			//找到职工
			index = i;
			break;
		}
	}
	return index;
}
//修改职工
void WorkManager::Mod_Emp()
{
	if (m_FileIsEmpty)
	{
		cout << "文件不存在或者记录为空" << endl;
	}
	else
	{
		cout << "请输入修改职工的编号:" << endl;
		int id;
		cin >> id;
		int ret = IsExit(id);
		if (ret != -1)
		{
			//查找到编号的职工
			delete m_EmpArray[ret];//堆区的数据先释放干净

			//不知道大家也没有疑问?
			//为什么要删除数据,不能直接覆盖吗
			//覆盖就会内存泄露哦
			//因为数组这个位置存放了work*,它指向了
			//开辟在堆区的内存
			//如果直接覆盖,就是建立了一个work*,
			//指向一个新开辟的内存,然后把新建立的work*
			//放在这个位置。你看,原来开辟在堆区的数据还在
			//内存泄漏
			int newId = 0;
			string newName = "";
			int dSelect = 0;
			cout << "查到:" << id << "号职工,请输入新职工号" << endl;
			cin >> newId;
			cout << "请输入新的姓名:" << endl;
			cin >> newName;
			cout << "请输入岗位:" << endl;
			cout << "1.普通职工" << endl;
			cout << "2.经理" << endl;
			cout << "3.老板" << endl;
			cin >> dSelect;
			Worker* worker = NULL;
			switch (dSelect)
			{
			case 1:
				worker = new Employee(newId, newName, dSelect);
				break;
			case 2:
				worker =new Manager(newId, newName, dSelect);
				break;
			case 3:
				worker =new Boss(newId, newName, dSelect);
				break;
			default:
				break;
			}

			//更新数据 到数组中
			m_EmpArray[ret] = worker;

			cout << "修改成功!" << endl;

			//保存到文件中
			save();
		}
		else
		{
			cout << "修改失败,查无此人" << endl;
		}
		system("pause");
		system("cls");
	}
}

 10.2main函数测试

#include<iostream>
using namespace std;
#include"workManager.h"


int main()
{
	

	//实例化管理者对象
	WorkManager wm;

	int choice = 0;//用来存储用户的选择
	while (true)
	{
		//调用展示菜单的成员函数
		wm.Show_Menu();
		cout << "请输入您的选择:" << endl;
		cin >> choice;
		switch (choice)
		{
		case 0://退出系统
			wm.ExitSystem();
			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://查找职工
			break;
		case 6://排序职工
			break;
		case 7://清空文档
			break;
		default:
			system("cls");//清屏操作
			//输入的不是0-7,就会删除掉输入,在循环
				break;
		}
	}
	

	system("pause");

	return 0;
}

11.查找职工

 11.1查找职工实现

#include"workManager.h"

WorkManager::WorkManager()
{
	//文件不存在
	ifstream ifs;
	ifs.open(FILENAME, ios::in);//读文件

	//判断文件是否打开成功,文件名写错,或者文件不存在
	//都会打开失败
	if (!ifs.is_open())
	{
		//cout << "文件不存在" << endl;
		//初始化记录人数
		m_EmpNum = 0;
		//初始化数组指针
		m_EmpArray = NULL;
		//初始化文件是否为空
		m_FileIsEmpty = true;
		ifs.close();
		return;//文件不存在不进行后续操作,直接return代码
	}

	//2.文件存在,数据为空
	char ch;
	//读入一个字符看是不是文件尾
	//ifs.eof()如果它为真,代表文件为空,读到了文件尾
	if ((ch = ifs.get()) == EOF)
	{
		//cout << "文件为空!!" << endl;
		//初始化记录人数
		m_EmpNum = 0;
		//初始化数组指针
		m_EmpArray = NULL;
		//初始化文件是否为空
		m_FileIsEmpty = true;
		ifs.close();
		return;

	}

	//3.文件存在,并且有数据
	//先看文件中有多少人
	int num = get_EmpNum();
	//cout << "职工人数为:"<<num << endl;
	m_EmpNum = num;

	//按照文件人数开辟空间
	m_EmpArray = new Worker * [m_EmpNum];
	//并且将文件中的数据,存到数组中
	init_Emp();

	//测试代码
	//输出的姓名如果为乱码,把文件另存为时把下面的编码改为ANSI
	/*
	for (int i = 0; i < m_EmpNum; i++)
	{
		cout << "职工编号:" << m_EmpArray[i]->m_Id
			<< " 姓名:" << m_EmpArray[i]->m_Name
			<< " 部门编号:" << m_EmpArray[i]->m_DeptId << endl;
	}
	*/
}
WorkManager::~WorkManager()
{
	if (m_EmpArray != NULL)
	{
		delete[] m_EmpArray;
		m_EmpArray = NULL;
	}
}
void WorkManager::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;

}
//退出系统
void WorkManager::ExitSystem()
{
	cout << "欢迎下次使用" << endl;
	system("pause");
	exit(0);//退出程序
	//不管在哪个地方调用,exit(0)都会退出
}
//添加职工的函数
void WorkManager::Add_Emp()
{
	cout << "请输入添加职工的数量" << endl;
	int addNum = 0;//保存用户输入的数量
	cin >> addNum;
	if (addNum > 0)
	{
		//添加

		//计算添加新空间的大小
		//比如假设有三个人了,用户在添加的时候,需要开辟一个更大的
		//把原来的挪过来
		int newSize = m_EmpNum + addNum;//新空间人数 = 原来记录人数 + 新增人数
        
		//开辟新空间,动态的数组
		Worker** newSpace = new Worker * [newSize];
		//数组里的数据是work* 类型,
		// 用new返回的是这个数组的首地址,
	   //也就是work* 类型的指针,所以是work**

	   //将原来空间下的数据,拷贝到新空间下
		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;//职工编号
			string name;//职工姓名
			int dSelect;//部门选择
			cout << "请输入第" << i + 1 << "个新职工编号:" << endl;
			cin >> id;
			
			cout << "请输入第" << i + 1 << "个新职工姓名:" << endl;
			cin >> name;
			
			cout << "请选择该职工的岗位" << endl;
			cout << "1、普通职工" << endl;
			cout << "2、经理" << endl;
			cout << "3、老板" << endl;
			while (1)
			{
				cin >> dSelect;
				if (dSelect == 1 || dSelect == 2 || dSelect == 3)
					break;
				else
					cout << "输入有误,重新输入" << endl;
			}
			Worker* worker = NULL;
			switch (dSelect)
			{
			case 1:
				worker = new Employee(id, name, dSelect);
				//需要在workManager.h里添加employee.h
				break;
			case 2:
				worker = new Manager(id, name, dSelect);
				break;
			case 3:
				worker = new Boss(id, name, dSelect);
				break;
			default:
				break;
			}
			//将创建的职工保存到数组中
			newSpace[m_EmpNum + i] = worker;	

		}
		//释放原有空间
		delete[] m_EmpArray;

		//更改新空间的指向
		m_EmpArray = newSpace;

		//更新新的职工人数
		m_EmpNum = newSize;

		//更新职工不为空的标志
		m_FileIsEmpty = false;

		//保存数据到文件中
		save();
		//提示添加成功
		cout << "成功添加" << addNum << "名新职工" << endl;
		
		//按任意键后清屏 回到上级目录
		system("pause");
		system("cls");
		//直接清屏的话看不到提示添加成功的话

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

}
//保存文件
void WorkManager::save()
{
	ofstream ofs;
	ofs.open(FILENAME, ios::out);

	//将每个人的数据写入文件中
	for (int i = 0; i < m_EmpNum; i++)
	{
		ofs << m_EmpArray[i]->m_Id << " "
			<< m_EmpArray[i]->m_Name << " "
			<< m_EmpArray[i]->m_DeptId << endl;
	}
	//关闭文件
	ofs.close();
}

//统计文件中的人数
int WorkManager::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)
	string buf;
	while(getline(ifs,buf))//像上面那样读也可以
	{
		//统计人数
		num++;
	}
	return num;
}
//初始化员工
void WorkManager::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);
		}
		m_EmpArray[index] = worker;
		index++;
	}
	//关闭文件
	ifs.close();
}
//显示职工
void WorkManager::Show_Emp()
{
	//判断文件是否为空
	if (m_FileIsEmpty)
	{
		cout << "文件不存在或记录为空" << endl;
	}
	else
	{
		for (int i = 0; i < m_EmpNum; i++)
		{
			//利用多态调用程序接口
			m_EmpArray[i]->showInfo();
		}
	}
	system("pause");
	system("cls");
}
//删除职工
void WorkManager::Del_Emp()
{
	if (m_FileIsEmpty)
	{
		cout << "文件不存在或记录为空" << endl;
	}
	else
	{
		//按照职工编号删除职工
		cout << "请输入想要删除的职工的编号" << endl;
		int id;
		cin >> id;
		int index = IsExit(id);
		if ( index!= -1)
		{
			//说明职工存在,并且要删除index位置上的职工
			for (int i = index+1; i < m_EmpNum; i++)
			{
				m_EmpArray[i - 1] = m_EmpArray[i];
			}
			/*
			一个意思
			for (int i = index; i < m_EmpNum-1; i++)
			{
				m_EmpArray[i] = m_EmpArray[i+1];
			}
			*/
			//更新记录的人员个数
			m_EmpNum--;
			//同步更新到文件中
			save();

			cout << "删除成功" << endl;
		}
		else
		{
			cout << "删除失败,未找到该职工" << endl;
		}
	}
	system("pause");//按任意键继续
	system("cls");
}

//判断职工是否存在
//如果存在返回职工所在数组中的位置,不存在返回-1
int WorkManager::IsExit(int id)
{
	int index = -1;
	for (int i = 0; i < m_EmpNum; i++)
	{
		if (m_EmpArray[i]->m_Id == id)
		{
			//找到职工
			index = i;
			break;
		}
	}
	return index;
}
//修改职工
void WorkManager::Mod_Emp()
{
	if (m_FileIsEmpty)
	{
		cout << "文件不存在或者记录为空" << endl;
	}
	else
	{
		cout << "请输入修改职工的编号:" << endl;
		int id;
		cin >> id;
		int ret = IsExit(id);
		if (ret != -1)
		{
			//查找到编号的职工
			delete m_EmpArray[ret];//堆区的数据先释放干净

			//不知道大家也没有疑问?
			//为什么要删除数据,不能直接覆盖吗
			//覆盖就会内存泄露哦
			//因为数组这个位置存放了work*,它指向了
			//开辟在堆区的内存
			//如果直接覆盖,就是建立了一个work*,
			//指向一个新开辟的内存,然后把新建立的work*
			//放在这个位置。你看,原来开辟在堆区的数据还在
			//内存泄漏
			int newId = 0;
			string newName = "";
			int dSelect = 0;
			cout << "查到:" << id << "号职工,请输入新职工号" << endl;
			cin >> newId;
			cout << "请输入新的姓名:" << endl;
			cin >> newName;
			cout << "请输入岗位:" << endl;
			cout << "1.普通职工" << endl;
			cout << "2.经理" << endl;
			cout << "3.老板" << endl;
			cin >> dSelect;
			Worker* worker = NULL;
			switch (dSelect)
			{
			case 1:
				worker = new Employee(newId, newName, dSelect);
				break;
			case 2:
				worker =new Manager(newId, newName, dSelect);
				break;
			case 3:
				worker =new Boss(newId, newName, dSelect);
				break;
			default:
				break;
			}

			//更新数据 到数组中
			m_EmpArray[ret] = worker;

			cout << "修改成功!" << endl;

			//保存到文件中
			save();
		}
		else
		{
			cout << "修改失败,查无此人" << endl;
		}
		system("pause");
		system("cls");
	}
}
//查找职工
void WorkManager::Find_Emp()
{
	if (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 = IsExit(id);
			if (ret != -1)
			{
				//找到职工
				cout << "查找成功!该职工信息如下" << endl;
				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 < m_EmpNum; i++)
			{
				if (m_EmpArray[i]->m_Name == name)
				{
					cout << "查找成功,信息如下" << endl;
					//调用显示信息的接口
					m_EmpArray[i]->showInfo();
					flag = true;
				}
			}
			if (flag == false)
			{
				cout << "查找失败,查无此人" << endl;
			}
		}
		else
		{
			cout << "输入选项有无误" << endl;
		}
	}
	system("pause");
	system("cls");
}

11.2main函数测试

#include<iostream>
using namespace std;
#include"workManager.h"


int main()
{
	

	//实例化管理者对象
	WorkManager wm;

	int choice = 0;//用来存储用户的选择
	while (true)
	{
		//调用展示菜单的成员函数
		wm.Show_Menu();
		cout << "请输入您的选择:" << endl;
		cin >> choice;
		switch (choice)
		{
		case 0://退出系统
			wm.ExitSystem();
			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://排序职工
			break;
		case 7://清空文档
			break;
		default:
			system("cls");//清屏操作
			//输入的不是0-7,就会删除掉输入,在循环
				break;
		}
	}
	

	system("pause");

	return 0;
}

12.排序--选择排序

 12.1选择排序实现

#include"workManager.h"

WorkManager::WorkManager()
{
	//文件不存在
	ifstream ifs;
	ifs.open(FILENAME, ios::in);//读文件

	//判断文件是否打开成功,文件名写错,或者文件不存在
	//都会打开失败
	if (!ifs.is_open())
	{
		//cout << "文件不存在" << endl;
		//初始化记录人数
		m_EmpNum = 0;
		//初始化数组指针
		m_EmpArray = NULL;
		//初始化文件是否为空
		m_FileIsEmpty = true;
		ifs.close();
		return;//文件不存在不进行后续操作,直接return代码
	}

	//2.文件存在,数据为空
	char ch;
	//读入一个字符看是不是文件尾
	//ifs.eof()如果它为真,代表文件为空,读到了文件尾
	if ((ch = ifs.get()) == EOF)
	{
		//cout << "文件为空!!" << endl;
		//初始化记录人数
		m_EmpNum = 0;
		//初始化数组指针
		m_EmpArray = NULL;
		//初始化文件是否为空
		m_FileIsEmpty = true;
		ifs.close();
		return;

	}

	//3.文件存在,并且有数据
	//先看文件中有多少人
	int num = get_EmpNum();
	//cout << "职工人数为:"<<num << endl;
	m_EmpNum = num;

	//按照文件人数开辟空间
	m_EmpArray = new Worker * [m_EmpNum];
	//并且将文件中的数据,存到数组中
	init_Emp();

	//测试代码
	//输出的姓名如果为乱码,把文件另存为时把下面的编码改为ANSI
	/*
	for (int i = 0; i < m_EmpNum; i++)
	{
		cout << "职工编号:" << m_EmpArray[i]->m_Id
			<< " 姓名:" << m_EmpArray[i]->m_Name
			<< " 部门编号:" << m_EmpArray[i]->m_DeptId << endl;
	}
	*/
}
WorkManager::~WorkManager()
{
	if (m_EmpArray != NULL)
	{
		delete[] m_EmpArray;
		m_EmpArray = NULL;
	}
}
void WorkManager::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;

}
//退出系统
void WorkManager::ExitSystem()
{
	cout << "欢迎下次使用" << endl;
	system("pause");
	exit(0);//退出程序
	//不管在哪个地方调用,exit(0)都会退出
}
//添加职工的函数
void WorkManager::Add_Emp()
{
	cout << "请输入添加职工的数量" << endl;
	int addNum = 0;//保存用户输入的数量
	cin >> addNum;
	if (addNum > 0)
	{
		//添加

		//计算添加新空间的大小
		//比如假设有三个人了,用户在添加的时候,需要开辟一个更大的
		//把原来的挪过来
		int newSize = m_EmpNum + addNum;//新空间人数 = 原来记录人数 + 新增人数
        
		//开辟新空间,动态的数组
		Worker** newSpace = new Worker * [newSize];
		//数组里的数据是work* 类型,
		// 用new返回的是这个数组的首地址,
	   //也就是work* 类型的指针,所以是work**

	   //将原来空间下的数据,拷贝到新空间下
		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;//职工编号
			string name;//职工姓名
			int dSelect;//部门选择
			cout << "请输入第" << i + 1 << "个新职工编号:" << endl;
			cin >> id;
			
			cout << "请输入第" << i + 1 << "个新职工姓名:" << endl;
			cin >> name;
			
			cout << "请选择该职工的岗位" << endl;
			cout << "1、普通职工" << endl;
			cout << "2、经理" << endl;
			cout << "3、老板" << endl;
			while (1)
			{
				cin >> dSelect;
				if (dSelect == 1 || dSelect == 2 || dSelect == 3)
					break;
				else
					cout << "输入有误,重新输入" << endl;
			}
			Worker* worker = NULL;
			switch (dSelect)
			{
			case 1:
				worker = new Employee(id, name, dSelect);
				//需要在workManager.h里添加employee.h
				break;
			case 2:
				worker = new Manager(id, name, dSelect);
				break;
			case 3:
				worker = new Boss(id, name, dSelect);
				break;
			default:
				break;
			}
			//将创建的职工保存到数组中
			newSpace[m_EmpNum + i] = worker;	

		}
		//释放原有空间
		delete[] m_EmpArray;

		//更改新空间的指向
		m_EmpArray = newSpace;

		//更新新的职工人数
		m_EmpNum = newSize;

		//更新职工不为空的标志
		m_FileIsEmpty = false;

		//保存数据到文件中
		save();
		//提示添加成功
		cout << "成功添加" << addNum << "名新职工" << endl;
		
		//按任意键后清屏 回到上级目录
		system("pause");
		system("cls");
		//直接清屏的话看不到提示添加成功的话

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

}
//保存文件
void WorkManager::save()
{
	ofstream ofs;
	ofs.open(FILENAME, ios::out);

	//将每个人的数据写入文件中
	for (int i = 0; i < m_EmpNum; i++)
	{
		ofs << m_EmpArray[i]->m_Id << " "
			<< m_EmpArray[i]->m_Name << " "
			<< m_EmpArray[i]->m_DeptId << endl;
	}
	//关闭文件
	ofs.close();
}

//统计文件中的人数
int WorkManager::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)
	string buf;
	while(getline(ifs,buf))//像上面那样读也可以
	{
		//统计人数
		num++;
	}
	return num;
}
//初始化员工
void WorkManager::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);
		}
		m_EmpArray[index] = worker;
		index++;
	}
	//关闭文件
	ifs.close();
}
//显示职工
void WorkManager::Show_Emp()
{
	//判断文件是否为空
	if (m_FileIsEmpty)
	{
		cout << "文件不存在或记录为空" << endl;
	}
	else
	{
		for (int i = 0; i < m_EmpNum; i++)
		{
			//利用多态调用程序接口
			m_EmpArray[i]->showInfo();
		}
	}
	system("pause");
	system("cls");
}
//删除职工
void WorkManager::Del_Emp()
{
	if (m_FileIsEmpty)
	{
		cout << "文件不存在或记录为空" << endl;
	}
	else
	{
		//按照职工编号删除职工
		cout << "请输入想要删除的职工的编号" << endl;
		int id;
		cin >> id;
		int index = IsExit(id);
		if ( index!= -1)
		{
			//说明职工存在,并且要删除index位置上的职工
			for (int i = index+1; i < m_EmpNum; i++)
			{
				m_EmpArray[i - 1] = m_EmpArray[i];
			}
			/*
			一个意思
			for (int i = index; i < m_EmpNum-1; i++)
			{
				m_EmpArray[i] = m_EmpArray[i+1];
			}
			*/
			//更新记录的人员个数
			m_EmpNum--;
			//同步更新到文件中
			save();

			cout << "删除成功" << endl;
		}
		else
		{
			cout << "删除失败,未找到该职工" << endl;
		}
	}
	system("pause");//按任意键继续
	system("cls");
}

//判断职工是否存在
//如果存在返回职工所在数组中的位置,不存在返回-1
int WorkManager::IsExit(int id)
{
	int index = -1;
	for (int i = 0; i < m_EmpNum; i++)
	{
		if (m_EmpArray[i]->m_Id == id)
		{
			//找到职工
			index = i;
			break;
		}
	}
	return index;
}
//修改职工
void WorkManager::Mod_Emp()
{
	if (m_FileIsEmpty)
	{
		cout << "文件不存在或者记录为空" << endl;
	}
	else
	{
		cout << "请输入修改职工的编号:" << endl;
		int id;
		cin >> id;
		int ret = IsExit(id);
		if (ret != -1)
		{
			//查找到编号的职工
			delete m_EmpArray[ret];//堆区的数据先释放干净

			//不知道大家也没有疑问?
			//为什么要删除数据,不能直接覆盖吗
			//覆盖就会内存泄露哦
			//因为数组这个位置存放了work*,它指向了
			//开辟在堆区的内存
			//如果直接覆盖,就是建立了一个work*,
			//指向一个新开辟的内存,然后把新建立的work*
			//放在这个位置。你看,原来开辟在堆区的数据还在
			//内存泄漏
			int newId = 0;
			string newName = "";
			int dSelect = 0;
			cout << "查到:" << id << "号职工,请输入新职工号" << endl;
			cin >> newId;
			cout << "请输入新的姓名:" << endl;
			cin >> newName;
			cout << "请输入岗位:" << endl;
			cout << "1.普通职工" << endl;
			cout << "2.经理" << endl;
			cout << "3.老板" << endl;
			cin >> dSelect;
			Worker* worker = NULL;
			switch (dSelect)
			{
			case 1:
				worker = new Employee(newId, newName, dSelect);
				break;
			case 2:
				worker =new Manager(newId, newName, dSelect);
				break;
			case 3:
				worker =new Boss(newId, newName, dSelect);
				break;
			default:
				break;
			}

			//更新数据 到数组中
			m_EmpArray[ret] = worker;

			cout << "修改成功!" << endl;

			//保存到文件中
			save();
		}
		else
		{
			cout << "修改失败,查无此人" << endl;
		}
		system("pause");
		system("cls");
	}
}
//查找职工
void WorkManager::Find_Emp()
{
	if (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 = IsExit(id);
			if (ret != -1)
			{
				//找到职工
				cout << "查找成功!该职工信息如下" << endl;
				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 < m_EmpNum; i++)
			{
				if (m_EmpArray[i]->m_Name == name)
				{
					cout << "查找成功,信息如下" << endl;
					//调用显示信息的接口
					m_EmpArray[i]->showInfo();
					flag = true;
				}
			}
			if (flag == false)
			{
				cout << "查找失败,查无此人" << endl;
			}
		}
		else
		{
			cout << "输入选项有无误" << endl;
		}
	}
	system("pause");
	system("cls");
}
//按照编号排序
void WorkManager::Sort_Emp()
{
	if (m_FileIsEmpty)
	{
		cout << "文件不存在或记录为空" << endl;
		system("pause");
		system("cls");
	}
	else
	{
		cout << "请选择排序的方式:" << endl;
		cout << "1.按照职工编号升序" << endl;
		cout << "2.按照职工编号降序" << endl;
		int select = 0;
		cin >> select;
		//选择排序,比较暴力
		//两个for,每次把最小或最大的拿过来
		for (int i = 0; i < m_EmpNum; i++)
		{
			int minormax = i;//声明最小值或最大值下表
			for (int j = i + 1; j < m_EmpNum; j++)
			{
				if (select == 1)//升序
				{
					if (m_EmpArray[i]->m_Id > m_EmpArray[j]->m_Id)
						minormax = j;
				}
				else if (select == 2)//降序
				{
					if (m_EmpArray[i]->m_Id < m_EmpArray[j]->m_Id)
						minormax = j;
				}
			}
			//判断一开始认定的最小值或最大值 是不是计算的
			//最小值或最大值,如果不是,交换数据
			if (minormax != i)
			{
				Worker* temp = m_EmpArray[i];
				m_EmpArray[i] = m_EmpArray[minormax];
				m_EmpArray[minormax] = temp;
			}
		}
		save();//排序后的结果保存到文件中
		cout << "排序成功!排序后的结果为:" << endl;
		Show_Emp();//展示所有职工
        //因为Show_Emp();里面我们弄了按任意键清屏,所以
		//这里就不用写了
	}
}

12.2main函数测试

#include<iostream>
using namespace std;
#include"workManager.h"


int main()
{
	

	//实例化管理者对象
	WorkManager wm;

	int choice = 0;//用来存储用户的选择
	while (true)
	{
		//调用展示菜单的成员函数
		wm.Show_Menu();
		cout << "请输入您的选择:" << endl;
		cin >> choice;
		switch (choice)
		{
		case 0://退出系统
			wm.ExitSystem();
			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://清空文档
			break;
		default:
			system("cls");//清屏操作
			//输入的不是0-7,就会删除掉输入,在循环
				break;
		}
	}
	

	system("pause");

	return 0;
}

13.清空文件

 13.1析构函数的改进,以前写的有瑕疵

WorkManager::~WorkManager()
{
	if (m_EmpArray != NULL)
	{
		for (int i = 0; i < m_EmpNum; i++)
		{
			if (m_EmpArray[i] != NULL)
			{
				//每个元素也在堆区有
				delete m_EmpArray[i];
				m_EmpArray[i] = NULL;
			}
		}
		delete[] m_EmpArray;
		m_EmpArray = NULL;
	}
}

13.2清空函数实现

#include"workManager.h"

WorkManager::WorkManager()
{
	//文件不存在
	ifstream ifs;
	ifs.open(FILENAME, ios::in);//读文件

	//判断文件是否打开成功,文件名写错,或者文件不存在
	//都会打开失败
	if (!ifs.is_open())
	{
		//cout << "文件不存在" << endl;
		//初始化记录人数
		m_EmpNum = 0;
		//初始化数组指针
		m_EmpArray = NULL;
		//初始化文件是否为空
		m_FileIsEmpty = true;
		ifs.close();
		return;//文件不存在不进行后续操作,直接return代码
	}

	//2.文件存在,数据为空
	char ch;
	//读入一个字符看是不是文件尾
	//ifs.eof()如果它为真,代表文件为空,读到了文件尾
	if ((ch = ifs.get()) == EOF)
	{
		//cout << "文件为空!!" << endl;
		//初始化记录人数
		m_EmpNum = 0;
		//初始化数组指针
		m_EmpArray = NULL;
		//初始化文件是否为空
		m_FileIsEmpty = true;
		ifs.close();
		return;

	}

	//3.文件存在,并且有数据
	//先看文件中有多少人
	int num = get_EmpNum();
	//cout << "职工人数为:"<<num << endl;
	m_EmpNum = num;

	//按照文件人数开辟空间
	m_EmpArray = new Worker * [m_EmpNum];
	//并且将文件中的数据,存到数组中
	init_Emp();

	//测试代码
	//输出的姓名如果为乱码,把文件另存为时把下面的编码改为ANSI
	/*
	for (int i = 0; i < m_EmpNum; i++)
	{
		cout << "职工编号:" << m_EmpArray[i]->m_Id
			<< " 姓名:" << m_EmpArray[i]->m_Name
			<< " 部门编号:" << m_EmpArray[i]->m_DeptId << endl;
	}
	*/
}
WorkManager::~WorkManager()
{
	if (m_EmpArray != NULL)
	{
		for (int i = 0; i < m_EmpNum; i++)
		{
			if (m_EmpArray[i] != NULL)
			{
				//每个元素也在堆区有
				delete m_EmpArray[i];
				m_EmpArray[i] = NULL;
			}
		}
		delete[] m_EmpArray;
		m_EmpArray = NULL;
	}
}
void WorkManager::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;

}
//退出系统
void WorkManager::ExitSystem()
{
	cout << "欢迎下次使用" << endl;
	system("pause");
	exit(0);//退出程序
	//不管在哪个地方调用,exit(0)都会退出
}
//添加职工的函数
void WorkManager::Add_Emp()
{
	cout << "请输入添加职工的数量" << endl;
	int addNum = 0;//保存用户输入的数量
	cin >> addNum;
	if (addNum > 0)
	{
		//添加

		//计算添加新空间的大小
		//比如假设有三个人了,用户在添加的时候,需要开辟一个更大的
		//把原来的挪过来
		int newSize = m_EmpNum + addNum;//新空间人数 = 原来记录人数 + 新增人数
        
		//开辟新空间,动态的数组
		Worker** newSpace = new Worker * [newSize];
		//数组里的数据是work* 类型,
		// 用new返回的是这个数组的首地址,
	   //也就是work* 类型的指针,所以是work**

	   //将原来空间下的数据,拷贝到新空间下
		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;//职工编号
			string name;//职工姓名
			int dSelect;//部门选择
			cout << "请输入第" << i + 1 << "个新职工编号:" << endl;
			cin >> id;
			
			cout << "请输入第" << i + 1 << "个新职工姓名:" << endl;
			cin >> name;
			
			cout << "请选择该职工的岗位" << endl;
			cout << "1、普通职工" << endl;
			cout << "2、经理" << endl;
			cout << "3、老板" << endl;
			while (1)
			{
				cin >> dSelect;
				if (dSelect == 1 || dSelect == 2 || dSelect == 3)
					break;
				else
					cout << "输入有误,重新输入" << endl;
			}
			Worker* worker = NULL;
			switch (dSelect)
			{
			case 1:
				worker = new Employee(id, name, dSelect);
				//需要在workManager.h里添加employee.h
				break;
			case 2:
				worker = new Manager(id, name, dSelect);
				break;
			case 3:
				worker = new Boss(id, name, dSelect);
				break;
			default:
				break;
			}
			//将创建的职工保存到数组中
			newSpace[m_EmpNum + i] = worker;	

		}
		//释放原有空间
		delete[] m_EmpArray;

		//更改新空间的指向
		m_EmpArray = newSpace;

		//更新新的职工人数
		m_EmpNum = newSize;

		//更新职工不为空的标志
		m_FileIsEmpty = false;

		//保存数据到文件中
		save();
		//提示添加成功
		cout << "成功添加" << addNum << "名新职工" << endl;
		
		//按任意键后清屏 回到上级目录
		system("pause");
		system("cls");
		//直接清屏的话看不到提示添加成功的话

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

}
//保存文件
void WorkManager::save()
{
	ofstream ofs;
	ofs.open(FILENAME, ios::out);

	//将每个人的数据写入文件中
	for (int i = 0; i < m_EmpNum; i++)
	{
		ofs << m_EmpArray[i]->m_Id << " "
			<< m_EmpArray[i]->m_Name << " "
			<< m_EmpArray[i]->m_DeptId << endl;
	}
	//关闭文件
	ofs.close();
}

//统计文件中的人数
int WorkManager::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)
	string buf;
	while(getline(ifs,buf))//像上面那样读也可以
	{
		//统计人数
		num++;
	}
	return num;
}
//初始化员工
void WorkManager::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);
		}
		m_EmpArray[index] = worker;
		index++;
	}
	//关闭文件
	ifs.close();
}
//显示职工
void WorkManager::Show_Emp()
{
	//判断文件是否为空
	if (m_FileIsEmpty)
	{
		cout << "文件不存在或记录为空" << endl;
	}
	else
	{
		for (int i = 0; i < m_EmpNum; i++)
		{
			//利用多态调用程序接口
			m_EmpArray[i]->showInfo();
		}
	}
	system("pause");
	system("cls");
}
//删除职工
void WorkManager::Del_Emp()
{
	if (m_FileIsEmpty)
	{
		cout << "文件不存在或记录为空" << endl;
	}
	else
	{
		//按照职工编号删除职工
		cout << "请输入想要删除的职工的编号" << endl;
		int id;
		cin >> id;
		int index = IsExit(id);
		if ( index!= -1)
		{
			//说明职工存在,并且要删除index位置上的职工
			for (int i = index+1; i < m_EmpNum; i++)
			{
				m_EmpArray[i - 1] = m_EmpArray[i];
			}
			/*
			一个意思
			for (int i = index; i < m_EmpNum-1; i++)
			{
				m_EmpArray[i] = m_EmpArray[i+1];
			}
			*/
			//更新记录的人员个数
			m_EmpNum--;
			//同步更新到文件中
			save();

			cout << "删除成功" << endl;
		}
		else
		{
			cout << "删除失败,未找到该职工" << endl;
		}
	}
	system("pause");//按任意键继续
	system("cls");
}

//判断职工是否存在
//如果存在返回职工所在数组中的位置,不存在返回-1
int WorkManager::IsExit(int id)
{
	int index = -1;
	for (int i = 0; i < m_EmpNum; i++)
	{
		if (m_EmpArray[i]->m_Id == id)
		{
			//找到职工
			index = i;
			break;
		}
	}
	return index;
}
//修改职工
void WorkManager::Mod_Emp()
{
	if (m_FileIsEmpty)
	{
		cout << "文件不存在或者记录为空" << endl;
	}
	else
	{
		cout << "请输入修改职工的编号:" << endl;
		int id;
		cin >> id;
		int ret = IsExit(id);
		if (ret != -1)
		{
			//查找到编号的职工
			delete m_EmpArray[ret];//堆区的数据先释放干净

			//不知道大家也没有疑问?
			//为什么要删除数据,不能直接覆盖吗
			//覆盖就会内存泄露哦
			//因为数组这个位置存放了work*,它指向了
			//开辟在堆区的内存
			//如果直接覆盖,就是建立了一个work*,
			//指向一个新开辟的内存,然后把新建立的work*
			//放在这个位置。你看,原来开辟在堆区的数据还在
			//内存泄漏
			int newId = 0;
			string newName = "";
			int dSelect = 0;
			cout << "查到:" << id << "号职工,请输入新职工号" << endl;
			cin >> newId;
			cout << "请输入新的姓名:" << endl;
			cin >> newName;
			cout << "请输入岗位:" << endl;
			cout << "1.普通职工" << endl;
			cout << "2.经理" << endl;
			cout << "3.老板" << endl;
			cin >> dSelect;
			Worker* worker = NULL;
			switch (dSelect)
			{
			case 1:
				worker = new Employee(newId, newName, dSelect);
				break;
			case 2:
				worker =new Manager(newId, newName, dSelect);
				break;
			case 3:
				worker =new Boss(newId, newName, dSelect);
				break;
			default:
				break;
			}

			//更新数据 到数组中
			m_EmpArray[ret] = worker;

			cout << "修改成功!" << endl;

			//保存到文件中
			save();
		}
		else
		{
			cout << "修改失败,查无此人" << endl;
		}
		system("pause");
		system("cls");
	}
}
//查找职工
void WorkManager::Find_Emp()
{
	if (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 = IsExit(id);
			if (ret != -1)
			{
				//找到职工
				cout << "查找成功!该职工信息如下" << endl;
				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 < m_EmpNum; i++)
			{
				if (m_EmpArray[i]->m_Name == name)
				{
					cout << "查找成功,信息如下" << endl;
					//调用显示信息的接口
					m_EmpArray[i]->showInfo();
					flag = true;
				}
			}
			if (flag == false)
			{
				cout << "查找失败,查无此人" << endl;
			}
		}
		else
		{
			cout << "输入选项有无误" << endl;
		}
	}
	system("pause");
	system("cls");
}
//按照编号排序
void WorkManager::Sort_Emp()
{
	if (m_FileIsEmpty)
	{
		cout << "文件不存在或记录为空" << endl;
		system("pause");
		system("cls");
	}
	else
	{
		cout << "请选择排序的方式:" << endl;
		cout << "1.按照职工编号升序" << endl;
		cout << "2.按照职工编号降序" << endl;
		int select = 0;
		cin >> select;
		//选择排序,比较暴力
		//两个for,每次把最小或最大的拿过来
		for (int i = 0; i < m_EmpNum; i++)
		{
			int minormax = i;//声明最小值或最大值下表
			for (int j = i + 1; j < m_EmpNum; j++)
			{
				if (select == 1)//升序
				{
					if (m_EmpArray[i]->m_Id > m_EmpArray[j]->m_Id)
						minormax = j;
				}
				else if (select == 2)//降序
				{
					if (m_EmpArray[i]->m_Id < m_EmpArray[j]->m_Id)
						minormax = j;
				}
			}
			//判断一开始认定的最小值或最大值 是不是计算的
			//最小值或最大值,如果不是,交换数据
			if (minormax != i)
			{
				Worker* temp = m_EmpArray[i];
				m_EmpArray[i] = m_EmpArray[minormax];
				m_EmpArray[minormax] = temp;
			}
		}
		save();//排序后的结果保存到文件中
		cout << "排序成功!排序后的结果为:" << endl;
		Show_Emp();//展示所有职工
        //因为Show_Emp();里面我们弄了按任意键清屏,所以
		//这里就不用写了
	}
}
//清空文件
void WorkManager::Clean_Emp()
{
	cout << "确定清空?" << endl;
	cout << "1.确定" << endl;
	cout << "2.返回" << endl;
	int select;
	cin >> select;
	if (select == 1)
	{
		//清空文件
		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 m_EmpArray[i];
					m_EmpArray[i] = NULL;
				}
			}
			//删除堆区数组指针
			delete[] m_EmpArray;
			m_EmpArray = NULL;
			m_EmpNum = 0;
			m_FileIsEmpty = true;
		}
		cout << "清空成功" << endl;
	}
	else
	{
		cout << "不清空" << endl;
	}
	system("pause");
	system("cls");
}

13.3main函数测试

#include<iostream>
using namespace std;
#include"workManager.h"


int main()
{
	

	//实例化管理者对象
	WorkManager wm;

	int choice = 0;//用来存储用户的选择
	while (true)
	{
		//调用展示菜单的成员函数
		wm.Show_Menu();
		cout << "请输入您的选择:" << endl;
		cin >> choice;
		switch (choice)
		{
		case 0://退出系统
			wm.ExitSystem();
			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_Emp();
			break;
		default:
			system("cls");//清屏操作
			//输入的不是0-7,就会删除掉输入,在循环
				break;
		}
	}
	

	system("pause");

	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/157913.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pycharm基础安装教程:搭建python环境+安装pycharm

嗨害大家好鸭&#xff01;我是小熊猫~ 之前有的小伙伴总说小熊猫发的内容不够基础… 这次小熊猫就来给大家做一个简单的安装介绍吧~ 这里给大家准备了社区版pycharm2021.2 &#xff08;最新版部分库不稳定&#xff0c;不建议下载&#xff09; 第一次安装的小伙伴实在不会下载…

【JavaSE系列】第十节 —— 带你吃透抽象类

&#xff08;6&#xff09;当一个抽象类 继承一个抽象类的时候&#xff0c;可以不用来重写 当作父类的那个抽象类的抽象方法&#xff1a;提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、抽象类的概念 二、…

二叉苹果树 【树形dp(背包)】

来源&#xff1a;牛客网 题目链接&#xff1a;https://ac.nowcoder.com/acm/contest/25022/1006 题目描述 有一棵二叉苹果树&#xff0c;如果数字有分叉&#xff0c;一定是分两叉&#xff0c;即没有只有一个儿子的节点。这棵树共N个节点&#xff0c;标号1至N&#xff0c;树根编…

rollup.js配置环境变量

场景: 由于项目是通过svelte.js rollup.js框架搭建起来的, 并没有使用到cli脚手架, 没有办法配置不同环境的变量一. 使用cross-env添加环境变量安装cross-env&#xff0c;它可根据不同的系统设置环境变量npm install cross-env --save-dev在 package.json 中&#xff1a;"…

MongoDB索引

介绍 增加查询效率&#xff0c;不必每次都全表扫描单字段索引&#xff1a;在用户单个字段上创建升序/降序索引复合索引&#xff1a;在多个字段上添加索引&#xff1b;如{name:1, age:-1}&#xff0c;关注field顺序其他索引&#xff1a;地理空间索引&#xff0c;文本索引&#x…

浙大MBA复试经验和真题分享——知己知彼胜率更高

前段时间跟朋友吃饭的时候&#xff0c;问我在浙大读MBA是什么体验&#xff1f;其实说实话&#xff0c;当时选择浙大&#xff0c;主要还是为了学历&#xff0c;觉得自己一个普通的二本学历真的平平无奇&#xff0c;公司里面新进的员工虽然年纪轻&#xff0c;但学历却很有来头&am…

PySpark任务提交spark-submit参数设置一文详解

目录 前言 一、PySpark集群运行原理 二、spark-submit参数详解 1.指定运行目录 2.--deploy-mode 3.--master 4.驱动程序和执行器资源 5.--files和--verbose 6.Spark提交配置 三.PySpark程序提交配置选项 1.构建一套虚拟环境 2. 模块依赖问题原因 参阅 前言 之前我们已…

MySQL 笔记

文章目录安装MySQL 语法格式MySQL数据类型命令操作数据库CRUD查询创建表删除表修改表操作数据增改删查基础查询条件查询模糊查询排序查询分组查询分页查询聚合函数约束约束分类安装 软件安装&#xff5c;macOS下超详细的MySQL安装 MySQL 语法格式 每条语句以分号;结尾&#…

LeetCode150.逆波兰表达式

LeetCode刷题记录 文章目录&#x1f4dc;题目描述&#x1f4a1;解题思路⌨C代码&#x1f4dc;题目描述 给你一个字符串数组 tokens &#xff0c;表示一个根据 逆波兰表示法 表示的算术表达式。 请你计算该表达式。返回一个表示表达式值的整数。 注意 有效的算符为 、-、* 和/。…

如何mock当前类的私有方法

背景 基础知识 mockito单元测试&#xff1a;它的做法是mock掉当前类的所有外部依赖&#xff0c;保障自己的代码没有问题。举个例子&#xff0c;如果数据库查询的语句出了问题&#xff0c;单元测试不会测试出来。因为它直接mock掉了&#xff0c;不会去真的去查数据库。从这点来…

电压放大器在大功率脉冲电能源研究中的应用

实验名称&#xff1a;大功率脉冲电能源高精度测试技术研究 研究方向&#xff1a;仪器仪表测试 测试目的&#xff1a; 传统的测量精度校准的方法是对传感器单一频率下的刻度因子进行校准&#xff0c;校准方法通常选用同轴分流器串联于放电回路中&#xff0c;通过测量同轴分流器两…

Ubuntu18.04下安装mysql并使用QT成功编译驱动方法

开发环境&#xff1a;Ubuntu18.04QT5.14.2MySQL5.7.240 编译步骤&#xff1a; 1、安装mysql软件和驱动&#xff1a; 打开终端命令&#xff0c;执行安装语句如下&#xff1a; sudo apt-get install mysql-server sudo apt-get install mysql-client sudo apt-get install lib…

MyBatisPlus(MP)学习记录(分页查询的开启+日志打印配置)

MP介绍&#xff08;官网链接&#xff09; MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。 前言 本篇文章展示的MP教学中涉及到的版本如下&#xff1a; IDE…

使用Xshell 将Linux文件下载到本地或者将本地的文件上传到Linux

第一步&#xff1a;在Linux中安装上传下载功能的软件 sudo apt install lrzsz第二步&#xff1a;将Linux文件下载到本地&#xff1a;此时我的Linux桌面上有一个叫test.c的文件&#xff0c;我要将它下载到windows桌面上。 在Linux终端输入&#xff1a; sz test.c这里使用的是…

座舱显示的未来到底是什么?宝马供应商给出了答案

“显示器是汽车的核心人机界面&#xff0c;”业内人士表示&#xff0c;与此同时更智能化、体验更好的显示解决方案在驾驶舱的设计中起着核心作用。 屏幕及其增强驾驶体验的巨大潜力正迅速成为未来智能网联汽车DNA的一部分。高分辨率、大尺寸以及曲面屏、OLED屏等等新元素&…

【手写 Vue2.x 源码】第十九篇 - 根据 vnode 创建真实节点

一&#xff0c;前言 上篇&#xff0c;根据 render 函数&#xff0c;生成 vnode&#xff0c;主要涉及以下几点&#xff1a; 封装 vm._render 返回虚拟节点_s&#xff0c;_v&#xff0c;_c的实现 本篇&#xff0c;根据 vnode 虚拟节点渲染真实节点 二&#xff0c;根据 vnode 创…

SpringCloud项目实例3--Nacos整合

然后新建一个Module&#xff0c;命名为nacos-provider-demo&#xff0c;Java代码的包名为ltd.newbee.cloud。在该Module的pom.xml配置文件中增加parent标签&#xff0c;与上层Maven建立好关系。之后&#xff0c;在这个子模块的 pom.xml 文件中加入Nacos的依赖项 spring-cloud-s…

谈一谈暴露偏差

文章由参考文章重新组合而来。 暴露偏差又叫Exposure Bias&#xff0c;是由Teacher Forcing 导致的。 Teacher Forcing Teacher Forcing 是一种用于序列生成任务的训练技巧&#xff0c;与Autoregressive模式相对应&#xff0c;这里阐述下两者的区别&#xff1a; Autoregres…

【Flink系列】部署篇(一):Flink集群部署

主要回答以下问题&#xff1a; Flink集群是由哪些组件组成的&#xff1f;它们彼此之间如何协调工作的&#xff1f;在Flink中job, task, slots,parallelism是什么意思&#xff1f;集群中的资源是如何调度和分配的&#xff1f;如何搭建一个Flink集群&#xff1f;如何配置高可用服…

目标检测再升级!YOLOv8模型训练和部署

一个不知名大学生&#xff0c;江湖人称菜狗 original author: jacky Li Email : 3435673055qq.com Time of completion&#xff1a;2023.1.12 Last edited: 2023.1.12 目录 目标检测再升级&#xff01;YOLOv8模型训练和部署 简介 YOLOv8创新改进点 区别 1、C2f模块是什么&…