C++封装、继承、多态的应用---职工管理系统

news2025/1/12 22:50:18

C++封装、继承、多态的应用—职工管理系统

文章目录

  • C++封装、继承、多态的应用---职工管理系统
    • 1.需求分析
    • 2.抽象类的建立
      • 2.1抽象基类
      • 2.2员工类
      • 2.3经理类
      • 2.4老板类
      • 2.5存储类
    • 3.抽象类的实现
    • 4.功能函数的实现
      • 4.1菜单功能的实现
      • 4.2增加职工功能函数实现
      • 4.2显示职工功能函数实现
      • 4.3删除职工功能函数实现
      • 4.4修改信息功能函数实现
      • 4.5查找职工功能函数实现
      • 4.6职工排序功能函数实现
      • 4.7清除信息功能函数实现
    • 5.主函数
    • 6.总结

1.需求分析

可以实现不同职工(老板、经理、员工)的增、删、改、查,以及对员工按职工编号进行排序,同时实现增删改查功能和文件的交互。
在主菜单界面显示:增加职工、显示、删除、修改、查找、排序、清空和退出系统的功能。如下图:
在这里插入图片描述

2.抽象类的建立

2.1抽象基类

class Base {
public:
    int num;
    std::string name;
    std::string job;
    virtual void addPerson(int  &num, std::string &name, std::string &job) = 0;
    virtual void deletePerson(int &num) = 0;
};

基类中定义了老板类、经理类、员工类的共同属性,将增加操作的函数声明为纯虚函数,使基类无法实例化对象,同时需要在派生类中重写基类的纯虚函数,否则派生类也为抽象类,无法实例化对象。

2.2员工类

class Staff : public Base {
public:
    std::string duty = "完成经理交给的任务";
    void addPerson(int &num, std::string &name, std::string &job) override ;
    void deletePerson(int &num) override ;
};

员工类继承基类的属性,同时也拥有自己独一无二的职责属性duty

2.3经理类

class Manager : public Base {
public:
    std::string duty = "完成老板交给的任务,并下发给员工";
    void addPerson(int &num, std::string &name, std::string &job) override ;
    void deletePerson(int &num) override ;
};

2.4老板类

class Boss : public Base {
public:
    std::string duty = "管理公司所有事务";
    void addPerson(int &num, std::string &name, std::string &job) override ;
    void deletePerson(int &num) override ;
};

员工、经理和老板类都继承了基类中共同的属性,同时重写了基类的纯虚函数,使用了继承和多态的技术。

2.5存储类

class SaveList {
public:
    int num{};
    Staff staff[100];
    Manager manager[100];
    Boss boss[100];
};

存储类来实现不同职工信息的存储。

3.抽象类的实现

#include "myClass.h"


void Staff::addPerson(int &num, std::string &name, std::string &job) {
    this->num = num;
    this->name = name;
    this->job = job;
}

void Staff::deletePerson(int &num) {
    num = 0;
}

void Manager::addPerson(int &num, std::string &name, std::string &job) {
    this->num = num;
    this->name = name;
    this->job = job;
}

void Manager::deletePerson(int &num) {
    num = 0;
}

void Boss::addPerson(int &num, std::string &name, std::string &job) {
    this->num = num;
    this->name = name;
    this->job = job;
}
void Boss::deletePerson(int &num) {
    num = 0;
}

通过在头文件中声明类的成员函数,在源文件实现成员函数,提高代码的可读性和易维护性。

4.功能函数的实现

4.1菜单功能的实现

void printMode()
{
    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 << "请选择(0-7): ";
}

通过cout实现简易的菜单界面。

4.2增加职工功能函数实现

