职工管理系统C++

news2024/9/20 9:24:45

1、管理系统需求

职工管理系统可以用来管理公司内所有员工的信息

本教程主要利用C++来实现一个基于多态的职工管理系统

公司中职工分为三类:普通员工、经理、老板,显示信息时,需要显示职工编号、职工姓名、职工岗位、以及职责

普通员工职责:完成经理交给的任务

经理职责:完成老板交给的任务,并下发任务给员工

老板职责:管理公司所有事务

管理系统中需要实现的功能如下:

  1. 退出管理程序: 退出当前管理系统
  2. 增加职工信息:实现批量添加职工功能,将信息录入到文件中,职工信息为:职工编号、姓名、部门编号
  3. 显示职工信息:显示公司内部所有职工的信息
  4. 删除离职职工:按照编号删除指定的职工
  5. 修改职工信息:按照编号修改职工个人信息
  6. 查找职工信息: 按照职工的编号或者职工的姓名进行查找相关的人员信息
  7. 按照编号排序:按照职工编号,进行排序,排序规则由用户指定
  8. 清空所有文档:清空文件中记录的所有职工信息 (清空前需要再次确认,防止误删)

系统界面效果如下:

目录

3、创建管理类

3.1创建文件

3.2头文件实现

4、菜单功能

4.1添加成员函数

4.2菜单功能实现

4.3测试菜单功能

5、退出功能

5.1提供功能接口

5.2实现退出功能

5.3测试功能

6、创建职工类

6.1 创建职工抽象类

6.2 创建普通员工类

6.3 创建经理类

6.4 创建老板类

6.5 测试多态

 7、添加职工

7.1 功能分析

7.2 功能实现

8、文件交互-写文件

8.1 设定文件路径

8.2 成员函数声明

9、文件交互- 读文件

9.1 文件未创建

9.2文件存在且数据为空

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

9.3.1获取记录的职工人数

9.3.2 初始化数组

10、显示职工

10.1显示职工函数声明

10.2显示职工函数实现

11、删除职工

11.1删除职工函数声明

11.2职工是否存在函数是声明

11.3职工是否存在函数实现

11.4删除职工函数实现

11.5测试代码

12、修改职工

12.1修改职工函数声明

12.2修改职工函数实现

12.3测试代码

13、查找职工

13.1查找职工函数声明

13.2查找职工函数实现

13.3测试代码

14、排序

14.1排序函数声明

14.2排序函数实现

14.3测试代码

15、清空文件

15.1清空函数声明

15.2清空函数实现

15.3测试代码


3、创建管理类

管理类负责的内容如下:

  1. 与用户的沟通菜单界面
  2. 对职工增删改查的操作
  3. 与文件的读写交互

3.1创建文件

在头文件和源文件的文件夹下分别创建workerManager.h 和 workerManager.cpp文件

3.2头文件实现

在workerManager.h中设计管理类

代码如下:

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

class WorkerManager
{
public:
	//构造函数
	WorkerManager();

	//析构函数
	~WorkerManager();

private:

};

 3.3源文件实现

在workerManager.cpp中将构造和析构函数空实现补全。

#include"workerManager.h"

WorkerManager::WorkerManager()
{
}

WorkerManager::~WorkerManager()
{
}

至此职工管理类已经创建完成。

4、菜单功能

功能描述:与用户的沟通界面

4.1添加成员函数

在管理类workerManager.h中添加成员函数 void Show_Menu();  //展示菜单

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

class WorkerManager
{
public:
	//构造函数
	WorkerManager();
	//展示菜单
	void Show_Menu();
	//析构函数
	~WorkerManager();

private:

};

4.2菜单功能实现

在管理类workerManager.cpp中实现Show_Menu()函数

//展示菜单
void WorkerManager::Show_Menu()
{
	cout << "********************************" << endl;
	cout << "*****欢迎使用职工管理系统!*****" << endl;
	cout << "*****    0.退出管理程序    *****" << endl;
	cout << "*****    1.增加职工信息    *****" << endl;
	cout << "*****    2.显示职工信息    *****" << endl;
	cout << "*****    3.删除离职职工    *****" << endl;
	cout << "*****    4.修改职工信息    *****" << endl;
	cout << "*****    5.查找职工信息    *****" << endl;
	cout << "*****    6.按照编号排序    *****" << endl;
	cout << "*****    7.清空所有文档    *****" << endl;
	cout << "********************************" << endl;
	cout << endl;
}

