职工管理系统
1 管理系统需求
系统界面效果图如下:
具体过程如下:
2 创建管理类(整体架构)
2.1 头文件创建
创建WorkManager.h头文件
2.2 cpp创建
3 菜单功能
3.1 添加成员函数
3.2 菜单功能实现
3.3 测试菜单功能
在基于多态的职工管理系统.cpp测试菜单功能
菜单效果如下:
4 退出功能实现
4.1 提供功能接口
根据菜单中的数字分别对应的功能,提供功能接口。
4.2 实现退出功能
1、在头文件中添加退出系统函数声明
2、在cpp文件中添加函数具体实现
4.3 测试功能
效果如下:
输入0:
系统正常退出。
5 创建职工类-多态实现
5.1 创建职工抽象类
5.2 创建普通员工类
cpp文件对h文件函数进行实现:
5.3 创建经理类(与普通员工方法基本一致)
5.4 创建老板类(与普通员工方法基本一致)
5.5 测试多态
多态测试正常。
6 添加职工
6.1 功能分析
6.2 功能实现
在WokerManager.h头文件中添加成员属性和成员函数
在 WokerManager.cpp文件中初始化成员属性和函数实现
//实现职工函数
void WorkManager::Add_Emp()
{
cout << "请输入增加职工数量" << endl;
int addNum = 0; //接收输入的数量
cin >> addNum;
if (addNum > 0)
//执行具体的添加,否则输入有误
{
//计算新空间大小
int newSize = this->m_EmpNum + addNum;
//开辟新空间
Worker** newSpace = new Worker * [newSize];
//将原空间下内容存放到新空间下
if (this->m_EmpArray != 0)
{
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、Boss" << 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 + 1] = worker;
}
//释放原有空间
delete[]this->m_EmpArray;
//更改新空间指向
this->m_EmpArray = newSpace;
//更新新的个数
this->m_EmpNum = newSize;
//提示信息
cout << "成功添加" << addNum << "名职工!" << endl;
}
else
{
cout << "输入有误" << endl;
}
//按任意键后 清屏回到上级目录
system("pause");
system("cls");
}
6.3 测试
在main函数中调用函数。
测试结果如下:
7 文件交互—写文件
7.1 设定文件路径
首先将文件路径,在workManager.h中添加宏常量,并且包含头文件fstream
解释:
7.2 成员函数声明
在workManager.h类中添加成员函数void save()
7.3 保存文件功能实现
在workManager.cpp中实现成员函数save
在workManager.cpp中的添加职工信息之后调用保存函数,对职工信息进行文件写入
7.4 保存文件功能测试
在文件目录下产生.txt文件,并里面包含我们添加的成员信息。
8 文件交互—读文件
8.1 文件未创建
在WorkManager.h中添加新的成员属性m_FilelsEmpty标志文件是否为空
修改WorkManager.cpp的构造函数代码
之前构造函数的初始化是这样写的,人数为0指针为空,这样其实不对,因为我们要求的是写入的职工在下次打开还是能看到的,初始化不能初始化为0,因此需要修改。
我们测试一下,删除之前生成的文件,点击运行程序。
8.2 文件存在且数据为空
添加WorkManager.cpp的构造函数代码
//初始化文件为空 this->m_FileIsEmpty = true; 这行代码是初始化文件为空的操作,我们可以往后想想,咱们再添加一名心用户以后,是不是就表明文件一定不为空了,因此在添加职员后面可以加上一行代码。
添加用户之后,职工一定不为空了。
测试一下:
我们添加一位成员之后,运行代码。
文件不存在没有了,因为添加以后文件存在了,并且文件不为空。
将文件内容删除,再次运行。
显示文件存在但是为空了,和我们预期一致。
8.3 文件存在且保存职工数据
8.3.1 获取记录的职工人数
在WorkManager.h中添加成员函数int get_EmpNum();
在WorkManager.cpp中实现
在析构函数中调用
测试代码:
8.3.2 初始化数组
在WorkerManager.h中添加成员函数 void init_Emp();
在WorkerManager.cpp中实现
在WorkerManager.cpp构造函数中追加代码
测试代码:
添加一名用户后,也可以成功打印。
9 显示职工
9.1 函数声明
在WorkerManager.h中添加成员函数void Show_Emp()
9.2 函数实现
在WorkerManager.cpp中实现成员函数void Show_Emp()
测试代码:
10 删除职工
10.1 删除职工函数声明
10.2 职工是否存在函数声明
形参是用户id,根据id删除职工信息。
10.3 职工是否存在函数实现
10.4 删除职工函数实现
10.5 测试删除职工
我们删除ID为2的经理李四。
删除成功。
11 修改职工信息
11.1 函数声明
11.2 函数实现
11.3 测试
12 查找职工
12.1 函数声明
12.2 函数实现
//查找职工函数实现
void WorkManager::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)//按照职工号查找
{
int id;
cout << "请输入查找的职工编号:" << endl;
cin >> id;
int ret = IsExist(id);
if (ret != -1)
{
cout << "查找成功,信息如下:" << endl;
this->m_EmpArray[ret]->Show_Info();
}
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 << "查找成功,职工编号为:"
<< m_EmpArray[i]->m_ID
<< "的信息如下:" << endl;
flag = true;
this->m_EmpArray[i]->Show_Info();
}
}
if (flag = false)
{
cout << "查找失败,查无此人" << endl;
}
}
else
{
cout << "输入信息有误,请重新输入" << endl;
}
}
//按任意键清屏
system("pause");
system("cls");
}
12.3 测试
13 排序
13.1 函数声明
13.2 函数实现
/排序函数实现
void WorkManager::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 < m_EmpNum; j++)
{
if (select == 1) //升序先认定一个最小值,选择排序
{
if (m_EmpArray[minOrMax]->m_ID > m_EmpArray[j]->m_ID)
{
minOrMax = j;
}
}
else //降序先认定一个最大值,选择排序
{
if (m_EmpArray[minOrMax]->m_ID < m_EmpArray[j]->m_ID)
{
minOrMax = j;
}
}
}
if (i != minOrMax)
{
Worker* temp = m_EmpArray[i];
m_EmpArray[i] = m_EmpArray[minOrMax];
m_EmpArray[minOrMax] = temp;
}
}
cout << "排序成功,结果为:" << endl;
this->save();
this->Show_Emp();
}
}
13.3 测试
排序成功。
14 清空文件
14.1 函数声明
14.2 函数实现
14.3 测试
所有功能已经全部完成。