void addEmp(SaveList &saveList)
{
    auto *staff = new Staff();
    auto *manager = new Manager();
    auto *boss = new Boss();
    int num = 0;
    string name;
    string job;
    cout << "请输入职工信息:" << endl;
    cout << "请输入职工编号:";
    cin >> num;
    cout << "请输入职工姓名:";
    cin >> name;
    cout << "请输入职工职位:";
    cin >> job;
    if (job == "经理")
    {
        manager->addPerson(num, name, job);
        saveList.manager[saveList.num] = *manager;
        saveList.num++;
        file.open("data.txt", ios::app);
        for (int i = 0; i < saveList.num; i++) {
            if (saveList.manager[i].num != 0) {
                file << saveList.manager[i].num << " " << saveList.manager[i].name << " " << saveList.manager[i].job
                    << " " << saveList.manager[i].duty << endl;
            }
        }
        file.close();
    }
    else if (job == "老板")
    {
        boss->addPerson(num, name, job);
        saveList.boss[saveList.num] = *boss;
        saveList.num++;
        file.open("data.txt", ios::app);
        for (int i = 0; i < saveList.num; i++) {
            if (saveList.boss[i].num != 0) {
                file << saveList.boss[i].num << " " << saveList.boss[i].name << " " << saveList.boss[i].job
                        << " " << saveList.boss[i].duty << endl;
            }
        }
        file.close();
    }
    else if (job == "员工")
    {
        staff->addPerson(num, name, job);
        saveList.staff[saveList.num] = *staff;
        saveList.num++;
        file.open("data.txt", ios::app);
        for (int i = 0; i < saveList.num; i++)
        {
            if (saveList.staff[i].num != 0){
                file << saveList.staff[i].num << " " << saveList.staff[i].name << " " << saveList.staff[i].job  << " " << saveList.staff[i].duty << endl;
            }
        }
        file.close();
    }
}

增加职工通过调用不同类的成员函数,增加不同岗位的职工,同时将不同岗位的职工数据存入各自的存储数组中,同时打开文件,将写文件方式设置为app(追加模式)解决每次写文件时对上次内容覆盖的问题。

4.2显示职工功能函数实现

void showEmp(SaveList &saveList)
{
    if (saveList.num == 0)
    {
        cout << "没有职工信息" << endl;
    }
    else
    {
        for (int i = 0; i < saveList.num; i++)
        {
            if (saveList.manager[i].num != 0){
                cout << "职工编号:" << saveList.manager[i].num << "\t\t";
                cout << "职工姓名:" << saveList.manager[i].name << "\t\t";
                cout << "职工职位:" << saveList.manager[i].job << "\t\t";
                cout << "职工职责:" << saveList.manager[i].duty << endl;
            }
        }
        for (int i = 0; i < saveList.num; i++)
        {
            if (saveList.boss[i].num != 0){
                cout << "职工编号:" << saveList.boss[i].num << "\t\t";
                cout << "职工姓名:" << saveList.boss[i].name << "\t\t";
                cout << "职工职位:" << saveList.boss[i].job << "\t\t";
                cout << "职工职责:" << saveList.boss[i].duty << endl;
            }
        }
        for (int i = 0; i < saveList.num; i++)
        {
            if (saveList.staff[i].num != 0){
                cout << "职工编号:" << saveList.staff[i].num << "\t\t";
                cout << "职工姓名:" << saveList.staff[i].name << "\t\t";
                cout << "职工职位:" << saveList.staff[i].job << "\t\t";
                cout << "职工职责:" << saveList.staff[i].duty << endl;
            }
        }
    }
}

对不同存储数组进行遍历,将内容输出。

4.3删除职工功能函数实现

void deleteEmp(SaveList &saveList)
{
    if (saveList.num == 0)
    {
        cout << "没有职工信息" << endl;
    }
    else
    {
        int num;
        cout << "请输入要删除的职工编号:";
        cin >> num;
        for (int i = 0; i < saveList.num; i++)
        {
            if (saveList.manager[i].num == num)
            {
                saveList.manager[i].num = 0;
                saveList.manager[i].name = "";
                saveList.num--;
            }
            if (saveList.boss[i].num == num)
            {
                saveList.boss[i].num = 0;
                saveList.boss[i].name = "";
                saveList.num--;
            }
            if (saveList.staff[i].num == num)
            {
                saveList.staff[i].num = 0;
                saveList.staff[i].name = "";
                saveList.num--;
            }
        }
    }
}

