【C++ 核心编程】实践篇:基于多态的职工管理系统-代码可直接运行!

目录

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 创建经理类

6.4 创建老板类

6.5 测试多态

7 添加职工

7.1 功能分析

7.2 功能实现

7.3 测试添加

8 文件交互 - 写文件

8.1 设定文件路径

8.2 成员函数声明

8.3 保存文件功能实现

8.4 保存文件功能测试

9 文件交互 - 读文件

9.1 文件未创建

9.2 文件存在且数据为空

9.3 文件存在且保存职工数据

9.3.1 获取记录的职工人数

9.3.2 初始化数组

10 显示职工

 10.1 显示职工函数声明

10.2 显示职工函数实现

10.3 测试显示职工

11 删除职工

11.1 删除职工函数声明

11.2 职工是否存在函数声明

11.3 职工是否存在函数实现

11.4 删除职工函数实现

11.5 测试删除职工

12 修改职工

12.1 修改职工函数声明

12.2 修改职工函数实现

12.3 测试修改职工

13 查找职工

13.1 查找职工函数声明

13.2 查找职工函数实现

13.3 测试查找职工

14 排序

14.1 排序函数声明

14.2 排序函数实现

14.3 测试排序功能

5 清空文件

15.1 清空函数声明

15.3 测试清空文件

完整代码-可直接使用!

⚪架构说明

⚪boss.h

⚪employee.h

⚪manager.h

⚪worker.h

⚪workerManager.h

♥boss.cpp

♥employee.cpp(这里项目敲错为emplyee...qvq)

♥manager.cpp

♥workerManager.cpp

♥职工管理系统.cpp  -核心!


1 管理系统需求

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

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

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

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

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

需根据用户不同的选择,完成不同的功能!

2 创建项目

  • VS2019
  • 新建项目-C++空项目-命名:基于多态的职工管理系统;项目路径;创建。
  • 源文件右键-添加-新建项-C++文件(.cpp)-命名:职工管理系统.cpp;添加。
  • 完成

 3 创建管理类

管理类负责的内容如下:

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

3.1创建文件 

在头文件和源文件的文件夹下分别创建workerManager.h 和 workerManager.cpp文件

  • 头文件-添加-新建项-头文件(.h)-命名:workerManager.h
  • 源文件-添加-新建项-C++文件(.cpp)-命名:workerManager.cpp

3.2 头文件实现

在workerManager.h中设计管理类

