我是C ++的新手,对我正在处理的问题有疑问。
我写的程序旨在执行以下操作:
**在步骤2中,如果用户输入违反三角不等式定理的边长,则要求她/他再次输入边长
例如,如果我输入边:
我得到了所需的输出,并提示输入另一组边长。但是,如果我输入以下内容:
然后我得到:
"三角形的面积为:-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;
}
}
答案 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.