C ++职工管理系统

通过C++ 实现职工管理系统,可以进行数据的增删改查以及数据备份,设计C++知识点有 继承,抽象类,数组,堆,冒泡排序以及文件的操作等知识点
代码无删减,创建一个cpp文件,粘贴进去运行就能进行功能操作
运行页面展示
在这里插入图片描述

#include  <iostream>
#include <Windows.h>
#include <fstream>
#include <regex>
#include <string>
#include <cstdio>//处理文件操作,如:删除文件
#include<type_traits>
#define LENGTH 1000
using namespace std;

//利用多态实现一个职工管理系统
/*
公司职工分为:普通员工, 经理, 老板, 需要职工编号, 职工姓名, 职工岗位以及职责
普通员工职责:完成经理交代的任务
经理职责:完成老板交代的任务, 并下发给员工
老板职责:管理公司所有事务

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

*/
class FileManage {
public:
	// 写数据
	void writeData(string data) {
		//创建文件流
		ofstream ofs;
		//创建文件
		ofs.open("emp_system.txt", ios::app);
		//写数据
		ofs << data << "\n";
		//关闭文件
		ofs.close();

		cout << data << "添加成功" << endl;
	}
	// 读数据
	void readData() {
		//创建文件流
		ifstream ifs;
		//打开文件,并判断文件是否打开成功
		ifs.open("emp_system.txt", ios::out);
		if (!ifs.is_open()) {
			cout << "===========     文件打开失败     ===========" << endl;
		}
		//读数据
		char buff[1024] = { 0 };
		string temp_data[LENGTH];
		int len = 1000;
		bool tag = false; //添加一个标志判断数据是否为空
		while (ifs.getline(buff, sizeof(buff))) {
			string temp_buff = buff;
			int buff_len = temp_buff.length();
			//通过length 去除多余空数据
			if (buff_len > 0) {
				temp_data[LENGTH - len] = buff;
				len--;
				tag = true;
			}
			
		}
		// 判断数据是否为空
		if (tag==false) {
			this->isEmpty();
		}
		//关闭文件
		ifs.close();
		//使用指针遍历数组
		string* p = temp_data;
		for (int i = 0; i < sizeof(temp_data) / sizeof(temp_data[0]); i ++) {
			//if(sizeof(temp_))
			//cout << temp_data[i] << endl;
			// *p != "" 去除空的数据
			if (*p != "") {
				cout << *p << endl;
			}
			*p++;
		}
		cout <<  "===========     数据已经读取完毕     ===========" << endl;
	}

	// 删除数据
	void deleteData(string temp_emp_num) {
		//采用创建临时文件temp_emp_system.txt,复制处理好的数据进去,然后删除掉emp_system.txt原来的数据,
		// 把最新数据又放到emp_system.txt中,最后再删除掉temp_emp_system.txt
	
		//创建文件流
		ifstream ifs;
		//打开文件,并判断文件是否打开成功
		ifs.open("emp_system.txt", ios::out);
		if (!ifs.is_open()) {
			cout << "===========     文件打开失败     ===========" << endl;
		}
		//读数据
		char buff[1024] = { 0 };
		string temp_data[LENGTH];
		int len = 1000;
		bool tag = false;
		while (ifs.getline(buff, sizeof(buff))) {
			//cout << buff << endl;
			temp_data[LENGTH - len] = buff;
			len--;
			tag = true;
		}
		//关闭文件
		ifs.close();
		// 判断数据是否为空
		if (tag == false) {
			this->isEmpty();
		}
		if (tag == true) {
			//使用指针遍历数组 处理符号要求的数据存入临时文件temp_emp_system.txt,在处理数据前,不能删除emp_system.txt
			string* p = temp_data;
			for (int i = 0; i < sizeof(temp_data) / sizeof(temp_data[0]); i++) {
				// *p != "" 去除空的数据
				if (*p != "") {
					//cout << *p << endl;
					//使用正则处理数据,获取到员工编号
					regex reg("[^0-9]");  //匹配3个任意字符+2个任意字符+下划线+4个数字+!
					string emp_num = regex_replace(*p, reg, "$1");
					//把输入的编号和文件中处理到编号部相等的数据先存放到临时文件中
					if (temp_emp_num != emp_num) {
						//创建文件流
						ofstream ofs;
						//创建文件
						ofs.open("temp_emp_system.txt", ios::app);
						//写入数据
						ofs << *p << "\n";
						//关闭文件
						ofs.close();
					}
					else {
						string qd;
						cout << "\t确定删除请输入:是 [输入不是“是”的其它任意字符取消删除]";
						cin >> qd;
						if (qd == "是") {
							// 先删除emp_system.txt文件,把temp_emp_system.txt文件中的数据转存到emp_system.txt文件中,最后再删除temp_emp_system.txt文件
							if (remove("emp_system.txt") != 0) {
								perror("文件删除错误");
							}
							else {
								//puts("文件已成功删除");
								//创建文件流
								ofstream ofs;
								ifstream ifs;
								//打开文件,并判断文件是否打开成功
								ofs.open("emp_system.txt", ios::out);
								ifs.open("temp_emp_system.txt", ios::in);
								if (!ifs.is_open()) {
									cout << "文件打开失败";
								}
								char buff[1024] = { 0 };
								while (ifs.getline(buff, sizeof(buff))) {
									ofs << buff << "\n";
								}
								//关闭文件
								ofs.close();
								ifs.close();
								remove("temp_emp_system.txt");
							}
							cout << emp_num << "删除成功" << endl;
						}
						else {
							break;
						}
					}
				}
				*p++;
			}
		}
		
		cout << "===========     数据已经读取完毕     ===========" << endl;
		
	}