#pragma once //防止头文件重复包含
#include <iostream> //包含输入输出流的头文件
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();`

#pragma once //防止头文件重复包含
#include <iostream> //包含输入输出流的头文件
using namespace std; //使用标准命名空间

//创建类
class WorkerManager
{
public:
	//构造函数
	WorkerManager();

	//展示菜单-仅声明-到.cpp文件继续编写
	void Show_Menu();
	//析构函数
	~WorkerManager();

};

4.2 菜单功能实现

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

#include "workerManager.h"

WorkerManager::WorkerManager()
{
	
}

//展示菜单-仅声明-加上作用域!
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;
}
//
WorkerManager::~WorkerManager()
{

}

4.3 测试菜单功能

在职工管理系统.cpp中测试菜单功能

#include <iostream>
using namespace std;
#include "workerManager.h"

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 exist_System();

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

//退出系统
void WorkerManager::exist_System()
{
	cout << "欢迎下次使用!" << endl;
	system("pause");
	exit(0);
}

5.3测试功能

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

6 创建职工类

6.1 创建职工抽象类

职工的分类为:普通员工、经理、老板

将三种职工抽象到一个类(worker)中,利用多态管理不同职工种类。

  • 职工的属性为:职工编号、职工姓名、职工所在部门编号
  • 职工的行为为:岗位职责信息描述,获取岗位名称

头文件-创建文件worker.h  文件并且添加如下代码:

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

6.2 创建普通员工类

普通员工类继承职工抽象类,并重写父类中纯虚函数

在头文件和源文件的文件夹下分别创建employee.h 和 employee.cpp文件

employee.h中代码如下:

#include "worker.h"
class Employee: public Worker
{
public:
	//构造函数-初始化属性
	Employee(int id, string name, int dId);
	//显示个人信息
	virtual void showInfo();
	//获取岗位名称
	virtual string getDeptName();
};

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

6.3 创建经理类

经理类继承职工抽象类,并重写父类中纯虚函数,和普通员工类似

在头文件和源文件的文件夹下分别创建manager.h 和 manager.cpp文件

manager.h中代码如下:

#pragma once
#include<iostream>
using namespace std;
#include<string>
#include "worker.h"

// Manager继承父类Worker
// 继承用:一个冒号!!!!
class  Manager : public Worker
{
public:
	//构造函数-初始化属性
	Manager(int id, string name, int dId);
	//显示个人信息
	virtual void showInfo();
	//获取岗位名称
	virtual string getDeptName();
};

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

6.4 创建老板类

老板类继承职工抽象类,并重写父类中纯虚函数,和普通员工类似

在头文件和源文件的文件夹下分别创建boss.h 和 boss.cpp文件

boss.h中代码如下:

#pragma once
#include<iostream>
using namespace std;
#include<string>
#include "worker.h"

// Boss继承父类Worker
// 继承用:一个冒号!!!!
class  Boss : public Worker
{
public:
	//构造函数-初始化属性
	Boss(int id, string name, int dId);
	//显示个人信息
	virtual void showInfo();
	//获取岗位名称
	virtual string getDeptName();
};

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

6.5 测试多态

在职工管理系统.cpp中添加测试函数,并且运行能够产生多态

测试代码如下:

#include <iostream>
using namespace std;
#include "workerManager.h"
#include "worker.h"
#include "employee.h"
#include "boss.h"
#include "manager.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;

	system("pause");
	return 0;
}

测试成功后,测试代码可以注释保留,或者选择删除。

7 添加职工

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

7.1 功能分析

分析:

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

父类指针指向子类,

7.2 功能实现

在WokerManager.h头文件中添加成员属性代码

//两个属性
//记录职工人数
int m_EmpNum;
//职工数组指针 要引用worker.h
Worker** m_EmpArray;

//添加职工-申明
void Add_Emp();

 在WorkerManager构造函数中初始化属性

WorkerManager::WorkerManager()
{
	//初始化人数
	this->m_EmpNum = 0;

	//初始化数组指针
	this->m_EmpArray = NULL;
}

在workerManager.h中添加成员函数

//增加职工
void Add_Emp();

workerManager.cpp中实现该函数

//增加职工
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 nam
【员工管理系统】 问题描述:每个员工的信息包括:编号、姓名、性别、出生年月、学历、职务、电话、住址等。系统能够完成员工信息的查询、更新、插入、删除、排序等功能。 基本要求:排序:按不同关键字,对所有员工的信息进行排序;查询:按特定条件查找员工;更新,按编号对某个员工的某项信息进行修改;插入,加入新员工的信息;删除,按编号删除已离职的员工的信息。 选作内容:实现图形用户界面。 通过链表实现 数据结构: #include #include #include #include #include using namespace std; typedef struct workers{ char name[15];//姓名 char department[18];//单位 char gender;//性别 unsigned int age;//年龄 unsigned long long telephone;//电话 unsigned long wage;//工资 unsigned long num;//职工号 struct workers *next; }*Linklist,Lnode; void frist_print() { printf("\t\t⊙▽⊙ ⊙▽⊙ ⊙▽⊙ ⊙▽⊙ ⊙▽⊙ ⊙▽⊙ \n\n"); printf("\t\t\t欢迎进入员工管理系统\n"); } void menu() { printf("\n\t\t^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"); printf("\t\t \t ◎1.创建员工信息\t \n"); printf("\t\t \t ◎2.插入员工信息\t \n"); printf("\t\t \t ◎3.修改员工信息\t \n"); printf("\t\t \t ◎4.删除员工信息\t \n"); printf("\t\t \t ◎5.查询员工信息\t \n"); printf("\t\t \t ◎6.员工信息排序\t \n"); printf("\t\t \t ◎7.显示员工信息\t \n"); printf("\t\t \t ◎8.员工工资情况\t \n"); printf("\n\t\t^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n"); printf("注意:输入均以回车作为结束\n"); printf("please choise 1--8:\t "); //putchar(12); } void Inset(Linklist Head){ Linklist s,L; unsigned int agee; unsigned long wagee,numm;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MengYa_DreamZ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值