C++多态实现职工管理系统

时间:2024-01-20 21:43:25

一.需求

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

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

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

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

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

二.创建基础平台

1.平台实现

利用switch......case语句实现平台搭建:

void main() {

	Workermanger wm;
	int choice = 0;
	while (true) {
		wm.show_menu();
		cout << "请输入你的选择:" << endl;
		cin >> choice;
		int num, dex;
		switch (choice) {
		case 1:
			wm.Exitsystem();//退出系统
			break;
		case 2:
			wm.add_eme();   //添加职工
			break;
		case 3:
			wm.show_emp();//显示职工
			break;
		case 4:
			wm.del_emp();//删除职工
			break;
		case 5:
			wm.modemp();//修改职工
			break;
		case 6:
			wm.findemp();//查找职工
			break;
		case 7:
			wm.sortemp();//排序职工
			break;
		case 8:
			wm.clean_file();//清空文档
			break;
		default:
			system("clc");
			break;
		}
	}


}

2.管理类

定义一个管理类:

#pragma once
#include <iostream>
#include <fstream>
#include "worker.h"
#define filename "emefile.txt"
using namespace std;

class Workermanger {
public:
	//构造函数
	Workermanger();
	//析构函数
	~Workermanger();

	
	void show_menu();          //显示菜单
	void Exitsystem();	       //退出系统
	void add_eme();            //添加职工
	void save();               //保存文件
	int get_empnum();          //统计文件中的职工人数
	void init_emp();           //文档不为空,初始化动态数组
	void show_emp();           //显示职工信息
	void del_emp();            //删除职工
	int isexit(int id);              //判断职工是否存在数组之中
	void modemp();            //修改职工
	void findemp();           //查找职工信息
	void sortemp();           //职工编号排序
	void clean_file();        //清空文档



	//成员属性
	int m_emenum;  //记录职员总数
	Worker** m_emearry;   //职工数组指针
	bool m_fileisempty;   //文件空标志
};

三.添加.h头文件

1.基类头文件

基类worker.h文件:

//抽象职工文件
#pragma once
#include <iostream>
#include <string>
using namespace std;

class Worker {
public:

	//成员函数
	virtual void showinfo() = 0;      //显示职工信息
	virtual string get_depart() = 0;    //获取部门信息

	//成员属性
	int m_id;           //职工编号
	string m_name;      //职工姓名
	int m_departid;     //部门编号

};

2.员工类1——普通职员

employee.h头文件:

//普通员工文件
#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 get_depart() ;    //获取部门信息
};

3.员工类2——经理

manger.h头文件:

//经理文件
#pragma once
#include <iostream>
#include "worker.h"
using namespace std;

class Manger :public Worker {
public:
	//成员函数
	Manger(int id, string name, int did);
	virtual void showinfo();      //显示职工信息
	virtual string get_depart();    //获取部门信息
};

4.员工类3——老板

boss.h头文件:

//老板文件
#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 get_depart();    //获取部门信息
};

四.实现成员函数

1.多态——普通职员

employee.cpp源文件:

#include "employee.h"

Employee::Employee(int id,string name,int did) {
	this->m_id = id;
	this->m_name = name;
	this->m_departid = did;
}

//显示职工信息
void Employee::showinfo() {
	cout << "职工编号:" << this->m_id << "\t职工姓名:" << this->m_name << "\t职工岗位:" << this->get_depart()
		<< "\t岗位职责:完成经理交给的任务" << endl;
}

//获取部门信息
string Employee::get_depart() {
	return string("员工");
}

2.多态——经理

manger.cpp源文件:

#include "manger.h"

Manger::Manger(int id, string name, int did) {
	this->m_id = id;
	this->m_name = name;
	this->m_departid = did;
}

//显示职工信息
void Manger::showinfo() {
	cout << "职工编号:" << this->m_id << "\t职工姓名:" << this->m_name << "\t职工岗位:" << this->get_depart()
		<< "\t岗位职责:完成老板交给的任务,并且下发任务给普通员工" << endl;
}

