• 任务:

职工三类(部门编号):普通职工,经理,老板
职工编号,职工姓名,职工岗位,指责
普通职工 :完成经理交付任务
经理 :完成老板交付任务,并下发任务给员工
老板职责 :管理公司所有事务
1.退出管理程序
2.添加职工信息 实现批量添加,支持信息录入文件,(编号,姓名,部门编号)
3.显示职工信息
4.删除离职职工 按编号
5.修改职工信息 按编号
6.查找职工信息 按编号 或 姓名
7.按照编号排序 升序 降序
8.清空所有文档 (再确认功能)

原代码工程下载链接(点击此处下载)

效果


类内结构体


Code:

workerManager.h

#pragma once
#include<iostream>
#include<fstream>
#include"worker.h"#define FILENAME "empFile.txt"
using namespace std;
class WorkerManager
{private:int m_EmpNum;           //记录文件中人数Worker** m_EmpArray;    //员工指针数组 的指针bool m_FileIsEmpty;     //文件是否为空 的标示(1空 0非空)bool FileIsEmpty();     //文件是否为空 的标识函数bool IdUnique(int id);        //ID唯一限制void SelectSort(int s);       //选择排序,s = 1升序 / 2降序void init_Data();        //初始化数据public:WorkerManager(/* args */);void Show_Menu();       //Menuvoid ExitSys_0();       //00Exitvoid Add_Emp_1();       //01添加员工void saveData();        //数据txt 写入int get_EmpNum();       //统计txt 的成员个数void init_Emp();        //读取员工数据 到数组中void show_Emp_2();      //02显示员工void Del_Emp_3();       //03删除员工int IsExist(int id);    //判断职工ID是否存在( -1 不存在)void Mod_Emp_4();       //04修改员工void Find_Emp_5();      //05查找员工void Sort_Emp_6();      //06选择排序void Clea_Emp_7();       //07清空~WorkerManager();
};

worker.h

#pragma once
#include<iostream>
#include<string>
using namespace std;class Worker
{private:int m_Id;string m_Name;int m_DeptId;
public:int getId();string getName();int getDeptId();void setFunc(int id, string name, int did);virtual void showInfo() = 0;    //显示个人信息virtual string getDeptName() = 0; //获取岗位信息//Worker(/* args */);//~Worker();
};

worker.cpp

#include"worker.h"
int Worker::getId() {return m_Id;
}
string Worker::getName() {return m_Name;
}
int Worker::getDeptId() {return m_DeptId;
}
void Worker::setFunc(int id, string name, int did) {m_Id = id;m_Name = name;m_DeptId = did;
}

workerManager.cpp

