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");
}