主要职工有老板、经理、普通员工,分有职工编号、职工姓名、部门编号等属性,有显示信息以及部门信息的成员函数
主要实现的功能有:退出、增加、显示、修改、查找(分编号以及姓名)、删除、排序(升序或降序)、清空
代码分类
几个主要类
抽象基类
#pragma once #include <bits/stdc++.h> using namespace std; // 职工抽象类 class Worker { public: int m_Id; // 职工编号 string m_Name; // 职工姓名 int m_DeptId; // 部门编号 // 显示个人信息 virtual void showInfo() = 0; // 获取岗位名称 virtual string getDeptName() = 0; };
普通员工类
头文件
#pragma once #include <bits/stdc++.h> using namespace std; #include "worker.h" // 普通员工类 class Employee :public Worker { public: // 构造函数 Employee(int id,string name,int dId); // virtual 关键字在子类中可删可不删 // 但是后面的=0得删 // 显示个人信息 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\t岗位职责:完成经理交给的任务" << endl; } // 获取岗位名称 string Employee::getDeptName() { return string("员工"); }
经理类
头文件
#pragma once #include <bits/stdc++.h> using namespace std; #include "worker.h" // 经理类 class Manager :public Worker { public: // 构造函数 Manager(int id, string name, int dId); // virtual 关键字在子类中可删可不删 // 但是后面的=0得删 // 显示个人信息 virtual void showInfo(); // 获取岗位名称 virtual string getDeptName(); };
源代码
#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\t岗位职责:完成老板交给的任务,并下发任务给普通员工" << endl; } // 获取岗位名称 string Manager::getDeptName() { return string("经理"); }
老板类
头文件
#pragma once #include <bits/stdc++.h> using namespace std; #include "worker.h" // 老板类 class Boss :public Worker { public: // 构造函数 Boss(int id, string name, int dId); // virtual 关键字在子类中可删可不删 // 但是后面的=0得删 // 显示个人信息 virtual void showInfo(); // 获取岗位名称 virtual string getDeptName(); };
源代码
#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\t岗位职责:管理公司所有事务" << endl; } // 获取岗位名称 string Boss::getDeptName() { return string("总裁"); }
主要功能实现类
头文件
#pragma once // 防止头文件重复包含 #include <bits/stdc++.h> using namespace std; #include "worker.h" #define FILENAME "empfile.txt" class WorkerManager { public: // 构造函数 WorkerManager(); // 展示菜单 void show_Menu(); // 先定义一个变量接收职工人数,再定义一个数组 int m_EmpNum; // 这个数组用抽象基类的指针,主要是为了方便添加 // 在添加职工时,可能是普通员工也可能是经理或是老板 // 那么用worker指针实现多态 // 这里用worker**是为了将数组开辟到堆区 Worker** m_EmpArray; // 主要新增成员函数 void add_Emp(); // 为了更好的使用文件,添加一个新成员属性来标志文件是否为空 bool m_FileIsEmpty; // 保存文件 void save(); // 记录文件中的成员数 int get_EmpNum(); // 初始化员工 void init_Emp(); // 显示员工 void show_Emp(); // 判断员工是否存在,存在则返回数组位置,不存在则返回-1 int IsExist(int id); // 删除员工 void del_Emp(); // 修改员工信息 void mod_Emp(); // 查找员工 可根据职工编号以及职工姓名查找 void find_Emp(); // 排序职工 void sort_Emp(); // 清空文件 void clean_File(); // 退出功能 void exitSystem(); // 析构函数 ~WorkerManager(); };
展示菜单
// 展示菜单 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; }
新增
// 新增功能 void WorkerManager::add_Emp() { // 先询问用户需要新增多少个职工 cout << "请输入添加职工数量:"; int addNum = 0; cin >> addNum; cout << endl; // 要判断添加数量是否大于零 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 dId; // 部门编号 // 判断职工编号是否重复,重复则不允新增 while (true) { cout << "请输入第 " << i + 1 << "个新职工编号:"; cin >> id; cout << endl; int ret = 0; for (int i = 0; i < this->m_EmpNum; i++) { if (id == this->m_EmpArray[i]->m_Id) { ret++; } } if (ret == 0) { break; } else { cout << "输入的职工编号重复,请重新输入!" << endl; } } cout << "请输入第 " << i + 1 << "个新职工姓名:"; cin >> name; cout << endl; cout << "部门编号" << endl; cout << " 1. 普通员工" << endl; cout << " 2. 经理" << endl; cout << " 3. 老板" << endl; cout << "请输入第 " << i + 1 << "个新职工部门编号:"; cin >> dId; cout << endl; Worker* worker = NULL; // 部门编号的几种情况 switch (dId) { 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; this->m_FileIsEmpty = false; // 提示 cout << "成功添加 " << addNum << " 名新职工" << endl; // 保存数据到文件 this->save(); } else { cout << "输入数量有误" << endl; } // 按任意键后,清屏回到上级目录 system("pause"); system("cls"); }
为了不需要每次重新创建职工,这里涉及到一个文件的读取和写入
// 保存文件 void WorkerManager::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(); } // 计算文件中的数据行 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; } // 初始化员工 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; // 根据不同部门编号创建不同对象 switch (dId) { case 1: // 普通员工 worker = new Employee(id, name, dId); break; case 2: // 经理 worker = new Manager(id, name, dId); break; case 3: // 老板 worker = new Boss(id, name, dId); break; default: break; } // 存放到数组中 this->m_EmpArray[index] = worker; index++; } // 关闭文件 ifs.close(); }
构造函数的初始化
// 构造函数 WorkerManager::WorkerManager() { // ifstream ifs; ifs.open(FILENAME, ios::in); // 读取文件 // 文件不存在的情况 if (!ifs.is_open()) { // 测试语句 /*cout << "文件不存在" << endl;*/ cout << endl; cout << endl; this->m_EmpNum = 0; // 初始化人数 this->m_EmpArray = NULL; // 初始化文件为空标志 this->m_FileIsEmpty = true; // 初始化数组 ifs.close(); // 关闭文件 return; } // 文件存在但数据为空的情况 char ch; ifs >> ch; if (ifs.eof()) { // 测试语句 /*cout << "文件为空!" << endl;*/ cout << endl; cout << endl; this->m_EmpNum = 0; // 初始化人数 this->m_EmpArray = NULL; // 初始化文件为空标志 this->m_FileIsEmpty = true; // 初始化数组 ifs.close(); // 关闭文件 return; } // 文件存在,并记录数据 int num = this->get_EmpNum(); cout << "职工人数为:" << num << endl; this->m_EmpNum = num; // 开辟空间 this->m_EmpArray = new Worker * [this->m_EmpNum]; // 将文件中的数据存到数组中 this->init_Emp(); // 测试语句 /*for (int i = 0; i < this->m_EmpNum; i++) { cout << "职工编号:" << this->m_EmpArray[i]->m_Id << "\t职工姓名:" << this->m_EmpArray[i]->m_Name << "\t\t职工部门编号:" << this->m_EmpArray[i]->m_DeptId << endl; }*/ cout << endl; cout << endl; }
显示
// 显示职工 void WorkerManager::show_Emp() { if (this->m_FileIsEmpty) // 初始化为false状态 { cout << "文件不存在或记录为空" << endl; // 按任意键后,清屏回到上级目录 system("pause"); system("cls"); } else { for (int i = 0; i < this->m_EmpNum; i++) { // 利用多态调用接口 this->m_EmpArray[i]->showInfo(); } } // 按任意键后,清屏回到上级目录 system("pause"); system("cls"); }
因修改删除等操作需要找到职工,所以需要另外写一个函数来在数组中寻找
// 判断员工是否存在,存在则返回数组位置,不存在则返回-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; } } // 遍历完还没找到就返回-1 return index; }
删除
// 删除员工 void WorkerManager::del_Emp() { if (this->m_FileIsEmpty) // 初始化为false状态 { cout << "文件不存在或记录为空" << endl; // 按任意键后,清屏回到上级目录 system("pause"); system("cls"); } else { // 按照员工编号删除 cout << "请输入想要删除的职工编号:"; int id = 0; cin >> id; cout << endl; 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"); }
修改
// 修改员工信息 void WorkerManager::mod_Emp() { if (this->m_FileIsEmpty) // 初始化为false状态 { cout << "文件不存在或记录为空" << endl; // 按任意键后,清屏回到上级目录 system("pause"); system("cls"); } else { // 按照员工编号进行修改 cout << "请输入想要修改的职工编号:"; int id = 0; cin >> id; cout << endl; int index = this->IsExist(id); if (index != -1) { // 先删除该员工的所有信息 delete this->m_EmpArray[index]; int newId = 0; string newName = ""; int newDid = 0; cout << "查找到 " << id << "号员工,请输入新职工号:"; cin >> newId; cout << endl; cout << "请输入新职工姓名:"; cin >> newName; cout << endl; cout << "部门编号" << endl; cout << " 1. 普通员工" << endl; cout << " 2. 经理" << endl; cout << " 3. 老板" << endl; cout << "请输入新部门编号:"; cin >> newDid; cout << endl; 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[index] = worker; // 提示 cout << "修改成功!" << endl; //更新数据到文件中 this->save(); } else { cout << "查到不到该员工,修改失败" << endl; } } // 按任意键后,清屏回到上级目录 system("pause"); system("cls"); }
查找
// 查找员工 可根据职工编号以及职工姓名查找 void WorkerManager::find_Emp() { if (this->m_FileIsEmpty) // 初始化为false状态 { cout << "文件不存在或记录为空" << endl; // 按任意键后,清屏回到上级目录 system("pause"); system("cls"); } else { cout << "请输入查找的方式:" << endl; cout << "1. 按职工编号查找" << endl; cout << "2. 按姓名查找" << endl; int select = 0; cin >> select; if (select == 1) // 按职工编号查找 { // 按照员工编号进行查找 cout << "请输入想要查找的职工编号:"; int id = 0; cin >> id; cout << endl; int index = this->IsExist(id); if (index != -1) { cout << "查找成功!该职工信息如下:" << endl; this->m_EmpArray[index]->showInfo(); } else { cout << "查找失败!" << endl; } } else if (select == 2) // 根据职工姓名查找 { string name; cout << "请输入查找的职工姓名:"; cin >> name; cout << endl; bool flag = false; // 定义一个查找的标志 // 避免有重名的职工 for (int i = 0; i < this->m_EmpNum - 1; i++) { if (this->m_EmpArray[i]->m_Name == name) { cout << "查找成功!以下为该职工的信息" << endl; this->m_EmpArray[i]->showInfo(); flag = true; // 修改标志 } } if (flag == false) { cout << "查无此人!" << endl; } } else { cout << "输入的选项有误,即将退出查找" << endl; } } // 按任意键后,清屏回到上级目录 system("pause"); system("cls"); }
排序
// 排序职工 void WorkerManager::sort_Emp() { if (this->m_FileIsEmpty) // 初始化为false状态 { cout << "文件不存在或记录为空" << endl; // 按任意键后,清屏回到上级目录 system("pause"); system("cls"); } else { cout << "1. 按职工编号升序排序" << endl; cout << "2. 按职工编号降序排序" << endl; cout << "请选择排序的方式:"; int select = 0; cin >> select; cout << endl; for (int i = 0; i < this->m_EmpNum; i++) { // 假定它最小或最大 int minOrMax = i; for (int j = i + 1; j < this->m_EmpNum; j++) { if (select == 1) // 升序 { if (this->m_EmpArray[i]->m_Id > this->m_EmpArray[j]->m_Id) { // 更改最小值序号 minOrMax = j; } } else if (select == 2) // 降序 { if (this->m_EmpArray[i]->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->show_Emp(); // 更新到文件中 this->save(); } // 按任意键后,清屏回到上级目录 system("pause"); system("cls"); }
清空
// 清空文件 void WorkerManager::clean_File() { cout << "1. 确认" << endl; cout << "2. 返回" << endl; cout << "请再进行一次选择:"; int select = 0; cin >> select; cout << endl; if (select == 1) { // 打开模式 ios::truns 如果存在删除文件并重新创建 ofstream ofs(FILENAME,ios::trunc); ofs.close(); // 文件的删除在这一步完成 接下来主要是数组的删除 if (this->m_EmpArray != NULL) { for (int i = 0; i < this->m_EmpNum; i++) { if (this->m_EmpArray[i] != NULL) { delete this->m_EmpArray[i]; } } // 将属性进行全部初始化 this->m_EmpNum = 0; delete[] this->m_EmpArray; this->m_EmpArray = NULL; this->m_FileIsEmpty = true; } cout << "清空成功!" << endl; } // 按任意键后,清屏回到上级目录 system("pause"); system("cls"); }
退出
// 退出功能 void WorkerManager::exitSystem() { cout<< "欢迎下次使用!" << endl; system("pause"); exit(0); // 专门用来退出的函数 }
主要功能实现的完整代码
#include "workerManager.h" #include "employee.h" #include "manager.h" #include "boss.h" // 构造函数 WorkerManager::WorkerManager() { // ifstream ifs; ifs.open(FILENAME, ios::in); // 读取文件 // 文件不存在的情况 if (!ifs.is_open()) { // 测试语句 /*cout << "文件不存在" << endl;*/ cout << endl; cout << endl; this->m_EmpNum = 0; // 初始化人数 this->m_EmpArray = NULL; // 初始化文件为空标志 this->m_FileIsEmpty = true; // 初始化数组 ifs.close(); // 关闭文件 return; } // 文件存在但数据为空的情况 char ch; ifs >> ch; if (ifs.eof()) { // 测试语句 /*cout << "文件为空!" << endl;*/ cout << endl; cout << endl; this->m_EmpNum = 0; // 初始化人数 this->m_EmpArray = NULL; // 初始化文件为空标志 this->m_FileIsEmpty = true; // 初始化数组 ifs.close(); // 关闭文件 return; } // 文件存在,并记录数据 int num = this->get_EmpNum(); cout << "职工人数为:" << num << endl; this->m_EmpNum = num; // 开辟空间 this->m_EmpArray = new Worker * [this->m_EmpNum]; // 将文件中的数据存到数组中 this->init_Emp(); // 测试语句 /*for (int i = 0; i < this->m_EmpNum; i++) { cout << "职工编号:" << this->m_EmpArray[i]->m_Id << "\t职工姓名:" << this->m_EmpArray[i]->m_Name << "\t\t职工部门编号:" << this->m_EmpArray[i]->m_DeptId << endl; }*/ cout << endl; cout << endl; } // 展示菜单 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; } // 新增功能 void WorkerManager::add_Emp() { // 先询问用户需要新增多少个职工 cout << "请输入添加职工数量:"; int addNum = 0; cin >> addNum; cout << endl; // 要判断添加数量是否大于零 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 dId; // 部门编号 // 判断职工编号是否重复,重复则不允新增 while (true) { cout << "请输入第 " << i + 1 << "个新职工编号:"; cin >> id; cout << endl; int ret = 0; for (int i = 0; i < this->m_EmpNum; i++) { if (id == this->m_EmpArray[i]->m_Id) { ret++; } } if (ret == 0) { break; } else { cout << "输入的职工编号重复,请重新输入!" << endl; } } cout << "请输入第 " << i + 1 << "个新职工姓名:"; cin >> name; cout << endl; cout << "部门编号" << endl; cout << " 1. 普通员工" << endl; cout << " 2. 经理" << endl; cout << " 3. 老板" << endl; cout << "请输入第 " << i + 1 << "个新职工部门编号:"; cin >> dId; cout << endl; Worker* worker = NULL; // 部门编号的几种情况 switch (dId) { 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; this->m_FileIsEmpty = false; // 提示 cout << "成功添加 " << addNum << " 名新职工" << endl; // 保存数据到文件 this->save(); } else { cout << "输入数量有误" << endl; } // 按任意键后,清屏回到上级目录 system("pause"); system("cls"); } // 保存文件 void WorkerManager::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(); } // 计算文件中的数据行 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; } // 初始化员工 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; // 根据不同部门编号创建不同对象 switch (dId) { case 1: // 普通员工 worker = new Employee(id, name, dId); break; case 2: // 经理 worker = new Manager(id, name, dId); break; case 3: // 老板 worker = new Boss(id, name, dId); break; default: break; } // 存放到数组中 this->m_EmpArray[index] = worker; index++; } // 关闭文件 ifs.close(); } // 显示职工 void WorkerManager::show_Emp() { if (this->m_FileIsEmpty) // 初始化为false状态 { cout << "文件不存在或记录为空" << endl; // 按任意键后,清屏回到上级目录 system("pause"); system("cls"); } else { for (int i = 0; i < this->m_EmpNum; i++) { // 利用多态调用接口 this->m_EmpArray[i]->showInfo(); } } // 按任意键后,清屏回到上级目录 system("pause"); system("cls"); } // 判断员工是否存在,存在则返回数组位置,不存在则返回-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; } } // 遍历完还没找到就返回-1 return index; } // 删除员工 void WorkerManager::del_Emp() { if (this->m_FileIsEmpty) // 初始化为false状态 { cout << "文件不存在或记录为空" << endl; // 按任意键后,清屏回到上级目录 system("pause"); system("cls"); } else { // 按照员工编号删除 cout << "请输入想要删除的职工编号:"; int id = 0; cin >> id; cout << endl; 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"); } // 修改员工信息 void WorkerManager::mod_Emp() { if (this->m_FileIsEmpty) // 初始化为false状态 { cout << "文件不存在或记录为空" << endl; // 按任意键后,清屏回到上级目录 system("pause"); system("cls"); } else { // 按照员工编号进行修改 cout << "请输入想要修改的职工编号:"; int id = 0; cin >> id; cout << endl; int index = this->IsExist(id); if (index != -1) { // 先删除该员工的所有信息 delete this->m_EmpArray[index]; int newId = 0; string newName = ""; int newDid = 0; cout << "查找到 " << id << "号员工,请输入新职工号:"; cin >> newId; cout << endl; cout << "请输入新职工姓名:"; cin >> newName; cout << endl; cout << "部门编号" << endl; cout << " 1. 普通员工" << endl; cout << " 2. 经理" << endl; cout << " 3. 老板" << endl; cout << "请输入新部门编号:"; cin >> newDid; cout << endl; 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[index] = worker; // 提示 cout << "修改成功!" << endl; //更新数据到文件中 this->save(); } else { cout << "查到不到该员工,修改失败" << endl; } } // 按任意键后,清屏回到上级目录 system("pause"); system("cls"); } // 查找员工 可根据职工编号以及职工姓名查找 void WorkerManager::find_Emp() { if (this->m_FileIsEmpty) // 初始化为false状态 { cout << "文件不存在或记录为空" << endl; // 按任意键后,清屏回到上级目录 system("pause"); system("cls"); } else { cout << "请输入查找的方式:" << endl; cout << "1. 按职工编号查找" << endl; cout << "2. 按姓名查找" << endl; int select = 0; cin >> select; if (select == 1) // 按职工编号查找 { // 按照员工编号进行查找 cout << "请输入想要查找的职工编号:"; int id = 0; cin >> id; cout << endl; int index = this->IsExist(id); if (index != -1) { cout << "查找成功!该职工信息如下:" << endl; this->m_EmpArray[index]->showInfo(); } else { cout << "查找失败!" << endl; } } else if (select == 2) // 根据职工姓名查找 { string name; cout << "请输入查找的职工姓名:"; cin >> name; cout << endl; bool flag = false; // 定义一个查找的标志 // 避免有重名的职工 for (int i = 0; i < this->m_EmpNum - 1; i++) { if (this->m_EmpArray[i]->m_Name == name) { cout << "查找成功!以下为该职工的信息" << endl; this->m_EmpArray[i]->showInfo(); flag = true; // 修改标志 } } if (flag == false) { cout << "查无此人!" << endl; } } else { cout << "输入的选项有误,即将退出查找" << endl; } } // 按任意键后,清屏回到上级目录 system("pause"); system("cls"); } // 排序职工 void WorkerManager::sort_Emp() { if (this->m_FileIsEmpty) // 初始化为false状态 { cout << "文件不存在或记录为空" << endl; // 按任意键后,清屏回到上级目录 system("pause"); system("cls"); } else { cout << "1. 按职工编号升序排序" << endl; cout << "2. 按职工编号降序排序" << endl; cout << "请选择排序的方式:"; int select = 0; cin >> select; cout << endl; for (int i = 0; i < this->m_EmpNum; i++) { // 假定它最小或最大 int minOrMax = i; for (int j = i + 1; j < this->m_EmpNum; j++) { if (select == 1) // 升序 { if (this->m_EmpArray[i]->m_Id > this->m_EmpArray[j]->m_Id) { // 更改最小值序号 minOrMax = j; } } else if (select == 2) // 降序 { if (this->m_EmpArray[i]->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->show_Emp(); // 更新到文件中 this->save(); } // 按任意键后,清屏回到上级目录 system("pause"); system("cls"); } // 清空文件 void WorkerManager::clean_File() { cout << "1. 确认" << endl; cout << "2. 返回" << endl; cout << "请再进行一次选择:"; int select = 0; cin >> select; cout << endl; if (select == 1) { // 打开模式 ios::truns 如果存在删除文件并重新创建 ofstream ofs(FILENAME,ios::trunc); ofs.close(); // 文件的删除在这一步完成 接下来主要是数组的删除 if (this->m_EmpArray != NULL) { for (int i = 0; i < this->m_EmpNum; i++) { if (this->m_EmpArray[i] != NULL) { delete this->m_EmpArray[i]; } } // 将属性进行全部初始化 this->m_EmpNum = 0; delete[] this->m_EmpArray; this->m_EmpArray = NULL; this->m_FileIsEmpty = true; } cout << "清空成功!" << endl; } // 按任意键后,清屏回到上级目录 system("pause"); system("cls"); } // 退出功能 void WorkerManager::exitSystem() { cout<< "欢迎下次使用!" << endl; system("pause"); exit(0); // 专门用来退出的函数 } // 析构函数 WorkerManager::~WorkerManager() { if (this->m_EmpArray != NULL) { delete[] this->m_EmpArray; this->m_EmpArray = NULL; } }
main函数
#include <bits/stdc++.h> using namespace std; #include "workerManager.h" int main() { // 实例化管理者对象 WorkerManager wm; // 创建变量接收用户选择 int choice = 0; while (true) { // 调用展示菜单成员函数 wm.show_Menu(); cout << "请输入您的选择:"; cin >> choice; cout << endl; switch(choice) { case 0: // 退出管理程序 wm.exitSystem(); break; case 1: // 增加职工信息 wm.add_Emp(); break; case 2: // 显示职工信息 wm.show_Emp(); break; case 3: // 删除离职职工 wm.del_Emp(); break; case 4: // 修改职工信息 wm.mod_Emp(); break; case 5: // 查找职工信息 wm.find_Emp(); break; case 6: // 按照编号排序 wm.sort_Emp(); break; case 7: // 清空所有文档 break; default: cout << "输入有误,即将退出程序" << endl; system("cls"); break; } } system("pause"); return 0; }