职工管理系统

职工管理系统

一、功能介绍

该职工管理系统8个功能,管理的职工有三大类:

在这里插入图片描述

  1. 八大功能介绍
    • 退出功能:选择0时程序停止运行退出
    • 增加职工信息功能:完成各类职工的添加,并将其写入文件中
    • 显示职工信息功能:从文件中读出数据,将其展示在屏幕中
    • 删除离职职工功能:按照职工编号将该职工信息从文件中删除
    • 修改职工信息功能:按照职工编号对职工的信息进行修改
    • 查找职工信息功能:提供按职工编号和职工姓名进行查找
    • 排序职工信息功能:将职工的信息按照编号进行排序,可升序也可降序,并且排序后的数据将同步到文件中
    • 清空所有数据功能:将文件中所有的数据全部清空
  2. 三类职工
    • 普通员工类
    • 经理类
    • 老板类

类的设计如下:

在这里插入图片描述

该项目采用标准的设计,即类的定义和实现分开实现

二、功能详细介绍

1、各类的实现

  • Worker类:定义两个纯虚函数和三个属性,由其子类实现并继承,该文件为头文件,不实现具体功能
//worker.h

class Worker {
public:
	//显示个人信息
	virtual void showInfo() = 0;

	//获取岗位名称
	virtual string getDeptName() = 0;


	//职工编号
	int m_Id;
	//职工姓名
	string m_Name;
	//部门编号
	int m_DeptId;
};
  • Employee类:普通员工,继承Worker类
//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 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\t"<<"职工姓名:"<<this->m_Name
		<<"\t\t"<<"职工岗位:"<<this->getDeptName()<<endl;
}

//获取岗位名称
string Employee::getDeptName() {
	return string("员工");
}
  • Manger类:经理,继承父类Worker
//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 getDeptName();
};
//manger.cpp

#include "manger.h"

Manger::Manger(int id, string name, int dId) {
	this->m_Id=id;
	this->m_Name=name;
	this->m_DeptId=dId;
}

void Manger::showInfo() {
	cout << "职工编号:" << this->m_Id
		<< "\t\t" << "职工姓名:" << this->m_Name
		<< "\t\t" << "职工岗位:" << this->getDeptName() << endl;
}

string Manger::getDeptName() {
	return string("经理");
}
  • Boss类:老板,继承父类Worker
//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 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\t" << "职工姓名:" << this->m_Name
		<< "\t\t" << "职工岗位:" << this->getDeptName() << endl;
}

string Boss::getDeptName() {
	return string("老板");
}
  • WorkerManger类:由于该系统功能的封装类,将该系统所需要实现的各个功能函数封装到该类中,其功能定义如下:
//workerManger.h

#pragma once //防止头文件重复包含
#include<iostream>
#include "worker.h"
using namespace std;

class WorkerManger {
public:
    //构造函数
	WorkerManger();

	//展示菜单
	void showMenu();

	//退出系统
	void exitSystem();

	//添加职工
	void addEmp();

	//保存文件
	void save();

	//统计文件中的人数
	int get_EmpNum();

	//初始化员工
	void init_Emp();

	//显示员工
	void show_Emp();

	//删除职工
	void del_Emp();

	//根据id判断职工是否存在,存在返回在数组中的位置,不存在返回-1
	int isExist(int id);

	//修改职工
	void update_Emp();

	//判断文件是否为空
	bool m_FileIsEmpty;

	//查找职工
	void query_Emp();

	//排序职工
	void sort_Emp();

	//清空文件
	void clear_File();

	//记录职工人数
	int m_EmpNum;
	//职工数组指针
	Worker ** m_EmpArray;

    //析构函数
	~WorkerManger();
};

2、功能介绍

2.1 退出功能

通过函数exit(0)实现程序的停止

//退出系统
void WorkerManger::exitSystem() {
	cout<<"欢迎下次使用"<<endl;
	system("pause");
	exit(0);
}
2.2 添加职工功能

