IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> IT公司职工管理系统——————C++文件交互式的项目实现】 -> 正文阅读

[C++知识库]IT公司职工管理系统——————C++文件交互式的项目实现】

职工管理项目模型在编程作业随处可见,如【学生信息管理系统】、【图书馆管理系统】等等
这里给出【IT公司职工管理系统】的实现👇
在这里插入图片描述
系统要求描述:
有一家小小的IT公司,只有三类员工:普通程序员、项目经理、公司董事,每个员工只有编号ID、姓名、代表职位的dID(1,2,3)。
要求你制作一个完善职工管理系统:
实现添加、查找、删除、清空、修改等操作

由于这是公司所用,不能使用那种只能使用一下的临时程序🌀

1.单文件?

/*
IT公司员工分为三类:普通程序员、项目经理、董事,显示信息时,需要显示职工编号、职工姓名、职工岗位,以及职责
普通程序员:完成项目经理交给的任务
项目经理职责:完成老板的任务并且下发任务给员工
董事职责:管理公司所有任务

职工岗位用1,2,3表示,代表三类员工

*/
//-------------------------------------
//-------------------------------------
#include<iostream>
#include<string>
using namespace std;
#include<fstream>
constexpr auto myFILE = "empFile.txt"; //对非VS,如CB、DV玩家,使用#define myFILE "empFile.txt"
typedef unsigned int ui;
//-----------------------------------职工类设计-----------------------
//员工基类
class Worker {
public:
	Worker(ui id, string name, string dId) :m_id(id), m_name(name), m_DeptId(dId) {}
	//显示员工个人信息
	virtual void showInfo() = 0;
	//获取岗位名称
	virtual string getDeptName() = 0;
	ui m_id;//职工编号
	string m_name;//职工姓名
	string m_DeptId;//职工所在部门编号

};

//------------------普通程序员类
class Employee :public Worker {
public:
	//普通程序员的构造函数
	Employee(ui id, string name, string dId) :Worker(id, name, dId) {}
	//显示普通程序员的个人信息
	void showInfo() {
		cout << "职工编号:" << this->m_id
			<< "\t职工姓名:" << this->m_name
			<< "\t岗位:" << this->getDeptName()
			<< "\t岗位职责:完成经理交给的项目,满足客户需求" << endl;
	}
	//获取岗位名称
	string getDeptName() {
		return string("普通程序员");
	}
};

//------------------项目经理类
class Manager :public Worker {
public:
	//项目经理的构造函数
	Manager(ui id, string name, string dId) :Worker(id, name, dId) {}
	//显示项目经理的个人信息
	void showInfo() {
		cout << "职工编号:" << this->m_id
			<< "\t职工姓名:" << this->m_name
			<< "\t岗位:" << this->getDeptName()
			<< "\t岗位职责:完成老板的任务,下发任务给普通程序员" << endl;
	}
	//获取岗位名称
	string getDeptName() {
		return string("项目经理");
	}
};

//------------------老板类
class Boss :public Worker {
public:
	//董事的构造函数
	Boss(ui id, string name, string dId) :Worker(id, name, dId) {}
	//显示董事的个人信息
	void showInfo() {
		cout << "职工编号:" << this->m_id
			<< "\t职工姓名:" << this->m_name
			<< "\t岗位:" << this->getDeptName()
			<< "\t岗位职责:管理公司职责,全局掌控,发布任务" << endl;
	}
	//获取岗位名称
	string getDeptName() {
		return string("IT公司董事");
	}
};
//-----------------职工类实现完毕!!!






//---------------------------------系统接口API设计-----------------------
class workerManager
{
private://敏感文件
	int m_EmpNum;
	Worker** m_Emparray;
	bool m_FileIsEmpty;
	void save() {//保存文件
		ofstream ofs;
		ofs.open(myFILE, 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;
			cout << "Id为" << this->m_Emparray[i]->m_id << "的员工" << "保存成功" << endl;
		}
		ofs.close();
		return;
	}
	void up_qssort(Worker** m_Emparray, int l, int r) {
		int i = l, j = r, flag = this->m_Emparray[l + (r - l) / 2]->m_id;//先选出标杆flag
		do {
			while (this->m_Emparray[i]->m_id < flag)i++;//从左找比标杆大的数
			while (this->m_Emparray[j]->m_id > flag)j--;//从右找比标杆小的数
			if (i <= j) {//位置不匹配的元素,交换
				swap(this->m_Emparray[i]->m_id, this->m_Emparray[j]->m_id);
				i++;
				j--;
			}
		} while (i <= j);
		if (l < j)up_qssort(m_Emparray, l, j);
		if (i < r)up_qssort(m_Emparray, i, r);
	}
	void low_qssort(Worker** m_Emparray, int l, int r) {
		int i = l, j = r, flag = this->m_Emparray[l + (r - l) / 2]->m_id;//先选出标杆flag
		do {
			while (this->m_Emparray[i]->m_id > flag)i++;//从左找比标杆小的数
			while (this->m_Emparray[j]->m_id < flag)j--;//从右找比标杆大的数
			if (i <= j) {//位置不匹配的元素,交换
				swap(this->m_Emparray[i]->m_id, this->m_Emparray[j]->m_id);
				i++;
				j--;
			}
		} while (i <= j);
		if (l < j)low_qssort(m_Emparray, l, j);
		if (i < r)low_qssort(m_Emparray, i, r);
	}
public:

	//构造函数,三种情况,分别判断
	workerManager() {
		ifstream ifs;
		ifs.open(myFILE, ios::in);//读文件
		if (!ifs.is_open()) {//情况一:文件未创建,即文件不存在
			//初始化属性
			cout << "-----------------------------------------------------" << endl;
			cout << "提示:--!!!文件未创建,运行系统可自动生成!!! --" << endl;
			cout << "-----------------------------------------------------" << endl;
			this->m_EmpNum = 0;     //人数为0
			this->m_Emparray = NULL;//指针数组为空
			this->m_FileIsEmpty = true;//初始化文件为空
			ifs.close();
			return;
		}
		//2.文件存在,但数据为空
		char ch;
		ifs >> ch;
		if (ifs.eof()) {
			cout << "--------------------------------------------------------" << endl;
			cout << "提示:--!!!职工管理文件为空,等待添加数据信息!!!--" << endl;
			cout << "--------------------------------------------------------" << endl;
			this->m_EmpNum = 0;     //人数为0
			this->m_Emparray = NULL;//指针数组为空
			this->m_FileIsEmpty = true;//初始化文件为空
			ifs.close();
			return;
		}
		//3.文件存在,数据存在时,需要我们进行一下数据的保存
		int num = this->get_EmpNum();
		cout << "--------------------------------------------------------" << endl;
		cout << "提示:--《《《我公司现有的员工为:" << num << "位》》》  ---" << endl;
		cout << "--------------------------------------------------------" << endl;
		this->m_EmpNum = num;
		this->m_Emparray = new Worker * [this->m_EmpNum];//开辟空间,将文件中的数据存到数组中
		this->init_Emp();
	}
	void init_Emp() {
		ifstream ifs;
		ifs.open(myFILE, ios::in);
		ui id;
		string name;
		string 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 Manager(id, name, dId);
			}
			else {
				worker = new Boss(id, name, dId);
			}
			this->m_Emparray[index++] = worker;
		}
		//关闭文件
		ifs.close();
	}
	int get_EmpNum() {
		ifstream ifs;
		ifs.open(myFILE, ios::in);//读文件
		ui id;
		string name;
		string dId;
		int cnt = 0;
		while (ifs >> id && ifs >> name && ifs >> dId) {
			//统计人数
			cnt++;
		}
		return cnt;
	}
	int Find_worker(int id) {//遍历查找职工,返回其在数组中的位置,找不到则返回-1
		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;
	}
	//-----------------------------------------------------------------------------------
	//显示菜单
	void Show_Menu() {
		cout << "                      《开始菜单》                 " << endl;
		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 << "    **********   |   8.现有员工总数   |    ********" << endl;
		cout << "    **********   ----------------------    ********" << endl;
		cout << "    ***********************************************" << endl;

	}
	//-------------------------------------------------------------------------------------



	//---------------------------------------------------------------------------------
	//程序执行操作——
	void Start() {
		while (true) {
			this->Show_Menu();
			cout << endl;
			cout << "Acting.........." << endl;
			cout << "    **********   -------请输入选项------     ******" << endl;
			int select;
			cin >> select;
			switch (select)
			{
			case 0:         //退出系统
				this->exitSystem();
				break;
			case 1:        //添加职工
				this->Add_Emp();
				break;
			case 2:        //显示职工
				this->Show_Emp();
				break;
			case 3:        //删除职工
				this->del_Emp();
				break;
			case 4:        //修改职工
				this->Mod_Emp();
				break;
			case 5:        //查找职工
				this->Find_theEmp();
				break;
			case 6:        //按职工编号排序职工
				this->Sort_Emp();
				break;
			case 7:        //清空职工档案
				this->Clean_file();
				break;
			case 8:        //显示现有的职工总数
				this->gettotal();
				break;
			default:
				cout << "无此类选项,请确认后重新输入!" << endl;
				system("pause");
				system("cls");
				break;
			}

		}


	}
	//----------------------------------------------

	//-------------------------------------------------------------------------------------
	//0.退出系统
	void exitSystem() {
		cout << "确定退出吗?再次输入0可取消此次操作" << endl;
		bool jd;
		cin >> jd;
		if (jd) {
			cout << "------已退出系统,欢迎下次使用--------" << endl;
			system("pause");
			exit(0);
		}
		else {
			cout << "-------成功取消本次操作,系统继续执行------" << endl;
			system("pause");
			system("cls");
			return;
		}
	}
	//----------------------------------------------------

	//------------------------------------------------------------------
	//1.添加新入职的员工
	void Add_Emp() {
		cout << "   请输入所添加员工的数量:" << endl;
		int addNum = 0;//输入的数量
		cin >> addNum;
		while (addNum <= 0) {
			cout << "输入错误,请重新输入!!!" << endl;
			cin >> addNum;
		}
		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];
			}
		}
		//批量添加新数据
		cout << "执行添加操作!____..." << endl;
		for (int i = 0; i < addNum; i++) {
			ui id;
			string name;
			string dSelect;
			Worker* worker = NULL;//临时的职工
			cout << "请输入第 " << i + 1 << " 个新员工的编号(数字形式): " << endl;
			cin >> id;
			int index = this->Find_worker(id);
			while (index != -1) {
				cout << "wrong!系统已存在此Id,请重新输入!----【注:按照数字形式输入】" << endl;
				cin >> id;
				index = this->Find_worker(id);
			}
			cout << "请输入第 " << i + 1 << " 个新员工的姓名: " << endl;
			cin >> name;
			cout << "请选择该职工的岗位:" << endl;
			cout << "1.普通程序员" << endl;
			cout << "2.项目经理" << endl;
			cout << "3.公司董事" << endl;
			cin >> dSelect;
			while (dSelect != "1" && dSelect != "2" && dSelect != "3") {
				cout << "选项输入错误,请按照规则重新输入!!!" << endl;
				cin >> dSelect;
			}
			if (dSelect == "1") {
				worker = new Employee(id, name, "1");
			}
			else if (dSelect == "2") {
				worker = new Manager(id, name, "2");
			}
			else {
				worker = new Boss(id, name, "3");
			}

			newSpace[this->m_EmpNum + i] = worker;
			cout << "--------已成功添加一个新员工!!!--------" << endl;
			cout << endl;
		}
		//释放原有的空间
		delete[]this->m_Emparray;
		//更改新空间的指向
		this->m_Emparray = newSpace;
		//更新新的职工人数
		this->m_EmpNum = newSize;
		//提示添加成功
		cout << "成功添加 " << addNum << " 位新职工" << endl;
		this->m_FileIsEmpty = false;//更新系统文件为非空
		this->save();//保存数据
		system("pause");
		system("cls");
		return;
	}
	//----------
	//----------------------------------------------------------------
	//2.显示职工信息
	void Show_Emp() {
		if (this->m_FileIsEmpty) {
			cout << "系统暂无职工信息或者未创建文件!!!" << endl;
		}
		else {
			for (int i = 0; i < this->m_EmpNum; i++) {
				//利用多态调用程序接口
				this->m_Emparray[i]->showInfo();//注意,输中文的话可能有乱码出现,这里要自行修改一下txt文件设置
			}
		}
		system("pause");
		system("cls");//按任意键后清屏
		return;
	}
	//----------------
	//-----------------------------------------------------------------
	//3.删除离职员工
	void del_Emp() {
		if (this->m_FileIsEmpty) {
			cout << "系统暂无职工信息或者未创建文件!!!" << endl;
			return;
		}
		int id;
		cout << "请输入想要删除的职工编号(数字串形式)———" << endl;
		cin >> id;
		int index = this->Find_worker(id);
		if (index == -1)cout << "删除失败!系统暂未录入该员工的信息!" << endl;
		else {
			//用数据前移,对指定元素进行删除!
			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;
		}
		system("pause");
		system("cls");
		return;
	}
	//-------------------------
	//----------------------------------------------------------------
	//4.修改职工信息
	void Mod_Emp() {
		if (this->m_FileIsEmpty) {
			cout << "系统暂无职工信息或者未创建文件!!!" << endl;
			return;
		}
		int id;
		cout << "请输入想要修改的职工编号(数字串形式)———" << endl;
		cin >> id;
		int index = this->Find_worker(id);
		if (index == -1)cout << "无法修改!系统暂未录入该员工的信息!" << endl;
		else {
			delete this->m_Emparray[index];
			ui new_id;
			string new_name;
			string new_dId;
			cout << "已查到:Id为" << id << "的职工!执行修改操作——";
			cout << "请输入新的Id..." << endl;
			cin >> new_id;
			cout << "请输入新的姓名..." << endl;
			cin >> new_name;
			cout << "请输入新的岗位编号..." << endl;
			cout << "请选择该职工的岗位:" << endl;
			cout << "1.普通程序员" << endl;
			cout << "2.项目经理" << endl;
			cout << "3.公司董事" << endl;
			cin >> new_dId;
			while (new_dId != "1" && new_dId != "2" && new_dId != "3") {
				cout << "选项输入错误,请按照规则重新输入!!!" << endl;
				cin >> new_dId;
			}
			Worker* worker = NULL;
			if (new_dId == "1") {
				worker = new Employee(new_id, new_name, "1");
			}
			else if (new_dId == "2") {
				worker = new Manager(new_id, new_name, "2");
			}
			else {
				worker = new Boss(new_id, new_name, "3");
			}
			this->m_Emparray[index] = worker;
			cout << "|||修改成功|||" << endl;
			this->save();//保存到文件中
		}
		system("pause");
		system("cls");
		return;
	}
	//----------------------------
	//5.查找某员工的信息
	void Find_theEmp() {
		if (this->m_FileIsEmpty) {
			cout << "系统暂无职工信息或者未创建文件!!!" << endl;
			system("puase");
			system("cls");
			return;
		}
		cout << "请输入您想要的查找方式..." << endl;
		cout << "1.按Id查找  ------  2.按职工姓名查找" << endl;
		cout << "选择..." << endl;
		string select;
		cin >> select;
		while (select != "1" && select != "2") {
			cout << "选项输入错误!请正确输入 1|2 !" << endl;
			cin >> select;
		}
		if (select == "1") {//按Id查
			int id;
			cout << "请输入要【查找】职工的编号:" << endl;
			cin >> id;
			int index = this->Find_worker(id);
			if (index == -1)cout << "系统暂未录入该Id的职工信息!" << endl;
			else {
				//找到职工
				cout << "查找成功!该员工的信息如下——" << endl;
				this->m_Emparray[index]->showInfo();
			}

		}
		else {//按姓名查
			string name;
			bool no_nameflag = true;
			cout << "请输入所要查找的姓名:" << endl;
			cin >> name;
			for (int i = 0; i < this->m_EmpNum; i++) {
				if (this->m_Emparray[i]->m_name == name) {
					no_nameflag = false;
					cout << "查找成功!" << endl;
					this->m_Emparray[i]->showInfo();//调用显示信息的接口
				}
			}
			if (no_nameflag)cout << "姓名为:" << name << "的员工暂未录入系统!" << endl;
		}
		system("pause");
		system("cls");
		return;
	}
	//--------------------------------
	//----------------------------------------------------------------
	// 6.对员工排序
	void Sort_Emp() {
		if (this->m_FileIsEmpty) {
			cout << "系统暂无职工信息或者未创建文件" << endl;
			system("pause");
			system("cls");
			return;
		}
		cout << "请选择排序方式..." << endl;
		cout << "0  降序/ 1 升序" << endl;
		bool isupp;
		cin >> isupp;
		if (isupp) {
			this->up_qssort(this->m_Emparray, 0, this->m_EmpNum - 1);
		}
		else {
			this->low_qssort(this->m_Emparray, 0, this->m_EmpNum - 1);
		}
		cout << "排序完毕!!!" << endl;
		this->save();
		system("pause");
		system("cls");
		return;
	}
	//-----------------------
	//----------------------------------------------------------------
	//7.清空文件
	void Clean_file() {
		cout << "确认清空?" << endl;
		cout << "1.确定" << endl;
		cout << "0.取消" << endl;
		bool jd;
		cin >> jd;
		if (jd) {
			//清空文件
			ofstream ofs(myFILE, ios::trunc);//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");
			return;
		}
	}
	//----------------------------------------------------------------
	//8.显示职工总数 
	void gettotal() {
		cout << "公司现有的员工总数为:" << this->m_EmpNum << endl;
		system("pause");
		system("cls");
		return;
	}
	//-------------------------
	//析构函数,回收操作
	~workerManager() {
		if (this->m_Emparray != NULL) {
			for (int i = 0; i < this->m_EmpNum; i++) {
				if (this->m_Emparray[i] != NULL)delete this->m_Emparray[i];
			}
		}
		delete[] this->m_Emparray;
		this->m_Emparray = NULL;
	}
};
using namespace std;
int main() {
	workerManager works;
	works.Start();
	system("pause");
	return 0;
}


