一.需求
职工管理系统可以用来管理公司内所有员工的信息,本次练习主要利用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;
}
}
}