从显示函数部分知道,遍历每个数组时,会剔除编号为0的职工信息,故只需将职工的编号置为0实现这部分职工不显示,从侧面实现职工删除。

4.4修改信息功能函数实现

void modifyEmp(SaveList &saveList)
{
    auto *boss = new Boss();
    auto *staff = new Staff();
    auto *manager = new Manager();
    if (saveList.num == 0)
    {
        cout << "没有职工信息" << endl;
    }
    else
    {
        int num;
        cout << "请输入要修改的职工编号:";
        cin >> num;
        for (int i = 0; i < saveList.num; i++)
        {
            if (saveList.manager[i].num == num)
            {
                cout << "请输入职工姓名:";
                cin >> saveList.manager[i].name;
                cout << "请输入职工职位:";
                cin >> saveList.manager[i].job;
                if (saveList.manager[i].job == "老板"){
                    num = saveList.manager[i].num;
                    boss->addPerson(num, saveList.manager[i].name, saveList.manager[i].job);
                    saveList.boss[saveList.num] = *boss;
                    saveList.manager[i].num = 0;
                    saveList.num++;
                    return;
                }
                if (saveList.manager[i].job == "员工"){
                    staff->addPerson(num, saveList.manager[i].name, saveList.manager[i].job);
                    saveList.staff[saveList.num] = *staff;
                    saveList.manager[i].num = 0;
                    saveList.num++;
                    return;
                }
            }
            if (saveList.boss[i].num == num)
            {
                cout << "请输入职工姓名:";
                cin >> saveList.boss[i].name;
                cout << "请输入职工职位:";
                cin >> saveList.boss[i].job;
                if (saveList.boss[i].job == "经理"){
                    manager->addPerson(num, saveList.boss[i].name, saveList.boss[i].job);
                    saveList.manager[saveList.num] = *manager;
                    saveList.num++;
                    return;
                }
                if (saveList.boss[i].job == "员工"){
                    staff->addPerson(num, saveList.boss[i].name, saveList.boss[i].job);
                    saveList.staff[saveList.num] = *staff;
                    saveList.num++;
                    return;
                }
            }
            if (saveList.staff[i].num == num)
            {
                cout << "请输入职工姓名:";
                cin >> saveList.staff[i].name;
                cout << "请输入职工职位:";
                cin >> saveList.staff[i].job;
                if (saveList.staff[i].job == "经理"){
                    manager->addPerson(num, saveList.staff[i].name, saveList.staff[i].job);
                    saveList.manager[saveList.num]= *manager;
                    saveList.num++;
                    return;
                }
                if (saveList.staff[i].job == "老板"){
                    boss->addPerson(num, saveList.staff[i].name, saveList.staff[i].job);
                    saveList.boss[saveList.num] = *boss;
                    saveList.num++;
                    return;
                }
            }
        }
    }
}

在修改信息的过程中,如果修改的内容不包括岗位时,只需要对原始数据进行覆盖操作,但修改岗位时,事实上此时应该将数据更改存储位置,以保证默认值duty可以正确输出,所以可以认为修改岗位时相当于为其他岗位增加了一个成员,使本岗位减少了一个成员。

4.5查找职工功能函数实现

void findEmp(SaveList &saveList)
{
    if (saveList.num == 0)
    {
        cout << "没有职工信息" << endl;
    }
    else
    {
        int num;
        cout << "请输入要查找的职工编号:";
        cin >> num;
        for (int i = 0; i < saveList.num; i++)
        {
            if (saveList.manager[i].num == num)
            {
                cout << "职工编号:" << saveList.manager[i].num << "\t\t";
                cout << "职工姓名:" << saveList.manager[i].name << "\t\t";
                cout << "职工职位:" << saveList.manager[i].job << "\t\t";
                cout << "职工职责:" << saveList.manager[i].duty << endl;
            }
            if (saveList.boss[i].num == num)
            {
                cout << "职工编号:" << saveList.boss[i].num << "\t\t";
                cout << "职工姓名:" << saveList.boss[i].name << "\t\t";
                cout << "职工职位:" << saveList.boss[i].job << "\t\t";
                cout << "职工职责:" << saveList.boss[i].duty << endl;
            }
            if (saveList.staff[i].num == num)
            {
                cout << "职工编号:" << saveList.staff[i].num << "\t\t";
                cout << "职工姓名:" << saveList.staff[i].name << "\t\t";
                cout << "职工职位:" << saveList.staff[i].job << "\t\t";
                cout << "职工职责:" << saveList.staff[i].duty << endl;
            }
        }
    }
}

