职工管理系统

学这个很痛苦,感觉又臭又长,逻辑性不高,现在自己再来复习一遍,希望能找到逻辑。

下面的顺序是按照资本压榨等级排序的,因为我天天被压榨。

头文件:

workermanager.h

主要是构建了WorkerManager这个对象,在这个对象中,声明了职工管理系统所用的功能函数,包括统计人数、初始化职工、显示职工、删除职工、判断此人是都存在、修改信息、查找、排序、清空、展示等一系列功能。还有构造函数和析构函数。

构造函数(手动打星):

构造函数用于创建类的实例,并对实例进行初始化操作,通过不同的参数传递,可进行不同

的实例初始化操作。

#pragma once  //防止头文件重复包含
#include<iostream> //包含输入输出流文件
using namespace std;//使用标准命名空间
#include"employee.h"
#include"worker.h"
#include"manager.h"
#include"boss.h"//设定文件流和文件路径
#include<fstream>
#define FILENAME "empFile.txt"class WorkerManager
{
public://构造函数WorkerManager();//判断文件是否为空bool m_FileIsEmpty;//统计文件中人数int get_EmpNum();//初始化员工void init_Emp();//显示职工void Show_Emp();//删除职工void Del_Emp();//判断职工是否存在  如果存在返回职工所在数组的位置,不存在返回-1int IsExist(int id);//修改职工void Mod_Emp();//查找void Find_Emp();//排序void Sort_Emp();//清空void Clean_File();//展示菜单void ShowMenu();//退出void ExitSystem();//记录职工人数int m_EmpNum;//职工数组指针Worker** m_EmpArray;//增加void Add_Emp();//保存文件void save();//析构函数~WorkerManager();
};

worker.h

在worker类中,用于(玩了十分钟手机)声明两个纯虚函数,一个是显示个人信息,一个是获取岗位名称,那么使用纯虚函数的原因是因为在下面具体到每个职别时,创建的类需要继承worker类,为了在各个子类中都能单独显示其独特的信息。

#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

在boss、manager、employee头文件中,有参构造中传入相应人的id、姓名、和dId,并且对其单独的显示和获取岗位函数进行了声明。

#pragma once
#include"worker.h"
//老板class Boss :public Worker
{
public://构造函数Boss(int id, string name, int dId);//显示个人信息virtual void showInfo();//获取岗位名称virtual string getDeptName();
};

manager.h

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

employee.h

#pragma once
#include"worker.h"
//普通员工class Employee :public Worker
{
public://构造函数Employee(int id,string name,int dId);//显示个人信息virtual void showInfo();//获取岗位名称virtual string getDeptName();
};

源文件:

职工管理系统.cpp

在此代码中,创建了一个WorkerManager的对象wm,定义一个变量用于input来接收用户的操作选择,使用switch语句选择相应的操作函数。

#include<iostream> //包含输入输出流文件
using namespace std;//使用标准命名空间
#include"workerManager.h"
#include"worker.h"
#include"employee.h"
#include"manager.h"
#include"boss.h"int main()
{WorkerManager wm;//创建一个职工管理系统的对象int input = 0;//用于接受用户选择操作while (true)//无限循环{wm.ShowMenu();//展示菜单函数,前提为wm对象内cout << "请选择您的选择" << endl;cin >> input;//接受用户选择操作switch (input){case 0://退出wm.ExitSystem();break;case 1://增加wm.Add_Emp();break;case 2://显示wm.Show_Emp();break;case 3://删除/*int ret = wm.IsExist(1);if (ret != -1){cout << "职工存在" << endl;}else{cout << "职工不存在" << endl;}*/wm.Del_Emp();break;case 4://修改wm.Mod_Emp();break;case 5://查找wm.Find_Emp();break;case 6://排序wm.Sort_Emp();break;case 7://清空break;default:system("cls");//清屏break;}}system("pause");return 0;
}

workermanager.cpp

前面对各种操作函数都是声明,在下面这段代码中进行了定义,要不你们自己看?

