C++:职工管理系统

一、创建项目

  • CMakeLists.txt
cmake_minimum_required(VERSION 3.27)
project(WorkerManagementSystem CXX)

set(CMAKE_CXX_STANDARD 17)

add_executable(WorkerManagementSystem
        main.cpp
        workerManager/WorkerManager.h
        workerManager/WorkerManager.cpp
        worker/Worker.h
        worker/impl/Employee.cpp
        worker/impl/Employee.h
        worker/impl/Manager.cpp
        worker/impl/Manager.h
        worker/impl/Boss.cpp
        worker/impl/Boss.h)

二、创建职工类

1、创建职工抽象类

  • Worker.h
//
// Created by 尔尔 on 2024/1/21.
//

#ifndef WORKERMANAGER_CPP_WORKER_H
#define WORKERMANAGER_CPP_WORKER_H

#pragma once

#include <iostream>

using namespace std;

class Worker {
public:
    // 职工编号
    int m_Id;
    // 职工姓名
    string m_Name;
    // 职工所在部门名称编号
    int m_DeptId;

    virtual ~Worker() = default;

    // 显示个人信息
    virtual void showInfo() = 0;

    // 获取岗位名称
    virtual string getDeptName() = 0;
};


#endif //WORKERMANAGER_CPP_WORKER_H

2、创建普通员工类

1. 头文件

  • Employee.h
//
// Created by 尔尔 on 2024/1/21.
//

#ifndef WORKERMANAGER_CPP_EMPLOYEE_H
#define WORKERMANAGER_CPP_EMPLOYEE_H

#pragma once

#include "../Worker.h"

using namespace std;

class Employee : public Worker {
public:
    // 构造函数
    Employee(int id, const string &name, int deptId);

    // 析构函数
    ~Employee() override;

    // 显示个人信息
    void showInfo() override;

    // 获取职工岗位名称
    string getDeptName() override;
};

#endif //WORKERMANAGER_CPP_EMPLOYEE_H

2. 源文件

  • Employee.cpp
#include "Employee.h"

using namespace std;

Employee::Employee(int id, const std::string &name, int deptId) {
    this->m_Id = id;
    this->m_Name = name;
    this->m_DeptId = deptId;
}

Employee::~Employee() = default;

void Employee::showInfo() {
    cout << "职工编号: " << m_Id << "\t职工姓名: " << m_Name << "\t职工岗位: " << this->getDeptName()
         << "\t岗位职责:完成经理交给的任务" << endl;
}

string Employee::getDeptName() {
    return "普通员工";
}

3、创建经理类

1. 头文件

  • Manager.h
//
// Created by 尔尔 on 2024/1/21.
//

#ifndef WORKERMANAGER_CPP_MANAGER_H
#define WORKERMANAGER_CPP_MANAGER_H

#pragma once

#include "../Worker.h"

class Manager : public Worker {
public:
    // 构造函数
    Manager(int id, const string &name, int deptId);

    // 析构函数
    ~Manager() override;

    // 显示个人信息
    void showInfo() override;

    // 获取职工岗位名称
    string getDeptName() override;
};

#endif //WORKERMANAGER_CPP_MANAGER_H

2. 源文件

  • Manager.cpp
#include "Manager.h"

using namespace std;

Manager::Manager(int id, const std::string &name, int deptId) {
    this->m_Id = id;
    this->m_Name = name;
    this->m_DeptId = deptId;
}

Manager::~Manager() = default;

void Manager::showInfo() {
    cout << "职工编号:" << m_Id << "\t职工姓名:" << m_Name << "\t职工岗位:" << this->getDeptName()
         << "\t岗位职责:完成老板交给的任务,并下发任务给员工" << endl;
}

string Manager::getDeptName() {
    return "经理";
}

4、创建老板类

1. 头文件

  • Boss.h
//
// Created by 尔尔 on 2024/1/21.
//

#ifndef WORKERMANAGER_CPP_BOSS_H
#define WORKERMANAGER_CPP_BOSS_H

#pragma once

#include "../Worker.h"

class Boss : public Worker {
public:
    // 构造函数
    Boss(int id, const string &name, int deptId);

    // 析构函数
    ~Boss() override;

    // 显示个人信息
    void showInfo() override;

    // 获取职工岗位名称
    string getDeptName() override;
};

#endif //WORKERMANAGER_CPP_BOSS_H

2. 源文件

  • Boss.cpp
#include "Boss.h"

using namespace std;

Boss::Boss(int id, const std::string &name, int deptId) {
    this->m_Id = id;
    this->m_Name = name;
    this->m_DeptId = deptId;
}