//获取部门信息
string Manger::get_depart() {
	return string("经理");
}

3.多态——老板

boss.cpp源文件:

#include "boss.h"

Boss::Boss(int id, string name, int did) {
	this->m_id = id;
	this->m_name = name;
	this->m_departid = did;
}

//显示职工信息
void Boss::showinfo() {
	cout << "职工编号:" << this->m_id << "\t职工姓名:" << this->m_name << "\t职工岗位:" << this->get_depart()
		<< "\t岗位职责:管理公司所有事物" << endl;
}

//获取部门信息
string Boss::get_depart() {
	return string("老板");
}

4.管理类

管理类成员函数封装:

#include "workermanger.h"
#include "employee.h"
#include "manger.h"
#include "boss.h"

Workermanger::Workermanger() {
	
	ifstream ifs;
	ifs.open(filename, ios::in);
	//1.文件不存在
	if (!ifs.is_open()) {
		cout << "文件不存在" << endl;
		//初始化空数组
		this->m_emenum = 0;
		this->m_emearry = NULL;
		this->m_fileisempty = true;
		ifs.close();
	}

	//2.文件存在但为空
	char ch;
	ifs >> ch;
	if (ifs.eof()) 
	{
		cout << "文件为空" << endl;
		//初始化空数组
		this->m_fileisempty =true;
		this->m_emenum = 0;
		this->m_emearry = NULL;
		
		ifs.close();
	}

	//3.文件存在且不为空
	int num = this->get_empnum();
	//cout << "文档中职工人数为:" << endl;
	this->m_emenum = num;
	this->m_fileisempty = false;
	this->m_emearry = new Worker * [this->m_emenum];
	this->init_emp();
}

Workermanger::~Workermanger() {
	if (this->m_emearry != NULL) {
		delete[] this->m_emearry;
		this->m_emearry = NULL;
	}
}

//显示菜单
void Workermanger::show_menu() {
	cout << "********************************************" << endl;
	cout << "*********  欢迎使用职工管理系统! **********" << endl;
	cout << "*************  1.退出管理程序  *************" << endl;
	cout << "*************  2.增加职工信息  *************" << endl;
	cout << "*************  3.显示职工信息  *************" << endl;
	cout << "*************  4.删除离职职工  *************" << endl;
	cout << "*************  5.修改职工信息  *************" << endl;
	cout << "*************  6.查找职工信息  *************" << endl;
	cout << "*************  7.按照编号排序  *************" << endl;
	cout << "*************  8.清空所有文档  *************" << endl;
	cout << "********************************************" << endl;
	cout << endl;
}

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

//增加职工
void Workermanger::add_eme() 
{
	cout << "请输入增加职工的数量:" << endl;
	int addnum=0;
	cin >> addnum;
	if (addnum > 0) 
	{
		//添加
		int newsize = this->m_emenum + addnum;
		Worker ** newspace = new Worker* [newsize];

		//如果原来有数据,进行拷贝
		if (this->m_emearry != NULL) 
		{
			for (int i = 0; i < this->m_emenum; i++) 
			{
				newspace[i] = this->m_emearry[i];
			}
		}

		//开始批量添加
		for (int i = 0; i < addnum; i++)
		{
			int id;
			string name;
			int departnum;

			cout << "请输入第" << i + 1 << "个新职工的编号:" << endl;
			cin >> id;
			cout << "请输入第" << i + 1 << "个新职工的姓名:" << endl;
			cin >> name;
			
			cout << "请选择该职工的部门分类:" << endl;
			cout << "1:普通员工" << endl;
			cout << "2:经理" << endl;
			cout << "3:老板" << endl;
			cin >> departnum;

			Worker* worker = NULL;
			switch (departnum) {
			case 1:worker = new Employee(id,name, 1); break;
			case 2:worker = new Manger(id, name, 2); break;
			case 3:worker = new Boss(id, name, 3); break;				
			}

			newspace[this->m_emenum + i] = worker;   //将创建的职工对象存入数组
		}
		delete[] this->m_emearry;           //释放原来的数组空间
		this->m_emearry = newspace;         //更新空间指向
		this->m_emenum = newsize;           //更新数组长度
		this->m_fileisempty = false;        //文件空标志

		this->save();
		cout << "成功添加了" << addnum << "名新职工" << endl;
	}
	else
		cout << "数据输入有误" << endl;
	system("cls");
}