4.3测试菜单功能

在职工管理系统.cpp中测试菜单功能。

代码:

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

int main()
{
	//实例化管理者对象
	WorkerManager wm;
	//调用展示菜单成员函数
	wm.Show_Menu();

	system("pause");
	return 0;
}

测试效果:

5、退出功能

5.1提供功能接口

在main函数中提供分支选择,提供每个功能接口

代码:

5.2实现退出功能

在workerManager.h中提供退出系统的成员函数 void Exitsystem();

在workerManager.cpp中提供具体的功能实现

void WorkerManager::ExitSystem()
{
	cout << "欢迎下次使用" << endl;
	system("pause");
	exit(0);
}

5.3测试功能

在main函数分支0选项中,调用退出程序的接口。

6、创建职工类

6.1 创建职工抽象类

职工的分类为:普通员工、经理、老板

将三种职工抽象到一个类 (worker)广中,利用多态管理不同职工种类

职工的属性为:职工编号、职工姓名、职工所在部门编号

职工的行为为:岗位职责信息描述,获取岗位名称

头文件文件夹下 创建文件worker.h 文件并且添加如下代码:

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

//职工抽象基类 virtual纯虚函数
class Worker
{
public:
	//显示个人信息
	virtual void showInfo() = 0;
	//获取岗位名称
	virtual string getDeptName() = 0;

	int m_Id; //职工编号
	string m_Name; //职工姓名
	int m_DeptId; //职工所在部门名称编号
private:
};

6.2 创建普通员工类

普通员工类继承职工抽象类,并重写父类中纯虚函数

在头文件和源文件的文件夹下分别创建employee.h 和 employee.cpp文件

employee.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();
	//获取职工岗位名称
	virtual string getDeptName();
};

employee.cpp中代码如下:

#include "employee.h"

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

void Employee::showInfo()
{
	cout << "职工编号:" << this->m_Id
		<<"\t职工姓名:" << this->m_Name
		<<"\t岗位:"<< this->getDeptName()
		<<"\t岗位职责:完成经理交给的任务" << endl;
}

string Employee::getDeptName()
{
	return string("员工");
}

6.3 创建经理类

经理类继承职工抽象类,并重写父类中纯虚函数,和普通员工类似

在头文件和源文件的文件夹下分别创建manager.h 和 manager.cpp文件

manager.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();
};

Manager.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("经理");
}

6.4 创建老板类

老板类继承职工抽象类,并重写父类中纯虚函数,和普通员工类似

在头文件和源文件的文件夹下分别创建boss.h 和 boss.cpp文件

boss.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();
};

boss.cpp中的代码如下:

#include "boss.h"
Boss::Boss(int id, string name, int dId)
{
	this->m_Id = id;
	this->m_Name = name;
	this->m_DeptId = dId;
}

void Boss::showInfo()
{
	cout << "职工编号:" << this->m_Id
		<< "\t职工姓名: " << this->m_Name
		<< "\t岗位:" << this->getDeptName()
		<< "\t岗位职责:管理公司所有事务" << endl;
}

string Boss::getDeptName()
{
	return string("总裁");
}

6.5 测试多态

在职工管理系统.cpp中添加测试函数,并且运行能够产生多态

测试代码如下:

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

void test()
{
	Worker* worker = NULL;
	worker = new Employee(1,"张三",1);
	worker->showInfo();
	delete worker;
	worker = new Manager(2,"李四",2);
	worker->showInfo();
	delete worker;
	worker = new Boss(3,"王五",3);
	worker->showInfo();
	delete worker;
}

 7、添加职工

功能描述:批量添加职工,并且保存到文件中

7.1 功能分析

分析:

用户在批量创建时,可能会创建不同种类的职工

如果想将所有不同种类的员工都放入倒一个数组中,可以将所有员工的指针维护到一个数组里

如果想在程序中维护这个不定长度的数组,可以将数组创建到堆区,并利用Worker **的指针维护

例如:Woker ** = new Worker*[5];

7.2 功能实现