	// 修改数据
	void changeData(string temp_emp_num, string change_emp_name, string change_emp_department) {
		//采用创建临时文件temp_emp_system.txt,复制处理好的数据进去,然后删除掉emp_system.txt原来的数据,
		// 把最新数据又放到emp_system.txt中,最后再删除掉temp_emp_system.txt

		//创建文件流
		ifstream ifs;
		//打开文件,并判断文件是否打开成功
		ifs.open("emp_system.txt", ios::out);
		if (!ifs.is_open()) {
			cout << "===========     文件打开失败     ===========" << endl;
		}
		//读数据
		char buff[1024] = { 0 };
		string temp_data[LENGTH];
		int len = 1000;
		while (ifs.getline(buff, sizeof(buff))) {
			temp_data[LENGTH - len] = buff;
			len--;
		}
		//关闭文件
		ifs.close();
		

		//使用指针遍历数组
		string* p = temp_data;
		for (int i = 0; i < sizeof(temp_data) / sizeof(temp_data[0]); i++) {
			// *p != "" 去除空的数据
			if (*p != "") {
				//cout <<  *p << endl;
				regex reg("(\\W*\:)(\\d*)(\ \\W*\:)(\\W*)(\ \\W*\:)(\\W*)");
				string  reg_emp_num = regex_replace(*p, reg, "$2");
				string  reg_emp_name = regex_replace(*p, reg, "$4");
				string  reg_emp_department = regex_replace(*p, reg, "$6");
				reg_emp_name.erase(remove(reg_emp_name.begin(), reg_emp_name.end(), ' '), reg_emp_name.end());//给职员名字去空格
				//cout << reg_emp_name << ":" << reg_emp_num<<":"<< reg_emp_department << endl;
				if (temp_emp_num == reg_emp_num ) {
					//打印查询到的数据
					cout <<"被修改的职员信息[" << *p << "]" << endl;
					
					
					//符号要求的数据存入临时文件temp_emp_system.txt
					//创建文件流
					ofstream ofs;
		 			//创建文件
		 			ofs.open("temp_emp_system.txt", ios::app);
		 			//写入数据
					string change_data = "部门编号:" + reg_emp_num + " 职工姓名:" + change_emp_name + " 所属部门:" + change_emp_department;
		 			ofs << change_data << "\n";
		 			//关闭文件
		 			ofs.close();
				}
				else {
					//不需要修改的直接迁移到temp_emp_system.txt文件中
					//创建文件流
					ofstream ofs;
					//创建文件
					ofs.open("temp_emp_system.txt", ios::app);
					//写入数据
					string change_data = "部门编号:" + reg_emp_num + " 职工姓名:" + reg_emp_name + " 所属部门:" + reg_emp_department;
					ofs << change_data << "\n";
					//关闭文件
					ofs.close();
				}
			}
			*p++;
		}

		cout << "系统开始更新数据" << endl;
		// 先删除emp_system.txt文件,把temp_emp_system.txt文件中的数据转存到emp_system.txt文件中,最后再删除temp_emp_system.txt文件
		if (remove("emp_system.txt") != 0) {
			perror("文件删除错误");
		}
		else {
			//puts("文件已成功删除");
			//创建文件流
			ofstream ofs;
			ifstream ifs;
			//打开文件,并判断文件是否打开成功
			ofs.open("emp_system.txt", ios::out);
			ifs.open("temp_emp_system.txt", ios::in);
			if (!ifs.is_open()) {
				cout << "文件打开失败";
			}
			char buff[1024] = { 0 };
			while (ifs.getline(buff, sizeof(buff))) {
				ofs << buff << "\n";
			}
			//关闭文件
			ofs.close();
			ifs.close();
			remove("temp_emp_system.txt");
		}
		cout << "数据更新完毕" << endl;
	}