//保存文件
void Workermanger::save() {
	ofstream ofs;
	ofs.open(filename, ios::out);      //写文件
	for (int i = 0; i < this->m_emenum; i++) {
		ofs << this->m_emearry[i]->m_id << "	"
			<< this->m_emearry[i]->m_name << "		"
			<< this->m_emearry[i]->m_departid << endl;
	}
	ofs.close();
}

//统计文件中的职工人数
int Workermanger::get_empnum() {
	ifstream ifs;
	ifs.open(filename, ios::in);

	int id,did,num=0;
	string name;
	while (ifs >> id && ifs >> name && ifs >> did)
		num++;

	return num;
}
//文档不为空,初始化动态数组
void  Workermanger::init_emp() {
	ifstream ifs;
	ifs.open(filename, ios::in);

	int id, did,index=0;
	string name;

	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 Manger(id, name, did);
		else if (did == 3)
			worker = new Boss(id, name, did);
		this->m_emearry[index] = worker;
		index++;
	}

	ifs.close();
}

//显示职工信息
void Workermanger::show_emp() {
	if (this->m_fileisempty)
		cout << "文件不存在或记录为空" << endl;
	else {
		for (int i = 0; i < this->m_emenum; i++) {
			this->m_emearry[i]->showinfo();        //利用多态调用程序接口
		}
	}
}

//判断职工是否存在数组之中
int Workermanger::isexit(int id) {
	int dex = -1;
	for (int i = 0; i < this->m_emenum; i++) {
		if (this->m_emearry[i]->m_id == id)
			dex=i; 
	}
	return dex;
}

//删除职工
void Workermanger::del_emp() {
	if (this->m_fileisempty)
		cout << "文件不存在或记录为空" << endl;
	else 
	{
		//按职工编号删除
		cout << "请输入想要删除的职工号:" << endl;
		int id;
		cin >> id;
		int index = this->isexit(id);
		
		if (index != -1)  //说明index上位置数据需要删除
		{
			for (int i = index; i < this->m_emenum - 1; i++)
			{
				this->m_emearry[i] = this->m_emearry[i + 1];
			}
			this->m_emenum--;

			this->save(); //删除后数据同步到文件中
			cout << "删除成功!" << endl;
		}
		else
			cout << "删除失败,未找到该职工" << endl;

	}
}

//修改职工
void Workermanger::modemp()
{
	if (this->m_fileisempty)
		cout << "文件不存在或记录为空" << endl;
	else
	{
		cout << "请输入要修改的职工编号:" << endl;
		int id;
		cin>>id;
		int ret = this->isexit(id);
		if (ret != -1)
		{
			delete this->m_emearry[ret];
			int newid, newdid;
			string newname;

			cout << "成功查找到id为" << id << " 的职工,请输入新的职工信息" << endl;

			cout << "请输入新职工的编号:" << endl;
			cin >> newid;
			cout << "请输入新职工的姓名:" << endl;
			cin >> newname;

			cout << "请选择该职工的部门分类:" << endl;
			cout << "1:普通员工" << endl;
			cout << "2:经理" << endl;
			cout << "3:老板" << endl;
			cin >> newdid;

			Worker* worker = NULL;
			switch (newdid) {
			case 1:worker = new Employee(newid, newname, 1); break;
			case 2:worker = new Manger(newid, newname, 2); break;
			case 3:worker = new Boss(newid, newname, 3); break;
			}

			this->m_emearry[ret] = worker;
			cout << "修改成功" << endl;
			this->save();
		}
		else
			cout << "修改失败,未找到该员工" << endl;
	}
}

