相关文章链接:

C++基础实战——通讯录管理系统

一、头文件

1、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 WorkerManager
{
public:WorkerManager(); //构造函数void Show_Menu();//展示菜单void ExisSystem();//退出系统int m_EmpNum;//记录职工人数Worker** m_EmpArray;//职工数组指针void Add_Emp();//添加职工void save();//保存文件bool m_FileIsEmpty;//判断文件是否为空  标志void init_Emp();//初始化员工int get_EmpNum();//统计文件中人数void Show_Emp();//显示职工void Del_Emp();//删除职工int IsExist(int id);//判断职工是否存在,如果存在返回职工所在数组中的位置,不存在返回-1void Mod_Emp();  //修改职工信息void Find_Emp();//查找职工函数void Sort_Emp();//按照编号排序void Clean_File();//清空文件~WorkerManager();//析构函数
};

2、worker.h

#pragma once
#include <iostream>
using namespace std;
#include<string>//职工抽象类
class Worker
{
public:virtual void showInfo() = 0;//显示个人信息virtual string getDeptName() = 0;//获取岗位名称int m_Id;//职工编号string m_Name;//职工姓名int m_DeptId;//部门编号
};

3、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() ;//获取岗位名称
};

4、manager.h

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

5、boos.h

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

二、源文件

1、职工管理系统.cpp

#include <iostream>
using namespace std;
#include "workManager.h"#include"worker.h"
#include"employee.h"
#include"manager.h"
#include"boss.h"int main()
{测试代码//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;//实例化管理者对象WorkerManager wm;int choice = 0;//用来存储用户的选项while (true){//调用展示菜单成员函数wm.Show_Menu();cout << "请输入您的选择" << endl;cin >> choice;//接收用户的选项switch (choice){case 0 : //退出系统wm.ExisSystem();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:system("cls");    //清屏操作break;}}system("pause");return 0;
}

2、WorkerManager.cpp

#include "workManager.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 < this->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::ExisSystem()
{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;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 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");}//删除职工
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");
}//判断职工是否存在,如果存在返回职工所在数组中的位置,不存在返回-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::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 (this->m_EmpArray[i]->m_Name == name){cout << "查找成功,职工编号为" << this->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 < this->m_EmpNum; j++){if (select == 1)//升序{if (this->m_EmpArray[minOrMax]->m_Id > this->m_EmpArray[j]->m_Id){minOrMax = j;}}else//降序{if (this->m_EmpArray[minOrMax]->m_Id < this->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();//展示所有的职工system("pause");system("cls");
}//清空文件
void WorkerManager::Clean_File()
{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_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 != NULL){delete this->m_EmpArray[i];}}delete[] this->m_EmpArray;this->m_EmpArray = NULL;}
}

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

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

5、boos.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("总裁");
}

C++进阶实战——基于多态的职工管理系统相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. C++ 基于多态的职工管理系统_黑马

    任务: 职工三类(部门编号):普通职工,经理,老板 职工编号,职工姓名,职工岗位,指责 普通职工 :完成经理交付任务 经理 :完成老板交付任务,并下发任务给员工 老板职责 :管理公司所有事务 1.退出 ...

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

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

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

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

最新文章

  1. python 递归结束条件_python递归(如果条件满足,为什么程序不退出一次?)
  2. canvas入门-1三种填充方式、渐变、模式
  3. Eclipse 常用快捷键-java
  4. JVM优化原理—Java架构师必须要知晓的知识
  5. httpurlconnect设置中文参数_CNC机床参数的设置及报警解除,赶紧收藏吧!
  6. Java-迭代器(新手)
  7. Vue导出office模板文件(xdoc在Vue中的使用)
  8. 数据库MySQL与可视化界面 SQLYog 安装教程
  9. 一种标准地图服务转矢量Shapefile方法
  10. python面试资格确认_python面试(语法)
  11. 快速学习Ant Design-简介
  12. 企业微信企业邮箱设置,微信企业邮箱如何设置?
  13. java得到几天前的日期
  14. 分布式消息队列RocketMQ(一)安装与启动
  15. tf.nn.dynamic_rnn返回值详解
  16. 【Aladdin Unity3D Shader编程】之四 贴图纹理
  17. 前端面试必读,助力秋招!
  18. Mixly 触摸开关的使用
  19. WebAPP添加到iOS的桌面
  20. 2022年最新江苏建筑特种工(施工升降机)模拟题库及答案

热门文章

  1. armeabi-v7a armeabi arm64-v8a 有何区别 ,英雄不问出处
  2. 有什么音频软件可进行定时录音
  3. 关于Android单元测试
  4. 15个受用一生的学习习惯
  5. web前端(2):了解CSS和常见的属性(常用选择器+盒子模型+浮动和定位)
  6. 计算机无法安装windows系统还原,windows一键还原,详细教您电脑怎么一键还原
  7. 某办公房间空调环境下的温度场、速度场和PMV的SolidWorks模拟分析
  8. 数学分析第一课(数学分析和微积分的桥梁)
  9. 虚拟机影响网络驱动使用
  10. 如何在微网站上设置在线客服QQ