Boss::~Boss() = default;

void Boss::showInfo() {
    cout << "职工编号: " << m_Id << "\t职工姓名: " << m_Name << "\t职工岗位: " << this->getDeptName()
         << "\t岗位职责:管理公司所有事务" << endl;
}

string Boss::getDeptName() {
    return "老板";
}

三、创建管理类

1、头文件实现

  • WorkerManager.h
//
// Created by 尔尔 on 2024/1/21.
//

#ifndef WORKERMANAGER_CPP_WORKERMANAGER_H
#define WORKERMANAGER_CPP_WORKERMANAGER_H

// 防止头文件重复包含
#pragma once

#include<iostream>
#include <fstream>
#include "../worker/Worker.h"
#include "../worker/impl/Employee.h"
#include "../worker/impl/Manager.h"
#include "../worker/impl/Boss.h"

using namespace std;

#define FILENAME "worker.txt"

class WorkerManager {
    // 记录文件中的人数个数
    int m_WorkerNumber{};
    // 员工数组的指针
    Worker **m_WorkerArray{};
    // 文件是否为空
    bool m_FileIsEmpty{};
public:

    // 使用 = default 声明默认构造函数
    WorkerManager();

    //析构函数
    ~WorkerManager();

    // 显示菜单
    static void showMenu();

    // 退出系统
    static void exitSystem();

    // 保存到本地
    void saveToLocal();

    // 加载本地文件
    void loadFromLocal();

    // 统计职工数量
    static int countWorkers();

    // 初始化职工信息
    void initWorkers();

    // 增加职工信息
    void addWorker();

    // 显示职工信息
    void showWorkers();

    // 判断职工是否存在
    int isExistWorker(int id);

    // 删除离职职工
    void deleteWorker();

    // 修改职工信息
    void modifyWorker();

    // 查找职工信息
    void findWorker();

    // 按照编号排序
    void sortWorkers();

    // 清空所有文档
    void clearAll();
};

#endif //WORKERMANAGER_CPP_WORKERMANAGER_H

2、源文件

  • WorkerManager.cpp
#include "WorkerManager.h"

四、数据交互

1、显示菜单

// 显示菜单
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;
}

2、退出系统

// 退出系统
void WorkerManager::exitSystem() {
    cout << "欢迎下次使用" << endl;
    system("read");
    exit(0);
}

3、显示职工信息

// 显示职工信息
void WorkerManager::showWorkers() {
    if (this->m_FileIsEmpty) {
        cout << "暂无数据" << endl;
    } else {
        for (int i = 0; i < this->m_WorkerNumber; i++) {
            this->m_WorkerArray[i]->showInfo();
        }
    }
    system("read");
    system("clear");
}

4、保存到本地

// 保存到本地
void WorkerManager::saveToLocal() {
    // 打开文件
    ofstream file(FILENAME, ios::out);
    // 写入文件
    if (file.is_open() && this->m_WorkerArray != nullptr) {
        for (int i = 0; i < this->m_WorkerNumber; i++) {
            file << this->m_WorkerArray[i]->m_Id << " "
                 << this->m_WorkerArray[i]->m_Name << " "
                 << this->m_WorkerArray[i]->m_DeptId << endl;
        }
    }
    // 关闭文件
    file.close();
}

5、初始化数据

1. 构造函数

WorkerManager::WorkerManager() {
    this->loadFromLocal();
}

2. 加载文件

// 加载本地文件
void WorkerManager::loadFromLocal() {
    // 打开文件
    ifstream file(FILENAME, ios::in);
    // 读取文件
    if (file.is_open()) {
        // 判断文件是否为空
        char ch;
        file >> ch;
        if (file.eof()) {
            cout << "文件为空!" << endl;
            // 初始化人数
            this->m_WorkerNumber = 0;
            // 初始化数组
            this->m_WorkerArray = nullptr;
            // 初始化文件为空标志
            this->m_FileIsEmpty = true;
            // 关闭文件
            file.close();
            return;
        } else {
            this->initWorkers();
          	// 关闭文件
            file.close();
            return;
        }
    } else {
        cout << "文件不存在!" << endl;
        // 初始化人数
        this->m_WorkerNumber = 0;
        // 初始化数组
        this->m_WorkerArray = nullptr;
        // 初始化文件为空标志
        this->m_FileIsEmpty = true;
        // 关闭文件
        file.close();
        return;
    }
}

3. 统计职工数量