(1)在WokerManager.h头文件中添加成员属性 代码:

//记录职工中的人数个数
int m_EmpNum;
//员工数组的指针
Worker** m_EmpArray;

(2)在WorkerManager构造函数中初始化属性

WorkerManager::WorkerManager()
{
	//初始化人数
	this->m_EmpNum = 0;
	//初始化数组指针
	this->m_EmpArray = NULL;
}

(3)在workManager.h中添加成员函数

//增加职工
void Add_Emp();

(4)workManager.cpp中实现该函数

//增加职工
void WorkerManager::Add_Emp()
{
	cout << "请输入增加职工数量:" << endl;
	int addNum = 0;
	cin >> addNum;
	
	if (addNum > 0)
	{
		//计算新空间大小
		int newSize = this->m_EmpNum + addNum;
		//开辟新空间
		Wlorker ** newSpace = new Worker * [newSize];
		//将原来空间下的内容存放到新空间下
		if (this->m_EmpArray != NULL)
		{
			for (int i = 0; i < this->m_EmpNum; i++)
			{
				newSpace[i] = this->m_EmpArray[i];
			}
		}
		//输入新数据
		for (int i = 0; i < addNum; i++)
		{
			int id;
			string name;
			int dSelect;
			cout << "请输入第 " << i + 1 << " 个新职工编号" << endl;
			cin >> id;
			cout << "请输入第 " << i + 1 << "个新职工姓名:" << endl;
			cin >> name;
			
			cout <<"请选择该职工的岗位:"<< endl;
			cout << "1、普通职工" << endl;
			cout << "2、经理" << endl;
			cout << "3、老板" << endl;
			cin >> dSelect;

			Worker * worker = NULL;
			switch (dSelect)
			{
			case 1: //普通员工
				worker = new Employee(id, name, 1); 
				break;
			case 2: //经理
				worker = new Manager(id, name, 2); 
				break;
			case 3: //老板
				worker = new Boss(id, name, 3);
			break;
			default:
				break;
			}
			newSpace[this->m_EmpNum + i] = worker;
		}
		//释放原有空间
		delete[] this->m_EmpArray;
		//更改新空间的指向
		this->m_EmpArray = newSpace;
		//更新新的个数
		this->m_EmpNum = newSize;
		//提示信息
		cout << "成功添加" << addNum << "名新职工!" << endl;
	}
	else
	{
		cout << "输入有误" << endl;
			
	}
	system("pause");
	system("cls");
}

8、文件交互-写文件

功能描述:对文件进行读写

  1. 在上一个添加功能中,我们只是将所有的数据添加到了内存中,一旦程序结束就无法保存了
  2. 因此文件管理类中需要一个与文件进行交互的功能,对于文件进行读写操作

8.1 设定文件路径

首先我们将文件路径,在workerManager.h中添加宏常量,并且包含头文件 fstream

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

8.2 成员函数声明

在workerManager.h中类里添加成员函数 void save()

//保存文件
void save();

8.3保存文件功能实现

//保存文件
void WorkerManager::save()//实现函数 并 添加作用域WorkerManager::
{
	ofstream ofs;
	ofs.open(FILENAME, ios::out);//用输出的方式打开文件 -- 写文件
	//将每个人数据写入到文件中
	for (int i = 0; i < this->m_EmpNum; i++)
	{
		ofs << this->m_EmpArray[i]->m_Id << " "
			<< this->m_EmpArray[i]->m_Name << " "
			<< this->m_EmpArray[i]->m_DeptId << endl;
	}
	//关闭文件
	ofs.close();
}

9、文件交互- 读文件

功能描述:将文件中的内容读取到程序中

虽然我们实现了添加职工后保存到文件的操作,但是每次开始运行程序,并没有将文件中数据读取到程序中而我们的程序功能中还有清空文件的需求因此构造函数初始化数据的情况分为三种

1.第一次使用,文件未创建

2.文件存在,但是数据被用户清空

3.文件存在,并且保存职工的所有数据

9.1 文件未创建

在workerManager.h中添加新的成员属性 m_FilelsEmpty标志文件是否为空

//判断文件是否为空 标志
bool m_FileIsEmpty;

