基基于多态的职工管理系统

效果

添加

 

 显示

删除

 

 

 查找

 排序(不演示了)

清空所有

 

头文件

员工类

#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;
};

职员类

//普通员工文件
#pragma once
#include <iostream>
#include "worker.h"
using namespace std;class Employee :public Worker
{
public://构造函数Employee(int id,string name,int dId);//显示个人信息virtual void showInfo();//获取岗位名称virtual string getDeptName();
};

经理类

#pragma once
#include <iostream>
#include "worker.h"
using namespace std;
//经理类
class Manager :public Worker
{
public://构造函数Manager(int id, string name, int dId);//显示个人信息virtual void showInfo();//获取岗位名称virtual string getDeptName();
};

老板类

#pragma once
#include <iostream>
#include "worker.h"
using namespace std;
//老板类
class Boss :public Worker
{
public://构造函数Boss(int id, string name, int dId);//显示个人信息virtual void showInfo();//获取岗位名称virtual string getDeptName();
};

员工管理类

#pragma once
#include <iostream>
#include"worker.h"
#include"employee.h"
#include "manager.h"
#include "boss.h"
#include <fstream>
#define FILENAME "empFile.txt"using namespace std;
class WorkerManager
{
public://构造函数WorkerManager();//展示菜单void Show_Menu();//退出功能void ExitSystem();//记录职工人数int m_EmpNum;//职工数组指针Worker **m_EmpArray;//添加职工void Add_Emp();//保存文件void save();//判断文件是否为空 标志bool m_FileIsEmpty;//统计文件中人数int get_EmpNum();//初始化员工void init_Emp();//显示职工void Show_Emp();//删除职工void Del_Emp();//按照职工编号判断职工是否存在,若存在返回职工在数组中位置,不存在返回-1int IsExist(int id);//修改职工void Mod_Emp();//查找职工 void Find_Emp();//排序职工void Sort_Emp();//清空文件void Clean_File();//析构函数~WorkerManager();
};

源文件

职员类

#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("员工");
}

经理类

#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("经理");
}

老板类

#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("总裁");
}

员工管理类

#include "workerManager.h"
WorkerManager::WorkerManager()//构造函数
{//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;}//3、文件存在,并且记录数据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 < m_EmpNum; i++)//{//	cout << "职工号: " << this->m_EmpArray[i]->m_Id//		<< " 职工姓名: " << this->m_EmpArray[i]->m_Name//		<< " 部门编号: " << this->m_EmpArray[i]->m_DeptId << 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::ExitSystem()
{cout << "欢迎下次使用" << endl;system("pause");exit(0);//退出程序
}//添加职工
void WorkerManager::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 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;//根据不同的部门Id创建不同对象if (dId == 1)  // 1普通员工{worker = new Employee(id, name, dId);}else if (dId == 2) //2经理{worker = new Manager(id, name, dId);}else //总裁{worker = new Boss(id, name, dId);}//存放在数组中this->m_EmpArray[index] = worker;index++;}//关闭文件ifs.close();
}//显示职工
void WorkerManager::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");
}//按照职工编号判断职工是否存在,若存在返回职工在数组中位置,不存在返回-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;}}return index;
}//删除职工
void WorkerManager::Del_Emp()
{if (this->m_FileIsEmpty){cout << "文件不存在或记录为空!" << endl;}else{//按职工编号删除cout << "请输入想要删除的职工号:" << endl;int id = 0;cin >> id;int index = this->IsExist(id);if (index != -1)  //说明index上位置数据需要删除{//数据前移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){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 << "修改成功!" << endl;//保存到文件中this->save();}else{cout << "修改失败,查无此人" << endl;}}//按任意键 清屏system("pause");system("cls");
}//查找职工
void WorkerManager::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 < 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");
}//排序职工
void WorkerManager::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 = m_EmpArray[i];m_EmpArray[i] = m_EmpArray[minOrMax];m_EmpArray[minOrMax] = temp;}}cout << "排序成功,排序后结果为:" << endl;this->save();this->Show_Emp();}}//清空文件
void WorkerManager::Clean_File()
{cout << "确认清空?" << endl;cout << "1、确认" << endl;cout << "2、返回" << endl;int select = 0;cin >> select;if (select == 1){//清空文件//打开模式 ios::trunc 如果存在删除文件并重新创建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];this->m_EmpArray[i] = NULL;}//删除堆区数组指针delete[] this->m_EmpArray;this->m_EmpArray = NULL;this->m_EmpNum = 0;this->m_FileIsEmpty = true;}cout << "清空成功!" << endl;}system("pause");system("cls");
}
WorkerManager::~WorkerManager()//析构函数
{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;}}