通过遍历每个存储数组,将存储内容输出。

4.6职工排序功能函数实现

void sortEmp(SaveList &saveList)
{
    if (saveList.num == 0)
    {
        cout << "没有职工信息" << endl;
    }
    else
    {
        for (int i = 0; i < saveList.num; i++)
        {
            for (int j = 0; j < saveList.num - i - 1; j++)
            {
                if (saveList.manager[j].num > saveList.manager[j + 1].num)
                {
                    swap(saveList.manager[j], saveList.manager[j + 1]);
                }
                if (saveList.boss[j].num > saveList.boss[j + 1].num)
                {
                    swap(saveList.boss[j], saveList.boss[j + 1]);
                }
                if (saveList.staff[j].num > saveList.staff[j + 1].num)
                {
                    swap(saveList.staff[j], saveList.staff[j + 1]);
                }
            }
        }
    }
}

通过冒泡排序将职工按编号进行升序排列(编号小的先显示)。

4.7清除信息功能函数实现

void deleteAll(SaveList &saveList)
{
    if (saveList.num == 0)
    {
        cout << "没有职工信息" << endl;
    }
    else
    {
        for (int i = 0; i < saveList.num; i++)
        {
            saveList.manager[i].num = 0;
            saveList.boss[i].num = 0;
            saveList.staff[i].num = 0;
        }
        saveList.num = 0;
        file.open("data.txt", ios::out);
        file << " " << endl;
        file.close();
    }
}

参考删除职工的操作,将所有信息“清除”,同时以普通模式向文件中写入空格,覆盖原来的信息。

5.主函数

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

int mode = 1;
string str;

int main() {
    SaveList saveList;
    while (mode != 0){
        printMode();
        cin >> mode;
        switch (mode) {
            case 1:
                label:
                addEmp(saveList);
                cout << "是否继续添加:"
                     << "1.继续添加"
                     << "2.退出" << endl;
                cin >> str;
                if (str == "2") {
                    break;
                }
                if (str == "1"){
                    goto label;
                }
            case 2:
                label2:
                showEmp(saveList);
                cout << "是否继续查看:"
                     << "1.继续查看"
                     << "2.退出" << endl;
                cin >> str;
                if (str == "2") {
                    break;
                }
                if (str == "1"){
                    goto label2;
                }
            case 3:
                label3:
                deleteEmp(saveList);
                cout << "是否继续删除:"
                     << "1.继续删除"
                     << "2.退出" << endl;
                cin >> str;
                if (str == "2") {
                    break;
                }
                if (str == "1"){
                    goto label3;
                }
            case 4:
                label4:
                modifyEmp(saveList);
                cout << "是否继续修改:"
                     << "1.继续修改"
                     << "2.退出" << endl;
                cin >> str;
                if (str == "2") {
                    break;
                }
                if (str == "1"){
                    goto label4;
                }
            case 5:
                label5:
                findEmp(saveList);
                cout << "是否继续查找:"
                     << "1.继续查找"
                     << "2.退出" << endl;
                cin >> str;
                if (str == "2") {
                    break;
                }
                if (str == "1"){
                    goto label5;
                }
            case 6:
                sortEmp(saveList);
                cout << "排序成功" << endl;
                break;
            case 7:
                cout << "确定删除所有员工?:";
                cin >> str;
                if (str == "是"){
                    deleteAll(saveList);
                    cout << "删除成功" << endl;
                    break;
                }
            default:
                cout << "欢迎使用" << endl;
        }
    }
    return 0;
}

通过switch实现不同功能函数的调用,同时引入goto语句,实现对同一个功能函数的重复调用。