	// 查找职工信息
	void searchData(string temp_emp) {
		// 把目标字符串进行分割
	/*	string target = "部门编号:123457 职工姓名:薇薇  所属部门:人事部";
		regex re("((\\W*\:)(\\d*))((\ \\W*\:)(\\W*))((\ \\W*\:)(\\W*))");
		smatch sm;
		regex_search(target, sm, re);
		for (int i = 0; i < sm.size(); i ++) {
			cout << "sm[" << i << "]: " << sm[i] << std::endl;
		}*/
		
		
		//创建文件流
		ifstream ifs;
		//打开文件,并判断文件是否打开成功
		ifs.open("emp_system.txt", ios::out);
		if (!ifs.is_open()) {
			cout << "===========     文件打开失败     ===========" << endl;
		}
		//读数据
		char buff[1024] = { 0 };
		string temp_data[LENGTH];
		int len = 1000;
		while (ifs.getline(buff, sizeof(buff))) {
			temp_data[LENGTH - len] = buff;
			len--;
		}
		//关闭文件
		ifs.close();
		//使用指针遍历数组
		string* p = temp_data;
		for (int i = 0; i < sizeof(temp_data) / sizeof(temp_data[0]); i++) {
			// *p != "" 去除空的数据
			if (*p != "") {
				//cout <<  *p << endl;
				regex reg("(\\W*\:)(\\d*)(\ \\W*\:)(\\W*)(\ \\W*\:)(\\W*)");
				string  reg_emp_num = regex_replace(*p, reg, "$2");
				string  reg_emp_name = regex_replace(*p, reg, "$4");
				reg_emp_name.erase(remove(reg_emp_name.begin(), reg_emp_name.end(), ' '), reg_emp_name.end());//给职员名字去空格
				//cout << reg_emp_name << ":" << temp_emp << endl;
				if (temp_emp == reg_emp_num || temp_emp == reg_emp_name) {
					//打印查询到的数据
					cout <<*p<< endl;
				}
			}
			*p++;
		}
		cout << "===========     数据已经读取完毕     ===========" << endl;
	}

