发布时间:2023-02-27 15:00
利用C++实现一个基于多态的职工管理系统。职工分为三类:普通员工、经理和老板。显示信息时,需要显示职工编号、姓名、岗位。
管理系统中需要实现的功能如下:
管理类内容为:
在头文件和源文件中分别创建workManager.h头文件和workManager.cpp源文件。
在.h头文件中创建基本框架:
#pragma once //防止头文件重复包含
#include
using namespace std;//标准命名空间
class WorkManager
{
public:
//构造函数
WorkManager();
//析构函数
~WorkManager();
};
在.cpp源文件中搭建基本框架:
#include\"workManager.h\"
WorkManager::WorkManager() {
}
WorkManager::~WorkManager() {
}
在workManager.h中添加成员函数void showMenu();
在workManager.cpp中实现该函数:
//显示菜单
void WorkManager::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;
}
在主函数中调用该函数:
int main()
{
WorkManager wm;//实例化类对象
wm.showMenu();//调用展示菜单成员函数
system(\"pause\");
return 0;
}
在实现上述功能之前,首先需要搭建一下基本框架,基本框架主函数如下:
int main()
{
WorkManager wm;//实例化类对象
int choice = 0;//创建用户选择变量
while (true) {
wm.showMenu();//调用展示菜单成员函数
cout << \"请输入您的选择:\" << endl;
cin >> choice;
switch (choice)
{
case 0: //0、退出管理系统
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;
}
选择0则退出管理系统,在workManager.h中添加成员函数void ExitSystem();
在workManager.cpp中实现该函数:
//退出系统
void WorkManager::ExitSystem()
{
cout << \"欢迎下次使用\" << endl;
system(\"pause\");
exit(0);//退出程序
}
case0中添加如下代码:
case 0: //0、退出管理系统
wm.ExitSystem();
break;
在头文件和源文件中分别创建worker.h头文件和worker.cpp源文件。
在.h头文件中创建员工类:
#include
#include
using namespace std;
//职工抽象类
class Worker
{
public:
//职工编号
int m_Id;
//职工姓名
string m_Name;
//部门编号
int m_DeptId;
//显示个人信息
virtual void showInfo() = 0;//纯虚函数
//获取岗位名称
virtual string getDeptName() = 0;//纯虚函数
};
在头文件和源文件中分别创建employee.h头文件和employee.cpp源文件。
在.h头文件中创建普通职工类,继承自Worker抽象类:
//普通职工类
#include
#include\"worker.h\"
class Employee:public Worker
{
public:
Employee(int id,string name,int deptId); //构造函数
//显示个人信息
virtual void showInfo();
//获取岗位名称
virtual string getDeptName();
};
在.cpp源文件中定义相关函数:
#include\"employee.h\"
//构造函数
Employee::Employee(int id, string name, int deptId)
{
//初始化
this->m_Id = id;
this->m_Name = name;
this->m_DeptId = deptId;
}
//显示个人信息
void Employee::showInfo()
{
cout<<\"职工编号:\"<<this->m_Id
<<\"\\t职工姓名:\"<<this->m_Name
<<\"\\t岗位:\"<<this->getDeptName()
}
//获取岗位名称
string Employee::getDeptName()
{
return string(\"普通职工\");
}
在头文件和源文件中分别创建manager.h头文件和manager.cpp源文件。
在.h头文件中创建经理类,继承自Worker抽象类:
//经理类
#include
#include\"worker.h\"
class Manager :public Worker
{
public:
Manager(int id, string name, int deptId); //构造函数
//显示个人信息
virtual void showInfo();
//获取岗位名称
virtual string getDeptName();
};
在.cpp源文件中定义相关函数:
#include\"manager.h\"
//构造函数
Manager::Manager(int id, string name, int deptId)
{
//初始化
this->m_Id = id;
this->m_Name = name;
this->m_DeptId = deptId;
}
//显示个人信息
void Manager::showInfo()
{
cout << \"职工编号:\" << this->m_Id
<< \"\\t职工姓名:\" << this->m_Name
<< \"\\t岗位:\" << this->getDeptName();
}
//获取岗位名称
string Manager::getDeptName()
{
return string(\"经理\");
}
在头文件和源文件中分别创建boss.h头文件和boss.cpp源文件。
在.h头文件中创建老板类,同样继承自Worker抽象类:
//老板类
#include
#include\"worker.h\"
class Boss :public Worker
{
public:
Boss(int id, string name, int deptId); //构造函数
//显示个人信息
virtual void showInfo();
//获取岗位名称
virtual string getDeptName();
};
在.cpp源文件中定义相关函数:
#include\"boss.h\"
//构造函数
Boss::Boss(int id, string name, int deptId)
{
//初始化
this->m_Id = id;
this->m_Name = name;
this->m_DeptId = deptId;
}
//显示个人信息
void Boss::showInfo()
{
cout << \"职工编号:\" << this->m_Id
<< \"\\t职工姓名:\" << this->m_Name
<< \"\\t岗位:\" << this->getDeptName()
}
//获取岗位名称
string Boss::getDeptName()
{
return string(\"老板\");
}
在WorkManager.h头文件中添加成员属性:
//记录职工人数
int m_Size;
//职工数组指针
Worker** m_EmployeeArray;
添加成员函数:
//添加职工
void addEmp();
在WorkManager.cpp源文件构造函数中初始化属性:
WorkManager::WorkManager() {
//初始化属性
this->m_Size = 0;
this->m_EmployeeArray = NULL;
}
实现addEmp函数,实现批量添加函数:
void WorkManager::addEmp()
{
cout << \"请输入添加职工数量:\" << endl;
int addNum = 0;//保存用户的输入数量
cin >> addNum;
if (addNum > 0)
{
//计算添加新空间人数
int newSize = this->m_Size + addNum;//新空间人数=原来记录人数+新增人数
//开辟新空间【动态数组】
Worker** newSpace = new Worker*[newSize];
//将原来空间下的数据,拷贝到新空间下
if (this->m_EmployeeArray != NULL) {
for (int i = 0; i < this->m_Size; i++)
{
newSpace[i] = this->m_EmployeeArray[i];
}
}
//批量添加新数据
for (int i = 0; i < addNum; i++)
{
int id;//职工编号
string name;//职工姓名
int deptid;//部门
cout << \"请输入第\" << i + 1 << \"个新职工编号:\" << endl;
cin >> id;
cout << \"请输入第\" << i + 1 << \"个新职工姓名:\" << endl;
cin >> name;
cout << \"请选择该职工的岗位:\" << endl;
cout << \"1、普通职工\" << endl;
cout << \"2、经理\" << endl;
cout << \"3、老板\" << endl;
cin >> deptid;
Worker* worker = NULL;
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;
}
//将创建的员工指针保存到数组中
newSpace[this->m_Size + i] = worker;
}
//释放原有空间
delete[] this->m_EmployeeArray;
//更改新空间的指向
this->m_EmployeeArray = newSpace;
//更新职工人数
this->m_Size = newSize;
//提示添加成功
cout << \"成功添加\" << addNum << \"名新职工\" << endl;
}
else {
cout << \"输入数据有误!\" << endl;
}
//按任意键、清屏
system(\"pause\");
system(\"cls\");
}
case1中修改代码为:
case 1: //1、添加职工
wm.addEmp();
break;
最后,可以完善一下析构函数(析构函数其实可写可不写):
//析构函数
WorkManager::~WorkManager() {
if (this->m_EmployeeArray != NULL)
{
delete[] this->m_EmployeeArray;
this->m_EmployeeArray = NULL;
}
}
将上述添加职工的功能进行保存,实现当程序关闭时依然能记住添加的职工。
首先需要在workManager.h中包含头文件和宏定义(文件名):
#include
#define FILENAME \"empFile.txt\"
添加成员函数:
//保存文件
void save();
实现保存文件save()函数:
void WorkManager::save()
{
ofstream ofs;
ofs.open(FILENAME, ios::out);
for (int i = 0; i < this->m_Size; i++)
{
ofs << this->m_EmployeeArray[i]->m_Id << \" \"
<< this->m_EmployeeArray[i]->m_Name << \" \"
<< this->m_EmployeeArray[i]->m_DeptId << endl;
}
ofs.close();
}
最后,在addEmp()函数最后调用该函数:
this->save();//保存
若已经存在文件,则每次程序开始运行时,需要将文件中的数据读取到程序中,如不存在文件,则无需读取。分为三种情况:
①第一次使用,文件未创建;
②文件存在,但数据被用户清空;
③文件存在,且存有信息;
在WorkManager.h头文件中添加成员属性判断文件是否为空:
//标志文件是否为空
bool m_FileIsEmpty;
在WorkManager.cpp构造函数中添加代码:
ifstream ifs;
ifs.open(FILENAME, ios::in);
在WorkManager.cpp构造函数中添加代码:
//若文件不存在
if (!ifs.is_open())
{
cout << \"文件不存在\" << endl;//测试输出
//初始化属性
this->m_Size = 0;//初始化人数
this->m_FileIsEmpty = true;//初始化文件为空
this->m_EmployeeArray = NULL;//初始化数组
ifs.close();//关闭文件
return;
}
在WorkManager.cpp构造函数中追加代码:【判断文件是否为空】
//2、若文件存在,但没有数据
char ch;
ifs >> ch;
if (ifs.eof())
{
cout << \"文件为空\" << endl;
//初始化属性
this->m_Size = 0;//初始化人数
this->m_FileIsEmpty = true;//初始化文件为空
this->m_EmployeeArray = NULL;//初始化数组
ifs.close();//关闭文件
return;
}
然后在addEmp()函数后更新职工不为空标志:
//更新标志【不为空】
this->m_FileIsEmpty = false;
在WorkManager.h中添加成员函数:
//统计文件中的人数
int get_EmpNum();
在WorkManager.cpp中实现该函数:
int WorkManager::get_EmpNum()
{
ifstream ifs;
ifs.open(FILENAME, ios::in);
int id;//职工编号
string name;//职工姓名
int deptid;//部门
int num = 0;//人数
while (ifs>>id && ifs >>name && ifs >>deptid)
{
//统计人数变量
num++;
}
ifs.close();
return num;
}
在构造函数中追加代码:
//3、若文件存在,并且记录数据
int num = this->get_EmpNum();
cout << \"职工人数:\" << num << endl;
this->m_Size = num;//人数
然后根据职工的相关数据,初始化WorkerManager中的Worker** m_EmployeeArray指针。
在WorkManager.h中添加成员函数:
//初始化职工
void init_Emp();
在WorkManager.cpp中实现该函数:
void WorkManager::init_Emp()
{
ifstream ifs;
ifs.open(FILENAME, ios::in);
int id;//职工编号
string name;//职工姓名
int deptid;//部门
int index = 0;
while (ifs >> id && ifs >> name && ifs >> deptid)
{
Worker* worker = NULL;
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_EmployeeArray[index] = worker;
index++;
}
ifs.close();//关闭文件
}
最后,在构造函数中追加代码:
//根据职工数创建数组
this->m_EmployeeArray = new Worker*[this->m_Size];//开辟空间
//将数据存到数组中
this->init_Emp();
for (int i = 0; i < this->m_Size; i++)
{
cout << \"职工编号:\" << this->m_EmployeeArray[i]->m_Id
<< \"姓名:\" << this->m_EmployeeArray[i]->m_Name
<< \"部门编号:\" << this->m_EmployeeArray[i]->m_DeptId << endl;
}
在WorkManager.h中添加成员函数:
//显示职工
void showEmp();
在WorkManager.cpp中实现该函数:
//2、显示职工
void WorkManager::showEmp()
{
if (this->m_FileIsEmpty) {
cout << \"文件为空或不存在...\" << endl;
}
else
{
for (int i = 0; i < this->m_Size; i++)
{
this->m_EmployeeArray[i]->showInfo();//显示信息
cout << endl;
}
}
system(\"pause\");//请按任意键继续
system(\"cls\");//清屏操作
}
case2中添加如下代码:
case 2: //2、显示职工
wm.showEmp();
break;
在WorkManager.h中添加成员函数:
//判断职工是否存在
int isExist(int id);
//删除职工
void deleteEmp();
定义检测职工是否存在函数,若存在则返回职工的id,否则返回-1:
int WorkManager::isExist(int id)
{
for (int i = 0; i < this->m_Size; i++)
{ //若存在
if (this->m_EmployeeArray[i]->m_Id == id)
{
return i;//返回下标编号
}
}
return -1;//如果没有找到
}
定义删除职工函数:
//3、删除职工
void WorkManager::deleteEmp()
{
cout << \"请输入要删除的联系人ID:\" << endl;
int id;
cin >> id;
int ret = isExist(id);//判断联系人是否存在
if (ret != -1) {
//查到了,则删除数据(利用后覆盖前实现)
for (int i = ret; i < this->m_Size; i++)
{
//数据迁移
this->m_EmployeeArray[i] = m_EmployeeArray[i + 1];
}
this->m_Size--;//更新通讯录中人员数
//同步更新到文件中
this->save();
cout << \"删除成功\" << endl;
}
else {
//未查到
cout << \"删除失败,未查到该职工...\" << endl;
}
system(\"pause\");//请按任意键继续
system(\"cls\");//清屏操作
}
case3中添加如下代码:
case 3: //3、删除职工
wm.deleteEmp();
break;
在WorkManager.h中添加成员函数:
//修改职工
void modifyEmp();
定义修改职工函数:
//4、修改职工
void WorkManager::modifyEmp()
{
if (this->m_FileIsEmpty)
{
cout << \"文件不存在或记录为空!\" << endl;
}
else {
cout << \"请输入要修改的职工ID:\" << endl;
int id;
cin >> id;
int ret = isExist(id);//判断职工是否存在
if (ret != -1) {
//查到了,则修改数据
//delete this->m_EmployeeArray[ret];//这里可以清空内容再修改也可以不清空修改
int id;//职工编号
string name;//职工姓名
int deptid;//部门
cout << \"请输入新的新职工编号:\" << endl;
cin >> id;
cout << \"请输入新的新职工姓名:\" << endl;
cin >> name;
cout << \"请选择该职工的新岗位:\" << endl;
cout << \"1、普通职工\" << endl;
cout << \"2、经理\" << endl;
cout << \"3、老板\" << endl;
cin >> deptid;
Worker* worker = NULL;
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_EmployeeArray[ret] = worker;
cout << \"修改成功!\" << endl;
//保存到文件中
this->save();
}
else {
//未查到
cout << \"修改失败,未查到该联系人\" << endl;
}
}
system(\"pause\");//请按任意键继续
system(\"cls\");//清屏操作
}
case4中添加如下代码:
case 4: //4、查找职工
wm.modifyEmp();
break;
在WorkManager.h中添加成员函数:
//查找职工
void findEmp();
定义查找职工函数:
//5、查找职工
void WorkManager::findEmp()
{
if (this->m_FileIsEmpty)
{
cout << \"文件不存在或记录为空!\" << endl;
}
else {
cout << \"请输入查找的方式:\" << endl;
cout << \"1、按照职工编号查找\" << endl;
cout << \"2、按照职工姓名查找\" << endl;
int select = 0;
cin >> select;
if (select == 1)
{
//按照编号查找
cout << \"请输入要查找的职工编号:\" << endl;
int id;
cin >> id;
int ret = isExist(id);//判断职工是否存在
if (ret != -1) {
//查到了,则显示数据
this->m_EmployeeArray[ret]->showInfo();
}
else {
cout << \"查找失败,查无此人...\" << endl;
}
}
else if (select == 2)
{
//按照姓名查找
cout << \"请输入要查找的职工姓名:\" << endl;
string name;
cin >> name;
//加入判断标志判断是否查到【防止重复打印查无此人】
bool flag = false;
//判断职工是否存在
for (int i = 0; i < this->m_Size; i++)
{ //若存在
if (this->m_EmployeeArray[i]->m_Name == name)
{
//查到了,则显示数据
flag = true;
this->m_EmployeeArray[i]->showInfo();
cout << endl;
}
}
if(flag==false)
{
cout << \"查找失败,查无此人...\" << endl;
}
}
else {
//输入有误
cout << \"输入错误\" << endl;
}
}
system(\"pause\");//请按任意键继续
system(\"cls\");//清屏操作
}
case5中修改代码为:
case 5: //5、查找职工
wm.findEmp();
break;
在WorkManager.h中添加成员函数:
//排序职工
void sortEmp();
使用选择排序算法定义职工排序函数:
//6、排序职工
void WorkManager::sortEmp()
{
if (this->m_FileIsEmpty)
{
cout << \"文件不存在或记录为空!\" << endl;
}
else {
cout << \"请输入排序的方式:\" << endl;
cout << \"1、按照职工编号升序\" << endl;
cout << \"2、按照职工编号降序\" << endl;
int select = 0;
cin >> select;
//选择排序
for (int i = 0; i < m_Size; i++)
{
int minOrmax = i;//声明最小值或最大值下标
for (int j = i + 1; j < this->m_Size; j++)
{
//升序
if (select == 1)
{
if (this->m_EmployeeArray[minOrmax]->m_Id > this->m_EmployeeArray[j]->m_Id)
{
minOrmax = j;
}
}
//降序
else {
if (this->m_EmployeeArray[minOrmax]->m_Id < this->m_EmployeeArray[j]->m_Id)
{
minOrmax = j;
}
}
}
//判断一开始认定的最小值或最大值是否为计算的最小值或最大值,若否则交换数据
if (i != minOrmax)
{
Worker* temp = this->m_EmployeeArray[i];
this->m_EmployeeArray[i] = this->m_EmployeeArray[minOrmax];
this->m_EmployeeArray[minOrmax] = temp;
}
}
cout << \"排序成功!排序后的结果为:\" << endl;
this->showEmp();//显示职工信息
this->save();//保存到文件中
}
}
case6中修改代码为:
case 6: //6、排序职工
wm.sortEmp();
break;
在WorkManager.h中添加成员函数:
//清空系统
void clearEmp();
定义清空系统函数:【这里需要同时清空文件和堆区数据】
//7、清空管理系统
void WorkManager::clearEmp()
{
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_EmployeeArray != NULL)
{
//删除堆区的每个职工对象
for (int i = 0; i < this->m_Size; i++)
{
if (this->m_EmployeeArray[i] != NULL)
{
delete this->m_EmployeeArray[i];
}
}
//删除堆区数组指针
delete[] this->m_EmployeeArray;
this->m_EmployeeArray = NULL;
this->m_Size = 0;//人数置为0
this->m_FileIsEmpty = true;//标志为空
}
cout << \"清空成功\" << endl;
}
system(\"pause\");//请按任意键继续
system(\"cls\");//清屏操作
}
同时,需要将析构函数也进行相应修改:
//析构函数
WorkManager::~WorkManager() {
if (this->m_EmployeeArray != NULL)
{
for (int i = 0; i < this->m_Size; i++)
{
if (this->m_EmployeeArray[i] != NULL)
{
delete this->m_EmployeeArray[i];
}
}
delete[] this->m_EmployeeArray;
this->m_EmployeeArray = NULL;
}
}
case7中修改代码为:
case 7: //7、清空管理系统
wm.clearEmp();
break;
如果没有看懂的话,完整代码可以参考:https://download.csdn.net/download/didi_ya/80135966
ok,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~
希云Docker培训视频百度云_希云cSphere-最佳实战Docker持续集成图文详解
Go语言异常处理(Panic和recovering)用法详解
【pytorch目标检测】labelme下载(数据标注器)+手把手教你虚拟环境的配置
如何将本地django项目部署到服务器,Django本地项目部署到云服务器
网上银行信息系统的分析与设计(《信息系统分析与设计》课程报告)
鸿蒙系统 什么时候发布,鸿蒙系统3.0什么时候发布?鸿蒙系统3.0发布时间介绍...
牛客题霸在线编程Python题库——Python入门到实践40招(二)运算符
开启生态新姿势 | 使用 WrodPress 远程附件存储到 COS