#include"workerManager.h"
#include"employee.h"
#include"manager.h"
#include"boss.h"
WorkerManager::WorkerManager() {//初始化属性ifstream ifs;if (this->FileIsEmpty()){cout << "FILE is NOT Exist!!!" << endl << "ReLoading..." << endl;//初始化this->m_EmpNum = 0;this->m_EmpArray = NULL;//this->m_FileIsEmpty = 1;ifs.close();return;}//3.文件存在,存在记录数据           初始化this->m_EmpNum = this->get_EmpNum();  //获取职工人数,并更新员工人数this->m_EmpArray = new Worker * [this->m_EmpNum];    //创建数组指针 并初始化长度,开辟空间this->init_Emp();     //初始化数据,存到数组中cout << "Staff Number : " << this->m_EmpNum << endl;
}void WorkerManager::Show_Menu() {for (int i = 0; i < 10; i++) {if (0 == i || 9 == i)cout << "**********************" << endl;else if (i < 8 && i>0) {cout << "******" << i;if (1 == i)cout << "-Add\t";if (2 == i)cout << "-Show\t";if (3 == i)cout << "-Del\t";if (4 == i)cout << "-Modify\t";if (5 == i)cout << "-Search\t";if (6 == i)cout << "-Sort\t";if (7 == i)cout << "-Clean\t";cout << "******" << endl;}elsecout << "******" << i - 8 << "-Quit\t" << "******" << endl;}cout << "Please Input Your Choice:" << endl;
}void WorkerManager::ExitSys_0() {cout << "Bye Bye!" << endl;system("pause");exit(0);
}void WorkerManager::Add_Emp_1() {int addNum = 0;     //用户输入数量cout << "Please Input the number of Staff which you want to add : ";cin >> addNum;if (addNum > 0) {int id = -1;string name;int did = -1;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++){cout << "Please Input Num" << i + 1 << " Staff's ID:" << endl;while (1) {cin >> id;if (this->IdUnique(id))break;elsecout << "ID is Exist, Input Again!" << endl;}cout << "Please Input Num" << i + 1 << " Staff's Name:" << endl;cin >> name;cout << "Please Input Num" << i + 1 << " Staff's Post" << endl<< "(1.Empolyee ; 2.Manager ; 3.Boss)" << endl;cin >> did;Worker* worker = NULL;switch (did){case 1:worker = new Employee(id, name, did);case 2:worker = new Manager(id, name, did);case 3:worker = new Boss(id, name, did);default:break;}newSpace[this->m_EmpNum + i] = worker;  //根据原有的数据位置进行递增存储}delete[] this->m_EmpArray;      //释放 原有数组空间this->m_EmpArray = newSpace;    //更改 新空间指向this->m_EmpNum = newSize;       //更新 新职工人数//this->m_FileIsEmpty = 0;        //更新    有职工标识this->saveData();               //保存数据 在文件中cout << "Done,Adding " << addNum << " New Staff" << endl;}else{cout << "ERROE input" << endl;}system("pause");        //任意键回到上级目录system("cls");
}void WorkerManager::saveData() {ofstream ofs;ofs.open(FILENAME, ios::out); //输出打开 写文件for (int i = 0; i < this->m_EmpNum; i++) //每个人数据写入{ofs << this->m_EmpArray[i]->getId() << " "<< this->m_EmpArray[i]->getName() << " "<< this->m_EmpArray[i]->getDeptId() << endl;}ofs.close();
}int WorkerManager::get_EmpNum() {ifstream ifs;int EmpNum = 0;int id;string name;int did;ifs.open(FILENAME, ios::in);while (ifs >> id && ifs >> name && ifs >> did)EmpNum++;   //统计人数ifs.close();return EmpNum;
}void WorkerManager::init_Emp() {ifstream ifs;int index = 0;int id;string name;int did;ifs.open(FILENAME, ios::in);while (ifs >> id && ifs >> name && ifs >> did){Worker* worker = NULL;if (1 == did)worker = new Employee(id, name, did);else if (2 == did)worker = new Manager(id, name, did);else if (3 == did)worker = new Boss(id, name, did);elsecout << "ERROR init_Emp()" << endl;this->m_EmpArray[index++] = worker;}ifs.close();//this->init_Data();
}void WorkerManager::show_Emp_2() {if (this->FileIsEmpty()){cout << "FILE is NOT Exist!!!" << endl;}else {this->init_Emp();for (int i = 0; i < m_EmpNum; i++) {   //利用多态调用程序接口this->m_EmpArray[i]->showInfo();}}system("pause");system("cls");
}bool WorkerManager::FileIsEmpty() {ifstream ifs;char ch;ifs.open(FILENAME, ios::in);   //读文件ifs >> ch;       //文件为空时,文件尾会有一个字符,ch读出接收后再用eof()判断是否为空if ((!ifs.is_open()) || (ifs.eof())) {  //1.未找到文件txt        2.文件为空m_FileIsEmpty = 1;}elsem_FileIsEmpty = 0;ifs.close();return m_FileIsEmpty;
}void WorkerManager::Del_Emp_3() {if (this->FileIsEmpty())cout << "FILE is NOT Exist!!!" << endl;else {    //按职工编号删除int id = -1;cout << "Please Input DEL_Staff's ID :" << endl;cin >> id;int index = this->IsExist(id);if (-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->saveData();cout << "Done! Del_Dtaff which id is " << id << endl;}else {cout << "Staff is NOT Exist , Del_ERROR" << endl;}system("pause");system("cls");}
}int WorkerManager::IsExist(int id) {int index = -1;for (int i = 0; i < this->m_EmpNum; i++){if (id == this->m_EmpArray[i]->getId()) {index = i;break;}}return index;
}void WorkerManager::Mod_Emp_4() {if (this->FileIsEmpty())cout << "FILE is NOT Exist!!!" << endl;else {int id = -1;cout << "Please Input Mod_Staff's ID :" << endl;cin >> id;int index = this->IsExist(id);if (-1 != index) {   //存在 执行修改int mod_id;string mod_name;int mod_did;delete this->m_EmpArray[index];cout << "Find ID : " << id << endl;cout << "Please Input Staff's NewID:" << endl;cin >> mod_id;cout << "Please Input Staff's NewName:" << endl;cin >> mod_name;cout << "Please Input Staff's NewPost" << endl<< "(1.Empolyee ; 2.Manager ; 3.Boss)" << endl;cin >> mod_did;Worker* worker = NULL;switch (mod_did){case 1:worker = new Employee(mod_id, mod_name, mod_did);case 2:worker = new Manager(mod_id, mod_name, mod_did);case 3:worker = new Boss(mod_id, mod_name, mod_did);default:break;}this->m_EmpArray[index] = worker;this->saveData();cout << "Done! Modified Id : " << mod_id << endl;}else {cout << "Staff is NOT Exist , Mod_ERROR" << endl;}system("pause");system("cls");}
}void WorkerManager::Find_Emp_5() {if (this->FileIsEmpty())cout << "FILE is NOT Exist!!!" << endl;else {int select = -1;int id;bool flag = 0;    //查找标识 默认未找到0string name;cout << "Please Choice the way to search :" << endl<< "(1.ID Search)" << endl<< "(2.Name Search)" << endl;cin >> select;if (1 == select) {cout << "Please Input Searching ID:" << endl;cin >> id;int index = this->IsExist(id);if (-1 != index) {cout << "Find it! Data :" << endl;this->m_EmpArray[index]->showInfo(); //多态 纯虚函数,子类重写父类即可}else {cout << "Staff is NOT Exist , Search_ERROR" << endl;}}else if (2 == select) {cout << "Please Input Searching Name:" << endl;cin >> name;for (int i = 0; i < m_EmpNum; i++) {if (name == this->m_EmpArray[i]->getName()) {flag = 1;cout << "Find it! Data :" << endl;this->m_EmpArray[i]->showInfo(); //多态 纯虚函数,子类重写父类即可}}if (0 == flag)cout << "Staff is NOT Exist , Search_ERROR" << endl;}elsecout << "Choice ERROR!!!" << endl;}system("pause");system("cls");
}bool WorkerManager::IdUnique(int id) {if (this->FileIsEmpty())return 1;else {if (-1 == this->IsExist(id))return 1;elsereturn 0;}
}void WorkerManager::Sort_Emp_6() {if (this->FileIsEmpty())cout << "FILE is NOT Exist!!!" << endl;else {int select = -1;cout << "Please Choice the way to Sort :" << endl<< "(1.Ascend)" << endl<< "(2.Descend)" << endl;cin >> select;this->SelectSort(select);cout << "Done! Sorted!" << endl;this->show_Emp_2();}system("pause");system("cls");
}void WorkerManager::SelectSort(int select) {for (int i = 0; i < this->m_EmpNum; i++) {int minOrMax = i;for (int j = i + 1; j < this->m_EmpNum; j++) {if (1 == select) {  //升序if (this->m_EmpArray[minOrMax]->getId() > this->m_EmpArray[j]->getId())minOrMax = j;}else {         //降序if (this->m_EmpArray[minOrMax]->getId() < this->m_EmpArray[j]->getId())minOrMax = j;}}if (i != minOrMax) {Worker* temp = this->m_EmpArray[i];this->m_EmpArray[i] = this->m_EmpArray[minOrMax];this->m_EmpArray[minOrMax] = temp;}}this->saveData();
}void WorkerManager::init_Data() {//升序this->SelectSort(1);//顺序去重for (int i = 0; i < this->m_EmpNum; i++) {                     //每次循环判断m_Array[i]的值是否重复for (int j = i + 1; j < this->m_EmpNum;) {                 //暂时不给出循环条件,若出现重复数据,if (this->m_EmpArray[i] == this->m_EmpArray[j]) {              //判断某一个数据和后面的数据是否相同for (int m = j; m < this->m_EmpNum - 1; m++) {     //若相同,将后面的数据向前移动,覆盖前面的数据,则数组长度减小,即长度变为len - 1this->m_EmpArray[m] = this->m_EmpArray[m + 1];}(this->m_EmpNum)--;                                  //循环条件,数据长度减一}else {                                      //如果某一个数据与后面的数据不同,则这个数据与后面数据的后面一个数据比较是否相同j++;}}}this->saveData();
}void WorkerManager::Clea_Emp_7() {int select = -1;cout << "Please For sure to Clean :" << endl<< "(1.Yes)" << endl<< "(2.No)" << endl;cin >> select;if (1 == select){ofstream ofs(FILENAME, ios::trunc);        //删除文件后重新创建ofs.close();if (0 == this->FileIsEmpty()){      //删除堆区每个职工对象for (int i = 0; i < this->m_EmpNum; i++) {delete[] this->m_EmpArray;this->m_EmpArray = NULL;}}delete[] this->m_EmpArray;         //删除堆区数据指针this->m_EmpArray = NULL;this->m_EmpNum = 0;cout << "Done! Clean ALL!" << 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;}
}

WorkerStaff_sys.cpp

#include<iostream>
#include<string>
#include"workerManager.h"
#include"worker.h"
#include"employee.h"
#include"manager.h"
#include"boss.h"using namespace std;
/*职工三类(部门编号):普通职工,经理,老板职工编号,职工姓名,职工岗位,指责普通职工 :完成经理交付任务经理    :完成老板交付任务,并下发任务给员工老板职责 :管理公司所有事务1.退出管理程序2.添加职工信息  实现批量添加,支持信息录入文件,(编号,姓名,部门编号)3.显示职工信息4.删除离职职工 按编号5.修改职工信息 按编号6.查找职工信息 按编号 或 姓名7.按照编号排序 升序 降序8.清空所有文档 (再确认功能)*/int main() {WorkerManager wm;       //实例化对象while (1) {int select = -1;wm.Show_Menu();         //展示菜单cin >> select;switch (select){case 0: //Quitwm.ExitSys_0();break;case 1: //Addwm.Add_Emp_1();break;case 2: //Showwm.show_Emp_2();break;case 3: //Delwm.Del_Emp_3();break;case 4: //Modifywm.Mod_Emp_4();break;case 5: //Searchwm.Find_Emp_5();break;case 6: //Sortwm.Sort_Emp_6();break;case 7: //cleanwm.Clea_Emp_7();break;default:system("cls");break;}}system("pause");return 0;
}

C++ 基于多态的职工管理系统_黑马相关推荐

  1. C++项目实战:基于多态的职工管理系统(源码)

    职工管理系统 1.管理系统需求 职工管理系统可以用来管理公司内所有员工的信息 本教程主要利用C++来实现一个基于多态的职工管理系统 公司中职工分为三类:普通员工.经理.老板,显示信息时,需要显示职工编 ...

  2. C++基于多态的职工管理系统,通过文件管理数据。

    基于多态的职工管理系统 职工类 共同属性 共同方法 员工类 经理类 老板类 系统数据 头文件 写文件 读文件 系统功能 初始化信息 显示/退出系统 显示系统 退出系统 添加职工 显示职工 删除职工 修 ...

  3. C++ 46.基于多态的职工管理系统(2)——创建职工类(创建职工抽象类、创建普通员工类、创建经理类、创建老板类)

    创建职工类 1. 创建职工抽象类 职工的分类为:普通员工.经理.老板 将三种职工抽象到一个类(worker)中,利用多态管理不同职工种类 职工的属性为:职工编号.职工姓名.职工所在部门编号 职工的行为 ...

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

    一.管理系统需求 职工管理系统可以用来管理公司内所有员工信息,设计一个关于多态的职工管理系统 公司中职工分三类,普通员工,经理,老板. 显示信息时,需要显示职工编号,职工姓名,职工岗位,以及职责 普通 ...

  5. 黑马程序员C++实战(二)——基于多态的职工管理系统完整代码

    本文转载自:https://github.com/AnkerLeng/Cpp-0-1-Resource.git 视频见:https://www.bilibili.com/video/av4155972 ...

  6. c++进阶项目—基于多态的职工管理系统

    一.管理系统需求 公司中职工分为三类:普通员工.经理.老板 显示信息时,需要显示职工编号.职工姓名.职工岗位.以及职责 1.普通员工职责:完成经理交给的任务 2.经理职责:完成老板交给的任务,并下发任 ...

  7. C++进阶实战——基于多态的职工管理系统

    相关文章链接: C++基础实战--通讯录管理系统 一.头文件 1.workerManager.h #pragma once //防止头文件重复包含 #include <iostream> ...

  8. 0x0041C580 处(位于 基于多态的职工管理系统.exe 中)引发的异常: 0xC0000005: 读取位置 0x00000024 时发生访问冲突。的解决方案

    我是看着黑马程序员的视频中制作员工管理系统写出的代码,在中间出现的一些问题. 其实这是我个人的疏忽,出现的问题和解决办法如下: 出现的问题:代码问题 void workManager::addEmp( ...

  9. C++ 54.基于多态的职工管理系统(10)——按照职工编号进行排序功能实现

    功能描述:按照职工编号进行排序,排序的顺序由用户指定 1.排序函数声明 在workerManager.h中添加成员函数 //按照职工编号进行排序void Sort_Emp(); 2.排序函数实现 在w ...

最新文章

  1. 入门深度学习的必备数学知识
  2. juggle dsl语法介绍及codegen浅析
  3. nginx反向代理编译异常
  4. 关于myeclipise注册机run.bat运行失败的解决方法
  5. Android学习笔记07---查看Android虚拟机输出的错误信息与如何部署应用到自己的真实手机
  6. 单肩包属于什么类目_Lazada时尚类目成为优势类目?
  7. Stable Diffusion半秒出图;VLIW的前世今生;YOLOv5全面解析教程 | AI系统前沿动态
  8. 废柴日记之国庆特辑:那些年我们一直分不清楚的近义词们②
  9. 华硕主板前置音频设置
  10. freenom 加 cloudflare免费域名申请
  11. 没有产权证的车库能不能随时拆掉
  12. 解决Nokia PC SUITE无法识别DELL E6400 WIDCOMM bluetooth的问题
  13. 浅析RTB和RTA(一)
  14. MMS流媒体下载原理
  15. 画了张图,总结了机房里AAU、RRU以及各模块之间的走线关系和线束规格类型
  16. MATALB-结构体
  17. 动态规划算法练习:蓝桥杯,洛谷的传纸条游戏的三种解法
  18. 数据结构:10大经典排序
  19. JavaScript防抖与节流的具体实现及使用场景
  20. Unity商店下载的文件保存路径?

热门文章

  1. ByShell 一个穿越主动防御的木马
  2. Python 抽取剔除视频帧工具
  3. 曾国藩:人没格局,比没钱更可怕
  4. oracle文件存储方式,oracle文件存储介质介绍
  5. MyBatis缓存和二级缓存整合Redis
  6. MySQL中的索引、视图和DBA操作
  7. Hauppauge WinTV-HVR1700电视卡调试报告
  8. 网页设计有什么标准?细说网页设计的6大规范
  9. RIA两大阵营大比拼-Adobe vs. Microsoft - 城市胡同
  10. 【uni-app基础教程】