	//数据排序
	void dataSort() {
		//创建文件流
		ifstream ifs;
		//打开文件,并判断文件是否打开成功
		ifs.open("emp_system.txt", ios::out);
		if (!ifs.is_open()) {
			cout << "===========     文件打开失败     ===========" << endl;
		}
		//读数据
		char buff[1024] = { 0 };
		string *temp_data, *emp_num;
		int len = 1000;
		temp_data = new string[len];
		emp_num = new string[len];
		int index = 0;
		while (ifs.getline(buff, sizeof(buff))) {
			string temp_buff = buff;
			int buff_len = temp_buff.length();
			//通过length 去除多余空数据
			if (buff_len > 0) {
				temp_data[LENGTH - len] = buff;
				regex reg("(\\W*\:)(\\d*)(\ \\W*\:)(\\W*)(\ \\W*\:)(\\W*)");
				string  reg_emp_num = regex_replace(buff, reg, "$2");
				emp_num[LENGTH - len] = reg_emp_num;
				len--;
			}
			index++;
			
		}
		//cout << index << "index" << endl;
		// 使用new 创建一个二维数组
		string (*all_emp_data)[2] = new string[index][2];
		//string all_emp_data[len][2];
		for (int i = 0; i < index; i++) {
			if (*temp_data != ""&& *emp_num != "") {
				all_emp_data[i][0] = emp_num[i];
				all_emp_data[i][1] = temp_data[i];
			}
		}


		for (int i = 0; i < index; i++) {
			for (int j = 1; j < index - 1; j++) {
				for (int k = 0; k < 2; k++) {
					if (all_emp_data[j][k] < all_emp_data[j - 1][k]) {
						string temp;
						temp = all_emp_data[j - 1][k];
						all_emp_data[j - 1][k] = all_emp_data[j][k];
						all_emp_data[j][k] = temp;
					}
				}
			}
		}

		// 释放数据内存
		delete []temp_data;
		delete []emp_num;
		delete []all_emp_data;

		// 清空文件emp_system.txt中原来的数据,把排好序的数据再添加到emp_system.txt 文件中

		//创建文件流
		ofstream  ofs;
		//打开文件
		ofs.open("emp_system.txt", ios::trunc);
		for (int i = 0; i < index; i++) {
			for (int j = 0; j < 2; j++) {	
				cout << all_emp_data[i][j] << endl;
				//把处理好的数据重新追加到emp_system.txt文件中
				ofs.open("emp_system.txt", ios::app);
				//写入数据 由于每行的第一列数据只有编号,不需要写进文件, 只要写入每行第二列的数据即可
				if (j == 1) {
					ofs << all_emp_data[i][j]<<"\n";
				}
				//关闭文件
				ofs.close();
			}
		}
		cout << "===========     数据已经排序完毕     ===========" << endl;
	}

	//清空数据
	void clearData() {
		//采用创建数据备份文件emp_system_copy.txt,复制文件emp_system.txt数据进去,然后清除掉emp_system.txt原来的数据,

		//创建文件流
		ifstream ifs;
		//打开文件,并判断文件是否打开成功
		ifs.open("emp_system.txt", ios::out);
		if (!ifs.is_open()) {
			cout << "===========     文件打开失败     ===========" << endl;
		}
		//读数据
		char buff[1024] = { 0 };
		string temp_data[LENGTH];
		int len = 1000;
		while (ifs.getline(buff, sizeof(buff))) {
			//cout << buff << endl;
			temp_data[LENGTH - len] = buff;
			len--;
		}
		//关闭文件
		ifs.close();


		//使用指针遍历数组 处理符号要求的数据存入临时文件temp_emp_system.txt,在处理数据前,不能删除emp_system.txt
		string* p = temp_data;
		for (int i = 0; i < sizeof(temp_data) / sizeof(temp_data[0]); i++) {
			// *p != "" 去除空的数据
			if (*p != "") {
					//把源文件中数据导入到备份文件中
					//创建文件流
					ofstream ofs;
					//创建文件
					ofs.open("emp_system_copy.txt", ios::app);
					//写入数据
					ofs << *p << "\n";
					//关闭文件
					ofs.close();
				
			}
			*p++;
		}
		//创建文件流
		ofstream ofs;
		//打开文件,并清空里面的数据
		ofs.open("emp_system.txt", ios::trunc);
		//关闭文件
		ofs.close();
		cout << "===========     数据已经清空完成     ===========" << endl;
	}
	// 判断数据文件是否为空
	void isEmpty() {
		cout << "\t" << "								  " << endl;
		cout << "\t" << "	=====        ==  ==========   " << endl;
		cout << "\t" << "	==  ==       ==  ===    ===   " << endl;
		cout << "\t" << "	==   ==      ==  ===    ===   " << endl;
		cout << "\t" << "	==    ==     ==  ===    ===   " << endl;
		cout << "\t" << "	==     ==    ==  ===    ===   " << endl;
		cout << "\t" << "	==      ==   ==  ===    ===   " << endl;
		cout << "\t" << "	==       ==  ==  ===    ===   " << endl;
		cout << "\t" << "	==        =====  ==========   " << endl;
		cout << "\t" << "								  " << endl;
	}
};

