【问题标题】:Logic Error in a Simple If Statement Practice in C++C++中一个简单的if语句实践中的逻辑错误
【发布时间】:2017-03-16 03:14:42
【问题描述】:

我不确定为什么 CHARGE_1 被评估为 .80,无论我输入的数量是 1 还是 19。其他 if 语句也是如此。我不断得到奇怪的数字,比如 .80 和 .64 作为输出。请帮我弄清楚这有什么问题。

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    const int MONTHLY_FEE = 10;
    const double CHARGE_1 = .10;
    const double CHARGE_2 = .08;
    const double CHARGE_3 = .06;
    const double CHARGE_4 = .04;
            int numChecks;
          double charge1Total = numChecks * CHARGE_1;
          double charge2Total = numChecks * CHARGE_2;
          double charge3Total = numChecks * CHARGE_3;
          double charge4Total = numChecks * CHARGE_4;

    cout << "Please enter how many checks you have used.\n";
    cout << "and I will tell you how much your charge is. ";
    cin >> numChecks;

    if((numChecks > 0) && (numChecks < 20))
    {
        cout << "Your total is $" << fixed << setprecision(2) <<    
        (charge1Total + MONTHLY_FEE) << ".";
    }
    else if ((numChecks >= 20) && (numChecks <= 39))
    {
        cout << "Your total is $" << fixed << setprecision(2) <<    
       (charge2Total + MONTHLY_FEE) << ".";
    }
    else if ((numChecks >= 40) && (numChecks <= 59))
    {
        cout << "Your total is $" << fixed << setprecision(2) <<    
        (charge3Total + MONTHLY_FEE) << ".";
    }
    else if (numChecks >=60)
    {
        cout << "Your total is $" << fixed << setprecision(2) << 
        (charge4Total + MONTHLY_FEE) << ".";
    }
}

【问题讨论】:

  • 您在获得支票号码之前计算您的总数。放在 cin >> numChecks; 行之后。

标签: c++ if-statement logic conditional


【解决方案1】:

使用前需要初始化 numChecks 的值。有四个地方使用了 uninitialized 变量,这意味着该值可以是任何值。

在行中

  double charge1Total = numChecks * CHARGE_1;
  double charge2Total = numChecks * CHARGE_2;
  double charge3Total = numChecks * CHARGE_3;
  double charge4Total = numChecks * CHARGE_4;

numChecks 可以是任何东西,所以把这些行放在你所在的语句下面

cin >> numChecks;

【讨论】:

    【解决方案2】:

    chargeXTotal 变量在编译时进行评估,因为您在变量声明中将它们的公式定义为:

    double charge1Total = numChecks * CHARGE_1;

    因为numChecks 是一个未初始化的变量:

    int numChecks;

    因此,chargeXTotal 每个都已经设置了一个数字,而不是您对cin 的期望,因此正确的方法是在cin 之后保留chargeXTotal 的声明:

    cin >> numChecks;
    double charge1Total = numChecks * CHARGE_1;
    

    这将使编译器在用户输入后计算charge1Total 的正确值,而不是在编译时使用未初始化的变量。

    【讨论】:

      【解决方案3】:

      您的代码中有一个简单的逻辑错误:您甚至在初始化之前就使用numChecks 执行了数学运算。计算完成后接受numChecks 的输入:

      int numChecks; // numChecks is uninitialized here; it is only defined as an int variable
      
      // in the following 4 calculations, you multiply CHARGE_N with an uninitialized variable
      double charge1Total = numChecks * CHARGE_1;
      double charge2Total = numChecks * CHARGE_2;
      double charge3Total = numChecks * CHARGE_3;
      double charge4Total = numChecks * CHARGE_4;
      
      // here you accept the input of numChecks after you have oerformed the calculations with it
      cout << "Please enter how many checks you have used.\n";
      cout << "and I will tell you how much your charge is. ";
      cin >> numChecks;
      

      由于您在执行数学运算之前没有初始化numChecks,因此每次运行程序时在运算中使用的值都是未知的,因为编译器会将变量设置为某个默认值。一些编译器将变量初始化为零;但是,其他编译器会将其初始化为某个“unknown”值。

      在编译器执行数学运算并将 不正确 值存储在 chargeXtotal 之后,您初始化变量 numChecks,因此,您可以将奇怪的值作为输出。

      您应该更改您的代码,以便在完成chargeXtotal 的数学运算之前输入numChecks

      int numChecks;
      
      cout << "Please enter how many checks you have used.\n";
      cout << "and I will tell you how much your charge is. ";
      cin >> numChecks;
      
      double charge1Total = numChecks * CHARGE_1;
      double charge2Total = numChecks * CHARGE_2;
      double charge3Total = numChecks * CHARGE_3;
      double charge4Total = numChecks * CHARGE_4;
      

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2010-11-17
        • 2014-02-13
        • 1970-01-01
        • 2011-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-24
        相关资源
        最近更新 更多