🐉🐉🐴🐴分割线------------------



2.双(多)文件?

【1】workerManager.h

#pragma once        //防止头文件重复包含
#include<iostream>
#include<string>
using namespace std;
#include<fstream>
constexpr auto myFILE ="empFile.txt"; //对非VS,如CB、DV玩家,使用#define myFILE "empFile.txt"
typedef unsigned int ui;
//-----------------------------------职工类设计-----------------------
//员工基类
class Worker {
public:    
	Worker(ui id, string name, string dId):m_id(id),m_name(name),m_DeptId(dId){}
	//显示员工个人信息
	virtual void showInfo() = 0;
	//获取岗位名称
	virtual string getDeptName() = 0;
	ui m_id;//职工编号
	string m_name;//职工姓名
	string m_DeptId;//职工所在部门编号

};

//------------------普通程序员类
class Employee :public Worker {
public:
	//普通程序员的构造函数
	Employee(ui id, string name, string dId):Worker(id,name,dId){}
	//显示普通程序员的个人信息
	void showInfo() {
		cout << "职工编号:" << this->m_id
			<< "\t职工姓名:" << this->m_name
			<< "\t岗位:" << this->getDeptName()
			<< "\t岗位职责:完成经理交给的项目,满足客户需求" << endl;
	 }
	//获取岗位名称
	string getDeptName() {
		return string("普通程序员");
	}
};