修改WorkerManager.cpp中构造函数代码。

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

	if (!ifs.is_open())
	{
		cout << "文件不存在" << endl;
		//初始化属性
		//初始化人数
		this->m_EmpNum = 0;
		//初始化数组指针
		this->m_EmpArray = NULL;
		//初始化文件是否为空
		this->m_FileIsEmpty = true;
		ifs.close();
		return;
	}	
}

删除文件后,测试文件不存在时初始化数据功能。

9.2文件存在且数据为空

在workerManager.cpp中构造函数追加代码:

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

	if (!ifs.is_open())
	{
		cout << "文件不存在" << endl;
		//初始化属性
		//初始化人数
		this->m_EmpNum = 0;
		//初始化数组指针
		this->m_EmpArray = NULL;
		//初始化文件是否为空
		this->m_FileIsEmpty = true;
		ifs.close();
		return;
	}	
	//2、文件存在 数据为空
	char ch;
	ifs >> ch;
	if (ifs.eof())
	{
		//文件为空
		cout << "文件为空" << endl;
		//初始化属性
		//初始化人数
		this->m_EmpNum = 0;
		//初始化数组指针
		this->m_EmpArray = NULL;
		//初始化文件是否为空
		this->m_FileIsEmpty = true;
		ifs.close();
		return;
	}
}

将文件创建后清空文件内容,并测试该情况下初始化功能

我们发现文件不存在或者为空清空 m_FilelsEmpty 判断文件是否为空的标志都为真,那何时为假?

成功添加职工后,应该更改文件不为空的标志

void WorkerManager::Add_Emp()中添加this->m_FileIsEmpty = false;

//更新新的职工人数
this->m_EmpNum = newSize;
//更新职工不为空的标志
this->m_FileIsEmpty = false;

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

9.3.1获取记录的职工人数

在workerManager.h中添加成员函数int get_EmpNum();

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

在workerManager.cpp中实现

//统计文件中人数
int WorkerManager::get_EmpNum()
{
	ifstream ifs;
	ifs.open(FILENAME, ios::in);//读文件 打开文件
	int id;
	string name;
	int dId;
	int num = 0;
	while (ifs >> id && ifs >> name && ifs >> dId)//读取三个数据
	{
		//统计人数变量
		num++;
	}
	return num;
}

在workerManager.cpp构造函数中继续追加代码

//3、当文件存在,并且记录数据
	int num = this->get_EmpNum();
	cout << "职工人数为" << num << endl;
	this->m_EmpNum = num;

手动添加一些职工数据,测试获取职工数量函数。

9.3.2 初始化数组

根据职工的数据以及职工数据,初始化workerManager中的Worker ** m_EmpArray 指针

在WorkerManager.h中添加成员函数 void init_Emp();

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

在WorkerManager.cpp中实现

//初始化员工
void WorkerManager::init_Emp()
{
	ifstream ifs;
	ifs.open(FILENAME, ios::in);
	int id;
	string name;
	int dId;
	int index = 0;
	while (ifs >> id && ifs >> name && ifs >> dId)//读取三个数据
	{
		Worker* worker = NULL;
		if (dId == 1)//普通职工
		{
			worker = new Employee(id, name, dId);
		}
		else if (dId == 2)//经理
		{
			worker = new Manager(id, name, dId);
		}
		else//老板
		{
			worker = new Boss(id, name, dId);
		}
		this->m_EmpArray[index] = worker;
		index++;
	}
	//关闭文件
	ifs.close();
}

测试代码

//测试代码
	for (int i = 0; i < this->m_EmpNum; i++)
	{
		cout << "职工编号:" << this->m_EmpArray[i]->m_Id
			<< " 姓名:" << this->m_EmpArray[i]->m_Name
			<< " 部门编号:" << this->m_EmpArray[i]->m_DeptId << endl;
	}

10、显示职工

功能描述:显示当前所有职工信息

10.1显示职工函数声明

在workerManager.h中添加成员函数void Show_Emp();

//显示职工
void Show_Emp();

10.2显示职工函数实现

在workerManager.cpp中实现成员函数void Show_Emp();

