【问题标题】:Program does arithmetic incorrectly when calculating overtime hours worked计算加班时间时程序计算错误
【发布时间】:2021-08-25 20:58:57
【问题描述】:

我正在用 C++ 编写一个计算加班时间的程序。出于某种原因,overtime_hours_worked 的计算已经过时了。我尝试初始化变量和否定。我为 hours_worked_inweek 输入了 48 小时,根据我的公式,我应该得到 8 作为答案。相反,我得到-40。我正在学习。

#include<iostream>

using namespace std;

int main(){
    
    int hours_worked_inweek=0;
    int dependents;
    int union_dues;
    double federal_tax_witholding;
    double state_tax_witholding;
    double social_security_tax_witholding;
    double gross_pay;
    double net_pay;
    double hourly_rate;
    double overtime_rate;
    int overtime_hours_worked=0;
    
    overtime_rate = 1.5*overtime_hours_worked;
    hourly_rate = 16.76;
    union_dues = 10;
    overtime_hours_worked = hours_worked_inweek-40;
    
    cout << " How many hours have you worked in a week ? " << endl;
    cin >> hours_worked_inweek;
    cout << "Wow ! You worked "<<hours_worked_inweek<<" this week"<<endl;
    
    if (hours_worked_inweek>40){
        cout<<"It looks like you also worked some overtime hours this week! Your Overtime hours are : "<<endl;
        cout<<hours_worked_inweek<< "-" << "40" << " Which is equal to " << overtime_hours_worked<<endl;
    }
    else{
        cout<< " You did not work any overtime hours this week !"<<endl;
    }
    
    cout<< "How many dependents do you have : "<<endl;
    cin>>dependents;

    return 0;
}

【问题讨论】:

  • overtime_hours_worked = hours_worked_inweek-40; 必须在 cin &gt;&gt; hours_worked_inweek; 之后,因为你现在从 0 中减去 40,所以 -40。
  • 其中定义了许多变量但未初始化。在使用它们之前,请确保它们都设置为有用的东西,但最好不要定义它们,直到你尽可能地获得它们的初始值。没有未初始化的变量可以防止很多琐碎的错误
  • 当您在 Stack Overflow 上提问时,您应该将您的程序缩减为 minimal reproducible example。不要发布整个代码;仅发布证明问题所需的内容。在这种情况下,您只需要 6 行,不是吗? (int hours_worked_inweek=0;int overtime_hours_worked=0;overtime_hours_worked = hours_worked_inweek-40;cout &lt;&lt; " How many hours have you worked in a week ? " &lt;&lt; endl;cin &gt;&gt; hours_worked_inweek;cout&lt;&lt;hours_worked_inweek&lt;&lt; "-" &lt;&lt; "40" &lt;&lt; " Which is equal to " &lt;&lt; overtime_hours_worked&lt;&lt;endl;)
  • 我会发表关于解决编译器警告的评论,但我猜你已经这样做了。我注意到您初始化的唯一两个变量是公式中使用的变量。您的编译器是否试图警告您您的设置错误(使用未初始化的变量),但您通过初始化为零而不是修复真正的错误来使其静音?

标签: c++ math


【解决方案1】:

你不能按这个顺序做:

overtime_hours_worked = hours_worked_inweek-40;

cout << " How many hours have you worked in a week ? " << endl;
cin >> hours_worked_inweek;

首先执行:overtime_hours_worked = hours_worked_inweek-40;,并使用当时hours_worked_inweek 的值。

只需切换它:

cout << " How many hours have you worked in a week ? " << endl;
cin >> hours_worked_inweek;

overtime_hours_worked = hours_worked_inweek-40;

【讨论】:

  • 旁注:如果您在靠近开始使用它们的位置定义变量,则更容易发现此类错误。请注意,这也有助于理解 C++ 不像电子表格那样工作。当计算中使用的变量随后发生更改时,不会重新计算结果。
【解决方案2】:

看看这条线overtime_hours_worked = hours_worked_inweek-40; 然后停一下。在那一刻,变量hours_worked_inweek 等于0,因为您在第一行初始化它。但是你想从用户的输入中减去 40,所以在你得到输入后移动这一行 cin &gt;&gt; hours_worked_inweek;

【讨论】:

  • 我认为许多新人认为赋值建立了一种数学关系,您可以将公式放在代码的开头,并且任何时候您要求与该变量相关的任何公式的值都会重新评估。 c++ 不能那样工作。相反,分配按照它在代码中的顺序发生,并且没有重新评估。
  • 是的,也许吧,但没有一种语言是这样运作的,不是吗?这让我想起了一个故事,有人想用纯英语编码:)
  • 有些语言可以做到这一点,但如果你不将电子表格算作编程,它们就很少见了。蓝精灵如果我能记住这个名字。反应性?
  • @HappyLemon “但没有一种语言是这样运作的,不是吗?” -- 这是一种非常合理的方法,但不幸的是,人类往往是非理性的。争论某种误解不应该发生不会导致它不发生。 ;)
  • 确认:reactive
猜你喜欢
  • 2022-10-24
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-15
  • 2014-01-04
  • 1970-01-01
  • 2015-06-25
相关资源
最近更新 更多