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

简介: 【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;
}
相关文章
|
4月前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
86 0
WK
|
1月前
|
机器学习/深度学习 人工智能 算法
那C++适合开发哪些项目
C++ 是一种功能强大、应用广泛的编程语言,适合开发多种类型的项目。它在游戏开发、操作系统、嵌入式系统、科学计算、金融、图形图像处理、数据库管理、网络通信、人工智能、虚拟现实、航空航天等领域都有广泛应用。C++ 以其高性能、内存管理和跨平台兼容性等优势,成为众多开发者的选择。
WK
70 1
|
2月前
|
Ubuntu Linux 编译器
Linux/Ubuntu下使用VS Code配置C/C++项目环境调用OpenCV
通过以上步骤,您已经成功在Ubuntu系统下的VS Code中配置了C/C++项目环境,并能够调用OpenCV库进行开发。请确保每一步都按照您的系统实际情况进行适当调整。
433 3
|
3月前
|
C++
【C++案例】一个项目掌握C++基础-通讯录管理系统
这篇文章通过一个通讯录管理系统的C++项目案例,详细介绍了如何使用C++实现添加、显示、删除、查找、修改和清空联系人等功能。
52 3
|
4月前
|
Rust 安全 C++
系统编程的未来之战:Rust能否撼动C++的王座?
【8月更文挑战第31天】Rust与C++:现代系统编程的新选择。C++长期主导系统编程,但内存安全问题频发。Rust以安全性为核心,通过所有权和生命周期概念避免内存泄漏和野指针等问题。Rust在编译时确保内存安全,简化并发编程,其生态系统虽不及C++成熟,但发展迅速,为现代系统编程提供了新选择。未来有望看到更多Rust驱动的系统级应用。
69 1
|
4月前
|
存储 算法 数据可视化
【C++】C++旅游管理系统(源码+论文)【独一无二】
【C++】C++旅游管理系统(源码+论文)【独一无二】
|
4月前
|
搜索推荐 数据处理 文件存储
【C++】C++ 培训报名系统 (源码+论文)【独一无二】
【C++】C++ 培训报名系统 (源码+论文)【独一无二】
|
4月前
|
存储 C++
【C++】C++公司人事管理系统(源码)【独一无二】
【C++】C++公司人事管理系统(源码)【独一无二】
123 2
|
4月前
|
存储 数据可视化 C++
【C++】C++-机房收费管理系统(源码+注释)【独一无二】
【C++】C++-机房收费管理系统(源码+注释)【独一无二】
|
4月前
|
数据可视化 C++
【C++】C++商店销售管理系统(源码+论文)【独一无二】
【C++】C++商店销售管理系统(源码+论文)【独一无二】