6.总结

通过这个简单的案例,可以加深对基础语法的理解,以及夯实基础知识,为学习更加复杂的知识打下基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1854198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣SQL50 销售分析III having + 条件计数

Problem: 1084. 销售分析III &#x1f468;‍&#x1f3eb; 参考题解 Code select s.product_id,p.product_name from sales s left join product p on s.product_id p.product_id group by product_id having count(if(sale_date between 2019-01-01 and 2019-03-31,1,nu…

【2024最新版】Mysql数据库安装全攻略:图文详解(Windows版本)

目录 1. 引言1.1 MySQL特性1.2 开源1.3 跨平台支持1.4 编程接口1.5 系统特性1.6 性能优势 2. 安装版本选择3. 安装MySQL3.1 下载MySQL3.2 安装MySQL 1. 引言 MySQL是一种流行的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;具有高度的可靠性、可扩展性和性能…

C++系列-String(二)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” #define _CRT_SECURE_NO_WARNINGS #include<string> #include<iostream> #include<list> #include<algorithm> using namespace std; void test_string…

计算机组成入门知识

前言&#x1f440;~ 数据库的知识点先暂且分享到这&#xff0c;接下来开始接触计算机组成以及计算机网络相关的知识点&#xff0c;这一章先介绍一些基础的计算机组成知识 一台计算机如何组成的&#xff1f; 存储器 CPU cpu的工作流程 主频 如何衡量CPU好坏呢&#xff1f…

基于stm32的温度采集并且显示

目录 一、I2C总线通信协议 &#xff08;一&#xff09;I2C简介 &#xff08;二&#xff09;I2C物理层 &#xff08;三&#xff09;I2C协议层 1、I2C基本读写过程 2、通信的起始和停止信号 3、数据的有效性 4、地址及数据方向 5、响应 &#xff08;四&#xff09;软件I…

常说的云VR是什么意思?与传统vr的区别

虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;是一种利用计算机技术模拟产生一个三维空间的虚拟世界&#xff0c;让用户通过视觉、听觉、触觉等感官&#xff0c;获得与现实世界类似或超越的体验。VR技术发展历程可追溯至上世纪&#xff0c;经历概念提出、…

方差分析【单/双因素方差分析】

文章目录 方差分析一、单因素方差分析&#xff08;Analysis of Variance&#xff09;1.方差分析在做什么&#xff1f;2.方差分析的思路&#xff1a;3.方差分析中的计算&#xff1a;4.构造F统计量&#xff1a; 二、双因素方差分析(Two-way ANOVA)1.双因素方差分析在做什么&#…

HCIA 18 结束 企业总部-分支综合实验(上)

1.实验介绍及拓扑 &#xff08;1&#xff09;总部和分支机构都可以上互联网访问8.8.8.8&#xff1b; &#xff08;2&#xff09;总部和分支机构使用广域网专线互访作为主线&#xff0c;并且通过互联网建立GRE隧道互访作为备线&#xff1b; &#xff08;3&#xff09;总部内为…

【database3】oracle:数据交换/存储/收集

文章目录 1.oracle安装&#xff1a;swap&#xff0c;dd1.1 创建swap交换区&#xff1a;grep MemTotal /proc/meminfo &#xff08;安装Oracle物理内存要求1024MB以上&#xff09;&#xff0c;grep SwapTotal /proc/meminfo1.2 安装依赖包及改系统核心参数&#xff1a;关闭一些系…

机器学习算法(二):1 逻辑回归的从零实现(普通实现+多项式特征实现非线性分类+正则化实现三个版本)

文章目录 前言一、普通实现1 数据集准备2 逻辑回归模型3 损失函数4 计算损失函数的梯度5 梯度下降算法6 训练模型二、多项式特征实现非线性分类1 数据准备与多项式特征构造2 逻辑回归模型三、逻辑回归 --- 正则化实现1 数据准备2 逻辑回归模型3 正则化损失函数4 计算损失函数的…

Cyber Weekly #12

