IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 嵌入式Linux C++练习4——小型公司人员信息管理 -> 正文阅读

[C++知识库]嵌入式Linux C++练习4——小型公司人员信息管理

设计要求:

某小型公司,主要有四类人员:经理、技术人员、销售经理和推销员。现在,需要存储这些人员的姓名、编号、级别、当月薪水。计算月薪总额并显示全部信息。人员编号基数为 1000,每输入一个人员信息编号顺序加 1。程序要有对所有人员提升级别的功能。 本例中为简单起见, 所有人员的初始级别均为 1级。然后进行升级,经理升为 4 级,技术人员和销售经理升为 3 级,推销员仍为 1 级。
月薪计算办法是:

  1. 经理拿固定月薪 8000 元;
  2. 技术人员按每小时 100 元领取月薪;
  3. 推销员的月薪按该推销员当月销售额的 4%提成;
  4. 销售经理既拿固定月薪也领取销售提成,固定月薪为 5000 元,销售提成为所管辖部门当月销售总额的 5%。

设计思路

根据要求,先设置一个基类employee,在这之上派生出经理类,技术人员类,销售员类,销售经理类。而在基类中,除了定义构造函数和析构函数以外,还应统一定义对各类人员信息都应有的譬如定义姓名,编号,设置等级等操作,这样可以规范各派生类的基本行为。但是由于各类人员的月薪计算方法不同,各类人员信息的显示内容也不同,不能统一在基类中定义。因此,在employee类中用纯虚函数的方式定义了计算月薪函数Salary()和显示信息函数Print(),然后在派生类中再根据各自的同名函数实现具体的功能。

staff.h

#ifndef __STAFF_H__
#define __STAFF_H__

#include <iostream>
#include <cstring>
using namespace std;

class employee //普通员工
{
protected:
    char *name;   //姓名
    int id;       //编号
    int rank;     //级别
    float salary; //当月薪水
    static int num;

public:
    employee();
    ~employee();
    void SetName();
    void Setrank(int);     //升级功能
    virtual void Salary(); //计算当月薪水
    virtual void Print();  //显示数据
};

class manager : public employee //经理
{
protected:
    int m_salary; //固定月薪

public:
    manager();
    void Salary();
    void Print();
};

class technicist : public employee //技术人员
{
protected:
    int h_salary; //时薪
    int hours;    //月工作时数

public:
    technicist();
    void Salary();
    void Print();
};

class salesman : public employee //销售员
{
protected:
    float rate; //销售额提成
    float sale; //当月销售额
public:
    salesman();
    void Salary();
    void Print();
};

class salesmanager : public employee //销售经理
{
protected:
    int m_salary;
    float rate; //销售额提成
    float sale; //当月销售额

public:
    salesmanager();
    void Salary();
    void Print();
};

#endif

staff.cpp

#include "staff.h"

int employee::num = 1000; //员工编号基数为1000

employee::employee()
{
    id = ++num; //每次输入员工信息时,员工编号 + 1
    rank = 1;
}

employee::~employee()
{
    delete name;
}

void employee::SetName()
{
    char m_name[20];
    cout << "请输入职工姓名:" << endl;
    cin >> m_name;
    name = new char[strlen(m_name)];
    strcpy(name, m_name);
}

void employee::Setrank(int r)
{
    rank += r;
}

void employee::Salary() {}

void employee::Print() {}

manager::manager()
{
    m_salary = 8000; //经理拿固定月薪 8000 元
}

void manager::Salary()
{
    salary = m_salary;
}

void manager::Print()
{
    cout << "职位:经理,姓名:" << name << ",编号:" << id << endl;
    cout << "级别:" << rank << ",当月薪水:" << salary << endl
         << endl;
}

technicist::technicist()
{
    h_salary = 100; //技术人员按每小时 100 元领取月薪
}

void technicist ::Salary()
{
    cout << "输入技术人员" << name << "当月工作总小时数:" << endl;
    cin >> hours;
    salary = hours * h_salary;
}

void technicist::Print()
{
    cout << "职位:技术人员,姓名:" << name << ",编号:" << id << endl;
    cout << "级别:" << rank << ",当月薪水:" << salary << endl
         << endl;
}

salesman::salesman()
{
    rate = 0.04f; //推销员的月薪按该推销员当月销售额的 4%提成
}

void salesman::Salary()
{
    cout << "输入销售员" << name << "当月销售总额:" << endl;
    cin >> sale;
    salary = sale * rate;
}

void salesman::Print()
{
    cout << "职位:销售员,姓名:" << name << ",编号:" << id << endl;
    cout << "级别:" << rank << ",当月薪水:" << salary << endl
         << endl;
}

salesmanager::salesmanager()
{
    m_salary = 5000; //销售经理既拿固定月薪也领取销售提成,固定月薪为 5000 元,
    rate = 0.05f;    //销售提成为所管辖部门当月销售总额的 5%
}

void salesmanager::Salary()
{
    cout << "输入销售经理" << name << "所管辖部门当月销售总额:" << endl;
    cin >> sale;
    salary = sale * rate + m_salary;
}

void salesmanager::Print()
{
    cout << "职位:销售经理,姓名:" << name << ",编号:" << id << endl;
    cout << "级别:" << rank << ",当月薪水:" << salary << endl
         << endl;
}

main.cpp

#include "staff.h"

int main()
{
    manager m1;
    technicist t1;
    salesman s1;
    salesmanager s2;

    m1.SetName();
    m1.Setrank(3);
    m1.Salary();
    m1.Print();

    t1.SetName();
    t1.Setrank(2);
    t1.Salary();
    t1.Print();

    s1.SetName();
    s1.Setrank(0);
    s1.Salary();
    s1.Print();

    s2.SetName();
    s2.Setrank(2);
    s2.Salary();
    s2.Print();

    return 0;
}

改进空间

由于销售经理(salesmanager)既是经理又是销售人员,兼具两类人员的特点,因此同时继承manager和salesman两个类的方法会更加简便。注意要将employee类设计为虚基类来避免二义性。但我的虚拟机在这样改的时候老是会报基类不明确的错误,就直接使用继承普通员工类的笨办法了。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-08 11:03:10  更:2021-08-08 11:05:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 3:29:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码