//2、显示职工
void WorkerManager::Show_Emp()
{
	//判断文件是否为空
	if (this->m_FileIsEmpty)
	{
		cout << "文件不存在,或者记录为空" << endl;
	}
	else
	{
		for (int i = 0; i < m_EmpNum; i++)
		{
			//利用多态调用程序接口
			this->m_EmpArray[i]->showInfo();
		}
	}
	//按任意键后清屏
	system("pause");
	system("cls");
}

在职工管理系统.cpp中添加wm.Show_Emp();

case 2: //显示职工
	wm.Show_Emp();
break;

显示结果:

11、删除职工

功能描述:按照职工的编号进行删除职工操作。

11.1删除职工函数声明

在workerManger.h中添加成员函数void Del_Emp();

//删除职工
void Del_Emp();

11.2职工是否存在函数是声明

很多功能都需要用到根据职工是否存在来进行操纵,如:删除职工、修改职工、查找职工

因此添加该公告函数,以便后续调用

在workerManager.h中添加成员函数 int IsExist(int id);

//判断职工是否存在  如果存在,返回职工所在数组中的位置,不存在返回-1;
int IsExist(int id);

11.3职工是否存在函数实现

在workerManager.cpp中实现成员函数 int IsExist(int id);

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

11.4删除职工函数实现

在workerManager.cpp中实现成员函数void Del_Emp();

//3、删除职工
void WorkerManager::Del_Emp()
{
	if (this->m_FileIsEmpty)
	{
		cout << "文件不存在或记录为空!" << endl;
	}
	else
	{
		//按照职工编号删除
		cout << "请输入想要删除职工编号:" << endl;
		int id = 0;
		cin >> id;
		int index = this->IsExist(id);
		if (index != -1)//说明职工存在,并且要删除掉index位置上的职工
		{
			for (int i = index;i<this->m_EmpNum -1;i++)
			{   //数据前移
				this->m_EmpArray[i] = this->m_EmpArray[i + 1];
			}
			this->m_EmpNum--;//更新数组中记录人员个数
			//同步更新到文件中
			this->save();
			cout << "删除成功!" << endl;
		}
		else
		{
			cout << "删除失败,未找到该职工" << endl;
		}
	}
	//按任意键 清屏
	system("pause");
	system("cls");
}

11.5测试代码

在职工管理系统.cpp中添加wm.Del_Emp();

case 3: //删除职工
	wm.Del_Emp();
break;

12、修改职工

功能描述:能够按照职工的编号对职工信息进行修改并保存

12.1修改职工函数声明

在workerManager.h中添加成员函数void Mod_Emp();

//修改职工
void Mod_Emp();

12.2修改职工函数实现

在workerManager.cpp中实现成员函数void Mod_Emp();

//4、修改职工
void WorkerManager::Mod_Emp()
{
	if (this->m_FileIsEmpty)
	{
		cout << "文件不存在或记录为空!" << endl;
	}
	else
	{
		cout << "请输入想要修改职工的编号:" << endl;
		int id;
		cin >> id;
		int ret = this->IsExist(id);
		if (ret != -1)//说明职工存在
		{
			//查找到编号的职工
			delete this->m_EmpArray[ret];
			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;
			}
			//更新数据 到数组中
			this->m_EmpArray[ret] = worker;
			cout << "修改成功!" << endl;
			//保存到文件中
			this->save();
		}
		else
		{
			cout << "修改失败,查无此人!" << endl;
		}
	}
	//按任意键 清屏
	system("pause");
	system("cls");
}

12.3测试代码

case 4: //修改职工
	wm.Mod_Emp();
break;

13、查找职工

功能描述:提供两种查找职工方式,一种按照职工编号,一种按照职工姓名。

13.1查找职工函数声明

在workerManager.h中添加成员函数void Find_Emp();

//查找职工
void Find_Emp();

13.2查找职工函数实现

在workerManager.cpp中实现成员函数void Find_Emp();