主函数

#include <iostream>
#include "workerManager.h"
using namespace std;int main()
{WorkerManager wm;int choice = 0;//用来存储用户的选项while (true){//调用展示菜单的成员函数wm.Show_Menu();cout<<"请输入您的选择:" << endl;cin >> choice;//接受用户的选项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://清空文档wm.Clean_File();break;default:break;}}system("pause");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487067.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

typescript箭头函数参数_Typescript 入门基础篇(一)

Typescript 基础Typescript是Javascript的一个超集。以下typescript简称为ts, 此文章主要是对ts官网文档的一个简化&#xff0c;缩短学习基础时间。类型基础ts 的类型主要有布尔值、数字、字符串、数组、元组、枚举、Any、Void、Null和Undefined、Never。# Boolean let boo : b…

sublime学习笔记

学习课程地址&#xff1a;快乐的sublime编辑器_sublime编辑器使用 另可参考笔记地址&#xff1a; http://c.haoduoshipin.com/happysublime/ http://blog.csdn.net/u014465934/article/details/72810763 PS&#xff1a;博主的一些文章地址&#xff1a;http://happypeter.github…

里程碑式的数学证明,攻破著名Erdős猜想中关键障碍

大数据文摘出品来源&#xff1a;wired编译&#xff1a;Canary、Andy最近&#xff0c;两名数学家解决了一个关于整数相加性质最著名猜想中的第一部分。该猜想由匈牙利传奇数学家Paul Erdős于60多年前提出&#xff0c;一个无限整数序列在何时一定会包含至少有三个等差数的模式&a…

浅复制和深复制

浅复制是由默认构造函数实现的&#xff0c;将对应数据成员一一复制。 浅复制 template<class T> Array<T>::Array(const Array<T>&a) {sizea.size;a.list list; }如果主函数中有这样的语句&#xff1a; int main() {Array<int> a(10);Array<…

admin select 2 异步_解决Angularjs异步操作后台请求用$q.all排列先后顺序问题

最近我在做angularjs程序时遇到了一个问题1.页面有很多选择框&#xff0c;一个选择框里面有众多的选择项&#xff0c;和一个默认选定的项,像下面这样(很多选择框&#xff0c;不只一个)&#xff1a;2.众多的选项要从后台接口得到&#xff0c;默认项从另一个后台接口得到&#xf…

产业|世界十大工业自动化公司,你知道几家?

来源&#xff1a;机械前线国内工业自动化行业的竞争激烈&#xff0c;国外工业自动化设备、产品制造商依然控制国内上游产品供应的主要市场&#xff0c;下面来看看国外最赚钱的工业自动化公司有哪些。▶1、德国西门子西门子股份公司(SIEMENSAGFWB:SIE&#xff0c;NYSE:SI)是全球…

12月25晚-12月29日做的两个网页

1 <!doctype html>2 <html>3 <head>4 <meta charset"utf-8">5 <title>仿山东理工大学</title>6 <link rel"stylesheet" href"css/wangye.css">7 <link href"img/favicon.ico" r…

2运行内存多大_智能设备中的内存与容量为何傻傻分不清?它们的区别是什么?...

在日常生活中&#xff0c;很多时候会把某些电子产品的容量说成内存&#xff0c;或者把内存说成了容量。比如有人问&#xff1a;“这个手机的内存多大&#xff1f;”或许会有这样回答的&#xff1a;“内存是256G。”这种问答方式虽然看似很普通&#xff0c;如果让业内人士以及了…

Nature突破:首个比头发丝还细的机器人诞生了!可用针头注射入人体

来源&#xff1a;科研大匠1959年&#xff0c;诺贝尔奖得主、理论物理学家Richard Feynman 首次提出微型医用机器人的概念。此后&#xff0c;将电子器件微型化以生产细胞大小的机器人一直是科学家们追求的目标&#xff0c;但由于缺乏合适的微米级致动器系统&#xff0c;该技术一…

腾讯云云机安装dockers

云机的配置 首先更新一下源&#xff08;更新前一直装不了&#xff09;下载dockers-ce&#xff08;社区版&#xff09;启动dockers服务使用hello-world进行测试&#xff08;由于本地没有hello-world这个镜像&#xff0c;所以dockers会下载下来并且在容器里运行&#xff09;转载于…

移动短信回执怎么开通_才知道移动积分需要主动开通功能,才会消费产生积分,垃圾!!!...

几天前朋友突然跟我说用移动积分兑换了流量&#xff0c;于是我很好奇就打开移动APP想查询下自己有多少积分&#xff0c;毕竟几年了从来没想到过积分兑换。有趣的事情发生了&#xff0c;我发现自己的积分显示是0&#xff0c;这怎么可能呢。用了好几年的号码怎么可能没有积分。当…

AIoT成功的关键要素

来源&#xff1a;中国工业和信息化本文发表于《中国工业和信息化》杂志2020年8月刊总第26期随着科技的不断发展&#xff0c;一些在功能上具有相互补充作用的技术正在不可避免地发生结合——例如&#xff0c;人工智能&#xff08;AI&#xff09;和物联网&#xff08;IoT&#xf…

中富之命能有多少钱_邯郸白铁风管工每天工资多少钱?白铁风管价格多少钱你能接受?...

邯郸白铁风管工每天工资多少钱&#xff1f;白铁风管价格多少钱你能接受&#xff1f;身为买家&#xff0c;认为白铁风管价格越低越好&#xff0c;身为厂家&#xff0c;希望在市场价格合理的情况下获得更高的利润。白铁风管工人一天的工资也是一样。以下小编就来说一下白铁风管的…

人工智能的尽头是人工?

来源&#xff1a;CAA混合智能专委会上个月出门&#xff0c;发现十字路口的交警和辅警人数明显增加了。我不禁有些诧异&#xff0c;近十年来&#xff0c;人工智能最成功和最有效的落地成果不就是安防和交通相关应用吗&#xff0c;而十字路口往往都是视频监控最密集的地方&#x…

3种团队分组适应项目_业务团队怎样做目标管理?更能激励员工?(附实操方法)...

导语&#xff1a;目标管理是业务团队的核心&#xff0c;好的目标管理激励员工&#xff0c;差的目标管理形同虚设&#xff01;很多公司有这样的现象&#xff1a;每次给业务团队订目标的时候&#xff0c;总是需要经过一番讨价还价之后&#xff0c;才能最终确定&#xff0c;然而结…

AI处理器热潮正在消退

来源&#xff1a;technews(台) 作者&#xff1a;痴汉水球俗语说得好&#xff1a;海水退潮之后&#xff0c;才知道谁没穿裤子。但历史的教训往往证明残酷的事实&#xff1a;结果站在浪里的所有人&#xff0c;全部都没有穿裤子。处理器业界的年度盛事第32届IEEE HotChips&#x…

gtj2018如何生成工程量报表_土建软件GTJ2018中的十个问题及解决方法

问题1柱汇总计算报错提示&#xff1a;直筋长度的计算结果小于0&#xff1f;方法一&#xff1a;调整为【纵筋销固】就可以计算出来钢筋量。但是设置插筋和纵筋锚固计算出来是有量差的&#xff0c;可以在编辑钢筋中把手算的长度手动添加下或者是在单构件输入界面去手动添加下。方…

重磅|我国科学家成功研制全球神经元规模最大的类脑计算机

来源&#xff1a;浙江大学9月1日&#xff0c;亿级神经元类脑计算机重大成果新闻发布会在杭州召开。浙江大学校长吴朝晖院士出席并讲话。他表示&#xff0c;人工智能浪潮正加快智能增强时代的到来&#xff0c;类脑计算机将成为未来计算的主要形态和重要平台&#xff0c;将在模拟…

java 毫秒转分钟和秒_PDF如何转换CAD文件?教你一分钟批量转上百文件方法,看完秒懂!...

如今科技这么发达&#xff0c;很多人在工作中都会遇到形形色色的各类文件。而同时也因为工作需求碰到文件格式转换难题&#xff0c;如&#xff1a;PDF如何快速转换成CAD文件&#xff1f;今天小编就教大家一个方法&#xff0c;让你轻松一秒完成百个PDF文件转CAD。具体操作方法&a…

数据库设计-规范化规则

SQL反模式一书在附录章节给出了设计关系数据库的规范化规则&#xff0c;一个简明的规范化规则清单。 关系是什么 在规范化之前&#xff0c;我们先要理解下关系。 数学中关系定义&#xff1a;两个不同数据域上的值的集合&#xff0c;通过一个条件得到的一个所有可能组合的子集。…