目录

管理类可以:制作菜单界面;执行用户操作;实现文件交互
- #pragma once // 头文件只编译一次
- #include
// 输入、输出源文件 - using namespace std; // 标准命名空间
-
- class WorkManager
- {
- public:
- // 构造函数
- WorkManager();
- // 析构函数
- ~WorkManager();
- };
- #include"workManager.h"
- WorkManager::WorkManager()
- {
-
- }
-
- WorkManager::~WorkManager()
- {
-
- }
在头文件中包含下列函数
void Show_Menu();
在源文件中添加菜单函数
- // 展示菜单
- 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;
- cout << endl;
- }
- // 调用菜单展示成员函数
- wm.Show_Menu();
使用循环和选择,进行系统操作
- int main()
- {
- // 实例化对象
- WorkManager wm;
- int select = 0;
-
- while (true)
- {
- // 调用菜单展示成员函数
- wm.Show_Menu();
-
- cout << "请输入您的选择:" << endl;
- cin >> select; // 提供一个选择变量
- switch (select)
- {
- 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"); // 清空屏幕
- break;
- }
- }
- // 退出菜单
- void WorkManager::Exit_Menu()
- {
- cout << "欢迎下次使用" << endl;
- system("pause");
- exit(0); // 程序正常退出
- }
- case 0: // 退出系统
- wm.Exit_Menu();
- #pragma once
- #include
- #include
- using namespace std;
-
- // 职工抽象类
- class Worker
- {
- public:
- // 行为
- // 显示个人信息
- virtual void showInfo() = 0; // 纯虚函数,不做实现
-
- // 获取岗位名称
- virtual string getDeptName() = 0;
-
- // 属性
- // 职工编号
- int m_Id;
- // 职工姓名
- string m_name;
- // 所在部门
- int m_DeptId;
- };
头文件
- #pragma once
- using namespace std;
- #include
- #include
- #include"worker.h"
- // 普通员工
- class Employee:public Worker // 定义一个继承职员类的员工类
- {
- public:
- // 构造函数
- Employee(int id,string name, int dId); // 初始化
- virtual void showInfo();
- virtual string getDeptName();
- };
源文件
- #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"员工";
- }
经理与老板类添加方式同员工类
批量添加职工,保存到文件中。以添加员工为例
头文件
- #pragma once
- using namespace std;
- #include
- #include
- #include"worker.h"
- // 普通员工
- class Employee:public Worker // 定义一个继承职员类的员工类
- {
- public:
- // 构造函数
- Employee(int id,string name, int dId); // 初始化
- virtual void showInfo();
- virtual string getDeptName();
- };
源文件
- #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"员工";
- }
添加职工函数
- // 添加职工
- 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 != 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);
- case 3:
- worker = new Boss(id, name, 3);
- 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");
- }
主函数使用
- case 1: // 增加职工
- wm.Add_Emp();
数据保存在堆区,运行结束后被释放。析构函数释放堆区内容
- // 析构函数
- WorkManager::~WorkManager()
- {
- if (this->m_EmpArray != NULL)
- {
- delete[] this->m_EmpArray;
- this->m_EmpArray = NULL;
- }
- }
头文件
- // 保存文件函数
- void save();
源文件
- / 保存文件
- void WorkManager::save()
- {
- 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(); // 关闭文件
- }
函数调用,在成员添加函数末尾,即添加结束后
- // 保存数据到文件中
- this->save();
写入后保存为txt格式文件
修改初始化属性,添加文件标志位
在头文件中添加标志位
- // 添加文件不存在标志位
- bool m_FileIsEmpty;
在源文件中添加文件不存在初始化属性
- // 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;
- }
添加职工后更新文件存在标志位
- // 更新职工是否为空标志位
- this->m_FileIsEmpty = false;
头文件
- // 统计文件中人数
- int get_EmpNum();
源文件中统计文件中人数
- // 统计文件中人数
- 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)
- {
- num++; // 读取一人信息后加一
- }
- return num;
- }
构造函数中调用
- // 3.文件存在并记录数据
- int num = this->get_EmpNum();
- cout << "职工人数为:" << num << endl;
- this->m_EmpNum = num;
头文件
- // 初始化员工
- void init_Emp();
源文件
- // 初始化员工
- 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);
- }
- this->m_EmpArray[index] = worker;
- index++;
- }
- // 关闭文件
- ifs.close();
- }
初始化
- // 3.文件存在并记录数据
- int num = this->get_EmpNum();
- cout << "职工人数为:" << num << endl;
- this->m_EmpNum = num;
- // 开辟空间
- this->m_EmpArray = new Worker*[this->m_EmpNum];
- this->init_Emp(); // 初始化
函数声明
- // 显示职工信息
- void show_Emp();
函数实现
- // 显示职工信息
- void WorkManager::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");
- }
函数调用
- case 2: // 显示职工
- wm.show_Emp();
函数声明。删除前首先判断是否存在
- // 判断职工是否存在,若存在返回职工所在位置,否则返回-1
- int IsExist(int id);
- // 删除职工
- void delete_Emp();
函数实现
- // 判断职工是否存在,若存在返回职工所在位置,否则返回-1
- int WorkManager::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;
- }
- // 删除职工
- void WorkManager::delete_Emp()
- {
- if (this->m_FileIsEmpty)
- {
- cout << "文件不存在" << endl;
- }
- else
- {
- cout << "输入删除职工编号:" << endl;
- int id = 0;
- cin >> id;
- int index = this->IsExist(id);
- if (index != -1)
- {
- // 职工存在
- 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");
在主程序中调用函数
- case 3: // 删除职工
- wm.delete_Emp();
- break;
函数声明
- // 修改职工
- void mod_Emp();
函数实现
- // 修改职工
- void WorkManager::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 newdId = 0;
- cout << "查找到:" << id << "号员工,请输入新职工号:" << endl;
- cin >> newId;
- cout << "请输入新姓名:" << endl;
- cin >> newName;
- cout << "请输入新岗位:" << endl;
-
- cout << "1.普通员工" << endl;
- cout << "2.经理" << endl;
- cout << "3.老板" << endl;
- cin >> newdId;
- // 根据选择创建对象
- Worker * worker = NULL;
- switch (newdId)
- {
- case 1:
- worker = new Employee(newId, newName, newdId); // 在堆区创建对象
- break;
- case 2:
- worker = new Manager(newId, newName, newdId);
- break;
- case 3:
- worker = new Boss(newId, newName, newdId);
- break;
- default:
- break;
- }
- // 更新数据到数组中
- this->m_EmpArray[ret] = worker;
- cout << "修改成功!" << endl;
- // 保存到文件中
- this->save();
- }
- else
- {
- cout << "员工不存在" << endl;
- }
- }
- // 清屏
- system("pause");
- system("cls");
- }
在主程序中调用函数
- case 4: // 修改职工
- wm.mod_Emp();
- break;
函数声明
- // 查找职工
- void find_Emp();
函数实现
- // 查找职工
- 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]->showInfo();
- }
- else
- {
- cout << "查无此人" << endl;
- }
- }
- else if (select == 2)
- {
- string name;
- cout << "输入查找职工的姓名:" << endl;
- cin >> name;
- // 加入查找标志位
- bool flag = false; // 默认未找到
- for (int i = 0; i < this->m_EmpNum; i++)
- {
- if (m_EmpArray[i]->m_name == name)
- {
- cout << "查找成功,信息如下:" << endl;
-
- flag = true;
-
- this->m_EmpArray[i]->showInfo();
- }
- }
- if (flag == false)
- {
- cout << "查无此人" << endl;
- }
- }
- else
- {
- cout << "输入有误" << endl;
- }
- }
- system("pause");
- system("cls");
- }
声明
- // 员工排序
- void sort_Emp();
实现
- // 员工排序
- 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 < this->get_EmpNum; i++)
- {
- int minOrmax = i; // 声明最值小标
- for (int j = i + 1; j < this->m_EmpNum; j++)
- {
- if (select == 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();
- }
声明
- // 清空文件
- void clean_File();
实现
- // 清空文件
- void WorkManager::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];
- }
- // 删除堆区数组指针
- delete[]this->m_EmpArray;
- this->m_EmpArray = NULL;
- this->m_EmpNum = 0;
- this->m_FileIsEmpty = true;
- }
- cout << "清空成功" << endl;
- }
- system("pause");
- system("cls");
- }