//5、查找职工
void WorkerManager::Find_Emp()
{
	if (this->m_FileIsEmpty)
	{
		cout << "文件不存在或记录为空!" << endl;
	}
	else
	{
		cout << "请输入查找的方式:" << endl;
		cout << "1、按照职工编号查找" << endl;
		cout << "2、按照职工姓名查找" << endl;
		int select = 0;
		cin >> select;
		if (select == 1)//1、按照职工编号查找
		{
			int id;
			cout << "请输入查找的职工编号:" << endl;
			cin >> id;
			int ret = IsExist(id);
			if (ret != -1)
			{
				//找到该职工
				cout << "查找成功!该职工信息如下:" << endl;
				this->m_EmpArray[ret]->showInfo();
			}
			else
			{
				cout << "查找失败,查无此人!" << endl;
			}
		}
		else if (select == 2)//2、按照职工姓名查找
		{
			string name;
			cout << "请输入查找的姓名:" << endl;
			cin >> name;
			//加入判断是否查到的标志
			bool flag = false;//默认未找到职工
			for (int i = 0; i < m_EmpNum; i++)
			{
				if (this->m_EmpArray[i]->m_Name == name)
				{
					cout << "查找成功,职工编号为:"
						<<this->m_EmpArray[i]->m_Id
						<< "号职工信息如下:"<<endl;
					flag = true;
					//调用显示信息的接口
					this->m_EmpArray[i]->showInfo();
				}
			}
			if (flag == false)
			{
				cout << "查找失败,查无此人!" << endl;
			}
		}
		else
		{
			cout << "输入的选项有误!" << endl;
		}
	}
	//按任意键 清屏
	system("pause");
	system("cls");
}

13.3测试代码

case 5: //查找职工
	wm.Find_Emp();
break;

14、排序

功能描述:按照职工编号进行排序,排序的顺序由用户指定

14.1排序函数声明

在workerManager.h中添加成员函数void Sort Emp();

//按照编号排序
void Sort_Emp();

14.2排序函数实现

在workerManager.cpp中实现成员函数void Sort Emp();

//6、按照编号排序
void WorkerManager::Sort_Emp()
{
	if (this->m_FileIsEmpty)
	{
		cout << "文件不存在或记录为空!" << endl;
		//按任意键 清屏 ——当文件不存在时
		system("pause");
		system("cls");
	}
	else
	{
		cout << "请选择排序方式:" << endl;
		cout << "1、按照工号进行升序" << endl;
		cout << "2、按照工号进行降序" << endl;
		int select = 0;
		cin >> select;
		for (int i = 0; i < m_EmpNum; i++)//实现排序功能
		{
			int minormax = i;//申明最小值 或者 最大值
			for (int j = i + 1; j < this->m_EmpNum; j++)//后一位
			{
				if (select == 1)//1、升序
				{
					if (this->m_EmpArray[minormax]->m_Id > this->m_EmpArray[j]->m_Id)
					{
						minormax = j;
					}
				}
				else//降序
				{
					if (this->m_EmpArray[minormax]->m_Id < this->m_EmpArray[j]->m_Id)
					{
						minormax = j;
					}
				}
			}
			//判断一开始认定 最小值或最大值 是不是 计算的最小值或最大值,如果不是 交换数据
			if (i != minormax)
			{
				Worker* temp = this-> m_EmpArray[i];
				this->m_EmpArray[i] = this->m_EmpArray[minormax];
				this->m_EmpArray[minormax] = temp;
			}
		}
		cout << "排序成功!排序后的结果为:" << endl;
		this->save();//排序后结果保存到文件中
		this->Show_Emp();//展示所有职工
	}
}

14.3测试代码

case 6: //排序职工
	wm.Sort_Emp();
break;

15、清空文件

功能描述:将文件中记录数据清空

15.1清空函数声明

在workerManager.h中添加成员函数void Clean_File();

//清空文件
void Clean_File();

15.2清空函数实现

在workerManager.cpp中实现成员函数void Clean_File();

//7、清空文件
void WorkerManager::Clean_File()
{
	cout << "确认清空?" << endl;
	cout << "1、确认" << endl;
	cout << "2、返回" << endl;
	int select = 0;
	cin >> select;
	if (select == 1)
	{
		//清空文件
		ofstream ofs(FILENAME, ios::trunc);//删除文件后重新创建
		ofs.close();
		if (this->m_EmpArray != NULL)
		{
			//删除堆区的每个职工对象
			for (int i = 0; i < this->m_EmpNum; i++)
			{
				delete this->m_EmpArray[i];
				this->m_EmpArray[i] = NULL;
			}
			//删除堆区数组指针
			delete[] this->m_EmpArray;
			this->m_EmpArray = NULL;
			this->m_EmpNum = 0;
			this->m_FileIsEmpty = true;
		}
		cout << "清空成功!" << endl;
	}
	//按任意键 清屏 ——当文件不存在时
	system("pause");//任意键继续
	system("cls");//清屏
}