//------------------项目经理类
class Manager :public Worker {
public:
	//项目经理的构造函数
	Manager(ui id, string name, string dId) :Worker(id, name, dId) {}
	//显示项目经理的个人信息
	void showInfo() {
		cout << "职工编号:" << this->m_id
			<< "\t职工姓名:" << this->m_name
			<< "\t岗位:" << this->getDeptName()
			<< "\t岗位职责:完成老板的任务,下发任务给普通程序员" << endl;
	}
	//获取岗位名称
	string getDeptName() {
		return string("项目经理");
	}
};

//------------------老板类
class Boss :public Worker {
public:
	//董事的构造函数
	Boss(ui id, string name, string dId) :Worker(id, name, dId) {}
	//显示董事的个人信息
	void showInfo() {
		cout << "职工编号:" << this->m_id
			<< "\t职工姓名:" << this->m_name
			<< "\t岗位:" << this->getDeptName()
			<< "\t岗位职责:管理公司职责,全局掌控,发布任务" << endl;
	}
	//获取岗位名称
	string getDeptName() {
		return string("IT公司董事");
	}
};
//-----------------职工类实现完毕!!!






//---------------------------------系统接口API设计-----------------------
class workerManager
{
private://敏感文件
	int m_EmpNum;
	Worker** m_Emparray;
	bool m_FileIsEmpty;
	void save() {//保存文件
		ofstream ofs;
		ofs.open(myFILE,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;
			cout << "Id为" << this->m_Emparray[i]->m_id << "的员工" << "保存成功" << endl;
		}
		ofs.close();
		return;
	}
	void up_qssort(Worker** m_Emparray, int l, int r) {
		int i = l, j = r, flag = this->m_Emparray[l + (r - l) / 2]->m_id;//先选出标杆flag
		do {
			while (this->m_Emparray[i]->m_id < flag)i++;//从左找比标杆大的数
			while (this->m_Emparray[j]->m_id  > flag)j--;//从右找比标杆小的数
			if (i <= j) {//位置不匹配的元素,交换
				swap(this->m_Emparray[i]->m_id, this->m_Emparray[j]->m_id);
				i++;
				j--;
			}
		} while (i <= j);
		if (l < j)up_qssort(m_Emparray, l, j);
		if (i < r)up_qssort(m_Emparray, i, r);
	}
	void low_qssort(Worker** m_Emparray, int l, int r) {
		int i = l, j = r, flag = this->m_Emparray[l + (r - l) / 2]->m_id;//先选出标杆flag
		do {
			while (this->m_Emparray[i]->m_id > flag)i++;//从左找比标杆小的数
			while (this->m_Emparray[j]->m_id < flag)j--;//从右找比标杆大的数
			if (i <= j) {//位置不匹配的元素,交换
				swap(this->m_Emparray[i]->m_id, this->m_Emparray[j]->m_id);
				i++;
				j--;
			}
		} while (i <= j);
		if (l < j)low_qssort(m_Emparray, l, j);
		if (i < r)low_qssort(m_Emparray, i, r);
	}
public:
	
