zoukankan      html  css  js  c++  java
  • 实现:职工管理系统

    实现员工类:Boss、Employee、Manager,都实现抽象类Worker

    worker.h头文件:

    #pragma once
    #include<iostream>
    #include<string>
    using namespace std;
    
    //职工抽象基类
    class Worker
    {
    public:
    
    	//显示个人信息
    	virtual void showInfo() = 0;
    	//获取岗位名称
    	virtual string getDeptName() = 0;
    
    	int m_Id; //职工编号
    	string m_Name; //职工姓名
    	int m_DeptId; //职工所在部门名称编号
    };
    

    老板类boss.h头文件

    #pragma once
    #include<iostream>
    using namespace std;
    #include "worker.h"
    
    //老板类
    class Boss :public Worker
    {
    public:
    
    	Boss(int id, string name, int dId);
    
    	//显示个人信息
    	void showInfo();
    
    	//获取职工岗位名称
    	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
    		<< " 	职工姓名: " << this->m_Name
    		<< " 	岗位:" << this->getDeptName()
    		<< " 	岗位职责:管理公司所有事务" << endl;
    }
    
    string Boss::getDeptName()
    {
    	return string("总裁");
    }
    

    员工类employee.h头文件

    #pragma once 
    #include<iostream>
    using namespace std;
    #include "worker.h"
    
    //员工类
    class Employee :public Worker
    {
    public:
    
    	//构造函数
    	Employee(int id, string name, int dId);
    
    	//显示个人信息
    	void showInfo();
    
    	//获取职工岗位名称
    	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
    		<< " 	职工姓名: " << this->m_Name
    		<< " 	岗位:" << this->getDeptName()
    		<< " 	岗位职责:完成经理交给的任务" << endl;
    }
    
    
    string Employee::getDeptName()
    {
    	return string("员工");
    }
    
    

    经理类manager.h头文件

    #pragma once
    #include<iostream>
    using namespace std;
    #include "worker.h"
    
    //经理类
    class Manager :public Worker
    {
    public:
    
    	Manager(int id, string name, int dId);
    
    	//显示个人信息
    	void showInfo();
    
    	//获取职工岗位名称
    	string getDeptName();
    };
    

    manager.cpp文件的实现:

    #include "manager.h"
    
    Manager::Manager(int id, string name, int dId)
    {
    	this->m_Id = id;
    	this->m_Name = name;
    	this->m_DeptId = dId;
    
    }
    
    void Manager::showInfo()
    {
    	cout << "职工编号: " << this->m_Id
    		<< " 	职工姓名: " << this->m_Name
    		<< " 	岗位:" << this->getDeptName()
    		<< " 	岗位职责:完成老板交给的任务,并下发任务给员工" << endl;
    }
    
    string Manager::getDeptName()
    {
    	return string("经理");
    }
    
    

    workManager.h头文件:进行函数的申明

    #pragma once
    #include <iostream>
    #include "worker.h"
    #include "employee.h"
    #include "manager.h"
    #include "boss.h"
    
    using namespace std;
    
    // .h文件进行声明,相应的cpp文件进行定义
    class workManager {
    public:
    	int m_Num; //记录文件的人数
    	Worker ** worker_array; //放置对象的指针
    	bool fileExist; //判断文件是否存在
    	workManager(); //构造函数
    	~workManager(); //析构函数
    	void Show_Menu(); //展示菜单
    	void Show_Exit(); //关闭程序功能
    	void Add_Worker(); //添加员工职位
    	void fileSave(); //用来保存员工
    	int getNum(); //统计文本中人数的个数
    	void to_init(); //如果文本中有内容就需要相应的进行读取文本初始化操作
    	void to_show(); //展示文本中的信息
    	void to_del(); //删除职工信息
    	int to_exist(int bh);//判断相应的职工编号是否存在 返回值为int
    	void to_modify(); //修改指定员工编号操作
    	void to_find(); //查找指定员工编号职工信息
    	void to_sort(); //进行员工的排序,升序或者降序
    	void to_clear(); //清空文本
    };
    
    

    workManager.cpp进行.h文件中函数的实现

    #include "workManager.h" //直接包含一个头文件,在workManager.h的头文件中已经包含了另外三个员工类的头文件
    #include<fstream>
    #define FILENAME "worker.txt"
    
    
    
    workManager::workManager() {
    	this->m_Num = 0; //初始化数量为0
    	this->worker_array = NULL; //初始化指针为NULL
    
    
    	//初始化进行读取文件
    	//1、第一种情况,文件不存在
    	ifstream ifs;
    	ifs.open(FILENAME, ios::in);
    
    	if (!ifs.is_open()) {
    		cout << "文件不存在" << endl;
    		this->fileExist = true; //文件存在的标识符
    		this->m_Num = 0;
    		this->worker_array = NULL;
    		ifs.close();
    		return; //跳出构造函数
    	}
    	
    	//2、第二种情况,文件存在,但是内容为空
    	char ch;
    	ifs >> ch; //读取一个字节来进行判断是否为空
    	if (ifs.eof()) {
    		cout << "文件为空" << endl;
    		this->fileExist = true; //文件存在的标识符
    		this->m_Num = 0;
    		this->worker_array = NULL;
    		ifs.close();
    		return; //跳出构造函数
    	}
    
    	
    	
    	//3、第三种情况,文件存在,内容存在,那么我们就需要读取出来并且生成相应的空间写入到程序中
    	int num = this->getNum();  //获取初始化的时候文本中的个数
    	cout << "当前职工人数有 " << num << "人" << endl;
    	this->m_Num = num; // 对m_Num进行更新人数
    	this->worker_array = new Worker*[m_Num];//在初始化之前我们需要分配给worker_array相应的内存空间进行储存,因为worker_array是指向指针的指针所以我们生成的空间为指针类型
    	this->to_init(); //进行相应的初始化操作
    
    }
    
    void workManager::to_show() { //实现显示职工信息的功能
    	if (this->fileExist == true) { //	//如果文件不存在或者文本中无内容则提示,这里我们可以利用到标识符fileExist
    		cout << "文件不存在或者内容为空" << endl;
    	}else {
    		//如果文件存在并且存在内容的情况下
    		for (int i = 0; i < this->m_Num; i++) {
    			this->worker_array[i]->showInfo();
    		}
    	}
    	system("pause");
    	system("cls");
    }
    
    void workManager::to_del() {
    	int bh;
    	cout << "请输入你要删除的职工编号" << endl;
    	cin >> bh;
    	int ret = this->to_exist(bh);
    	if (ret != -1) { //职工编号存在的处理
    		for (; ret < this->m_Num-1; ret++) {  //m_Num编号是从0开始的 所以总共是m_Num-1数量
    			this->worker_array[ret] = this->worker_array[ret + 1]; //进行覆盖操作
    		}
    		this->m_Num--; //覆盖完 少了一个人数,所以要-1操作
    		this->fileSave(); //重新保存文件
    	}
    	else {
    		//职工编号不存在的处理
    		cout << "职工编号不存在" << endl;
    	}
    	system("pause");
    	system("cls");
    }
    
    void workManager::to_modify() { //修改指定员工编号操作
    	int bh;
    	string name;
    	int dId;
    	cout << "请出你要修改的职工编号" << endl;
    	cin >> bh;
    	int ret = this->to_exist(bh);
    	if (ret != -1) {
    		//先把之前的内存空间给释放掉再重新创建对象
    		delete this->worker_array[ret];
    		cout << "输入你要重新修改的职工编号" << endl;
    		cin >> bh;
    		cout << "输入你要重新修改的职工姓名" << endl;
    		cin >> name;
    		cout << "输入你要重新修改的职工岗位" << endl;
    		cout << "1、普通职工" << endl;
    		cout << "2、经理" << endl;
    		cout << "3、老板" << endl;
    		cin >> dId;
    		Worker * worker = NULL;
    		switch (dId) {
    		case 1:
    			worker = new Employee(bh, name, dId);
    			break;
    		case 2:
    			worker = new Manager(bh, name, dId);
    			break;
    		case 3:
    			worker = new Boss(bh, name, dId);
    			break;
    		}
    		this->worker_array[ret] = worker;
    		this->fileSave();
    		cout << "修改成功" << endl;
    	}else {
    		cout << "修改失败,查无此人" << endl;
    	}
    
    	system("pause");
    	system("cls");
    }
    
    
    void workManager::to_clear(){ //清空文本
    	cout << "你确定要清空文本吗?" << endl;
    	int choose;
    	cin >> choose;
    	if (choose == 1) {
    		//cout << "清空" << endl;
    		ofstream ofs(FILENAME, ios::trunc); //打开模式 ios::trunc 如果存在删除文件并重新创建
    		ofs.close(); //进行关闭文件流的操作
    		if (this->worker_array != NULL) {
    			for (int i = 0; i < this->m_Num; i++) {
    				delete this->worker_array[i]; //释放worker_array指针中指向的地址的指针的内存空间
    			}
    			//this->m_Num = 0;可有可无
    			delete[] this->worker_array; //释放worker_array本身数组指针的内存空间
    			this->worker_array = NULL;
    		}
    		cout << "清空完成" << endl;
    	}
    	else {
    		cout << "清空操作被取消" << endl;
    		return;
    	}
    	system("pause");
    	system("cls");
    
    }
    //排序的操作
    void workManager::to_sort() {
    	cout << "请选择排序的顺序:" << endl;
    	int choose;
    	cout << "1、升序排序 2、降序排序" << endl;
    	cin >> choose;
    	if (choose == 1) {
    		//升序排序,利用的排序方法是冒泡排序
    		for (int i = 0; i < this->m_Num - 1; i++) {
    			Worker * temp = NULL; //作为一个temp的存在
    			for (int j = i + 1; j < this->m_Num; j++) {
    				if (this->worker_array[i]->m_Id < this->worker_array[j]->m_Id) {
    					temp = this->worker_array[i];
    					this->worker_array[i] = this->worker_array[j];
    					this->worker_array[j] = temp;
    				}
    			}
    		}
    	}else {
    		//降序排序
    		for (int i = 0; i < this->m_Num - 1; i++) {
    			Worker * temp = NULL; //作为一个temp的存在
    			for (int j = i + 1; j < this->m_Num; j++) {
    				if (this->worker_array[i]->m_Id > this->worker_array[j]->m_Id) {
    					temp = this->worker_array[i];
    					this->worker_array[i] = this->worker_array[j];
    					this->worker_array[j] = temp;
    				}
    			}
    		}
    	}
    	system("pause");
    	system("cls");
    }
    
    void workManager::to_find() {
    	cout << "请出你要查找的职工编号" << endl;
    	int bh;
    	cin >> bh;
    	int ret = this->to_exist(bh);
    	if (ret != -1) {
    		for (int i = 0; i < this->m_Num; i++) {
    			if (this->worker_array[i]->m_Id == bh) {
    				this->worker_array[i]->showInfo();
    				break; //如果自己还要添加一个以姓名查找的话,break就不能用了,因为要循环完才行
    			}
    		}
    	}else {
    		cout << "查找失败,查无此人" << endl;
    	}
    	system("pause");
    	system("cls");
    }
    
    void workManager::to_init() { //对文本进行读取然后再加进程序中的函数to_init封装
    	ifstream ifs;
    	ifs.open(FILENAME,ios::in);
    	int id, dId;
    	string name;
    	this->fileExist = false;
    	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 if (dId == 3) {
    			worker = new Boss(id, name, dId);
    		}
    		this->worker_array[index] = worker; //worker_array为指向worker指针的指针
    		index++;
    	}
    
    
    }
    int workManager::getNum() {
    	ifstream ifs;
    	ifs.open(FILENAME, ios::in);
    	int id, dId;
    	string name;
    
    	int num = 0;
    	while (ifs >> id && ifs >> name && ifs >> dId) {
    		num++;
    	}
    	ifs.close();
    	return num;
    }
    
    workManager::~workManager() {
    
    }
    
    void workManager::Show_Menu() {
    	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;
    	cout << endl;
    }
    
    
    //展示菜单栏
    void workManager::Show_Exit() {
    	cout << "欢迎下次使用" << endl;
    	system("pause");
    	exit(0);
    
    }
    
    //判断相应的职工编号是否存在 返回值为int
    int workManager::to_exist(int bh) { //传入的参数为编号
    	for (int i = 0; i < this->m_Num; i++) {
    		if (this->worker_array[i]->m_Id == bh) {
    			return i;
    			break;//既然已经找到了 那么直接break跳出循环
    		}
    	}
    	return -1; //如果没有找到就返回为-1 
    	
    }
    
    
    //写入文件操作
    void workManager::fileSave() { //当添加完成之后需要进行保存文件的操作
    	ofstream ofs;//创建写入的流对象
    	ofs.open(FILENAME, ios::out);
    	for (int i = 0; i < this->m_Num; i++) { //用m_Num来进行判断,因为m_Num中是存储的职工数量,然后进行遍历写入操作
    		ofs << this->worker_array[i]->m_Id << " " << this->worker_array[i]->m_Name << " " << this->worker_array[i]->m_DeptId << endl; //ofs进行写入
    	}
    	ofs.close();
    }
    
    void workManager::Add_Worker() {  //这个地方最重要 也是最要学习的地方,这里的双重指针也需要理解
    	int add_Num;
    	cout << "请输入你要添加的人数:"<< endl;
    	cin >> add_Num;
    	if (add_Num > 0) {
    		int all = this->m_Num + add_Num; //统计一共要生成的新空间的大小
    		Worker ** NewSpace = new Worker*[all];  //生成相应的地址空间
    
    		if (this->worker_array != NULL) { //如果不为空的话,那要把原来的数据都要先重新转移到NewSpace中,为空的话那么就直接转移
    			for (int i = 0; i < this->m_Num; i++) {
    				NewSpace[i] = this->worker_array[i];
    				
    
    			}
    		}
    
    		for (int i = 0; i < add_Num; i++) {
    			int id, dId;
    			string name;
    			cout << "请输入第 " << i + 1 << " 个新职工编号:" << endl;
    			cin >> id;
    			cout << "请输入第 " << i + 1 << " 个新职工姓名:" << endl;
    			cin >> name;
    			cout << "请选择该职工的岗位:" << endl;
    			cout << "1、普通职工" << endl;
    			cout << "2、经理" << endl;
    			cout << "3、老板" << endl;
    			cin >> dId;
    			Worker * worker = NULL;
    			if (dId == 1) { //普通职工创建指针
    				NewSpace[this->m_Num + i] = new Employee(id, name, dId);
    			}else if (dId == 2) { //经理创建指针
    				NewSpace[this->m_Num + i] = new Manager(id, name, dId);
    			}else if (dId == 3) { //老板创建指针
    				NewSpace[this->m_Num + i] = new Boss(id, name, dId);
    			}
    		}
    		delete[] this->worker_array; //进行释放之前储存的老空间
    		this->worker_array = NewSpace; //把之前的旧的空间释放然后指向最新保存的地址空间
    		this->m_Num = all;  //修改最新总共人数
    
    		cout << "添加成功" << add_Num << "新职工!" << endl;
    	}
    	else {
    		cout << "输入有误" << endl;
    	}
    	
    	this->fileSave();
    
    	system("pause"); //任意键
    	system("cls");
    	
    }
    

    入口文件

    职工管理系统.cpp

    #include<iostream>
    #include<string>
    #include "workManager.h"
    
    using namespace std;
    
    int main() {
    	workManager w1; //实例化对象
    	while (true) {
    		w1.Show_Menu();
    		int choose;
    		cout << "输入你要选择的选项:" << endl;
    		cin >> choose;
    		switch (choose) {
    		case 0: //0.退出管理程序
    			w1.Show_Exit();
    			break;
    		case 1: //1.增加职工信息
    			w1.Add_Worker();
    			break;
    		case 2: //2.显示职工信息
    			w1.to_show();
    			break;
    		case 3: //3.删除离职职工
    			w1.to_del();
    			break;
    		case 4: //4.修改职工信息
    			w1.to_modify();
    			break;
    		case 5: //5.查找职工信息
    			w1.to_find();
    			break;
    		case 6: //6.按照编号排序
    			w1.to_sort();
    			break;
    		case 7: //7.清空所有文档
    			w1.to_clear();
    			break;
    		}
    	}
    	system("pause");
    	return 0;
    }
    
    
  • 相关阅读:
    STM32 + RT Thread OS 学习笔记[三]
    全代码实现ios-1
    HTML5 Web Speech API 结合Ext实现浏览器语音识别以及输入
    全代码实现ios-2
    从零开始学C++之虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数
    二进制程序分析工具Pin在Windows系统中的安装和使用方法
    使用U盘安装Ubuntu系统的实践小结
    HDU 1874 畅通工程续
    JSP页面上用横线代替文本框
    Mysql设置编码
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/11889252.html
Copyright © 2011-2022 走看看