【C++初级项目】职工管理系统 v1.0

该代码是此项目的初步实现,仍然存在很多不妥之处,欢迎各位读者提供自己的改进意见!
我会结合大家的已经对项目进行改进,做出更好的项目!

项目简介:
首先,程序读取文件,会加载上次操作后的数据到内存区
在这里插入图片描述

其次,我们可以选择增加员工信息、显示员工信息、删除离职员工、修改职工信息、查找职工信息、按编号进行排序、清空、退出
在这里插入图片描述 在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

直接上代码:
首先是实现这个主要功能的类:
workerManager.h

#pragma once		//防止头文件重复包含
#include<iostream>	//输入输出流
#include<vector>
#include<fstream>
#include"worker.h"
#include"boss.h"
#include"employee.h"
#include"manager.h"
using namespace std;

#define FILENAME "empFile.txt"

//管理者类
class WorkerManager {
public:
	WorkerManager();

	WorkerManager(int worker_num);

	//显示菜单
	void showMenu();

	//添加职工
	void addEmp();

	//保存文件
	void save();

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

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

	//显示职工
	void showEmp();

	//删除职工
	void delEmp(int id);

	//判断职工是否存在
	int isExist(int id);

	//修改职工
	void modEmp();

	//查找职工
	void findWorker();

	//按编号排序
	void sortById();

	//清空
	void clearFile();

	~WorkerManager();

private:
	bool is_file_empty = false;	//文件是否为空
	int worker_num;				//记录职工人数
	vector<Worker*> m_EmpArr;	//职工数组
};

对应的函数实现:
workerManager.cpp

#include"workerManager.h"

WorkerManager::WorkerManager() {
	//程序初始化,首先加载文件
	ifstream ifs(FILENAME, ios::in);

	//如果文件不存在
	if (!ifs.is_open()) {
		cout << "文件不存在" << endl;

		//初始化属性
		this->worker_num = 0;
		this->is_file_empty = true;
	} else {
		//文件存在,判断文件是否为空
		char ch;
		ifs >> ch;

		//通过读取第一个字符判断
		if (ifs.eof()) {
			cout << "文件为空" << endl;
			this->worker_num = 0;
			this->is_file_empty = true;
		} else {
			cout << "文件加载成功!" << endl;
			
			int num = this->getWorkerNum();
			cout << "职工人数:" << num << endl;

			//将文件数据加载到数组中
			this->initWorker();

			//遍历打印
			for (int i = 0; i < this->worker_num; i++) {
				cout << "职工编号:" << this->m_EmpArr[i]->getWorkerId() << "\t"
					<< "姓名:" << this->m_EmpArr[i]->getWorkerName() << "\t"
					<< "部门编号:" << this->m_EmpArr[i]->getDeptId() << endl;
			}
		}
	}

	ifs.close();
}

WorkerManager::WorkerManager(int worker_num){
}

void WorkerManager::showMenu() {
	cout << "***********************************************************************" << endl;
	cout << "**************************  职工管理系统  v1.0  ***********************" << endl;
	cout << "****************************  1.增加职工信息  *************************" << endl;
	cout << "****************************  2.显示职工信息  *************************" << endl;
	cout << "****************************  3.删除离职职工  *************************" << endl;
	cout << "****************************  4.修改职工信息  *************************" << endl;
	cout << "****************************  5.查找职工信息  *************************" << endl;
	cout << "****************************  6.按照编号排序  *************************" << endl;
	cout << "****************************  7.清空所有文档  *************************" << endl;
	cout << "****************************  0.退出管理系统  *************************" << endl;
	cout << "***********************************************************************" << endl << endl;
	cout << "                               请输入选择[ ]\b\b";
}

void WorkerManager::addEmp(){
	int n;
	cout << "请输入要添加的职工的数量:" << endl;
	
	cin >> n;

	if (n > 0) {
		this->worker_num += n;

		//遍历添加职工信息
		for (int i = 0; i < n; i++) {
			Worker* w;		//创建职工对象

			int id;
			string name;
			int deptId;
			int pos_choice;

			cout << "请选择职工岗位:" << endl;
			cout << "1.老板" << endl;
			cout << "2.经理" << endl;
			cout << "3.普通员工" << endl;
			cin >> pos_choice;

			cout << "请输入第" << i + 1 << "个新职工的编号:";
			cin >> id;
			cout << "请输入第" << i + 1 << "个新职工的姓名:";
			cin >> name;
			cout << "请输入第" << i + 1 << "个新职工的部门编号:";
			cin >> deptId;

			//利用多态new相应的职工
			switch (pos_choice) {
			case 1:
				w = new Boss(id, name, deptId);
				break;
			case 2:
				w = new Manager(id, name, deptId);
				break;
			case 3:
				w = new Employee(id, name, deptId);
				break;
			default:
				break;
			}

			//将创建的职工指针保存到数组中
			m_EmpArr.push_back(w);
		}
		cout << "已成功添加" << n << "名新职工" << endl;
		this->is_file_empty = false;
		this->save();
	} else {
		return;
	}

	system("pause");
}