#include"workerManager.h"WorkerManager::WorkerManager()
{//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();}void WorkerManager::ShowMenu()
{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 WorkerManager::ExitSystem()
{cout << "欢迎下次使用" << endl;system("pause");exit(0);//退出程序
}void WorkerManager::Add_Emp()
{cout << "请输入添加数量" << endl;int addNum = 0;//保存用户的输入数量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 Manager(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;//提示添加成功cout << "成功添加" << addNum << "名新职工" << endl;//保存到文件中this->save();}else{cout << "输入错误" << endl;}//按任意键后清屏回到上级目录system("pause");//按任意键继续system("cls");//清屏
}void WorkerManager::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 WorkerManager::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 WorkerManager::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;//根据不同的部门id创建不同的对象if (dId == 1)//普通员工{worker = new Employee(id, name, dId);}else if (dId == 2)//2经理{worker = new Manager(id, name, dId);}else//总裁{worker = new Boss(id, name, dId);}//存放在数组中this->m_EmpArray[index] = worker;index++;}//关闭文件ifs.close();
}void WorkerManager::Show_Emp()
{if (this->m_FileIsEmpty){cout << "文件不存在或记录为空" << endl;}else{for (int i = 0; i < m_EmpNum; i++){//利用多态调用接口this->m_EmpArray[i]->showInfo();}}system("pause");system("cls");
}//删除职工
void WorkerManager::Del_Emp()
{if (this->m_FileIsEmpty){cout << "文件不存在或记录为空" << endl;}else{//按照职工编号删除cout << "请输入想要删除的职工编号:" << endl;int id = 0;cin >> id;int index = this->IsExist(id);if (index != -1)//说明职工存在,并且要删除index位置上的职工{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");}
}//判断职工是否存在 如果存在返回职工所在数组的位置,不存在返回-1
int WorkerManager::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;
}//修改职工
void WorkerManager::Mod_Emp()
{if (this->m_FileIsEmpty){cout << "文件不存在或记录为空" << endl;}else{cout << "请输入修改职工的编号:" << endl;int id;cin >> id;int ret = this->IsExist(id);if (ret != -1){//查找到编号的员工delete this->m_EmpArray[ret];int newId = 0;string newName = "";int dSelect = 0;cout << "查到" << id << "号职工,请输入新职工号:" << 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){case1:worker = new Employee(newId, newName, dSelect);break;case2:worker = new Manager(newId, newName, dSelect);break;case3:worker = new Boss(newId, newName, dSelect);break;default:break;}//更改数据 到数组中this->m_EmpArray[ret] = worker;cout << "修改成功!" << endl;//保存到文件中this->save();}else{cout << "修改失败,查无此人" << endl;}}//按任意键 清屏system("pause");system("cls");
}void WorkerManager::Find_Emp()
{if (this->m_FileIsEmpty){cout << "文件不存在或记录为空" << endl;}else{cout << "请输入查找方式" << endl;cout << "1、按职工编号查找" << endl;cout << "2、按姓名查找" << endl;int select = 0;cin >> select;if (select == 1){int id;cout << "请输入查找的职工编号:" << endl;cin >> id;int ret = IsExist(id);if (ret != -1){cout << "查找成功,该职工信息如下:" << endl;this->m_EmpArray[ret]->showInfo();}else{cout << "查无此人" << endl;}}else if (select == 2){string name;cout << "请输入姓名:" << endl;cin >> name;bool flag = false;//查找到的标志for (int i = 0; i < m_EmpNum; i++){if (m_EmpArray[i]->m_Name == name){cout << "查找成功,编号为:" << m_EmpArray[i]->m_Id << "的信息如下" << endl;flag = true;this->m_EmpArray[i]->showInfo();}}if (flag == false){//查无此人cout << "查无此人" << endl;}}else{cout << "输入有误" << endl;}}system("pause");system("cls");
}void WorkerManager::Sort_Emp()
{if (this->m_FileIsEmpty){cout << "文件不存在或记录为空" << endl;system("pause");system("cls");}else{cout << "请输入排序方式" << endl;cout << "1、按职工编号排序" << endl;cout << "2、按姓名排序" << endl;}int select = 0;cin >> select;for (int i = 0; i < m_EmpNum; i++){int minOrMax = i;for (int j = i + 1; j < m_EmpNum; j++){if (select == 1)//升序{if (m_EmpArray[minOrMax]->m_Id > m_EmpArray[j]->m_Id){minOrMax = j;}}else//降序{if (m_EmpArray[minOrMax]->m_Id < m_EmpArray[j]->m_Id){minOrMax = j;}}}if (i != minOrMax){Worker* temp = m_EmpArray[i];m_EmpArray[i] = m_EmpArray[minOrMax];m_EmpArray[minOrMax] = temp;}}cout << "排序成功,结果为:" << endl;this->save();//排序后保存到文件中this->Show_Emp();
}void WorkerManager::Clean_File()
{cout << "确认清空?" << endl;cout << "1、确认" << endl;cout << "2、返回" << endl;int select = 0;cin >> select;if (select == 1){//打开模式 ios::trunc 如果删除文件并重新创建ofstream ofs(FILENAME, ios::trunc);ofs.close();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];}}this->m_EmpNum = 0;delete[] this->m_EmpArray;this->m_EmpArray = NULL;this->m_FileIsEmpty = true;}cout << "清空成功" << endl;}system("pause");system("cls");
}WorkerManager::~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;}
}

下面三个源函数就是对指定的职别进行有参构造、显示信息和获取职别。

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职工姓名:" << this->m_Name<< "\t岗位:" << this->getDeptName()<< "\t岗位职责:管理所有事务" << endl;
}
//获取岗位名称
string Boss::getDeptName()
{return string("老板");
}

manager.h

#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<< "\t职工姓名:" << this->m_Name<< "\t岗位:" << this->getDeptName()<< "\t岗位职责:完成老板的要求并分配任务给普通员工" << endl;
}
//获取岗位名称
string Manager::getDeptName()
{return string("经理");
}

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职工姓名:" << this->m_Name<< "\t岗位:" << this->getDeptName()<< "\t岗位职责:完成经理交给的任务" << endl;
}
//获取岗位名称
string Employee::getDeptName()
{return string("员工");
}

C++:职工管理系统相关推荐

  1. C/C++课程设计 之职工管理系统

    文章目录 (一) 题目内容及简介 (二) 概要设计 (三) 详细设计 (四) 实现代码 (五) 相关案例 案例一 案例二 案例三 案例四 案例五 案例六 案例七 案例八 案例九 案例十 案例十一 (一 ...

  2. c/c++入门教程 - 3 职工管理系统 完整代码

    目录 3 职工管理系统 3.1 管理系统需求 3.2 代码 勘误 3 职工管理系统 编写示例:基于多态的企业职工系统. 3.1 管理系统需求 职工管理系统可以用来管理公司内所有员工的信息. 本教程主要 ...

  3. C++结课大作业——职工管理系统

    这个项目分为头文件和CPP文件和一个.txt文件 实现功能如图所示 我一一列出来(头文件,cpp文件,txt文件) 按着这三个复制粘贴就可以用 boss.h #pragma once //普通员工头文 ...

  4. 职工管理系统--基于C++多态

    目录 1.管理系统需求 2.创建项目 2.1 创建项目 2.2 添加文件 3.创建管理类 3.1创建文件 3.2 头文件实现 3.3 源文件实现 4.菜单功能 4.1 添加成员函数 4.2 菜单功能实 ...

  5. 真不戳,基于C++泛型编程的职工管理系统

    文章目录 前言 一.泛型编程思想 二.单链表是什么? 1.图示 2.链表的节点结构[节点类] ①常规链表节点 ②泛型链表节点 3.链表类 三.泛型编程核心 1.实现数据类 2.实现链表类 四.运行截图 ...

  6. 黑马程序员C++职工管理系统

    基础知识(面向对象编程) C++程序在执行时,将内存大方向划分为**4个区域** - 代码区:存放函数体的二进制代码,由操作系统进行管理的 - 全局区:存放全局变量和静态变量以及常量 - 栈区:由编译 ...

  7. c++ 实现职工管理系统

    一.案例描述: 某公司中的职工分为三种:普通员工,经理和老板. 每个职工都有自己的职工编号.姓名.年龄.电话号码和岗位. 管理系统需要实现的功能如下: ●添加职工信息 ●显示职工信息 ●删除离职职工 ...

  8. 【C语言】职工管理系统详解(文件操作)

    前言 大部分初学计算机的同学完成的第一个比较完整的程序就是管理系统,不过细分之后可能还有图书管理系统,停车场管理系统.在小黄看来,一个人独立地完成这样一个系统对于自己代码能力的整体提升是非常大的,是把 ...

  9. C++ 46.基于多态的职工管理系统(2)——创建职工类(创建职工抽象类、创建普通员工类、创建经理类、创建老板类)

    创建职工类 1. 创建职工抽象类 职工的分类为:普通员工.经理.老板 将三种职工抽象到一个类(worker)中,利用多态管理不同职工种类 职工的属性为:职工编号.职工姓名.职工所在部门编号 职工的行为 ...

  10. 《黑马程序员》职工管理系统实战

    职工管理系统 源码成品直达:https://download.csdn.net/download/Augenstern_QXL/19080725?spm=1001.2014.3001.5501 已经设 ...

最新文章

  1. R语言包_recharts
  2. 【JAVASCRIPT】jquery实现新闻滚动效果
  3. 捉虫记 单步跟踪 条件断点 变量查看实践
  4. 13. sizeof 和 strlen 的区别
  5. 【深度学习】陶大程等人编写!最新41页深度学习理论综述
  6. cognos 样例 oracle,Cognos10安装和sample配置(ORACLE学样例)
  7. linux mysql 查询慢_linux – MySQL非常简单的SELECT查询速度极慢
  8. 【安卓深度控件开发(2.2)】LCDView - 进阶绘图
  9. lucene分析(未完成)
  10. [读后感]Java 控制台执行 Jar 传參的编码问题
  11. swf文件的反编译或着flash文件的反编译
  12. 搭建webservice服务报错求解
  13. 高考英语口语测试软件,练习英语口语的app有哪些
  14. 《Python编程从入门到实践 第二版》第八章练习
  15. C语言中返回的0和1
  16. vite + ts + eslint全局变量配置
  17. 添加SearchView控件时飘红的问题
  18. Openwrt 分流-缓存-去广告
  19. 天气预报服务器响应超时,天气预报为啥有时不准? - 广西首页 -中国天气网
  20. java weblogic.wlst_Weblogic - 使用Wlst获取部署类型

热门文章

  1. 爬虫第一弹——爬取京东手机信息
  2. git解决冲突的方法
  3. 用键盘8个键演奏一首蒲公英的约定送给996的自己或者一首月亮代表我的心给七夕的她...
  4. 微软面试题,你会做几题?
  5. java-jna使用
  6. CentOS7安装Chrome实现命令行截屏功能
  7. Oracle中having函数和in函数的用法
  8. 谈谈你的移动端适配方案有哪些
  9. 35 岁以上还在通过招聘平台投简历找工作就很丢人吗?
  10. CAx(CAD\CAE\CAM…)浮动许可优化管理方案