C++分步实现职工管理系统详解

C++分步实现职工管理系统详解攻略

1. 程序基本框架

职工管理系统可以分为三个类别:员工基本信息类(Employee),普通员工类(Worker)和经理类(Manager)。其中,普通员工类和经理类都继承了员工基本信息类,因此程序框架如下:

// 员工信息类
class Employee {
public:
    virtual void showInfo() = 0;  // 展示个人信息
    virtual string getDeptName() = 0;  // 获取所在部门名称
    int m_Id;  // 员工编号
    string m_Name;  // 员工姓名
    int m_DeptId;  // 所在部门编号
};

// 普通员工类
class Worker : public Employee {
public:
    virtual void showInfo();  // 展示个人信息
    virtual string getDeptName();  // 获取所在部门名称
};

// 经理类
class Manager : public Employee {
public:
    virtual void showInfo();  // 展示个人信息
    virtual string getDeptName();  // 获取所在部门名称
    int m_Level;  // 管理等级
};

2. 主要功能实现

2.1 添加员工信息

在添加员工信息时,需要让用户选择添加普通员工或者经理,并根据用户选择分别进行不同的操作。代码实现如下:

// 实现添加员工函数
void WorkerManager::addEmp() {
    cout << "请输入添加员工类型:" << endl;
    cout << "1、普通员工" << endl;
    cout << "2、经理" << endl;
    int choice = 0;
    cin >> choice;
    if (choice == 1) {  // 添加普通员工
        int id = this->getEmpId();  // 获取新员工编号
        string name;
        int dId;
        cout << "请输入员工姓名:" << endl;
        cin >> name;
        cout << "请输入员工部门编号:" << endl;
        cin >> dId;
        // 创建新员工对象并加入数组
        this->m_EmpArray[this->m_EmpNum] = new Worker(id, name, dId);
        this->m_EmpNum++;  // 员工数量加1
        this->m_FileIsEmpty = false;  // 文件不为空
        cout << "添加成功!" << endl;
    } else if (choice == 2) {  // 添加经理
        int id = this->getEmpId();  // 获取新员工编号
        string name;
        int dId;
        cout << "请输入员工姓名:" << endl;
        cin >> name;
        cout << "请输入员工部门编号:" << endl;
        cin >> dId;
        cout << "请输入经理等级:" << endl;
        int level;
        cin >> level;
        // 创建新经理对象并加入数组
        this->m_EmpArray[this->m_EmpNum] = new Manager(id, name, dId, level);
        this->m_EmpNum++;  // 员工数量加1
        this->m_FileIsEmpty = false;  // 文件不为空
        cout << "添加成功!" << endl;
    } else {
        cout << "输入选项有误,请重新选择!" << endl;
    }
}

2.2 显示员工信息

显示员工信息时,要判断员工数组是否为空,如果为空则提示用户先添加员工信息。如果数组不为空,则循环输出每个员工的信息。

// 实现显示员工函数
void WorkerManager::showEmp() {
    if (this->m_FileIsEmpty) {  // 判断员工数组是否为空
        cout << "文件不存在或记录为空!" << endl;
    } else {
        for (int i = 0; i < m_EmpNum; i++) {
            m_EmpArray[i]->showInfo();  // 调用虚函数展示员工个人信息
        }
    }
}

2.3 修改员工信息

修改员工信息前先让用户输入要修改员工的编号,然后判断员工数组中是否有该编号的员工信息。如果有,则根据用户选择修改员工姓名或部门编号。如果是经理,还可以修改管理等级。

// 实现修改员工信息函数
void WorkerManager::modEmp() {
    if (this->m_FileIsEmpty) {  // 判断员工数组是否为空
        cout << "文件不存在或记录为空!" << endl;
    } else {
        cout << "请输入修改员工的编号:" << endl;
        int id;
        cin >> id;
        int index = this->isEmpExist(id);  // 根据员工编号查找员工在数组中的下标
        if (index != -1) {  // 员工编号存在
            int choice = 0;
            cout << "请输入修改选项:" << endl;
            cout << "1、修改姓名" << endl;
            cout << "2、修改部门编号" << endl;
            if (m_EmpArray[index]->m_DeptId != 0) {  // 如果不是经理,则不能修改等级
                choice = 1;
            } else {
                cout << "3、修改等级" << endl;
                choice = 3;
            }
            cin >> choice;
            switch (choice) {
            case 1: {  // 修改姓名
                string name;
                cout << "请输入新的员工姓名:" << endl;
                cin >> name;
                m_EmpArray[index]->m_Name = name;
                cout << "修改成功!" << endl;
                break;
            }
            case 2: {  // 修改部门编号
                int dId;
                cout << "请输入新的部门编号:" << endl;
                cin >> dId;
                m_EmpArray[index]->m_DeptId = dId;
                cout << "修改成功!" << endl;
                break;
            }
            case 3: {  // 修改等级
                int level;
                cout << "请输入新的等级:" << endl;
                cin >> level;
                Manager* manager = dynamic_cast<Manager*>(m_EmpArray[index]);  // 将员工强转为经理
                manager->m_Level = level;  // 修改等级
                cout << "修改成功!" << endl;
                break;
            }
            default: {
                cout << "输入选项有误!" << endl;
                break;
            }
            }
        } else {
            cout << "编号为 " << id << " 的员工不存在!" << endl;
        }
    }
}