赛博新闻 1、Anthropic发布Claude 3.5 Sonnet 本周五&#xff08;6月21日&#xff09;凌晨&#xff0c;Anthropic宣布推出其最新的语言模型Claude 3.5 Sonnet&#xff0c;距离上次发布Claude3才过去3个月。Claude3.5拥有20万token的长上下文窗口&#xff0c;目前已经在Claude…

企业中订单超时关闭是怎么做的?我说用延迟消息,面试官让我回去等消息?

文章目录 背景时序图方案对比方案一 被动关闭方案二 定时关闭方案三 Rocket MQ延迟消息 总结 背景 订单超时未支付是电商中的一个核心场景&#xff0c;当用户创建订单后&#xff0c;超过一定时间没有支付&#xff0c;平台需要及时将该订单关闭。需要关闭的主要原因有以下几个&…

初中英语优秀作文分析-005How to Plan Our Life Wisely-如何明智地规划我们的生活

PDF格式公众号回复关键字:SHCZYF005 记忆树 1 The “double reduction policy” reduces the burden on students and offers us more spare time than before, but how to plan our life wisely? 翻译 “双减政策”减轻了学生的负担&#xff0c;给了我们比以前更多的业余…

预备资金有5000-6000买什么电脑比较好?大学生电脑选购指南

小新pro14 2024 处理器&#xff1a;采用了英特尔酷睿Ultra5 125H或Ultra9 185H两种处理器可选&#xff0c;这是英特尔最新的高性能低功耗处理器&#xff0c;具有18个线程&#xff0c;最高可达4.5GHz的加速频率&#xff0c;支持PCIe 4.0接口&#xff0c;内置了强大的ARC核芯显卡…

Windows Update Blocker 完全禁用或启用Windows系统上的自动更新,一键阻止,无需额外操作!

你是否曾因为突如其来的系统更新而感到手忙脚乱&#xff1f;Windows Update Blocker v1.8让你只需一键&#xff0c;即可完全禁用或启用Windows系统上的自动更新&#xff0c;不需要任何的额外操作&#xff0c;只需要打开软件&#xff0c;点击应用即可关闭Windows系统上的自动更新…

DVWA-CSRF-samesite分析

拿DVWA的CSRF为例子 接DVWA的分析&#xff0c;发现其实Impossible的PHPSESSID是设置的samesite1. 参数的意思参考Set-Cookie SameSite:控制 cookie 是否随跨站请求一起发送&#xff0c;这样可以在一定程度上防范跨站请求伪造攻击&#xff08;CSRF&#xff09;。 下面用DVWA CS…

[案例]国家数据局:首批“数据要素×”典型案例深度解析系列之五

“ 通过示范引领&#xff0c;激励多方主体积极参与&#xff0c;释放数据要素价值。” 本文为“数据要素”典型案例深度解析系列的第五篇&#xff0c;前四篇请见 [案例]国家数据局&#xff1a;首批“数据要素”典型案例深度解析系列之一 [案例]国家数据局&#xff1a;首批“数…

微信小程序入门2

微信开发者工具的安装方法 1.打开微信开发者工具下载页面 在微信小程序管理后台的左侧边栏中选择“开发工具”&#xff0c;然后选择“开发者工具”&#xff0c;即可找到微信开发者工具的下载页面。 2.打开微信开发者工具的下载链接页面 单击“下载” 按钮下载&#xff0c;即…

【网络安全的神秘世界】已解决burpsuite报错Failed to start proxy service on 127.0.0.1:8080

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 解决burpsuite无法在 127.0.0.1&#xff1a;8080 上启动代理服务端口被占用以及抓不到本地包的问题 Burpsuite无法启动proxy…

深度学习 --- stanford cs231学习笔记五(训练神经网络的几个重要组成部分之二,数据的预处理)

数据的预处理(Data Preprocessing) 2 Data Preprocessing数据的预处理 数据预处理的几种方法 2&#xff0c;1 数据的零点中心化 数据的零点中心化的目的就是为了把数据的整体分布拉回到原点附近&#xff0c;也就是让数据的整体均值变为0。 ​ 2&#xff0c;2 数据的标准化 数据…