15.3测试代码

case 7: //清空文件
	wm.Clean_File();
break;

完结。

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

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

相关文章

一文了解JavaScript 与 TypeScript的区别

TypeScript 和 JavaScript 是两种互补的技术&#xff0c;共同推动前端和后端开发。在本文中&#xff0c;我们将带您快速了解JavaScript 与 TypeScript的区别。 一、TypeScript 和 JavaScript 之间的区别 JavaScript 和 TypeScript 看起来非常相似&#xff0c;但有一个重要的区…

CASAIM自动化平面度检测设备3D扫描零部件形位公差尺寸测量

平面度是表面形状的度量&#xff0c;指示沿该表面的所有点是否在同一平面中&#xff0c;当两个表面需要连接在一起形成紧密连接时&#xff0c;平面度检测至关重要。 CASAIM自动化平面度检测设备通过搭载领先的激光三维测头和智能检测软件自动获取零部件高质量测量数据&#xf…

Vue 入门(一)

一、注意 Vue 不支持 IE8 及以下的版本&#xff0c;因为 Vue 使用了 IE8 无法模拟的 ECMAScript 5 特性&#xff0c;但它支持所有兼容 ECMAScript 5 的浏览器。 二、创建 Hello Vue Vue.js 的核心是实现了 MVVM 模式&#xff0c;它扮演的角色就是 ViewModel 层&#xff0c;那么…

STM32使用HAL库中外设初始化MSP回调机制及中断回调机制详解

STM32使用HAL库之Msp回调函数 1.问题提出 在STM32的HAL库使用中&#xff0c;会发现库函数大都被设计成了一对&#xff1a; HAL_PPP/PPPP_Init HAL_PPP/PPPP_MspInit 而且HAL_PPP/PPPP_MspInit函数的defination前面还会有__weak关键字 上面的PPP/PPPP代表常见外设的名称为…

Vue配置代理(解决跨域请求)

app.vue <template><div><button click"getStudents">获取学生信息</button><button click"getCars">获取汽车信息</button></div></template><script> import axios from axios export default {…

2.4g遥控卧室床头氛围灯开发方案

台灯作为我们日常生活的照明工具&#xff0c;不但给我们的生活提供了很大的便利&#xff0c;而且也丰富了我们的世界。随着电子产品的快速发展&#xff0c;家用电器逐渐趋向智能化&#xff0c;台灯也更加智能。智能台灯以2.4g合封芯片为主控芯片&#xff0c;实现遥控器控制台灯…

依托大数据信息技术构建智慧水务系统,推动城市供水快速发展

随着城市化进程的步伐大大变快&#xff0c;城市建设与科学信息技术的融合程度也在不断提升&#xff0c;尤其是大数据信息技术的迅猛发展&#xff0c;为民生工程由信息化向智能化转型提供了条件。以城市的水务系统为例&#xff0c;依托大数据信息技术构建智慧水务系统是智慧城市…

bigemap工程工程行业应用

客户目前主要是需求为使用下载卫星图、等高线、水系、路网等等元素数据做线路规划图 其他信息 客户需要的图中还包含一些农作物以及需要在软件上标注带有箭头的线段&#xff08;不能满足&#xff09; 如下图&#xff1a; 使用场景&#xff1a; 目前主要为制图、规划线路等等…

【mysql】—— 数据类型详解

序言&#xff1a; 本期我将大家认识关于 mysql 数据库中的基本数据类型的学习。通过本篇文章&#xff0c;我相信大家对mysql 数据类型的理解都会更加深刻。 目录 &#xff08;一&#xff09;数据类型分类 &#xff08;二&#xff09;数值类型 1、tinyint类型 2、bit类型 …

Cilium系列-9-主机路由切换为基于 BPF 的模式

系列文章 Cilium 系列文章 前言 将 Kubernetes 的 CNI 从其他组件切换为 Cilium, 已经可以有效地提升网络的性能. 但是通过对 Cilium 不同模式的切换/功能的启用, 可以进一步提升 Cilium 的网络性能. 具体调优项包括不限于: 启用本地路由(Native Routing)完全替换 KubeProx…

Godot在多边形内随机获取点

前言&#xff1a; 我做了一个随机生成器&#xff0c;可以生成游戏道具&#xff0c;之前是矩形比较好算&#xff0c;随着关卡设计我需要多边形的生成方式。 在矩形内获取随机点&#xff1a; func generateRandomCoordinateInRect(pos,size):"""根据范围生成随机…

Reinforcement-Learning

文章目录 Reinforcement-Learning1. RL方法分类汇总&#xff1a;2. Q-Learning3. SARSA算法4. SARSA&#xff08;λ&#xff09; Reinforcement-Learning 1. RL方法分类汇总&#xff1a; &#xff08;1&#xff09;不理解环境&#xff08;Model-Free RL&#xff09;&#xff…

无涯教程-jQuery - outerWidth( margin])方法函数