// 统计职工数量
int WorkerManager::countWorkers() {
    ifstream file(FILENAME, ios::in);
    int id;
    string name;
    int deptId;
    int count = 0;
    while (file >> id >> name >> deptId) {
        count++;
    }
    file.close();
    return count;
}

4. 初始化职工信息

// 初始化职工信息
void WorkerManager::initWorkers() {
    // 初始化人数
    this->m_WorkerNumber = WorkerManager::countWorkers();
    // 初始化数组
    this->m_WorkerArray = new Worker *[this->m_WorkerNumber];
    // 初始化文件为空标志
    this->m_FileIsEmpty = false;

    // 读取文件信息
    ifstream file(FILENAME, ios::in);
    int id;
    string name;
    int deptId;
    int index = 0;
    while (file >> id >> name >> deptId) {
        Worker *worker = nullptr;
        switch (deptId) {
            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;
        }
        this->m_WorkerArray[index] = worker;
        index++;
    }
    file.close();
}

6、析构函数

WorkerManager::~WorkerManager() {
    if (this->m_WorkerArray != nullptr) {
        for (int i = 0; i < this->m_WorkerNumber; i++) {
            delete this->m_WorkerArray[i];
            this->m_WorkerArray[i] = nullptr;
        }
        delete[] this->m_WorkerArray;
        this->m_WorkerArray = nullptr;
        this->m_WorkerNumber = 0;
        this->m_FileIsEmpty = true;
    }
}

五、数据处理

1、增加职工信息

// 增加职工信息
void WorkerManager::addWorker() {
    cout << "请输入增加职工数量:";
    int addNum = 0;
    cin >> addNum;
    if (addNum > 0) {
        // 计算新空间大小
        int newSize = this->m_WorkerNumber + addNum;
        // 开辟新空间
        auto **newSpace = new Worker *[newSize];
        // 将原空间下内容存放到新空间下
        if (this->m_WorkerArray != nullptr) {
            for (int i = 0; i < this->m_WorkerNumber; i++) {
                newSpace[i] = this->m_WorkerArray[i];
            }
        }

        // 输入新数据
        for (int i = 0; i < addNum; i++) {
            int id;
            string name;
            int dSelect;

            cout << "请输入第 " << i + 1 << " 个新职工编号:";
            cin >> id;

            cout << "请输入第 " << i + 1 << " 个新职工姓名:";
            cin >> name;

            cout << "1、普通职工" << endl;
            cout << "2、经理" << endl;
            cout << "3、老板" << endl;
            cout << "请选择该职工的岗位:";
            cin >> dSelect;

            Worker *worker = nullptr;
            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_WorkerNumber + i] = worker;
        }

        // 释放原有空间
      	// 不能通过 for 循环遍历释放空间,因为此时 this->m_WorkerArray 每个节点的原始数据和 newSpace 每个节点的数据指向相同的地址
        delete[] this->m_WorkerArray;

        // 更改新空间的指向
        this->m_WorkerArray = newSpace;

        // 更新新的个数
        this->m_WorkerNumber = newSize;

        // 更新职工不为空标志
        this->m_FileIsEmpty = false;

        // 保存数据到文件中
        this->saveToLocal();

        // 提示信息
        cout << "成功添加" << addNum << "名新职工!" << endl;
    } else {
        cout << "输入有误" << endl;
    }
    system("read");
    system("clear");
}

2、判断职工是否存在

// 判断职工是否存在
int WorkerManager::isExistWorker(int id) {
    for (int i = 0; i < this->m_WorkerNumber; i++) {
        if (this->m_WorkerArray[i]->m_Id == id) {
            return i;
        }
    }
    return -1;
}

3、删除职工信息

// 删除职工信息
void WorkerManager::deleteWorker() {
    if (this->m_FileIsEmpty) {
        cout << "暂无数据" << endl;
    } else {
        cout << "请输入要删除的职工编号:";
        int id;
        cin >> id;
        int index = this->isExistWorker(id);
        if (index != -1) {
            // 更新新的个数
            this->m_WorkerNumber--;
            cout << this->m_WorkerNumber << "名员工" << endl;
            // 释放空间:如果不释放会造成内存泄漏,要被删除的数据所指向的内存将无法释放
            delete this->m_WorkerArray[index];
            // 更新数组
            for (int i = index; i < this->m_WorkerNumber; i++) {
                this->m_WorkerArray[i] = this->m_WorkerArray[i + 1];
            }
            // 保存数据到文件中
            this->saveToLocal();
            // 更新文件为空标志
            if (this->m_WorkerNumber == 0) {
                this->m_FileIsEmpty = true;
            }
            cout << "删除成功!" << endl;
        } else {
            cout << "该职工不存在!" << endl;
        }
    }
    system("read");
    system("clear");
}

