无法恢复到While循环的顶部

时间:2014-06-18 19:53:18

标签: c++ while-loop

我是C ++的新手,对我正在处理的问题有疑问。

我写的程序旨在执行以下操作:

  1. 要求用户输入三角形的3边长度
  2. 检查三面是否超过三角不等式定理(总和 任何双方必须大于第三方)
  3. 计算三角形的面积和周长
  4. **在步骤2中,如果用户输入违反三角不等式定理的边长,则要求她/他再次输入边长

    例如,如果我输入边:

    • A:7
    • B:16
    • C:10

    我得到了所需的输出,并提示输入另一组边长。但是,如果我输入以下内容:

    • A:2
    • B:1
    • C:1

    然后我得到:

      

    "三角形的面积为:-1。#IND
      三角形的周长是:9"

         

    "违反了三角不等式定理   请再次输入A侧,B侧和C侧的长度。"

    鉴于第2,1,1,I,我试图输出:

      

    "违反了三角不等式定理   请再次输入A侧,B侧和C侧的长度。"

    ...然后回到输入边长的提示。

    我无法看到我的代码出错的地方,并希望有人可以提供帮助。

    这是我的代码:

    #include "stdafx.h"
    #include <iostream>
    #include <cmath>
    #include <cstdlib>
    using namespace std;
    
    void calculate(double& side_a, double& side_b, double& side_c);
    void inputLengths(double& side_a, double& side_b, double& side_c);
    bool isValid(double& side_a, double& side_b, double& side_c);
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        double side_a = 3;
    double side_b = 3;
    double side_c = 3;
    
    while (isValid(side_a, side_b, side_c) == true)
        {
    
        inputLengths(side_a, side_b, side_c);
        calculate(side_a, side_b, side_c);
    
        if (isValid(side_a, side_b, side_c) == false)
        {
            cout << "\n";
            cout << "The triangle inequality theorem has been violated." << endl;
            cout << "Please enter the lengths of side A, side B and side C again." << endl;
            continue;
        }
    }
    return 0 ;
    }
    
    void calculate(double& side_a, double& side_b, double& side_c)
    {
    double perimeter = side_a + side_b + side_c ;
    double semiperimeter = (side_a + side_b + side_c) / 2 ;
    double area = sqrt(semiperimeter * (semiperimeter - side_a) * (semiperimeter -     side_b) * (semiperimeter - side_c));
    
        cout << "\n";
        cout << "Given a triangle with the following side lengths:" << endl;
        cout << "\n"; 
        cout << "Side A: " << side_a << endl;
        cout << "Side B: " << side_b << endl;
        cout << "Side C: " << side_c << endl;
        cout << "\n";
        cout << "The area of the triangle is: " << area << endl;
        cout << "The perimeter of the triangle is: " << perimeter;
        cout << "\n";
    }
    
    void inputLengths(double& side_a, double& side_b, double& side_c)
    {
    cout << "\n";
    cout << "Please enter the length of side A: ";
    cin >> side_a;
    
    cout << "Please enter the length of side B: ";
    cin >> side_b;
    
    cout << "Please enter the length of side C: ";
    cin >> side_c;
    } 
    
    bool isValid(double& side_a, double& side_b, double& side_c)
    {
    // use the triangle inequality theorem to test that the sum of any two sides is
           greater than the third side
    if ((side_a + side_b > side_c) && (side_a + side_c > side_b) && (side_b + side_c >
        side_a))
    {
        return true;
    }
    
    else
    {
        return false;
    }
    }
    

3 个答案:

答案 0 :(得分:1)

valid变量代表isValid(side_a, side_b, side_c),只能在一个位置更新状态。

valid = true;
while (valid == true)      // <-- `continue`s here, checking condition
{
    valid = updateState(); // i.e. dependent upon `inputLengths`
    if (valid == false)
    {
        continue;
    }
    /* implicitly */ continue;
}

这显然代表了一个问题,因为代码表示&#34; 无效(或者,总是隐式)继续,但仅在有效&#34;时循环。

也就是说,循环在被告知&#34;继续&#34;之后立即结束。在无效的情况下 - 可以更改有效性的代码有机会再次执行。

相反,请考虑以下几点。

// Loop repeatedly until the user enters a "valid input" state
valid = false;
while (true) {             
     valid = readTriangleSides(); // Ask for the input; is it valid?
     if (!valid) {
        // Inform the user the input was invalid; implicit `continue`
     } else {
        // Valid, end the loop - this could be eliminated if the
        // loop was expressed as `while (!valid) ..`
        break;
     }
}

// Use the obtained values, now in the "valid input" state
calculateAndDisplay();

答案 1 :(得分:0)

A = 2,B = 1,C = 1是长度为2的直线(所以是简并三角形),在这种情况下A = B + C.

在功能中测试值时,#34;无效&#34;:

if ((side_a + side_b > side_c) && (side_a + side_c > side_b) && (side_b + side_c >
side_a))

你不认为这种情况是退化的情况(side_b + side_c = side_a)。因此,您必须更换所有出现的&#34;&gt;&#34;使用&#34;&gt; =&#34;,如下所示:

if ((side_a + side_b >= side_c) && (side_a + side_c >= side_b) && (side_b + side_c >=
    side_a))

答案 2 :(得分:0)

我看到自己的错误。我在检查有效性之前计算。对while()的调用应该在while循环中向下移动。并且,应该回调inputLengths()。代码应该是:

int _tmain(int argc, _TCHAR* argv[])
{
double side_a = 3;
double side_b = 3;
double side_c = 3;

while (isValid(side_a, side_b, side_c) == true)
{
    inputLengths(side_a, side_b, side_c);


    if (isValid(side_a, side_b, side_c) == false)
    {
        cout << "\n";
        cout << "The triangle inequality theorem has been violated." <<
endl;
        cout << "Please enter the lengths of side A, side B and side C
again." << endl;
        inputLengths(side_a, side_b, side_c);
    }

    calculate(side_a, side_b, side_c);

}
return 0 ;
}

感谢所有人的慷慨帮助。

-Elizabeth C.