练习 ~黑马程序员匠心之作-第四阶段实战-基于多态的企业职工系统-P147~P154-职工管理系统

黑马程序员匠心之作|C++教程从0到1入门编程

关于P147~P154-练习-职工管理系统

  • 1、管理系统需求
  • 2、创建项目
  • 3、创建职工管理类
    • 3.1 创建文件
    • 3.2 头文件实现
    • 3.3 源文件实现
  • 4、菜单功能实现
    • 4.1 添加成员函数
    • 4.2 菜单功能实现
    • 4.3 测试菜单功能
  • 5、退出系统功能实现
    • 5.1 提供功能接口
    • 5.2 实现退出功能
    • 5.3 退出功能测试
  • 6、职工抽象类和普通员工类实现
    • 6.1 创建职工抽象类
    • 6.2 创建普通员工类
    • 6.3 测试
  • 7、经理类和老板类实现
    • 7.1 创建经理类
    • 7.2 创建老板类
    • 7.3 测试
  • 8、添加职工功能实现
    • 8.1 功能分析
    • 8.2 添加功能实现
    • 8.3 添加功能测试

1、管理系统需求

职工管理系统可以用来管理公司内所有员工的信息
主要利用C++来实现一个基于多态的职工管理系统

公司中职工分为三类:普通员工、经理、老板
显示信息时,需要显示:职工编号、职工姓名、职工岗位、以及职责

普通员工职责:完成经理交给的任务
经理职责:完成老板交给的任务,并下发任务给员工
老板职责:管理公司所有事务

管理系统中需要实现的功能如下:

  • 退出管理程序:退出当前管理系统
  • 增加职工信息:实现批量添加职工功能,将信息录入到文件中,职工信息为:职工编号、姓名、部门编号
  • 显示职工信息:显示公司内部所有职工的信息
  • 删除离职职工:按照编号删除指定的职工
  • 修改职工信息:按照编号修改职工个人信息
  • 查找职工信息:按照职工的编号或者职工的姓名进行查找相关的人员信息
  • 按照编号排序:按照职工编号,进行排序,排序规则由用户指定
  • 清空所有文档:清空文件中记录的所有职工信息(清空前需要再次确认,防止误删)

2、创建项目

参考通讯录管理系统-2创建项目

3、创建职工管理类

管理类负责内容如下:

  • 与用户的沟通菜单界面
  • 对职工增删改查操作
  • 与文件的读写交互

3.1 创建文件

在头文件的文件夹下创建workerManager.h文件
在源文件的文件夹下创建workerManager.cpp文件
在这里插入图片描述

3.2 头文件实现

在workerManager.h中设计管理类

#pragma once//防止头文件重复包含
#include//包含输入输出流头文件
using namespace std;//使用标准命名空间class WorkerManager
{
public://构造函数WorkerManager();//析构函数~WorkerManager();
};

3.3 源文件实现

在workerManager.cpp中将构造和析构函数空实现补全

#include"workerManager.h"WorkerManager::WorkerManager()
{}
WorkerManager::~WorkerManager()
{}

至此,职工管理类创建完成

4、菜单功能实现

功能描述:与用户的沟通界面

4.1 添加成员函数

在管理类workerManager.h中添加成员函数void show_Menu();

//展示菜单void Show_Menu();

4.2 菜单功能实现

在管理类workerManager.cpp中实现show_Menu();函数

//展示菜单
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;
}

4.3 测试菜单功能

在职工管理系统.cpp中

#include
#include"workerManager.h"//包含自定义头文件
using namespace std;int main()
{//实例化管理者对象WorkerManager wm;//调用展示菜单成员函数wm.Show_Menu();system("pause");return 0;
}

在这里插入图片描述

5、退出系统功能实现

5.1 提供功能接口

在main函数中提供分支选择,提供每个功能接口

int main()
{//实例化管理者对象WorkerManager wm;int choice = 0;//用来存储用户的选项while (true){//调用展示菜单成员函数wm.Show_Menu();cout << "请输入您的选择:" << endl;cin >> choice;//接收用户的选项switch (choice){case 0://退出管理程序break;case 1://增加职工信息break;case 2://显示职工信息break;case 3://删除离职职工break;case 4://修改职工信息break;case 5://查找职工信息break;case 6://按照编号排序break;case 7://清空所有文档break;default: system("cls");//清屏break;}}system("pause");return 0;
}

5.2 实现退出功能

在workerManager.h中提供退出系统的成员函数void ExitSystem();

//退出管理程序void ExitSystem();

在workerManager.cpp中提供具体的功能实现

//退出管理程序
void WorkerManager::ExitSystem()
{cout << "欢迎下次使用!" << endl;system("pause");exit(0);//无论在那段代码,调用该函数都会退出
}