原理:先确定要添加的职工人数,将该人数与与原数组中的人数相加,开辟一个新的如此大小空间,将所有数据存入新的数组空间,并将该数组中的数据写入文件中

//添加职工
void WorkerManger::addEmp() {
	int addNum = 0;
	cout<<"请输入你要添加的职工人数:"<<endl;
	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 Manger(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;

		//将添加的数据写入文件中
		this->save();//save()函数用于实现将该类中数组中的数据写入文件

		cout<<"成功添加"<<addNum<<"名新职工"<<endl;

	}
	else {
		cout<<"输入有误"<<endl;
	}

	system("pause");
	system("cls");
}
2.3 展示职工功能

原理:将数组中的元素依次读出并展示在屏幕上

//显示员工
void WorkerManger::show_Emp() {
	//判断文件是否为空
	if (this->m_FileIsEmpty) {
		cout<<"文件不存在或记录为空!"<<endl;
	}
	else {
		for (int i = 0; i < this->m_EmpNum; i++) {
			this->m_EmpArray[i]->showInfo();
		}
	}

	system("pause");
	system("cls");
}
2.4 删除职工功能

原理:确定要删除职工的编号,通过函数isExist()判断该编号是否存在,存在则返回该职工在数组中的下标,不存在则返回-1,如存在,则将其后面元素依次往前移,将要删除的元素进行覆盖以达到删除,再将该数组数据重新写入文件中

//删除职工
void WorkerManger::del_Emp() {
	if (this->m_FileIsEmpty) {
		cout<<"文件不存在或记录为空!"<<endl;
	}
	else {
		cout << "请输入想要删除职工的编号:" << endl;
		int id = 0;
		cin >> id;

		int index = this->isExist(id);

		if (index != -1) {
			//职工存在
			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");
}
2.5 修改职工功能

原理:输入要修改职工的编号,确定该员工是否存在,如存在返回该职工在数组中的下标,先将该位置中的指针进行释放,将修改后的新数据重新存放于此

//修改职工
void WorkerManger::update_Emp() {
	if (this->m_FileIsEmpty) {
		cout<<"文件不存在或记录为空!"<<endl;
	}

	cout<<"请输入要修改职工的编号:"<<endl;
	int id;
	cin>>id;

	int index = this->isExist(id);
	if (index != -1) {
		//查找到该编号的职工
		delete this->m_EmpArray[index];

		int newId=0;
		string newName="";
		int dSelect=0;

		cout<<"查找到编号为"<<id<<"的员工"<<endl;
		cout<<"请输入该员工新的编号:"<<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 Manger(newId, newName, dSelect);
			break;
		case 3:
			worker = new Boss(newId, newName, dSelect);
			break;
		default:
			break;
		}
		//更新数据
		this->m_EmpArray[index] = worker;
		this->save();
		cout<<"修改成功!"<<endl;
	}
	else {
		cout<<"该职工不存在!"<<endl;
	}

	system("pause");
	system("cls");
}

2.6 查找职工功能

原理:按职工编号或姓名依次遍历数组进行查找

//查找职工
void WorkerManger::query_Emp() {
	if (this->m_FileIsEmpty) {
		cout<<"文件不存在或者记录为空"<<endl;
	}

	cout<<"请输入查找的方式:"<<endl;
	cout<<"1-按职工编号查找"<<endl;
	cout<<"2-按职工姓名查找"<<endl;
	int select;
	cin>>select;

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

		int index = this->isExist(id);
		if (index != -1) {
			//找到职工
			cout<<"查找成功!该职工信息如下:"<<endl;
			this->m_EmpArray[index]->showInfo();
		}
		else {
			cout<<"查找失败,该职工不存在!"<<endl;
		}
	}
	else if (select == 2) {
		//按姓名查
		string name;
		cout<<"请输入要查找职工的姓名:"<<endl;
		cin>>name;

		bool flag = false;
		for (int i = 0; i < this->m_EmpNum; i++) {
			if (this->m_EmpArray[i]->m_Name == name) {
				cout<<"查找成功!职工编号为"<<this->m_EmpArray[i]->m_Id<<"号职工信息如下"<<endl;
				this->m_EmpArray[i]->showInfo();
				flag = true;
			}
		}

		if (!flag) {
			cout<<"查找失败,该职工不存在"<<endl;
		}
	}
	else {
		cout<<"输入选项有误"<<endl;
	}

	system("pause");
	system("cls");
}
2.7 职工排序功能