4、修改职工信息

// 修改职工信息
void WorkerManager::modifyWorker() {
    if (this->m_FileIsEmpty) {
        cout << "暂无数据" << endl;
    } else {
        cout << "请输入要修改的职工编号:";
        int id;
        cin >> id;
        int index = this->isExistWorker(id);
        if (index != -1) {
            // 显示原数据
            this->m_WorkerArray[index]->showInfo();
            // 修改数据
            string name;
            cout << "请输入职工姓名:";
            cin >> name;
            int dSelect;
            cout << "1、普通职工" << endl;
            cout << "2、经理" << endl;
            cout << "3、老板" << endl;
            cout << "请选择该职工的岗位:";
            cin >> dSelect;
            Worker *worker = nullptr;
            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;
            }
            // 释放原数据空间
            delete this->m_WorkerArray[index];
            // 更新数据
            this->m_WorkerArray[index] = worker;
            // 保存数据到文件中
            this->saveToLocal();
            cout << "修改成功!" << endl;
        } else {
            cout << "该职工不存在!" << endl;
        }
    }
    system("read");
    system("clear");
}

5、查找职工信息

// 查找职工信息
void WorkerManager::findWorker() {
    if (this->m_FileIsEmpty) {
        cout << "暂无数据" << endl;
    } else {
        cout << "请输入要查找的职工编号:";
        int id;
        cin >> id;
        int index = this->isExistWorker(id);
        if (index != -1) {
            this->m_WorkerArray[index]->showInfo();
        } else {
            cout << "该职工不存在!" << endl;
        }
    }
    system("read");
    system("clear");
}

6、按照编号排序

// 按照编号排序
void WorkerManager::sortWorkers() {
    if (this->m_FileIsEmpty) {
        cout << "暂无数据" << endl;
        system("read");
        system("clear");
    } else {
        for (int i = 0; i < this->m_WorkerNumber; i++) {
            for (int j = i + 1; j < this->m_WorkerNumber; j++) {
                if (this->m_WorkerArray[i]->m_Id < this->m_WorkerArray[j]->m_Id) {
                    Worker *temp = this->m_WorkerArray[i];
                    this->m_WorkerArray[i] = this->m_WorkerArray[j];
                    this->m_WorkerArray[j] = temp;
                }
            }
        }
        this->showWorkers();
    }
}

7、清空所有文档

// 清空所有文档
void WorkerManager::clearAll() {
    if (this->m_FileIsEmpty) {
        cout << "暂无数据" << endl;
    } else {
        if (this->m_WorkerArray != nullptr) {
            for (int i = 0; i < this->m_WorkerNumber; i++) {
                delete this->m_WorkerArray[i];
                this->m_WorkerArray[i] = nullptr;
            }
            // 释放原空间
            delete[] this->m_WorkerArray;
            // 更新新空间
            this->m_WorkerArray = nullptr;
            // 更新新空间个数
            this->m_WorkerNumber = 0;
            // 更新文件为空标志
            this->m_FileIsEmpty = true;
            // 保存数据到文件中
            this->saveToLocal();
        }
        cout << "清除成功" << endl;
    }
    system("read");
    system("clear");
}

六、程序入口

#include <iostream>
#include "workerManager/WorkerManager.h"

using namespace std;

int main() {

    WorkerManager workerManager;
    string str;
    char select;
    while (true) {
        WorkerManager::showMenu();
        cout << "请输入您想要的操作:";
        cin >> str;
        select = str[0];
        switch (select) {
            case '1':   // 增加职工信息
                workerManager.addWorker();
                break;
            case '2':   // 显示职工信息
                workerManager.showWorkers();
                break;
            case '3':   // 删除离职职工
                workerManager.deleteWorker();
                system("clear");
                break;
            case '4':   // 修改职工信息
                workerManager.modifyWorker();
                system("clear");
                break;
            case '5':   // 查找职工信息
                workerManager.findWorker();
                system("clear");
                break;
            case '6':   // 按照编号排序
                workerManager.sortWorkers();
                system("clear");
                break;
            case '7':   // 清空所有文档
                workerManager.clearAll();
                system("clear");
                break;
            case '0':
                WorkerManager::exitSystem();
                break;
            default:
                cout << "输入错误,请重新输入!" << endl;
                system("read");
                system("clear");
                break;
        }
    }
}
  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值