5.3 退出功能测试

在main函数分支0选项中,调用退出程序的接口

case 0://退出管理程序wm.ExitSystem();break;

在这里插入图片描述

6、职工抽象类和普通员工类实现

6.1 创建职工抽象类

职工的分类为:普通员工、经理、老板
将三种职工抽象到一个类(worker)中,利用多态管理不同职工种类
职工的属性为:职工编号、职工姓名、职工所在部门编号
职工的行为为:岗位职责信息描述,获取岗位名称

在头文件文件夹下,创建文件worker.h文件,并添加以下代码:

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

6.2 创建普通员工类

普通员工类继承职工抽象类,并重写父类中纯虚函数
在头文件和源文件的文件夹下分别创建employee.h和employee.cpp文件
在头文件文件夹下创建employee.h文件

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

在源文件文件夹下创建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("普通员工");
}
//析构函数
Employee::~Employee()
{}

6.3 测试

在职工管理系统.cpp前面加入文件包含

#include"worker.h"
#include"employee.h"

在main函数中测试(暂时将后面while部分注释掉)

//测试代码Worker *worker = NULL;worker = new Employee(1, "张三", 2);worker->showInfo();

在这里插入图片描述

7、经理类和老板类实现

7.1 创建经理类

经理类继承职工抽象类,并重写父类中纯虚函数,和普通员工类似
在头文件和源文件的文件夹下分别创建manager.h和manager.cpp文件
在头文件文件夹下创建manager.h文件

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

在源文件文件夹下创建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("经理");
}
//析构函数
Manager::~Manager()
{}

7.2 创建老板类

经理类继承职工抽象类,并重写父类中纯虚函数,和普通员工类似
在头文件和源文件的文件夹下分别创建boss.h和boss.cpp文件
在头文件文件夹下创建boss.h文件

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

在源文件文件夹下创建boss.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("总裁");}
//析构函数Boss::~Boss(){}

7.3 测试

在职工管理系统.cpp前面加入文件包含

#include"manager.h"
#include"boss.h"

在main函数中测试(暂时将后面while部分注释掉)

//测试代码//测试代码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;

在这里插入图片描述
注意:记得将测试代码注释掉,然后将while中内容还原,再进行下面操作

8、添加职工功能实现

功能描述:批量添加职工,并且保存到文件中

8.1 功能分析

分析:
用户在批量创建时,可能会创建不同种类的职工

如果想将所有不同种类的员工都放入倒一个数组中,可以将所有员工的指针维护到一个数组里如果想在程序中维护这个不定长度的数组,可以将数组创建到堆区,并利用Worker **的指针维护

worker**是一个二级指针,用来指向指针的指针,语法:数据类型 ** 变量名
在这里插入图片描述

8.2 添加功能实现

在workerManager.h头文件中添加成员属性

#include"worker.h"//开头//在class中
//记录文件中的人数个数int m_EmpNum;//员工数组的指针Worker ** m_EmpArray;

在workerManager.cpp源文件构造函数中初始化属性

//构造函数
WorkerManager::WorkerManager()
{//初始化属性//初始化人数this->m_EmpNum = 0;//初始化数组的指针this->m_EmpArray = NULL;
}

在workerManager.h头文件中添加成员函数

//增加职工
void Add_Emp();

在workerManager.cpp源文件中实现成员函数

//在开头加上文件包含
#include"worker.h"
#include"employee.h"
#include"manager.h"
#include"boss.h"//增加职工
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;im_EmpNum;i++){ newSpace[i] = this->m_EmpArray[i];}}//批量添加新数据for (int i = 0;i < addNum;i++){int id;//职工编号string name;//职工姓名int dSelest;//职工所在部门名称编号cout << "请输入第" << i + 1 << "个新职工的职工编号: " << endl;cin >> id;cout << "请输入第" << i + 1 << "个新职工的职工姓名: " << endl;cin >> name;cout << "请选择该职工岗位:" << endl;cout << "1、普通职工" << endl;cout << "2、经理" << endl;cout << "3、老板" << endl;cin >> dSelest;Worker *worker = NULL;switch (dSelest){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;//成功添加后 保存到文件中//提示添加成功cout << "成功添加" << addNum << "名新职工" << endl;}else{cout <<"您输入的数据有误!" << endl;}//按任意键后 清屏回到上级目录system("pause");system("cls");
}

8.3 添加功能测试

在main函数分支1选项中,调用添加功能的接口

case 1://增加职工信息wm.Add_Emp();break;

在这里插入图片描述
按任意键后清屏,回到源目录
注意:当前输入的数据下次再运行不会存在,所以需要引进文件交互部分,使得成功添加后,保存到文件中。


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部