void WorkerManager::save() {
	ofstream ofs;
	ofs.open(FILENAME, ios::out);

	//遍历写入文件
	for (int i = 0; i < this->worker_num; i++) {
		ofs << this->m_EmpArr[i]->getWorkerId() << " "
			<< this->m_EmpArr[i]->getWorkerName() << " "
			<< this->m_EmpArr[i]->getDeptId() << endl;
	}

	//关闭文件
	ofs.close();
}

int WorkerManager::getWorkerNum() {
	ifstream ifs(FILENAME, ios::in);

	int id;
	string name;
	int deptId;
	int num = 0;	//统计人数

	while (ifs >> id && ifs >> name && ifs >> deptId) {
		num++;	
	}

	return num;
}

void WorkerManager::initWorker(){
	ifstream ifs(FILENAME, ios::in);

	int id;
	string name;
	int deptId;

	while (ifs >> id && ifs >> name && ifs >> deptId) {
		Worker* w;

		if (deptId == 1) {
			w = new Boss(id, name, deptId);
		} else if (deptId == 2) {
			w = new Manager(id, name, deptId);
		} else {
			w = new Employee(id, name, deptId);
		}

		this->m_EmpArr.push_back(w);
		this->worker_num++;
	}

	ifs.close();
}

void WorkerManager::showEmp(){
	if (this->worker_num > 0) {
		for (int i = 0; i < worker_num; i++) {
			this->m_EmpArr[i]->showInfo();
		}
	} else {
		cout << "文件为空或不存在" << endl;
	}
		system("pause");
}

void WorkerManager::delEmp(int id) {
	//判断职工是否存在
	if (isExist(id) == -1) {
		cout << "职工不存在!" << endl;		
	} else {
		//删除操作
		for (vector<Worker*>::iterator it = m_EmpArr.begin(); it != m_EmpArr.end(); it++) {
			if ((*it)->getWorkerId() == id) {
				//数组中删除
				this->m_EmpArr.erase(it);
				this->worker_num--;

				//更新到文件中
				this->save();

				cout << "成功删除!" << endl;
				break;
			}
		}
	}

	system("pause");
	return;
}

int WorkerManager::isExist(int id) {
	int index = -1;

	for (int i = 0; i < this->worker_num; i++) {
		if (this->m_EmpArr[i]->getWorkerId() == id) {
			index = i;
			break;
		}
	}

	return index;
}

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

		int res = this->isExist(id);

		if (res == -1) {
			cout << "该职工不存在!" << endl;
			return;
		}

		//新职工的信息
		int newId = 0;
		string newName = "";
		int newDeptId = 0;

		cout << "查找到" << this->m_EmpArr[res]->getWorkerId() << "号职工,请输入新的职工号" << endl;
		cin >> newId;
		cout << "请输入姓名" << endl;
		cin >> newName;
		while (newDeptId > 3 || newDeptId <= 0) {
			cout << "请输入部门编号" << endl;
			cin >> newDeptId;
		}

		//创建新的对象
		Worker* w, *p = this->m_EmpArr[res];
		if (newDeptId == 1) {
			w = new Boss(newId, newName, newDeptId);
		} else if (newDeptId == 2) {
			w = new Manager(newId, newName, newDeptId);
		} else {
			w = new Employee(newId, newName, newDeptId);
		}
	
		this->m_EmpArr[res] = w;	//更新数组	
		delete p;					//释放空间

		cout << "修改信息成功!" << endl;
	}
	system("pause");
}

void WorkerManager::findWorker(){	
	int id;
	cout << "请输入要查找的职工的编号:";
	cin >> id;

	int res = this->isExist(id);

	if (res == -1) cout << "该职工不存在" << endl;
	else this->m_EmpArr[res]->showInfo();	

	system("pause");
}

void WorkerManager::sortById() {
	if (this->is_file_empty) {
		cout << "文件为空!" << endl;
	} else {
		for (int i = 0; i < this->worker_num - 1; i++) {
			for (int j = i; j < this->worker_num - i - 1; j++) {
				if (this->m_EmpArr[j]->getWorkerId() > this->m_EmpArr[j + 1]->getWorkerId()) {
					Worker* p = this->m_EmpArr[j];
					this->m_EmpArr[j] = this->m_EmpArr[j + 1];
					this->m_EmpArr[j + 1] = p;
				}
			}
		}

		cout << "排序成功!" << endl;
	}

	system("pause");
}