	//构造函数,三种情况,分别判断
	workerManager() {
		ifstream ifs;
		ifs.open(myFILE, ios::in);//读文件
		if (!ifs.is_open()) {//情况一:文件未创建,即文件不存在
			//初始化属性
			cout << "-----------------------------------------------------" << endl;
			cout << "提示:--!!!文件未创建,运行系统可自动生成!!! --" << endl;
			cout << "-----------------------------------------------------" << endl;
			this->m_EmpNum = 0;     //人数为0
			this->m_Emparray = NULL;//指针数组为空
			this->m_FileIsEmpty = true;//初始化文件为空
			ifs.close();
			return;
		}
		//2.文件存在,但数据为空
		char ch;
		ifs >> ch;
		if (ifs.eof()) {
			cout << "--------------------------------------------------------" << endl;
			cout << "提示:--!!!职工管理文件为空,等待添加数据信息!!!--" << endl;
			cout << "--------------------------------------------------------" << endl;
			this->m_EmpNum = 0;     //人数为0
			this->m_Emparray = NULL;//指针数组为空
			this->m_FileIsEmpty = true;//初始化文件为空
			ifs.close();
			return;
		}
		//3.文件存在,数据存在时,需要我们进行一下数据的保存
		int num = this->get_EmpNum();
		cout << "--------------------------------------------------------" << endl;
		cout << "提示:--《《《我公司现有的员工为:"<<num<<"位》》》  ---" << endl;
		cout << "--------------------------------------------------------" << endl;
		this->m_EmpNum = num;
		this->m_Emparray = new Worker * [this->m_EmpNum];//开辟空间,将文件中的数据存到数组中
		this->init_Emp();
	}
	void init_Emp() {
		ifstream ifs;
		ifs.open(myFILE,ios::in);
		ui id;
		string name;
		string 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 Manager(id, name, dId);
			}
			else {
				worker = new Boss(id, name, dId);
			}
			this->m_Emparray[index++] = worker;
		}
		//关闭文件
		ifs.close();
	}
	int get_EmpNum() {
		ifstream ifs;
		ifs.open(myFILE, ios::in);//读文件
		ui id;
		string name;
		string dId;
		int cnt = 0;
		while (ifs >> id && ifs >> name && ifs >> dId) {
			//统计人数
			cnt++;
		}
		return cnt;
	}
	int Find_worker(int id) {//遍历查找职工,返回其在数组中的位置,找不到则返回-1
		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;
	}
	//-----------------------------------------------------------------------------------
	//显示菜单
	void Show_Menu() {
		cout << "                      《开始菜单》                 " << endl;
		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 << "    **********   |   8.现有员工总数   |    ********" << endl;
		cout << "    **********   ----------------------    ********" << endl;
		cout << "    ***********************************************" << endl;

	}
	//-------------------------------------------------------------------------------------



	//---------------------------------------------------------------------------------
	//程序执行操作——
	void Start() {
		while (true) {
			this->Show_Menu();
			cout << endl;
			cout << "Acting.........." << endl;
			cout << "    **********   -------请输入选项------     ******" << endl;
			int select;
			cin >> select;
			switch (select)
			{
			case 0:         //退出系统
				this->exitSystem();
				break;       
			case 1:        //添加职工
				this->Add_Emp();
				break;
			case 2:        //显示职工
				this->Show_Emp();
				break;
			case 3:        //删除职工
				this->del_Emp();
				break;
			case 4:        //修改职工
				this->Mod_Emp();
				break;
			case 5:        //查找职工
				this->Find_theEmp();
				break; 
			case 6:        //按职工编号排序职工
				this->Sort_Emp();
				break;
			case 7:        //清空职工档案
				this->Clean_file();
				break;
			case 8:        //显示现有的职工总数
				this->gettotal();
				break;
			default:
				cout << "无此类选项,请确认后重新输入!" << endl;
				system("pause");
				system("cls");
				break;
			}

		}


	}
	//----------------------------------------------
	
	//-------------------------------------------------------------------------------------
	//0.退出系统
	void exitSystem() {
		cout << "确定退出吗?再次输入0可取消此次操作" << endl;
		bool jd;
		cin >> jd;
		if (jd) {
			cout << "------已退出系统,欢迎下次使用--------" << endl;
			system("pause");
			exit(0);
		}
		else {
			cout << "-------成功取消本次操作,系统继续执行------" << endl;
			system("pause");
			system("cls");
			return;
		}
	}
	//----------------------------------------------------
	
	//------------------------------------------------------------------
	//1.添加新入职的员工
	void Add_Emp() {
		cout << "   请输入所添加员工的数量:" << endl;
		int addNum = 0;//输入的数量
		cin >> addNum;
		while (addNum <=0) { 
			cout << "输入错误,请重新输入!!!" << endl;
			cin >> addNum; 
		}
		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];
			}
		}
		//批量添加新数据
		cout << "执行添加操作!____..." << endl;
		for (int i = 0; i < addNum; i++) {
			ui id;
			string name;
			string dSelect;
			Worker* worker = NULL;//临时的职工
			cout << "请输入第 " << i + 1 << " 个新员工的编号(数字形式): " << endl;
			cin >> id;
			int index = this->Find_worker(id);
			while(index != -1) {
				cout << "wrong!系统已存在此Id,请重新输入!----【注:按照数字形式输入】" << endl;
				cin >> id;
				index = this->Find_worker(id);
			}
			cout << "请输入第 " << i + 1 << " 个新员工的姓名: " << endl;
			cin >> name;
			cout << "请选择该职工的岗位:" << endl;
			cout << "1.普通程序员" << endl;
			cout << "2.项目经理" << endl;
			cout << "3.公司董事" << endl;
			cin >> dSelect;
			while (dSelect != "1" && dSelect != "2" && dSelect != "3") {
				cout << "选项输入错误,请按照规则重新输入!!!" << endl;
				cin >> dSelect;
			}
			if (dSelect == "1") {
				worker = new Employee(id, name, "1");
			}
			else if (dSelect == "2") {
				worker = new Manager(id, name, "2");
			}
			else {
				worker = new Boss(id, name, "3");
			}

			newSpace[this->m_EmpNum + i] = worker;
			cout << "--------已成功添加一个新员工!!!--------" << endl;
			cout << endl;
		}
		//释放原有的空间
		delete[]this->m_Emparray;
		//更改新空间的指向
		this->m_Emparray = newSpace;
		//更新新的职工人数
		this->m_EmpNum = newSize;
		//提示添加成功
		cout << "成功添加 " << addNum << " 位新职工" << endl;
		this->m_FileIsEmpty = false;//更新系统文件为非空
		this->save();//保存数据
		system("pause");
		system("cls");
		return;
	}
	//----------
	//----------------------------------------------------------------
	//2.显示职工信息
	void Show_Emp(){
		if (this->m_FileIsEmpty) {
			cout << "系统暂无职工信息或者未创建文件!!!" << endl;
		}
		else {
			for (int i = 0; i < this->m_EmpNum; i++) {
				//利用多态调用程序接口
				this->m_Emparray[i]->showInfo();//注意,输中文的话可能有乱码出现,这里要自行修改一下txt文件设置
			}
		}
		system("pause");
		system("cls");//按任意键后清屏
		return;
	}
	//----------------
	//-----------------------------------------------------------------
	//3.删除离职员工
	void del_Emp() {
		if (this->m_FileIsEmpty) {
			cout << "系统暂无职工信息或者未创建文件!!!" << endl;
			return;
		}
		int id;
		cout << "请输入想要删除的职工编号(数字串形式)———" << endl;
		cin >> id;
		int index = this->Find_worker(id);
		if (index ==-1)cout << "删除失败!系统暂未录入该员工的信息!" << endl;
		else {
			//用数据前移,对指定元素进行删除!
			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;
		}
		system("pause");
		system("cls");
		return;
	}
	//-------------------------
	//----------------------------------------------------------------
	//4.修改职工信息
	void Mod_Emp() {
		if (this->m_FileIsEmpty) {
			cout << "系统暂无职工信息或者未创建文件!!!" << endl;
			return;
		}
		int id;
		cout << "请输入想要修改的职工编号(数字串形式)———" << endl;
		cin >> id;
		int index = this->Find_worker(id);
		if (index == -1)cout << "无法修改!系统暂未录入该员工的信息!" << endl;
		else {
			delete this->m_Emparray[index];
			ui new_id;
			string new_name;
			string new_dId;
			cout << "已查到:Id为" << id << "的职工!执行修改操作——";
			cout << "请输入新的Id..." << endl;
			cin >> new_id;
			cout << "请输入新的姓名..." << endl;
			cin >> new_name;
			cout << "请输入新的岗位编号..." << endl;
			cout << "请选择该职工的岗位:" << endl;
			cout << "1.普通程序员" << endl;
			cout << "2.项目经理" << endl;
			cout << "3.公司董事" << endl;
			cin >> new_dId;
			while (new_dId != "1" && new_dId != "2" && new_dId != "3") {
				cout << "选项输入错误,请按照规则重新输入!!!" << endl;
				cin >> new_dId;
			}
			Worker* worker = NULL;
			if (new_dId == "1") {
				worker = new Employee(new_id, new_name, "1");
			}
			else if (new_dId == "2") {
				worker = new Manager(new_id,new_name, "2");
			}
			else {
				worker = new Boss(new_id, new_name, "3");
			}
			this->m_Emparray[index] = worker;
			cout << "|||修改成功|||" << endl;
			this->save();//保存到文件中
		}
		system("pause");
		system("cls");
		return;
	}
	//----------------------------
	//5.查找某员工的信息
	void Find_theEmp() {
		if (this->m_FileIsEmpty) {
			cout << "系统暂无职工信息或者未创建文件!!!" << endl;
			system("puase");
			system("cls");
			return;
		}
		cout << "请输入您想要的查找方式..." << endl;
		cout << "1.按Id查找  ------  2.按职工姓名查找" << endl;
		cout << "选择..." << endl;
		string select;
		cin >> select;
		while (select != "1" && select != "2") {
			cout << "选项输入错误!请正确输入 1|2 !" << endl;
			cin >> select;
		}
		if (select == "1") {//按Id查
			int id;
			cout << "请输入要【查找】职工的编号:" << endl;
			cin >> id;
			int index = this->Find_worker(id);
			if (index == -1)cout << "系统暂未录入该Id的职工信息!" << endl;
			else {
				//找到职工
				cout << "查找成功!该员工的信息如下——" << endl;
				this->m_Emparray[index]->showInfo();
			}

		}
		else {//按姓名查
			string name;
			bool no_nameflag = true;
			cout << "请输入所要查找的姓名:" << endl;
			cin >> name;
			for (int i = 0; i < this->m_EmpNum; i++) {
				if (this->m_Emparray[i]->m_name == name) {
					no_nameflag = false;
					cout << "查找成功!" << endl;
					this->m_Emparray[i]->showInfo();//调用显示信息的接口
				}
			}
			if (no_nameflag)cout << "姓名为:" << name << "的员工暂未录入系统!" << endl;
		}
		system("pause");
		system("cls");
		return;
	}
	//--------------------------------
	//----------------------------------------------------------------
	// 6.对员工排序
	void Sort_Emp() {
		if (this->m_FileIsEmpty) {
			cout << "系统暂无职工信息或者未创建文件" << endl;
			system("pause");
			system("cls");
			return;
		}
		cout << "请选择排序方式..." << endl;
		cout << "0  降序/ 1 升序" << endl;
		bool isupp;
		cin >> isupp;
		if (isupp) {
			this->up_qssort(this->m_Emparray, 0, this->m_EmpNum-1);
		}
		else {
			this->low_qssort(this->m_Emparray, 0, this->m_EmpNum - 1);
		}
		cout << "排序完毕!!!" << endl;
		this->save();
		system("pause");
		system("cls");
		return;
	}
	//-----------------------
	//----------------------------------------------------------------
	//7.清空文件
	void Clean_file() {
		cout << "确认清空?" << endl;
		cout << "1.确定" << endl;
		cout << "0.取消" << endl;
		bool jd;
		cin >> jd;
		if (jd) {
			//清空文件
			ofstream ofs(myFILE, ios::trunc);//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");
			return;
		}
	}
	//----------------------------------------------------------------
	//8.显示职工总数 
	void gettotal() {
		cout <<"公司现有的员工总数为:"<< this->m_EmpNum << endl;
		system("pause");
		system("cls");
		return ;
	}
	//-------------------------
	//析构函数,回收操作
	~workerManager() {
		if (this->m_Emparray != NULL) {
			for (int i = 0; i < this->m_EmpNum; i++) {
				if (this->m_Emparray[i] != NULL)delete this->m_Emparray[i];
			}
		}
		delete[] this->m_Emparray;
		this->m_Emparray = NULL;
	}
};