3. 示例说明

3.1 示例一

用户选择添加普通员工,程序输出如下:

请输入添加员工类型:
1、普通员工
2、经理
1
请输入员工姓名:
张三
请输入员工部门编号:
1
添加成功!

然后再次查询所有员工的信息,程序输出如下:

员工编号:1   员工姓名:张三   部门编号:1   职工岗位:普通员工

3.2 示例二

用户选择修改经理信息,程序输出如下:

请输入修改员工的编号:
2
请输入修改选项:
1、修改姓名
2、修改部门编号
3、修改等级
3
请输入新的等级:
99
修改成功!

修改后再次查询所有员工的信息,经理等级已经修改成功,程序输出如下:

员工编号:1   员工姓名:张三   部门编号:1   职工岗位:普通员工
员工编号:2   员工姓名:李四   部门编号:2   职工岗位:经理   基础职级:99

4. 总结

本篇攻略详细讲解了如何用 C++ 实现职工管理系统,包括类的继承和虚函数的使用,以及常用的数组和文件操作技巧,同时还给出了两条完整的示例说明,希望可以帮助读者更好地理解和掌握相关知识点。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++分步实现职工管理系统详解 - Python技术站

(0)
上一篇 2023年5月30日
下一篇 2023年5月30日

相关文章

  • Python中json.load()和json.loads()有哪些区别

    当我们使用Python进行处理JSON数据时,常常需要用到json模块中的load()和loads()方法。这两个方法都可以将JSON格式的字符串转化为Python对象,但是具体的使用方法和功能是不同的。 区别1:接收的参数类型不同 json.load()方法是将文件中的JSON格式数据转化为Python对象,即需要传入一个可读文件对象作为参数。例如: im…

    C 2023年5月23日
    00
  • Go错误和异常CGO fallthrough处理教程详解

    Go错误和异常CGO fallthrough处理教程详解 异常和错误的区别 在Go语言中,没有类似于Java的异常处理机制,而是采用了错误处理机制。Go语言中的错误是一种可以提前预判到的普通值,包含了自定义的错误信息。与其他语言不同,Go语言中的错误处理是基于返回值的,而不是异常。 如何处理错误 在Go语言中,一个函数的返回值通常由一个值和一个错误组成。当函…

    C 2023年5月23日
    00
  • 用C语言程序判断大小端模式

    确定计算机所采用的字节序(Endian)一般采用的是以下两种方式: 大端字节序(Big Endian):将高序字节存储在低地址,低序字节存储在高地址。 小端字节序(Little Endian):将低序字节存储在低地址,高序字节存储在高地址。 在C语言中,可以通过访问一个32位整数的低地址字节和高地址字节来判断计算机的字节序。 以下是一段判断计算机采用的字节序…

    C 2023年5月23日
    00
  • Linux系统中C语言编程创建函数fork()执行解析

    一、Linux系统中C语言编程创建函数fork()执行解析 1. 简介 在Linux系统中,通过fork() 函数可以创建出一个子进程(child process),让子进程拥有与父进程(parent process)相同的代码和数据的副本,然后各自独立运行。它是用于创建新进程的系统调用,可以更简便地创建新进程并与该进程进行通信。 2. 语法 创建子进程的函…

    C 2023年5月23日
    00
  • CDR怎么绘制一个简单的工作证?

    下面是CDR(CorelDRAW)怎么绘制一个简单的工作证的完整攻略: 1. 准备工作 首先,我们需要打开CDR软件,创建一个新的文档。在创建文档的时候,我们需要选择“页面尺寸”和“页面方向”,通常我们可以选择A4纵向的页面尺寸。 2. 绘制证件模板 接下来,我们需要绘制一个证件的矩形框架作为证件的模板。首先,我们需要选择矩形工具(快捷键F6),在画布上绘制…

    C 2023年5月23日
    00
  • C语言使用广度优先搜索算法解决迷宫问题(队列)

    C语言使用广度优先搜索算法解决迷宫问题(队列)攻略 概述 本攻略主要介绍如何使用 C 语言中的广度优先搜索算法和队列解决迷宫问题。广度优先搜索算法是一种用于遍历或搜索树或图的算法,这里我们将其应用到迷宫问题中。迷宫问题是指在一个有障碍物和可通行区域的矩阵中,从起点到终点找到一条路径的问题。本攻略中,我们将使用队列来存储和处理迷宫问题中的节点。 算法流程 广度…

    C 2023年5月22日
    00
  • python 统计代码耗时的几种方法分享

    Python 统计代码耗时的几种方法分享 在 Python 当中,我们经常需要统计代码的耗时,以便了解程序的性能情况,以及针对性优化。本文将分享几种统计 Python 代码耗时的方法。 1. 使用 time 模块 time 模块是 Python 自带的模块,可以非常方便地获取当前时间以及计算时间差。 示例代码: import time # 获取开始时间 st…

    C 2023年5月22日
    00
  • C++ IO设备读写功能实现详解

    C++ IO设备读写功能实现详解 在C++中,IO设备读写功能可以通过标准库中的iostream库实现。本文将详细讲解iostream库的基本使用方法和一些实际操作示例。 基本概念 在使用iostream库进行输入输出操作之前,需要了解一些概念: 输入流:用于从设备中读取数据的流,通常是std::cin 输出流:用于向设备中写入数据的流,通常是std::co…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部