C++学习 --- 职工管理系统模板
1、管理系统需求
2、创建项目
2.1、创建新项目
打开vs2017,点击创建新项目,创建新的C++项目
填写项目名称及项目路径,点击确定
2.2、添加文件
右击“源文件”,进行添加文件操作
至此,项目已经创建完毕!
3、创建管理类
在头文件和源文件的文件夹下分别创建workerManager.h 和workerManager.cpp文件
workerManager,h
//防止头文件重复包含 #pragma once //包含输入输出流头文件 #include <iostream> //使用标准命名空间 using namespace std; //管理类声明 class WokerManager { public: //构造函数 WokerManager(); //析构函数 ~WokerManager(); };
workerManager.cpp
#include "workerManager.h" //构造函数 WokerManager::WokerManager() { } //析构函数 WokerManager::~WokerManager() { }
4、菜单功能
workerManager.h
//防止头文件重复包含 #pragma once //包含输入输出流头文件 #include <iostream> //使用标准命名空间 using namespace std; //管理类声明 class WokerManager { public: //构造函数 WokerManager(); //析构函数 ~WokerManager(); //+ 展示菜单 void Show_Menu(); };
workerManager.cpp
#include "workerManager.h" //构造函数 WokerManager::WokerManager() { } //析构函数 WokerManager::~WokerManager() { } //+ 展示菜单 void WokerManager::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; }
职工管理系统.cpp
#include <iostream> using namespace std; #include "workerManager.h" int main() { //实例化管理对象 WokerManager wm; //调用 展示菜单 成员函数 wm.Show_Menu(); system("pause"); return 0; }
5、退出功能
5.1、功能接口
在main函数中提供分支选择,提供每个功能接口
#include <iostream> using namespace std; #include "workerManager.h" int main() { //实例化管理对象 WokerManager wm; int choice = 0; while (true) { //调用 展示菜单 成员函数 wm.Show_Menu(); cout << "请输入您的选择: " << endl; cin >> choice; switch (choice) { case 0: //0.退出管理程序 wm.exitSystem(); break; case 1://1.添加职工信息 break; case 2://2.显示职工信息 break; case 3://3.删除离职职工 break; case 4://4.修改职工信息 break; case 5://5.查找职工信息 break; case 6://6.按照编号排序 break; case 7://7.清空所有文档 break; default: system("cls"); break; } } system("pause"); return 0; }
5.2、退出功能
workerManager.h
//防止头文件重复包含 #pragma once //包含输入输出流头文件 #include <iostream> //使用标准命名空间 using namespace std; //管理类声明 class WokerManager { public: //构造函数 WokerManager(); //析构函数 ~WokerManager(); //展示菜单 void Show_Menu(); //+ 退出功能 void exitSystem(); };
workerManager.cpp
//退出功能 void WokerManager::exitSystem() { cout << "欢迎下次使用" << endl; system("pause"); exit(0); }
6、创建职工类
6.1、创建职工抽象类
创建头文件 worker.h
#pragma once #include <iostream> #include <string> using namespace std; //职工抽象基类 class Worker { public: //显示个人信息 virtual void showInfo() = 0; //获取岗位名称 virtual string getDeptName() = 0; //职工编号 int m_Id; //职工姓名 string m_Name; //职工所在部门名称编号 int m_DeptId; };
6.2、创建普通员工类
普通员工类 继承 职工抽象类,并重写父类中纯虚函数
创建头文件employee.h 和源文件 employee.cpp
//employee.h #pragma once #include <iostream> using namespace std; #include "worker.h" //普通员工类 class Employee :public Worker { public: //构造函数 Employee(int id, string name,int dId); //显示个人信息 virtual void showInfo(); //获取职工岗位名称 virtual string getDeptName(); };
//employee.cpp #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 string("员工"); }
6.3、创建经理类
经理类 继承 职工抽象类,并重写父类中纯虚函数 和普通员工类似
创建头文件manager.h 和源文件 manager.cpp
//manager.h #pragma once #include <iostream> #include <string> #include "worker.h" using namespace std; //经理类 class Manager :public Worker { public: Manager(int id,string name,int dId); virtual void showInfo(); virtual string getDeptName(); };
//manager.cpp #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岗位职责:完成老板交给的任务,并下发任务给员工" << endl; } string Manager::getDeptName() { return string("经理"); }
6.4、创建老板类
老板类继承职工抽象类,并重写父类中纯虚函数,和普通员工类似
创建头文件boss.h 和源文件 boss.cpp
//boss.h #pragma once #include <iostream> #include <string> #include "worker.h" using namespace std; //老板类 class Boss :public Worker { public: Boss(int id,string name,int dId); virtual void showInfo(); virtual string getDeptName(); };
//boss.cpp #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岗位职责:管理公司的所有事务" << endl; } string Boss::getDeptName() { return string("总裁"); }
6.5、测试多态
#include "worker.h" #include "employee.h" #include "manager.h" #include "boss.h" void test01() { Worker * worker = NULL; worker = new Employee(1,"张三",1); worker->showInfo(); delete worker; worker = new Manager(2,"李四",2); worker->showInfo(); delete worker; worker = new Boss(3,"王五",3); worker->showInfo(); delete worker; }
7、添加职工
7.1、功能分析
7.2、功能实现
在workerManager.h 头文件中添加成员属性
//记录文件中的人数个数 int m_EmpNum; //员工数组的指针 Worker ** m_EmpArray;
workerManager.cpp 构造函数中初始化属性,析构函数释放空间
//构造函数 WokerManager::WokerManager() { //初始化人数 this->m_EmpNum = 0; //初始化数组指针 this->m_EmpArray = NULL; } //析构函数 WokerManager::~WokerManager() { if (this->m_EmpArray != NULL) { delete[] this->m_EmpArray; this->m_EmpArray = NULL; this->m_EmpNum = 0; } }
在workerManager.h中添加成员函数
void Add_Emp();
workerManager.cpp中实现该函数
//添加职工 void WokerManager::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); 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; //提示信息 cout << "成功添加 " << addNum << " 名新职工" << endl; } else { cout << "输入有误" << endl; } system("pause"); system("cls"); }
7.3、测试功能
case 1://1.添加职工信息 wm.Add_Emp(); break;
8、文件交互-写文件
8.1、设定文件路径
首先我们将文件路径,在workerManager.h 中添加宏常量,包含头文件fstream
#include <fstream>
#define FILENAME "empFile.txt"
8.2、成员函数声明
workerManager.h 类中添加成员函数 void save()
//保存文件 void save();
8.3、保存文件功能实现
wokerManager.cpp 中实现
//保存 void WokerManager::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(); }
8.4、保存文件功能测试
//提示信息 cout << "成功添加 " << addNum << " 名新职工" << endl; //保存到文件中 this->save();
9、文件交互-读文件
9.1、文件未创建
wokerManager.h中添加新的成员函数 m_FileIsEmpty标志文件是否为空
//标志文件是否为空 bool m_FileIsEmpty;
修改wokerManager.cpp 中构造代码
//构造函数 WokerManager::WokerManager() { ifstream ifs; ifs.open(FILENAME,ios::in); //文件不存在情况 if (!ifs.is_open()) { //测试输出 cout << "文件不存在" << endl; //初始化人数 this->m_EmpNum = 0; //初始化文件为空标志 this->m_FileIsEmpty = true; //初始化数组 this->m_EmpArray = NULL; //关闭文件 ifs.close(); return; } }
9.2、文件存在,但是数据用户清空
在wokerManager.cpp 中构造函数追加代码
//文件存在,并且没有记录 char ch; ifs >> ch; if (ifs.eof()) { cout << "文件为空!" << endl; this->m_EmpNum = 0; this->m_FileIsEmpty = true; this->m_EmpArray = NULL; ifs.close(); return; }
在成员函数void WokerManager::Add_Emp() 中添加
//更新职工不为空标志 this->m_FileIsEmpty = false;
9.3、文件存在,并且保存职工的所有数据
在wokerManager.h 中添加成员函数 int get_EmpNum()
//统计人数 int get_EmpNum();
在wokerManager.cpp 中实现
//统计人数 int WokerManager::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++; } ifs.close(); return num; }
在wokerManager.cpp 构造函数中追加
//3.文件存在,并且有记录的数据 int num = this->get_EmpNum(); //测试 cout << "职工人数为:" << num << endl; //更新成员属性 this->m_EmpNum = num;
根据得到的人数初始化指针 Worker ** m_EmpArray;
在wokerManager.h 添加成员函数
//初始化员工 void init_Emp();
在wokerManager.cpp 中实现
//初始化员工 void WokerManager::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; //根据不同的部门Id创建不同对象 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(); }
在wokerManager.cpp 构造函数中追加代码
//根据职工数创建数组 this->m_EmpArray = new Worker*[this->m_EmpNum]; //初始化职工 init_Emp(); //测试代码 for (int i = 0; i < m_EmpNum; i++) { cout << "职工编号: " << this->m_EmpArray[i]->m_Id << "\t职工姓名: " << this->m_EmpArray[i]->m_Name << "\t岗位: " << this->m_EmpArray[i]->m_DeptId << endl; }
10、显示职工
显示当前所有职工信息
在wokerManager.h 中添加成员函数
//显示职工 void Show_emp();
在wokerManager.cpp 中函数实现
//显示职工 void WokerManager::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"); }
11、删除职工
按照职工的编号进行删除职工操作
11.1、删除职工
函数声明
wokerManager.h添加成员函数 Del_Emp()
//删除职工 void Del_Emp();
函数实现
wokerManager.cpp 实现成员函数 Del_Emp()
//删除职工 void WokerManager::Del_Emp() { if (this->m_FileIsEmpty) { cout << "文件不存在或记录为空!" << endl; } else { //按照职工编号删除 cout << "情输入想要删除职工编号:" << endl; int id = 0; cin >> id; int index = this->IsExist(id); //职工存在并且位置之后的数据全部前移动 if (index != -1) { cout << "准备删除职工编号:" << id << endl; cout << "准备删除职工下标位置:" << index << endl; 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"); }
11.2、职工是否存在
函数声明
wokerManager.h添加成员函数 IsExist(int id)
//按照职工编号判断职工是否存在,若存在返回职工在数组中位置,不存在返回-1 int IsExist(int id);
函数实现
wokerManager.cpp 实现成员函数 IsExist(int id)
//按照职工编号判断职工是否存在,若存在返回职工在数组中位置,不存在返回-1 int WokerManager::IsExist(int id) { cout << "要找的职工编号是:" << id << endl; 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; }
12、修改职工
功能描述:能够按照职工的编号对职工信息进行修改并保存
声明
wokerManager.h 声明成员函数Mod_Emp()
//修改职工 void Mod_Emp();
实现
wokerManager.cpp 实现成员函数Mod_Emp()
//修改职工 void WokerManager::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 dSelect = 0; cout << "查到: " << id << " 号职工,请输入新职工号:" << endl; cin >> newId; cout << "请输入新姓名:" << endl; cin >> newName; cout << "请输入岗位:" << endl; cout << "1、普通职工" << endl; cout << "2、经理" << endl; cout << "3、老板" << endl; cin >> dSelect; Worker * worker = NULL; switch (dSelect) { case 1: worker = new Employee(newId, newName, dSelect); break; case 2: worker = new Manager(newId, newName, dSelect); break; case 3: worker = new Boss(newId, newName, dSelect); break; default: break; } //更改数据到数组中 this->m_EmpArray[ret] = worker; cout << "修改成功!" <<this->m_EmpArray[ret]->m_DeptId << endl; //保存到文件中 this->save(); } else { cout << "修改失败,查无此人!" << endl; } } //按任意键清屏 system("pause"); system("cls"); }
13、查找职工
功能描述:提供两种查找职工方式,一种按照职工编号,一种按照职工姓名
wokerManager.h 声明成员函数 Find_Emp()
//查找职工 void Find_Emp();
wokerManager.cpp 实现成员函数 Find_Emp()
//查找职工 void WokerManager::Find_Emp() { if (this->m_FileIsEmpty) { cout << "文件不存在或记录为空!" << endl; } else { cout << "情输入查找的方式:" << endl; cout << "1、按职工编号查找 " << endl; cout << "2、按姓名查找 " << endl; int select = 0; cin >> select; //1、按职工编号查找 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; } } //2、按姓名查找 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]->showInfo(); } } if (flag == false) { //查无此人 cout << "查找失败,查无此人" << endl; } } else { cout << "输入选项有误" << endl; } } system("pause"); system("cls"); }
14、排序
wokerManager.h 声明成员函数 Sort_Emp()
//排序职工 void Sort_Emp();
wokerManager.cpp 实现成员函数 Sort_Emp()
//排序职工 void WokerManager::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 = this->m_EmpArray[i]; this->m_EmpArray[i] = this->m_EmpArray[minOrMax]; this->m_EmpArray[minOrMax] = temp; } } cout << "排序成功,排序后结果为:" << endl; //排序后的结果保存到文件中 this->save(); this->Show_Emp(); } }
15、清空文件
wokerManager.h 声明成员函数 Clean_Emp()
//清空文件 void Clean_Emp();
wokerManager.cpp 实现成员函数 Clean_Emp()
//清空文件 void WokerManager::Clean_Emp() { cout << "确认清空?" << endl; cout << "1、确认" << endl; cout << "2、返回" << endl; int select = 0; cin >> select; if (select == 1) { //打开模式 ios::truc 如果存在删除文件并重新创建 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"); }
源码:
boss.h
#pragma once #include <iostream> #include <string> #include "worker.h" using namespace std; //老板类 class Boss :public Worker { public: Boss(int id,string name,int dId); virtual void showInfo(); virtual string getDeptName(); };
employee.h
#pragma once #include <iostream> using namespace std; #include "worker.h" //普通员工类 class Employee :public Worker { public: //构造函数 Employee(int id, string name,int dId); //显示个人信息 virtual void showInfo(); //获取职工岗位名称 virtual string getDeptName(); };
manager.h
#pragma once #include <iostream> #include <string> #include "worker.h" using namespace std; //经理类 class Manager :public Worker { public: Manager(int id,string name,int dId); virtual void showInfo(); virtual string getDeptName(); };
worker.h
#pragma once #include <iostream> #include <string> using namespace std; //职工抽象基类 class Worker { public: //显示个人信息 virtual void showInfo() = 0; //获取岗位名称 virtual string getDeptName() = 0; //职工编号 int m_Id; //职工姓名 string m_Name; //职工所在部门名称编号 int m_DeptId; };
workerManager.h
//防止头文件重复包含 #pragma once //包含输入输出流头文件 #include <iostream> //使用标准命名空间 using namespace std; #include "worker.h" #include "employee.h" #include "manager.h" #include "boss.h" #include <fstream> #define FILENAME "empFile.txt" //管理类声明 class WokerManager { public: //构造函数 WokerManager(); //析构函数 ~WokerManager(); //展示菜单 void Show_Menu(); //退出功能 void exitSystem(); //添加职工 void Add_Emp(); //保存文件 void save(); //统计人数 int get_EmpNum(); //初始化员工 void init_Emp(); //显示职工 void Show_Emp(); //删除职工 void Del_Emp(); //按照职工编号判断职工是否存在,若存在返回职工在数组中位置,不存在返回-1 int IsExist(int id); //修改职工 void Mod_Emp(); //查找职工 void Find_Emp(); //排序职工 void Sort_Emp(); //清空文件 void Clean_Emp(); //记录文件中的人数个数 int m_EmpNum; //员工数组的指针 Worker ** m_EmpArray; //标志文件是否为空 bool m_FileIsEmpty; };
boss.cpp
#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岗位职责:管理公司的所有事务" << endl; } string Boss::getDeptName() { return string("总裁"); }
employee.cpp
#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 string("员工"); }
manager.cpp
#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岗位职责:完成老板交给的任务,并下发任务给员工" << endl; } string Manager::getDeptName() { return string("经理"); }
workerManager.cpp
#include "workerManager.h" //构造函数 WokerManager::WokerManager() { ifstream ifs; ifs.open(FILENAME,ios::in); //1.文件不存在情况 if (!ifs.is_open()) { //测试输出 cout << "文件不存在" << endl; //初始化人数 this->m_EmpNum = 0; //初始化文件为空标志 this->m_FileIsEmpty = true; //初始化数组 this->m_EmpArray = NULL; //关闭文件 ifs.close(); return; } //2.文件存在,并且没有记录 char ch; ifs >> ch; if (ifs.eof()) { cout << "文件为空!" << endl; this->m_EmpNum = 0; this->m_FileIsEmpty = true; this->m_EmpArray = NULL; ifs.close(); return; } //3.文件存在,并且有记录的数据 int num = this->get_EmpNum(); //测试 cout << "职工人数为:" << num << endl; //更新成员属性 this->m_EmpNum = num; //根据职工数创建数组 this->m_EmpArray = new Worker*[this->m_EmpNum]; //初始化职工 init_Emp(); //测试代码 for (int i = 0; i < m_EmpNum; i++) { cout << "职工编号: " << this->m_EmpArray[i]->m_Id << "\t职工姓名: " << this->m_EmpArray[i]->m_Name << "\t岗位: " << this->m_EmpArray[i]->m_DeptId << endl; } } //析构函数 WokerManager::~WokerManager() { 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]; } } delete[] this->m_EmpArray; this->m_EmpArray = NULL; this->m_EmpNum = 0; } } void WokerManager::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 WokerManager::exitSystem() { cout << "欢迎下次使用" << endl; system("pause"); exit(0); } //添加职工 void WokerManager::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); 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 WokerManager::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 WokerManager::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++; } ifs.close(); return num; } //初始化员工 void WokerManager::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; //根据不同的部门Id创建不同对象 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(); } //显示职工 void WokerManager::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"); } //删除职工 void WokerManager::Del_Emp() { if (this->m_FileIsEmpty) { cout << "文件不存在或记录为空!" << endl; } else { //按照职工编号删除 cout << "情输入想要删除职工编号:" << endl; int id = 0; cin >> id; int index = this->IsExist(id); //职工存在并且位置之后的数据全部前移动 if (index != -1) { cout << "准备删除职工编号:" << id << endl; cout << "准备删除职工下标位置:" << index << endl; 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"); } //按照职工编号判断职工是否存在,若存在返回职工在数组中位置,不存在返回-1 int WokerManager::IsExist(int id) { cout << "要找的职工编号是:" << id << endl; 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 WokerManager::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 dSelect = 0; cout << "查到: " << id << " 号职工,请输入新职工号:" << endl; cin >> newId; cout << "请输入新姓名:" << endl; cin >> newName; cout << "请输入岗位:" << endl; cout << "1、普通职工" << endl; cout << "2、经理" << endl; cout << "3、老板" << endl; cin >> dSelect; Worker * worker = NULL; switch (dSelect) { case 1: worker = new Employee(newId, newName, dSelect); break; case 2: worker = new Manager(newId, newName, dSelect); break; case 3: worker = new Boss(newId, newName, dSelect); break; default: break; } //更改数据到数组中 this->m_EmpArray[ret] = worker; cout << "修改成功!" <<this->m_EmpArray[ret]->m_DeptId << endl; //保存到文件中 this->save(); } else { cout << "修改失败,查无此人!" << endl; } } //按任意键清屏 system("pause"); system("cls"); } //查找职工 void WokerManager::Find_Emp() { if (this->m_FileIsEmpty) { cout << "文件不存在或记录为空!" << endl; } else { cout << "情输入查找的方式:" << endl; cout << "1、按职工编号查找 " << endl; cout << "2、按姓名查找 " << endl; int select = 0; cin >> select; //1、按职工编号查找 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; } } //2、按姓名查找 else if (select == 2) { string name; cout << "请输入查找的姓名:" << endl; cin >> name; //查找到的标志 bool flag = false; for (int i = 0; i < m_EmpNum; i++) { if (this->m_EmpArray[i]->m_Name == name) { cout << "查找成功,职工编号为:" << m_EmpArray[i]->m_Id << " 号的信息如下:" << endl; flag = true; this->m_EmpArray[i]->showInfo(); } } if (flag == false) { //查无此人 cout << "查找失败,查无此人" << endl; } } else { cout << "输入选项有误" << endl; } } system("pause"); system("cls"); } //排序职工 void WokerManager::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 = 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 WokerManager::Clean_Emp() { cout << "确认清空?" << endl; cout << "1、确认" << endl; cout << "2、返回" << endl; int select = 0; cin >> select; if (select == 1) { //打开模式 ios::truc 如果存在删除文件并重新创建 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"); }
职工管理系统.cpp
#include <iostream> using namespace std; #include "workerManager.h" //#include "worker.h" //#include "employee.h" //#include "manager.h" //#include "boss.h" // //void test01() { // Worker * worker = NULL; // worker = new Employee(1,"张三",1); // worker->showInfo(); // delete worker; // // worker = new Manager(2,"李四",2); // worker->showInfo(); // delete worker; // // worker = new Boss(3,"王五",3); // worker->showInfo(); // delete worker; //} int main() { //test01(); //实例化管理对象 WokerManager wm; int choice = 0; while (true) { //调用 展示菜单 成员函数 wm.Show_Menu(); cout << "请输入您的选择: " << endl; cin >> choice; switch (choice) { case 0: //0.退出管理程序 wm.exitSystem(); break; case 1://1.添加职工信息 wm.Add_Emp(); break; case 2://2.显示职工信息 wm.Show_Emp(); break; case 3://3.删除离职职工 wm.Del_Emp(); break; case 4://4.修改职工信息 wm.Mod_Emp(); break; case 5://5.查找职工信息 wm.Find_Emp(); break; case 6://6.按照编号排序 wm.Sort_Emp(); break; case 7://7.清空所有文档 wm.Clean_Emp(); break; default: system("cls"); break; } } system("pause"); return 0; }