【东华大学oj】28 发工资(面向对象)

发布时间:2024年01月08日
#include <iostream>
#include <vector>
#include <string>

using namespace std;

// 基类Employee
class employee
{
protected:
    string name;
    string role;
    double salary;

public:
    // 构造函数
    employee(string n, string r) : name(n), role(r), salary(0) {} // 虚函数,计算工资
    virtual void calcSalary() = 0;

    // 显示信息
    void showInformation()
    {
        cout << name << " " << role << " " << salary << endl;
    }

    // 获取工资
    double getSalary()
    {
        return salary;
    }
};

// 派生类Boss
class boss : public employee
{
public:
    boss(string name) : employee(name, "boss") {}
    void calcSalary() override
    {
        salary = 5000;
    }
};

// 派生类Salesman
class salesman : public employee
{
    int salesCount;
public:
    salesman(string name, int sales) : employee(name, "salesman"), salesCount(sales){}
        void calcSalary() override
    {
        salary = 2000 + salesCount * 0.1;
    }
};

// 派生类Intern
class intern : public employee
{
    int workHours;
public:
    intern(string name, int hours) : employee(name, "intern"), workHours(hours){}
       void calcSalary() override
    {
        salary = workHours * 30;
    }
};

int main()
{
    vector<employee*> empList;
    int op, salesCount, workHours;
    string name;

    while (cin >> op)
    {
        switch (op)
        {
        case 1:
        {
            cin >> name;
            employee *pe = new boss(name);
            empList.push_back(pe);
            break;
        }
        case 2:
        {
            cin >> name >> salesCount;
            employee *pe = new salesman(name, salesCount);
            empList.push_back(pe);
            break;
        }
        case 3:
        {
            cin >> name >> workHours;
            employee *pe = new intern(name, workHours);
            empList.push_back(pe);
            break;
        }
        default:
            // Handle invalid option if necessary
            break;
        }
    }

    double totalSalary = 0;
    for (employee* emp : empList)
    {
        emp->calcSalary(); // 计算工资
        totalSalary += emp->getSalary();
        emp->showInformation(); // 显示信息
    }

    cout << "total salary:" << totalSalary << endl;

    // 清理分配的内存
    for (employee* emp : empList)
    {
        delete emp;
    }

    return 0;
}

作者:?Turbo时间限制:?1S章节:?多态?

问题描述 :

实验目的:多态的应用

实验内容:

? 公司有三类雇员:老板、销售员、实习生。

? 老板每月固定5000元;销售员每月2000元底薪加提成,提成的计算方式为销售额的10%;实习生的工资按实习时间计算,每小时30元。

? 现输入若干雇员的信息,请输出一个月该发多少工资。

? 要求:

? 首先声明类employee,包含:

? 数据成员:

? string name;

? string role;

? double salary;

?以及

  • ?构造函数:employee(string name, string role),并且仅声明这一个构造函数,无默认构造函数。

  • ?虚函数calcSalary

  • ?普通成员函数showInformation(该输出雇员的姓名、角色、工资信息)

  • ?普通成员函数getSalary(返回salary的值)

? 再声明三个employee的派生类:boss、salesman、intern,类中需要实现虚函数calcSalary。

? 在main函数中,首先输入若干雇员的信息,放入empList中,然后遍历empList,计算各雇员的工资,输出其信息,最后输出总工资。

? main函数代码如下:

? int main()

? {

? ? vector<employee *> empList;

? ? int op, salesCount, workHours;

? ? string name;

? ? while (cin >> op)

? ? ?{

? ? ? ? switch (op)

? ? ? ? {

? ? ? ? ? ? case 1:

? ? ? ? ? ? {

? ? ? ? ? ? ? ? cin>>name;

? ? ? ? ? ? ? ? employee *pe = new boss(name);

? ? ? ? ? ? ? ? empList.push_back(pe);

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? }

? ? ? ? ? ? case 2:

? ? ? ? ? ? {

? ? ? ? ? ? ? ? cin>>name>>salesCount;

? ? ? ? ? ? ? ? employee *pe=new salesman(name, salesCount);

? ? ? ? ? ? ? ? empList.push_back(pe);

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? }

? ? ? ? ? ? case 3:

? ? ? ? ? ? {

? ? ? ? ? ? ? ? cin>>name>>workHours;

? ? ? ? ? ? ? ? employee *pe=new intern(name, workHours);

? ? ? ? ? ? ? ? empList.push_back(pe);

? ? ? ? ? ? ? ? break;

? ? ? ? ? ? }

? ? ? ? }

? ? ?}

? ? double totalSalary = 0;

? ? for(int i=0; i<empList.size(); i++)

? ? {

? ? ? ? empList.at(i)->calcSalary();//先利用各派生类的多态性计算出工资

? ? ? ? totalSalary += empList.at(i)->getSalary();

? ? ? ? empList.at(i)->showInformation();

? ? }

? ? cout<<"total salary:"<<totalSalary<<endl;

? ? return 0;

?}

输入说明 :

输入若干行,每行输入一个雇员的信息。

每一行的输入形式为:

首先输入一个整数,表示雇员的种类,1为老板,2为销售员,3为实习生。

如果输入1,后面紧接着输入老板的姓名。

如果输入2,后面紧接着输入销售员的姓名及销售额。

如果输入3,后面紧接着输入实习生的姓名及实习小时数。

输入的姓名中无空格,销售额及实习小时数均为整数。

输出说明 :

如果共有n个雇员,则共输出n+1行,

前n行输出雇员的姓名、角色及工资,以空格分隔。角色为:boss、salesman、intern。

第n+1行输出工资总额。

n个雇员的输出顺序按照输入的顺序。

文章来源:https://blog.csdn.net/2301_79923893/article/details/135425042
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。