// 员工管理
class Manage {
public:
	virtual void exitSystem(int num) = 0;
	virtual void addEmployee(int num) = 0;
	virtual void showEmployee(int num) = 0;
	virtual void deleteEmployee(int num) = 0;
	virtual void changeEmployee(int num) = 0;
	virtual void findEmployee(int num) = 0;
	virtual void employeeSort(int num) = 0;
	virtual void clearWord(int num) = 0;
	virtual ~Manage() {
		if (m_emp_num != NULL && m_emp_name != NULL && m_emp_department != NULL) {
			delete m_emp_num;
			delete m_emp_name;
			delete m_emp_department;
			 m_emp_num = NULL;
			 m_emp_name = NULL;
			 m_emp_department = NULL;
		}
	}
	string *m_emp_num;
	string *m_emp_name;
	string *m_emp_department;
};

// 创建员工类
class Employee :public Manage {
public:
	
	FileManage fm;
	void exitSystem(int num) {

		Sleep(10);
		cout << "退出系统" << endl;
		exit(0);
	}
	void addEmployee(int num) {
		cout << "==================     添加职工信息     ==================" << endl;
		string emp_num;
		string emp_name;
		string emp_department;

		cout << "\t职工编号:";
		cin >> emp_num;
		cout << "\t职工姓名:";
		cin >> emp_name;
		cout << "\t职工部门:";
		cin >> emp_department;

		m_emp_num = new string(emp_num);
		m_emp_name = new string(emp_name);
		m_emp_department = new string(emp_department);
		string temp = "部门编号:" + emp_num + " 职工姓名:" + emp_name + "  所属部门:" + emp_department;
		fm.writeData(temp);
	}
	void showEmployee(int num) {
		cout << "==================     显示职工信息     ==================" << endl;
		fm.readData();
		
	}
	void deleteEmployee(int num) {
		cout << "==================     删除职工信息     ==================" << endl;
		cout << "\n\t 请输入需要删除的员工编号:";
		string temp_emp_num;
		cin >> temp_emp_num;
		fm.deleteData(temp_emp_num);
	}
	void changeEmployee(int num) {
		cout << "==================     修改职工信息     ==================" << endl;
		cout << "\n\t 请输入需要修改的员工编号:";
		string temp_emp_num;
		cin >> temp_emp_num;
		string change_emp_name;
		string change_emp_department;
		cout << "\t请输入职员新的姓名:";
		cin >> change_emp_name;
		cout << "\t请输入职员新的部门:";
		cin >> change_emp_department;
		fm.changeData(temp_emp_num,change_emp_name, change_emp_department);
	}
	void findEmployee(int num) {
		cout << "==================     查找职工信息     ==================" << endl;
		cout << "\n\t 请输入需要查找的员工编号或姓名:";
		string temp_emp;
		cin >> temp_emp;
		fm.searchData(temp_emp);
	}
	void employeeSort(int num) {
		cout << "==============     按编号进行职工排序     ================" << endl;
		fm.dataSort();
		cout << "\t数据排序完成,输入2可以查看" << endl;
	}
	void clearWord(int num) {
		cout << "==================     清空所有文档     ==================" << endl;
		cout << "\t数据清空前,系统会默认备份数据" << endl;
		fm.clearData();
		cout << "备份数据完成,即将清空数据文件" << endl;
		cout << "\n\n===========     数据已经清空完成     ===========" << endl;
	}
	~Employee() {
		if (m_emp_num != NULL && m_emp_name != NULL && m_emp_department != NULL) {
			delete m_emp_num;
			delete m_emp_name;
			delete m_emp_department;
			m_emp_num = NULL;
			m_emp_name = NULL;
			m_emp_department = NULL;
		}
	}
};

void  manageSystem() {
	cout << "=======================================================" << endl;
	cout << "=======         欢迎使用职工管理系统        ===========" << endl;
	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;
	Manage* manage = new Employee;
	int num;
	while (true)
	{	
		cout << "请输入操作序号:" << endl;
		cin >> num;
		switch (num)
		{
		case 0: // 退出系统
			manage->exitSystem(num);
			break;
		case 1: // 添加
			manage->addEmployee(num);
			break;
		case 2: // 显示
			manage->showEmployee(num);
			break;
		case 3: // 删除
			manage->deleteEmployee(num);
			break;
		case 4: // 修改
			manage->changeEmployee(num);
			break;
		case 5: // 查找
			manage->findEmployee(num);
			break;
		case 6: // 排序
			manage->employeeSort(num);
			break;
		case 7: // 清空
			manage->clearWord(num);
			break;
		}

	}
}

 
void main() {
	manageSystem();
	system("pause");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值