C++职工管理系统 具体实现(六)-查找职工功能 排序功能 清空文件

1. 查找职工

功能描述:提供两种查找职工方式,一种按照职工编号,一种按照职工姓名;
按照职工编号查找:分为两种情况,找到职工编号和职工编号不存在。实际上,职工编号是不允许重复的,因此,在添加职工功能中,还要加上判断职工编号是否存在的代码。如果职工编号存在,提示用户输入错误,如果不存在可以继续输入。
按照职工姓名查找:分为两种情况,找到该姓名的职工只有一个和有多个职工重名。

1.1 步骤:

查找职工函数声明:在workerManager.h中添加成员函数 void Find_Emp();
查找职工函数实现:在workerManager.cpp中实现成员函数 void Find_Emp();,具体步骤如下:

  • 首先,判断文件是否存在或是否为空文件
  • 其次,提示用户是按照职工编号查找还是职工姓名查找
  • 然后,如果按照编号查找,让用户输入想要查找的编号,再查找
  • 最后,如果按照姓名查找,让用户输入想要查找的姓名,再查找

1.2 代码展示

//workerManager.cpp  查找职工功能
void WorkerManager::Find_Emp()
{
	if (!this->m_FileisEmpty)
	{
		//提示用户使用编号还是姓名查找
		int select = 0;
		cout << "请选择查找的方式:" << endl;
		cout << "1——按照编号查找" << endl;
		cout << "2——按照姓名查找" << endl;
		cin >> select;
		switch (select)
		{
		case 1:
		{
			cout << "1、按照编号查找" << endl;
			int id = 0;
			cout << "请输入需要查找的编号:" << endl;
			cin >> id;
			int index = this->isExist(id);
			if (index != -1)
			{
				cout << "查找成功!" << endl;
				cout << index << "号职工信息如下:" << endl;
				this->m_EmpArray[index]->showInfo();
			}
			else
			{
				cout << "查无此人!" << endl;
			}
		}
			break;
		case 2:
		{
			cout << "2、按照姓名查找" << endl;
			string name;
			cout << "请输入需要查找的姓名:" << endl;
			cin >> name;

			//查找成功标志
			bool flag = false;
			for (int i = 0; i < this->m_EmpNum; i++)
			{
				if (this->m_EmpArray[i]->mName == name)
				{
					cout << "找到该姓名职工!" << endl;
					cout << "该职工信息如下:" << endl;
					flag = true;
					this->m_EmpArray[i]->showInfo();	
				}
			}
			if (flag == false)
			{
				cout << "查无此人!" << endl;
			}
		}
			break;
		default:
			cout << "输入有误!" << endl;
			break;
		}
		system("pause");
		system("cls");
	}
	else
	{
		cout << "文件不存在或文件为空!" << endl;
	}
}

2. 排序

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

2.1 步骤:

排序函数声明:在workerManager.h中添加成员函数 void Sort_Emp();
排序函数实现:在workerManager.cpp中实现成员函数 void Sort_Emp();,具体步骤如下:

  • 首先,判断文件是否存在或是否为空文件
  • 其次,提示用户是按照升序还是降序排序,并假定一个职工编号最小值为1,排序时使用选择排序
  • 然后,如果按照编号升序排序,如果假定最小值的职工编号大于当前遍历值的职工编号,说明当前遍历值才是最小值,更新最小值。相当于找到编号最小值的下标
  • 最后,如果按照姓名降序排序,则是与升序的相反

2.2 代码展示

//排序职工功能
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)//升序
				{
					//说明假定最小值下标不是真实最小值下标,更新
					if (this->m_EmpArray[minOrmax]->mId > this->m_EmpArray[j]->mId)
					{
						minOrmax = j;
					}
				}
				else//降序
				{
					//说明假定最大值下标不是真实最大值下标,更新
					if (this->m_EmpArray[minOrmax]->mId < this->m_EmpArray[j]->mId)
					{
						minOrmax = j;
					}
				}
			}
			
			//判断一开始假定的最小值(最大值)i,是否为计算的最小值(最大值)minOrmax,如果不是,交换数据
			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();//展示结果
	}
}

3. 清空文件

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

3.1 步骤:

清空函数声明:在workerManager.h中添加成员函数 void Clean_File();
清空函数实现:在workerManager.cpp中实现员函数 void Clean_File();,具体步骤如下:
首先,提示用户是否确认清空文件
其次,操纵文件。使用文件输出流创建对象,并使用ios::trunc打开模式。该模式是说明,如果文件存在,那么删除这个文件,并重新创建文件
然后,文件虽然删除了,但是内部维护的数组指针还在堆区,没有释放。因此要把堆区的每一个数据都要释放干净,再把整个数组释放,再让指针数组置为空指针
最后,内部维护的人数置零,以及文件标志也改为真。

3.2 代码展示

//清空文件功能
void WorkerManager::Clean_File()
{
	cout << "请确认是否清空文件:" << endl;
	cout << "1——确认清空" << endl;
	cout << "2——返回" << endl;
	int select = 0;
	cin >> select;
	if (select == 1)
	{
		//打开模式 ios::trunc 如果存在删除文件并重新创建
		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");
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值