【2】workerManager.cpp

#include "workerManager.h"
/*
该文件的作用是:
      将类的成员函数的定义与声明分开
      在.h中声明
      在.cpp中写定义
      当然要加workerManager::
         相当于类成员的类外实现
      这样可以更方便地管理项目
-------------------------------
我为了少写workerManager::和声明,没有进行分离
面对上万行代码的程序,分离是绝对必要的
*/

【3】源.cpp

/*
IT公司员工分为三类:普通程序员、项目经理、董事,显示信息时,需要显示职工编号、职工姓名、职工岗位,以及职责
普通程序员:完成项目经理交给的任务
项目经理职责:完成老板的任务并且下发任务给员工
董事职责:管理公司所有任务

职工岗位用1,2,3表示,代表三类员工

*/
//-------------------------------------
//-------------------------------------
#include"workerManager.h"
using namespace std;
int main() {
	workerManager works;
	works.Start();
	system("pause");
	return 0;
}

3.效果展示?

【1】开始菜单

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

【2】添加职工

在这里插入图片描述



在这里插入图片描述

在这里插入图片描述
打开看看👇
在这里插入图片描述
成功纳入职工数据ヾ(?°?°?)ノ゙

【3】查看全部职工信息

在这里插入图片描述

【4】按编号删除职工

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

【5】修改职工信息

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

【5】查找职工

在这里插入图片描述

【6】对系统内的职工进行排序

在这里插入图片描述

在这里插入图片描述

【7】清空档案——

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

【8】现有员工总数

在这里插入图片描述

【9】退出职工操作系统

在这里插入图片描述



4.后记

完成练手项目后,我开始玩学校的大作业了ヾ(?°?°?)ノ゙
最好将上述代码CV到IDE中,对CB玩家要稍微修一下O(∩_∩)O~

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-12-23 15:34:46  更:2021-12-23 15:35:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 12:34:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码