黑马C++ 职工管理系统

职工有三类:普通员工、经理、老板。显示信息时,需要显示职工编号、职工姓名、职工岗位、以及职责。

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);
    
    // 显示个人信息
    virtual void showInfo();
    
    // 获取职工岗位名称
    virtual 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
    << "\t职工姓名:" << this->m_Name
    << "\t岗位:" << this->getDeptName()
    << "\t岗位职责:管理公司所有事务" << 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);
    
    // 显示个人信息
    virtual void showInfo();
    
    // 获取职工岗位名称
    virtual 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
    << "\t职工姓名:" << this->m_Name
    << "\t岗位:" << this->getDeptName()
    << "\t岗位职责:完成经理交给的任务" << 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);
    
    // 显示个人信息
    virtual void showInfo();
    
    // 获取职工岗位名称
    virtual 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
    << "\t职工姓名:" << this->m_Name
    << "\t岗位:" << this->getDeptName()
    << "\t岗位职责:完成老板交给的任务,并下发任务给员工" << endl;
}

// 获取岗位名称
string Manager::getDeptName() {
    return string("经理");
}

workerManager.h

#pragma once // 防止头文件重复包含
#include <iostream>
using namespace std;
#include "worker.h"
#include "manager.h"
#include "boss.h"
#include "employee.h"

#include <fstream>
#define FILENAME "empFile.txt"



class WorkerManager {
public:
    // 构造函数
    WorkerManager();
    
    // 展示菜单
    void Show_Menu();
    
    // 退出系统
    void exitSystem();
    
    // 记录职工人数
    int m_EmpNum;

    // 职工数组的指针
    Worker ** m_EmpArray;
    
    // 增加职工
    void Add_Emp();
    
    // 保存文件
    void save();
    
    // 标志文件是否为空
    bool m_FileIsEmpty;
    
    // 统计人数
    int get_EmpNum();
    
    // 初始化员工
    void init_Emp();
    
    // 显示职工
    void Show_Emp();
    
    // 删除职工
    void Del_Emp();
    
    // 按照职工编号,判断职工是否存在,若存在返回职工在数组中的位置,不存在返回-1
    int IsExist(int id);
    
    // 修改职工
    void Mod_Emp();
    
    // 查找职工
    void Find_Emp();
    
    // 排序职工
    void Sort_Emp();
    
    // 清空文件
    void Clean_File();
    
    // 析构函数
    ~WorkerManager();
};

workerManager.cpp

#include "workerManager.h"

WorkerManager::WorkerManager() {
//    // 初始化人数
//    this->m_EmpNum = 0;
//    // 初始化数组指针
//    this->m_EmpArray = NULL;
//    
    ifstream ifs;
    ifs.open(FILENAME, ios::in); // 读文件
    
    // 1、文件不存在情况
    if (!ifs.is_open()) {
        cout << "文件不存在" << endl;
        this->m_EmpNum = 0; // 初始化人数
        this->m_FileIsEmpty = true; // 初始化文件为空标志
        this->m_EmpArray = NULL; // 初始化数组
        ifs.close(); // 关闭文件
        return;
    }
    
    // 2、文件存在,但没有记录
    char ch;
    ifs >> ch;
    if (ifs.eof()) {
        cout << "文件为空!" << endl;
        this->m_EmpNum = 0;  // 初始化人数
        this->m_FileIsEmpty = true;
        this->m_EmpArray = NULL;
        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();
    
//    // 测试代码
//    for (int i = 0; i < m_EmpNum; i++) {
//        cout << "职工编号:" << this->m_EmpArray[i]->m_Id
//        << "职工姓名:" << this->m_EmpArray[i]->m_Name
//        << "部门编号:" << this->m_EmpArray[i]->m_DeptId << endl;
//    }
}


// 展示菜单
void WorkerManager::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;
}

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


// 1、增加职工
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 << "请选择该职工的岗位:1-普通职工 2-经理 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++;
//        cout << "职工编号:" << id << "\t" << name << "\t" << dId << "\t" << num << endl;
    }
//    ifs.close();
    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) {
            worker = new Manager(id, name, dId);
        } else if (dId == 3) {
            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");
}


// 判断职工是否存在
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::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");
}


// 修改职工
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]; // 释放原来的数据
            this->m_EmpArray[ret] = NULL;
            
            int newId = 0;
            string newName = "";
            int dSelect = 0;
            
            cout << "查到:" << id << "号职工,请输入新职工编号:" << endl;
            cin >> newId;
            
            cout << "请输入新姓名:" << endl;
            cin >> newName;
            
            cout << "请输入岗位:1-普通职工 2-经理 3-老板" << endl;
            cin >> dSelect;
            
            Worker *worker = NULL;
            switch (dSelect) {
                case 1:
                    worker = new Employee(newId, newName, dSelect);
                    break;
                case 2:
                    worker = new Manager(newId, newName, dSelect);
                    break;
                case 3:
                    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 << "确认清空?1、确认 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_EmpArray[i] = NULL;
                }
            }
            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];
                this->m_EmpArray[i] = NULL;
            }
        }
        delete[] this->m_EmpArray;
        this->m_EmpArray = NULL;
    }
//    // 释放堆区数据
//    if (this->m_EmpArray != NULL) {
//        delete[] this->m_EmpArray;
//    }
}

main.cpp

#include <iostream>
using namespace std;
#include "workerManager.h"

#include "worker.h"
#include "employee.h"
#include "manager.h"
#include "boss.h"

void test() {
    Worker *worker = NULL;
    worker = new Employee(1, "张三", 1);
    worker->showInfo();
//    delete worker;
    
    worker = new Manager(2, "李四", 2);
    worker->showInfo();
//    delete worker;
    
    worker = new Boss(3, "王五", 3);
    worker->showInfo();
//    delete worker;
}


int main() {
//    test();
    WorkerManager wm;
    int choice = 0;
    while (true) {
        // 展示菜单
        wm.Show_Menu();
        cout << "请输入你的选择:" << endl;
        cin >> choice;
        
        switch (choice) {
            case 0:
                wm.exitSystem();
                break;
            case 1:
                wm.Add_Emp();
                break;
            case 2:
                wm.Show_Emp();
                break;
            case 3:
                wm.Del_Emp();
                break;
            case 4:
                wm.Mod_Emp();
                break;
            case 5:
                wm.Find_Emp();
                break;
            case 6:
                wm.Sort_Emp();
                break;
            case 7:
                wm.Clean_File();
                break;
            default:
                system("cls");
                break;
        }
    }
    return 0;
}
posted @ 2025-12-06 16:19  归去来矣  阅读(0)  评论(0)    收藏  举报