//查找职工信息
void Workermanger::findemp()
{
	if (this->m_fileisempty)
		cout << "文件不存在或记录为空" << endl;
	else
	{
		cout << "请选择查找方式:" << endl;
		cout << "1.按职工编号查找" << endl;
		cout << "2.按职工姓名查找" << endl;

		int slect;
		cin >> slect;
		if (slect == 1)
		{
			int id;
			cout << "请输入要查找的职工编号:" << endl;
			cin >> id;

			int ret = this->isexit(id);
			if (ret != -1) {
				cout << "查找成功,该职工信息如下:" << endl;
				this->m_emearry[ret]->showinfo();
			}
			else
				cout << "查找失败,查无此人" << endl;
		}
		else if (slect == 2)
		{
			string name;
			bool flag = false;
			cout << "请输入要查找的职工姓名" << endl;
			cin >> name;
			for (int i = 0; i < this->m_emenum; i++) {
				if (this->m_emearry[i]->m_name == name) {
					flag = true;
					cout << "查找成功,职工姓名为" << name << "的员工信息如下:" << endl;
					this->m_emearry[i]->showinfo();
				}

			}
			if(flag=false)
				cout << "查找失败,查无此人" << endl;
		}
		else
			cout << "输入有误,查无此人" << endl;
	}
}


//职工编号排序
void Workermanger::sortemp() 
{
	if (this->m_fileisempty)
		cout << "文件不存在或记录为空" << endl;
	else
	{
		for (int i = 0; i < this->m_emenum; i++) 
		{
			int min = i;
			for (int j = i + 1; j < this->m_emenum; j++)
			{
				if (this->m_emearry[min]->m_id > this->m_emearry[j]->m_id)
					min = j;
			}
			if (i != min)
			{
				Worker* temp = this->m_emearry[i];
				this->m_emearry[i] = this->m_emearry[min];
				this->m_emearry[min] = temp;
			}
		}
		cout << "排序成功,其结构为:" << endl;
		this->save();
		this->show_emp();
	}
}

//清空文档
void Workermanger::clean_file()
{
	cout << "确认清空文件?" << endl;
	cout << "1、确定" << endl;
	cout << "2、返回" << endl;

	int select;
	cin >> select;
	if (select == 1)
	{
		//清空文件
		ofstream ofs(filename, ios::trunc);
		ofs.close();

		if (this->m_emearry != NULL)
		{
			for (int i = 0; i < this->m_emenum; i++) {
				delete this->m_emearry[i];
				this->m_emearry[i] = NULL;
			}
			delete[] this->m_emearry;
			this->m_emearry = NULL;
			this->m_emenum = 0;
			this->m_fileisempty = true;
		}

		cout << "清除成功" << endl;
	}
}

5.程序入口

main.cpp源文件:

#include <iostream>
#include "workermanger.h"
#include "worker.h"
#include "employee.h"
#include "manger.h"
#include "boss.h"
using namespace std;


void main() {

	Workermanger wm;
	int choice = 0;
	while (true) {
		wm.show_menu();
		cout << "请输入你的选择:" << endl;
		cin >> choice;
		int num, dex;
		switch (choice) {
		case 1:
			wm.Exitsystem();//退出系统
			break;
		case 2:
			wm.add_eme();   //添加职工
			break;
		case 3:
			wm.show_emp();//显示职工
			break;
		case 4:
			wm.del_emp();//删除职工
			break;
		case 5:
			wm.modemp();//修改职工
			break;
		case 6:
			wm.findemp();//查找职工
			break;
		case 7:
			wm.sortemp();//排序职工
			break;
		case 8:
			wm.clean_file();//清空文档
			break;
		default:
			system("clc");
			break;
		}
	}


}