outerWidth([margin])方法获取第一个匹配元素的外部宽度(默认情况下包括边框和填充)。 此方法适用于可见和隐藏元素。由于父项被隐藏的元素不支持此功能。 outerWidth( [margin] ) - 语法 selector.outerWidth( [margin] ) 这是此方法使用的所有参数的描述- margin - 此…

OpenLayers实战进阶专栏目录,OpenLayers实战案例,OpenLayers6实战教程

前言 本篇作为OpenLayers实战进阶教程的目录&#xff0c;用于整理汇总专栏所有文章&#xff0c;方便查找。 OpenLayers是前端最流行的JS二维地图引擎之一。 反馈建议 OpenLayers系列-交流专区&#xff0c;建议和问题反馈 Openlayers实战进阶 Openlayers实战&#xff0c;O…

SQL-每日一题【1148. 文章浏览 I】

题目 Views 表&#xff1a; 请查询出所有浏览过自己文章的作者 结果按照 id 升序排列。 查询结果的格式如下所示&#xff1a; 示例 1&#xff1a; 解题思路 1.题目要求我们查询出所有浏览过自己文章的作者&#xff0c;结果按照 id 升序排列。 2.我们只需要筛选出 author_id …

消防应急照明设置要求在炼钢车间电气室的应用

摘 要:文章以GB51309—2018《消防应急照明和疏散指示系统技术标准》为设计依据&#xff0c;结合某炼钢车间转炉项目的设计过程&#xff0c;在炼钢车间电气室的疏散照明和备用照明的设计思路、原则和方法等方面进行阐述。通过选择合理的消防应急疏散照明控制系统及灯具供配电方案…

java 企业工程管理系统软件源码+Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis

&#xfeff; 电子招标采购软件 解决方案 招标面向的对象为供应商库中所有符合招标要求的供应商&#xff0c;当库中的供应商有一定积累的时候&#xff0c;会节省大量引入新供应商的时间。系统自动从供应商库中筛选符合招标要求的供应商&#xff0c;改变以往邀标的业务模式。招…

独立站有流量没订单是什么原因呢?怎么解决?

和自带流量的电商平台比起来&#xff0c;外贸独立站自身是没有流量的。独立站卖家要订单&#xff0c;就必须主动去引流。 如果你是1个独立站新手卖家&#xff0c;你很可能遇到过这种问题&#xff1a;跑了一段时间广告&#xff0c;广告费花了几百上千美金&#xff0c;流量来了不…

集合简述

集合ListArrayListLinkedList SetHashSetTreeSet MapHashMapTreeMap 集合与数组的区别 集合 集合是java中的一个容器&#xff0c;可以在里面存放数据&#xff0c;容量可以发生改变 从集合框架结构可以分析得知&#xff1a; 1、集合主要分为Collection和Map两个接口 2、Collecti…

简单版本视频播放服务器V4,layui界面

简单版本视频播放服务器V4 前一个版本内容&#xff0c;可以查看 https://blog.csdn.net/wtt234/article/details/131759154 优化内容&#xff1a; 1.返回列表的优化&#xff0c;优化了原来返回空列表名称的问题 2.前端才有layui优化内容 后端&#xff1a; package mainim…