原理:采用选择排序对职工编号进行升序或降序排序,并将排序后的元素写入文件中

//排序职工
void WorkerManger::sort_Emp() {
	if (this->m_FileIsEmpty) {
		cout<<"文件不存在或记录为空"<<endl;
	}

	cout<<"请选择排序方式:"<<endl;
	cout<<"1-按职工编号升序排序"<<endl;
	cout<<"2-按职工编号降序排序"<<endl;
	int select;
	cin>>select;

	for (int i = 0; i < this->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 (select == 2) {
				//降序
				if (this->m_EmpArray[minOrMax]->m_Id < this->m_EmpArray[j]->m_Id) {
					minOrMax = j;
				}
			}
			
		}

		if (1 != minOrMax) {
			Worker * temp = this->m_EmpArray[i];
			this->m_EmpArray[i] = this->m_EmpArray[minOrMax];
			this->m_EmpArray[minOrMax] = temp; 
		}
		
	}

	if (select == 1 || select == 2) {
		cout << "排序成功" << endl;
		this->save();
	}
	else {
		cout<<"选项输入有误"<<endl;
	}

	system("pause");
	system("cls");
}
2.8 清空文件功能

原理:将文件删除后重新创建,重新变成一个没有数据的文件,同时将数组大小置0,删除堆区数组指针并置空

//清空文件
void WorkerManger::clear_File() {
	cout<<"确定清空文件吗?"<<endl;
	cout<<"1-确定"<<endl;
	cout<<"2-返回"<<endl;

	int select;
	cin>>select;

	if (select == 1) {
		//清空文件
		ofstream ofs;
		ofs.open(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");
}

2.9 其他函数功能实现
  • 构造函数实现各类数据的初始化
//构造函数用来根据不同情况来初始化各类数据

//构造函数
WorkerManger::WorkerManger() {
	//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 WorkerManger::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 WorkerManger::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 WorkerManger::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 Manger(id,name,dId);
		}
		else {
			worker = new Boss(id,name,dId);
		}
		this->m_EmpArray[index]=worker;
		index++;
	}
	ifs.close();
}
  • 根据id判断职工是否存在
//根据id判断职工是否存在,存在返回在数组中的位置,不存在返回-1
int WorkerManger::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;
}
  • 用于程序执行完后释放堆区指针
//析构函数
WorkerManger::~WorkerManger() {
	if (this->m_EmpArray != NULL) {
		delete[] this->m_EmpArray;
		this->m_EmpArray = NULL;
	}
}

三、功能展示

1、添加职工

在这里插入图片描述

2、显示职工

在这里插入图片描述

3、删除职工

在这里插入图片描述
在这里插入图片描述

4、修改职工

在这里插入图片描述

5、查找职工

在这里插入图片描述

6、职工排序

在这里插入图片描述

7、清空文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XJb0xF90-1691032911273)(C:\Users\JR\AppData\Roaming\Typora\typora-user-images\image-20230803105725837.png)]

四、总结

通过完成该项目,我对C++有了更深刻的了解,这很好的锻炼了我的逻辑思维能力以及代码的编写能力

本项目展示略有不够详细和完整,如对该项目有需要,可以联系本人免费获取,不懂之处也可以进行咨询:qq:3413606624
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值