我的作业代码计算有误.如何修复

Calculations are wrong in my homework code. How to fix?

本文关键字:何修复 计算 作业 代码 我的      更新时间:2023-10-16

我应该这样做:

  • 编写一个基类Worker和两个派生类HourlyWorkerSalariedWorker。每个工人都有名字和工资率。

  • 编写虚函数compute_pay(int hours),计算每个工人的周工资。小时工在前40小时获得全额工资,超过40小时的工资减半。无论实际工作时数是多少,受薪工人每小时获得40小时的工资。

下面是我的代码,编译没有错误。但是这些计算都是错误的。我希望有人能告诉我我的代码有什么问题。

#include <iostream>
#include <string>
using namespace std;
//////////// Worker /////////////////////////////
class Worker
{
    public:
        Worker();
        Worker(string name, int salary);
        void print();
        int compute_pay(int hours);
        string get_name();
        int get_salary();
    private:
        string name;
        int salary;
        int payout;
};
Worker::Worker() {salary = 0;}
Worker::Worker(string name, int salary)
{
    this->name = name;
    this->salary = salary;
}
void Worker::print()
{
    cout << "Worker name: " << this->name;
    cout << "Salary: " << this->salary;
}
int Worker::compute_pay(int hours)
{
    this->payout = this->salary * hours;
    return payout;
}
string Worker::get_name() {return this->name;}
int Worker::get_salary() { return this->salary;}
//////////// HourlyWorker ///////////////////////
class HourlyWorker : public Worker
{
    public:
    HourlyWorker(string name, int salary);
    int compute_pay(int hours); 
private:
    string name;
    int salary;
    int payout;
};
HourlyWorker::HourlyWorker(string name, int salary)
    :Worker(name, salary) {}
int HourlyWorker::compute_pay(int hours)
{
    int temp = 0;
    if (hours >= 40)
    {
        temp = (this->salary * (hours - 40)) / 2;
        this->payout = (this->salary * 40) + temp;
    }
    else
    {
        this->payout = this->salary * hours;
    }
    return payout;
}
//////////// SalariedWorker /////////////////////
class SalariedWorker : public Worker
{
    public:
        SalariedWorker(string name, int salary);
        int compute_pay(int hours); 
    private:
        string name;
        int salary;
        int payout;
};
SalariedWorker::SalariedWorker(string name, int salary)
    :Worker(name, salary) {}
int SalariedWorker::compute_pay(int hours)
{
    this->payout = this->salary * 40;
    return payout;
}
///////// 
int main()
{
    HourlyWorker a("Sam", 20);
    HourlyWorker b("Mary", 15);
    SalariedWorker c("Tom", 30);
    SalariedWorker d("Pat", 40);
    cout << "Hourly worker " << a.get_name() << " earns $"
         << a.get_salary();
    cout << " and worked 20 hours for a pay of $" << a.compute_pay(20)
         << "n";
    cout << "Hourly worker " << b.get_name() << " earns $"
         << b.get_salary();
    cout << " and worked 50 hours for a pay of $" << b.compute_pay(50)
         << "n";
    cout << "Salaried worker " << c.get_name() << " earns $"
         << c.get_salary();
    cout << " and worked 20 hours for a pay of $" << c.compute_pay(20)
         << "n";
    cout << "Salaried worker " << d.get_name() << " earns $"
         << d.get_salary();
    cout << " and worked 50 hours for a pay of $" << d.compute_pay(50)
         << "n";
    return 0;
}

这是我运行它时的结果:

Hourly worker Sam earns $20 and worked 20 hours for a pay of $85081400
Hourly worker Mary earns $15 and worked 50 hours for a pay of $-1915569464
Salaried worker Tom earns $30 and worked 20 hours for a pay of $91731520
Salaried worker Pat earns $40 and worked 50 hours for a pay of $162529280

这就是我想要得到的

Hourly worker Sam earns $20 and worked 20 hours for a pay of $400
Hourly worker Mary earns $15 and worked 50 hours for a pay of $825
Salaried worker Tom earns $30 and worked 20 hours for a pay of $1200
Salaried worker Pat earns $40 and worked 50 hours for a pay of $2000

您的代码中有许多问题。您在计算中看到如此奇数的原因是因为您的每个派生类(HourlyWorkerSalariedWorker)都有自己的私有name, salarypayout成员。这些成员与基类中的namesalarypayout成员不同,因为派生类不能直接访问私有成员。

为什么是奇数呢?这是因为您只通过调用基类构造函数来设置salary。这将设置基类的私有salary成员,但不设置派生类成员。因此,派生类成员就是内存中恰好位于该位置的任何内容,因此当您将其乘以工作小时数时,您将得到一个非常奇怪的结果。

可以通过使数据成员在基类中受保护,并从派生类定义中删除它们来修复这个问题。(Name仍然可以是私有的,因为你不能在派生类中直接访问它。)这样,当您访问salary时,您将始终访问具有正确值的基类成员。

一旦你解决了这个问题,你应该会看到合理的数字。然而,据我所知,你的期望值与你给出的赋值定义不相符。你得自己解决这个问题。

除此之外,您还被要求编写一个函数,但是您的compute_pay函数实际上并不是虚的。c++ FAQ中有c++虚函数的一个很好的概述,所以我强烈建议你去看看。简而言之,不同之处在于,如果在基类指针或引用上调用虚函数,而该指针或引用实际上是派生类型,则将调用相应的派生类函数。如果函数是非虚函数,则始终调用基类函数,即使派生类重写了它。

实际上,雇员的工资总是保存到工人类中,而不是保存在小时和工薪类中。因此,无论何时调用"compute_pay",它都会使用垃圾值。因此,要删除它,请在hour和salaried类的构造函数中使用this。

SalariedWorker::SalariedWorker(string name, int salary)
:Worker(name, salary) {this->salary=salary;}
HourlyWorker::HourlyWorker(string name, int salary)
:Worker(name, salary) {this->salary=salary;}
this->salary=salary 

将工资也复制到这些类的工资