一、创建项目
cmake_minimum_required(VERSION 3.27)
project(WorkerManagementSystem CXX)
set(CMAKE_CXX_STANDARD 17)
add_executable(WorkerManagementSystem
main.cpp
workerManager/WorkerManager.h
workerManager/WorkerManager.cpp
worker/Worker.h
worker/impl/Employee.cpp
worker/impl/Employee.h
worker/impl/Manager.cpp
worker/impl/Manager.h
worker/impl/Boss.cpp
worker/impl/Boss.h)
二、创建职工类
1、创建职工抽象类
# ifndef WORKERMANAGER_CPP_WORKER_H
# define WORKERMANAGER_CPP_WORKER_H
# pragma once
# include <iostream>
using namespace std;
class Worker {
public :
int m_Id;
string m_Name;
int m_DeptId;
virtual ~ Worker ( ) = default ;
virtual void showInfo ( ) = 0 ;
virtual string getDeptName ( ) = 0 ;
} ;
# endif
2、创建普通员工类
1. 头文件
# ifndef WORKERMANAGER_CPP_EMPLOYEE_H
# define WORKERMANAGER_CPP_EMPLOYEE_H
# pragma once
# include "../Worker.h"
using namespace std;
class Employee : public Worker {
public :
Employee ( int id, const string & name, int deptId) ;
~ Employee ( ) override;
void showInfo ( ) override;
string getDeptName ( ) override;
} ;
# endif
2. 源文件
# include "Employee.h"
using namespace std;
Employee :: Employee ( int id, const std:: string & name, int deptId) {
this -> m_Id = id;
this -> m_Name = name;
this -> m_DeptId = deptId;
}
Employee :: ~ Employee ( ) = default ;
void Employee :: showInfo ( ) {
cout << "职工编号: " << m_Id << "\t职工姓名: " << m_Name << "\t职工岗位: " << this -> getDeptName ( )
<< "\t岗位职责:完成经理交给的任务" << endl;
}
string Employee :: getDeptName ( ) {
return "普通员工" ;
}
3、创建经理类
1. 头文件
# ifndef WORKERMANAGER_CPP_MANAGER_H
# define WORKERMANAGER_CPP_MANAGER_H
# pragma once
# include "../Worker.h"
class Manager : public Worker {
public :
Manager ( int id, const string & name, int deptId) ;
~ Manager ( ) override;
void showInfo ( ) override;
string getDeptName ( ) override;
} ;
# endif
2. 源文件
# include "Manager.h"
using namespace std;
Manager :: Manager ( int id, const std:: string & name, int deptId) {
this -> m_Id = id;
this -> m_Name = name;
this -> m_DeptId = deptId;
}
Manager :: ~ Manager ( ) = default ;
void Manager :: showInfo ( ) {
cout << "职工编号:" << m_Id << "\t职工姓名:" << m_Name << "\t职工岗位:" << this -> getDeptName ( )
<< "\t岗位职责:完成老板交给的任务,并下发任务给员工" << endl;
}
string Manager :: getDeptName ( ) {
return "经理" ;
}
4、创建老板类
1. 头文件
# ifndef WORKERMANAGER_CPP_BOSS_H
# define WORKERMANAGER_CPP_BOSS_H
# pragma once
# include "../Worker.h"
class Boss : public Worker {
public :
Boss ( int id, const string & name, int deptId) ;
~ Boss ( ) override;
void showInfo ( ) override;
string getDeptName ( ) override;
} ;
# endif
2. 源文件
# include "Boss.h"
using namespace std;
Boss :: Boss ( int id, const std:: string & name, int deptId) {
this -> m_Id = id;
this -> m_Name = name;
this -> m_DeptId = deptId;
}
Boss :: ~ Boss ( ) = default ;
void Boss :: showInfo ( ) {
cout << "职工编号: " << m_Id << "\t职工姓名: " << m_Name << "\t职工岗位: " << this -> getDeptName ( )
<< "\t岗位职责:管理公司所有事务" << endl;
}
string Boss :: getDeptName ( ) {
return "老板" ;
}
三、创建管理类
1、头文件实现
# ifndef WORKERMANAGER_CPP_WORKERMANAGER_H
# define WORKERMANAGER_CPP_WORKERMANAGER_H
# pragma once
# include <iostream>
# include <fstream>
# include "../worker/Worker.h"
# include "../worker/impl/Employee.h"
# include "../worker/impl/Manager.h"
# include "../worker/impl/Boss.h"
using namespace std;
# define FILENAME "worker.txt"
class WorkerManager {
int m_WorkerNumber{ } ;
Worker * * m_WorkerArray{ } ;
bool m_FileIsEmpty{ } ;
public :
WorkerManager ( ) ;
~ WorkerManager ( ) ;
static void showMenu ( ) ;
static void exitSystem ( ) ;
void saveToLocal ( ) ;
void loadFromLocal ( ) ;
static int countWorkers ( ) ;
void initWorkers ( ) ;
void addWorker ( ) ;
void showWorkers ( ) ;
int isExistWorker ( int id) ;
void deleteWorker ( ) ;
void modifyWorker ( ) ;
void findWorker ( ) ;
void sortWorkers ( ) ;
void clearAll ( ) ;
} ;
# endif
2、源文件
# include "WorkerManager.h"
四、数据交互
1、显示菜单
void WorkerManager :: showMenu ( ) {
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;
}
2、退出系统
void WorkerManager :: exitSystem ( ) {
cout << "欢迎下次使用" << endl;
system ( "read" ) ;
exit ( 0 ) ;
}
3、显示职工信息
void WorkerManager :: showWorkers ( ) {
if ( this -> m_FileIsEmpty) {
cout << "暂无数据" << endl;
} else {
for ( int i = 0 ; i < this -> m_WorkerNumber; i++ ) {
this -> m_WorkerArray[ i] -> showInfo ( ) ;
}
}
system ( "read" ) ;
system ( "clear" ) ;
}
4、保存到本地
void WorkerManager :: saveToLocal ( ) {
ofstream file ( FILENAME, ios:: out) ;
if ( file. is_open ( ) && this -> m_WorkerArray != nullptr ) {
for ( int i = 0 ; i < this -> m_WorkerNumber; i++ ) {
file << this -> m_WorkerArray[ i] -> m_Id << " "
<< this -> m_WorkerArray[ i] -> m_Name << " "
<< this -> m_WorkerArray[ i] -> m_DeptId << endl;
}
}
file. close ( ) ;
}
5、初始化数据
1. 构造函数
WorkerManager :: WorkerManager ( ) {
this -> loadFromLocal ( ) ;
}
2. 加载文件
void WorkerManager :: loadFromLocal ( ) {
ifstream file ( FILENAME, ios:: in) ;
if ( file. is_open ( ) ) {
char ch;
file >> ch;
if ( file. eof ( ) ) {
cout << "文件为空!" << endl;
this -> m_WorkerNumber = 0 ;
this -> m_WorkerArray = nullptr ;
this -> m_FileIsEmpty = true ;
file. close ( ) ;
return ;
} else {
this -> initWorkers ( ) ;
file. close ( ) ;
return ;
}
} else {
cout << "文件不存在!" << endl;
this -> m_WorkerNumber = 0 ;
this -> m_WorkerArray = nullptr ;
this -> m_FileIsEmpty = true ;
file. close ( ) ;
return ;
}
}
3. 统计职工数量
int WorkerManager :: countWorkers ( ) {
ifstream file ( FILENAME, ios:: in) ;
int id;
string name;
int deptId;
int count = 0 ;
while ( file >> id >> name >> deptId) {
count++ ;
}
file. close ( ) ;
return count;
}
4. 初始化职工信息
void WorkerManager :: initWorkers ( ) {
this -> m_WorkerNumber = WorkerManager :: countWorkers ( ) ;
this -> m_WorkerArray = new Worker * [ this -> m_WorkerNumber] ;
this -> m_FileIsEmpty = false ;
ifstream file ( FILENAME, ios:: in) ;
int id;
string name;
int deptId;
int index = 0 ;
while ( file >> id >> name >> deptId) {
Worker * worker = nullptr ;
switch ( deptId) {
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 ;
}
this -> m_WorkerArray[ index] = worker;
index++ ;
}
file. close ( ) ;
}
6、析构函数
WorkerManager :: ~ WorkerManager ( ) {
if ( this -> m_WorkerArray != nullptr ) {
for ( int i = 0 ; i < this -> m_WorkerNumber; i++ ) {
delete this -> m_WorkerArray[ i] ;
this -> m_WorkerArray[ i] = nullptr ;
}
delete [ ] this -> m_WorkerArray;
this -> m_WorkerArray = nullptr ;
this -> m_WorkerNumber = 0 ;
this -> m_FileIsEmpty = true ;
}
}
五、数据处理
1、增加职工信息
void WorkerManager :: addWorker ( ) {
cout << "请输入增加职工数量:" ;
int addNum = 0 ;
cin >> addNum;
if ( addNum > 0 ) {
int newSize = this -> m_WorkerNumber + addNum;
auto * * newSpace = new Worker * [ newSize] ;
if ( this -> m_WorkerArray != nullptr ) {
for ( int i = 0 ; i < this -> m_WorkerNumber; i++ ) {
newSpace[ i] = this -> m_WorkerArray[ i] ;
}
}
for ( int i = 0 ; i < addNum; i++ ) {
int id;
string name;
int dSelect;
cout << "请输入第 " << i + 1 << " 个新职工编号:" ;
cin >> id;
cout << "请输入第 " << i + 1 << " 个新职工姓名:" ;
cin >> name;
cout << "1、普通职工" << endl;
cout << "2、经理" << endl;
cout << "3、老板" << endl;
cout << "请选择该职工的岗位:" ;
cin >> dSelect;
Worker * worker = nullptr ;
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_WorkerNumber + i] = worker;
}
delete [ ] this -> m_WorkerArray;
this -> m_WorkerArray = newSpace;
this -> m_WorkerNumber = newSize;
this -> m_FileIsEmpty = false ;
this -> saveToLocal ( ) ;
cout << "成功添加" << addNum << "名新职工!" << endl;
} else {
cout << "输入有误" << endl;
}
system ( "read" ) ;
system ( "clear" ) ;
}
2、判断职工是否存在
int WorkerManager :: isExistWorker ( int id) {
for ( int i = 0 ; i < this -> m_WorkerNumber; i++ ) {
if ( this -> m_WorkerArray[ i] -> m_Id == id) {
return i;
}
}
return - 1 ;
}
3、删除职工信息
void WorkerManager :: deleteWorker ( ) {
if ( this -> m_FileIsEmpty) {
cout << "暂无数据" << endl;
} else {
cout << "请输入要删除的职工编号:" ;
int id;
cin >> id;
int index = this -> isExistWorker ( id) ;
if ( index != - 1 ) {
this -> m_WorkerNumber-- ;
cout << this -> m_WorkerNumber << "名员工" << endl;
delete this -> m_WorkerArray[ index] ;
for ( int i = index; i < this -> m_WorkerNumber; i++ ) {
this -> m_WorkerArray[ i] = this -> m_WorkerArray[ i + 1 ] ;
}
this -> saveToLocal ( ) ;
if ( this -> m_WorkerNumber == 0 ) {
this -> m_FileIsEmpty = true ;
}
cout << "删除成功!" << endl;
} else {
cout << "该职工不存在!" << endl;
}
}
system ( "read" ) ;
system ( "clear" ) ;
}
4、修改职工信息
void WorkerManager :: modifyWorker ( ) {
if ( this -> m_FileIsEmpty) {
cout << "暂无数据" << endl;
} else {
cout << "请输入要修改的职工编号:" ;
int id;
cin >> id;
int index = this -> isExistWorker ( id) ;
if ( index != - 1 ) {
this -> m_WorkerArray[ index] -> showInfo ( ) ;
string name;
cout << "请输入职工姓名:" ;
cin >> name;
int dSelect;
cout << "1、普通职工" << endl;
cout << "2、经理" << endl;
cout << "3、老板" << endl;
cout << "请选择该职工的岗位:" ;
cin >> dSelect;
Worker * worker = nullptr ;
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 ;
}
delete this -> m_WorkerArray[ index] ;
this -> m_WorkerArray[ index] = worker;
this -> saveToLocal ( ) ;
cout << "修改成功!" << endl;
} else {
cout << "该职工不存在!" << endl;
}
}
system ( "read" ) ;
system ( "clear" ) ;
}
5、查找职工信息
void WorkerManager :: findWorker ( ) {
if ( this -> m_FileIsEmpty) {
cout << "暂无数据" << endl;
} else {
cout << "请输入要查找的职工编号:" ;
int id;
cin >> id;
int index = this -> isExistWorker ( id) ;
if ( index != - 1 ) {
this -> m_WorkerArray[ index] -> showInfo ( ) ;
} else {
cout << "该职工不存在!" << endl;
}
}
system ( "read" ) ;
system ( "clear" ) ;
}
6、按照编号排序
void WorkerManager :: sortWorkers ( ) {
if ( this -> m_FileIsEmpty) {
cout << "暂无数据" << endl;
system ( "read" ) ;
system ( "clear" ) ;
} else {
for ( int i = 0 ; i < this -> m_WorkerNumber; i++ ) {
for ( int j = i + 1 ; j < this -> m_WorkerNumber; j++ ) {
if ( this -> m_WorkerArray[ i] -> m_Id < this -> m_WorkerArray[ j] -> m_Id) {
Worker * temp = this -> m_WorkerArray[ i] ;
this -> m_WorkerArray[ i] = this -> m_WorkerArray[ j] ;
this -> m_WorkerArray[ j] = temp;
}
}
}
this -> showWorkers ( ) ;
}
}
7、清空所有文档
void WorkerManager :: clearAll ( ) {
if ( this -> m_FileIsEmpty) {
cout << "暂无数据" << endl;
} else {
if ( this -> m_WorkerArray != nullptr ) {
for ( int i = 0 ; i < this -> m_WorkerNumber; i++ ) {
delete this -> m_WorkerArray[ i] ;
this -> m_WorkerArray[ i] = nullptr ;
}
delete [ ] this -> m_WorkerArray;
this -> m_WorkerArray = nullptr ;
this -> m_WorkerNumber = 0 ;
this -> m_FileIsEmpty = true ;
this -> saveToLocal ( ) ;
}
cout << "清除成功" << endl;
}
system ( "read" ) ;
system ( "clear" ) ;
}
六、程序入口
# include <iostream>
# include "workerManager/WorkerManager.h"
using namespace std;
int main ( ) {
WorkerManager workerManager;
string str;
char select;
while ( true ) {
WorkerManager :: showMenu ( ) ;
cout << "请输入您想要的操作:" ;
cin >> str;
select = str[ 0 ] ;
switch ( select) {
case '1' :
workerManager. addWorker ( ) ;
break ;
case '2' :
workerManager. showWorkers ( ) ;
break ;
case '3' :
workerManager. deleteWorker ( ) ;
system ( "clear" ) ;
break ;
case '4' :
workerManager. modifyWorker ( ) ;
system ( "clear" ) ;
break ;
case '5' :
workerManager. findWorker ( ) ;
system ( "clear" ) ;
break ;
case '6' :
workerManager. sortWorkers ( ) ;
system ( "clear" ) ;
break ;
case '7' :
workerManager. clearAll ( ) ;
system ( "clear" ) ;
break ;
case '0' :
WorkerManager :: exitSystem ( ) ;
break ;
default :
cout << "输入错误,请重新输入!" << endl;
system ( "read" ) ;
system ( "clear" ) ;
break ;
}
}
}