void WorkerManager::clearFile() {
	cout << "确定清空吗?" << endl;
	cout << "1.确定" << endl;
	cout << "2.返回" << endl;

	int choice;
	cin >> choice;

	if (choice == 1) {
		ofstream ofs(FILENAME, ios::trunc);
		ofs.close();

		for (int i = 0; i < this->worker_num; i++) {
			//释放每一个空间
			delete this->m_EmpArr[i];
			this->m_EmpArr[i] = NULL;
		}

		this->m_EmpArr.clear();
		this->worker_num = 0;
		this->is_file_empty = true;

		cout << "清空成功!" << endl;
	}

	system("pause");
}

WorkerManager::~WorkerManager() {

}

其次,职工分为普通员工、经理和老板,都继承自抽象类worker
worker.h

#pragma once
#include<iostream>
#include<string>
using namespace std;

//职工类
class Worker {
public:

	//显示个人信息
	virtual void showInfo() = 0;

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

	//获取id
	int getWorkerId();

	//获取name
	string getWorkerName();

	//获取deptId
	int getDeptId();

protected:
	int worker_id;
	string worker_name;
	int department_id;
};

worker.cpp

#include "worker.h"

int Worker::getWorkerId(){
    return this->worker_id;
}

string Worker::getWorkerName(){
    return string(worker_name);
}

int Worker::getDeptId(){
    return department_id;
}

下面是三种职工分别各自的类,继承了上面的worker,对其中的函数进行了重写
employee.h

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

//职工类
class Employee : public Worker {
public:

	//显示个人信息
	virtual void showInfo();

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


	Employee(int id, string name, int deptId);

	Employee();

};

employee.cpp

#include "employee.h"

void Employee::showInfo(){
	cout << "职工编号:" << this->worker_id << "\t";
	cout << "职工姓名:" << this->worker_name << "\t";
	cout << "岗位:" << this->getDeptName() << "\t";
	cout << "岗位职责:完成经理交给的任务" << endl;
}

string Employee::getDeptName(){
	return string("员工");
}

Employee::Employee(int id, string name, int deptId){
	this->worker_id = id;
	this->worker_name = name;
	this->department_id = deptId;
}

Employee::Employee(){
}

manager.h

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

class Manager : public Worker {
public:

	Manager() = default;

	Manager(int id, string name, int deptId);

	//显示个人信息
	virtual void showInfo();

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

};

manager.cpp

#include "manager.h"

Manager::Manager(int id, string name, int deptId){
	this->worker_id = id;
	this->worker_name = name;
	this->department_id = deptId;
}

void Manager::showInfo(){
	cout << "职工编号:" << this->worker_id << "\t";
	cout << "职工姓名:" << this->worker_name << "\t";
	cout << "岗位:" << this->getDeptName() << "\t";
	cout << "岗位职责:完成老板交给的任务,并下发给普通的员工" << endl;
}

string Manager::getDeptName(){
	return string("经理");
}

boss.h

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

class Boss : public Worker {
public:

	Boss() = default;

	Boss(int id, string name, int deptId);

	//显示个人信息
	virtual void showInfo();

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

};

boss.cpp

#include "boss.h"

Boss::Boss(int id, string name, int deptId){
	this->worker_id = id;
	this->worker_name = name;
	this->department_id = deptId;
}

void Boss::showInfo(){
	cout << "职工编号:" << this->worker_id << "\t";
	cout << "职工姓名:" << this->worker_name << "\t";
	cout << "岗位:" << this->getDeptName() << "\t";
	cout << "岗位职责:管理公司所有事务" << endl;
}

string Boss::getDeptName(){
	return string("老板");
}

最后,主函数main.cpp

#include<iostream>
#include"workerManager.h"
#include"worker.h"
#include"employee.h"
#include"manager.h"
#include"boss.h"
using namespace std;


int main() {
	//Worker* w = new Employee(1, "张三", 1001);
	//Worker* w2 = new Manager(2, "李四", 1002);
	//Worker* w3 = new Boss(3, "王五", 1003);

	//w->showInfo();
	//w2->showInfo();
	//w3->showInfo();

	//delete w, w2, w3;

	int choice = 0;		//存储用户的选择项

	WorkerManager wm;	//实例化管理者对象

	while (1) {
		wm.showMenu();	//展示菜单
		cin >> choice;	//接收用户的选择

		switch (choice) {
		case 0:			//退出系统
			cout << "欢迎下次使用!" << endl;
			system("pause");
			exit(0);
			break;
		case 1:			//增加职工
			wm.addEmp();
			break;
		case 2:			//显示职工
			wm.showEmp();
			break;
		case 3:			//删除职工
		{
			int id;
			cout << "请输入要删除的职工的编号:" << endl;
			cin >> id;
			wm.delEmp(id);
		}
			break;
		case 4:			//修改职工
			wm.modEmp();
			break;
		case 5:			//查找职工
			wm.findWorker();
			break;
		case 6:			//排序
			wm.sortById();
			break;
		case 7:			//清空文档
			wm.clearFile();
			break;
		default:
			system("cls");
			break;
		}

		system("cls");
	}


	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

为梦而生~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值