这是我正在处理的简单代码。代码的目的是接受三个浮点值,然后找出它是什么类型的三角形;等边、等腰、斜角、直角或这些的组合。
#include <iostream>
using namespace std;
int main(){
float side_a, side_b, side_c;
int equi, iso, sca, right_angle;
int equi_same, iso_same, sca_same, right_angle_same;
cin >> side_a >> side_b >> side_c;
if( (side_a == side_b) && (side_b == side_c) && (side_a == side_c ) ){
cout << "nThis is an equilateral triangle";
equi = 1;
iso = 0;
sca = 0;
right_angle = 0;
equi_same = 1;
}
else if((side_a == side_b) || (side_b == side_c) || (side_b == side_c)){
cout << "nThis is an isosceles triangle";
iso = 1;
equi = 0;
sca = 0;
right_angle = 0;
iso_same = 1;
}
else if( ( (side_a*side_a) == ( (side_b*side_b) + (side_c*side_c) ) ) ||
( (side_b*side_b) == ( (side_a*side_a) + (side_c*side_c) ) ) ||
( (side_c*side_c) == ( (side_a*side_a) + (side_b*side_b) ) ) ){
cout << "nThis is a right angled triangle";
right_angle = 1;
equi = 0;
iso = 0;
sca = 0;
right_angle_same = 1;
}
else{
cout << "nThis is a scalene triangle";
sca = 1;
equi = 0;
iso = 0;
right_angle = 0;
sca_same = 1;
}
if( (equi = 1) && (equi_same != 1) ){
cout << " and an equilateral triangle";
}
else if((iso = 1) && (iso_same != 1)){
cout << " and an isosceles triangle";
}
else if((right_angle = 1) && (right_angle_same != 1)){
cout << " and a right angled triangle";
}
else if((sca = 1) && (sca != 1)){
cout << " and a scalene triangle";
}
else{
cout << "n";
}
return 0;
}
我很难解决的是如何让代码发现它也是其他三角形的组合。编写代码后,我意识到如果第一个语句为真,那么代码将不会检查其他 if 语句。是否有任何我错过而未注意到的错误?如果否,那么我应该如何更改我的代码?提前感谢!
编辑:在测试运行中,如果我输入相同的数字,输出将是:
它是一个等边三角形和一个直角三角形
但是,如果我输入满足其他要求的数字,则输出:
它是一个(取决于输入)三角形和一个等边三角形
也许我在直角部分或等边部分做错了什么,或者我错过了其他东西?
你把它复杂化了。尝试创建不同的函数来确定三角形是否属于某个类型,并对其进行标记,并使用 == 而不是 =:
我会怎么做:
在你的第一次测试中,不要写else if
-s,只写if
s。不要输出结果,只需设置标志。
稍后检查标志,并写入结果。
if(Equi(side1, side2, side3))
equi = 1;
if(Iso(side1, side2, side3))
iso = 1;
if(Sca(side1, side2, side3))
sca = 1;
if(RightAngled(side1, side2, side3))
rang= 1;
std::cout << "This is a " << equi == 1 ? "equilateral" : "" << ... << " triangle.";
编辑:使用using namespace std
,您可以在开头省略std::
。equi == 1 ? "equilateral" : ""
是一个条件表达式:在?
标记之前有一个条件,如果为 true,则返回"equilateral" : ""
表达式的第一面,如果为 false,则返回一个空字符串(它是 ")。因此,它仅在设置标志时才输出一些内容。查看 http://www.cplusplus.com/forum/articles/14631/
例:
// condition ? if_true_return_this : if_false_return_this
int x = true ? 1 : 2; //x will be 1
x = ((x == 2) ? 0 : 3); //x will be 3, since x == 2 is false, so the second in ... : ... is returned.
Equi(...)
和其他是函数,您可以在第一部分中用语句替换它们,我只是不想复制它以获得更紧凑的代码。
我希望它有所帮助。
腰可以是 右天使三角形 您需要在等腰三角形条件下放置与 if 语句相同的条件
给定三角形的边,你想知道
它是什么类型的三角形;等边形、等腰三角形、斜角三角形、直角三角形或这些三角形的组合
如果首先考虑四种类型的角度分类:
- 等边的
- 等腰
- 斯卡涅
- 不是三角形(例如,一个长度大于其他两个长度的总和,或者一个或多个长度不为正数等)
然后考虑如果它是一个直角三角形(如果是等腰或斜角),代码会更容易编写和理解。
您正在测试与等腰和斜角相同的if
语句链中的直角三角形,但您可以是直角斜角或直角等腰。
您正在为此程序使用"else if"大小写。一旦第一个条件为真,编译器就会跳过下面提到的所有测试用例。最安全的选择是使用多个 if() 条件并将布尔标志分配给三角形。
例:
if(equilateral)
bool Equilateral=true;
if(isoceles)
bool Isoceles=true;
if(rightAngled)
bool RightAngled=true;
现在您可以检查直角等腰条件,如果为 true,则可以将其标志设置为 true。
最后,您编写特定的测试用例来找出三角形实际上是什么。
bool FIsosceles(double a, double b, double c)
{
return ((a == b) || (a == c) || (b == c));
}
bool FEquilaterlal(double a, double b, double c)
{
return ((a == b) && (a == c));
}
bool FRightAngle(double a, double b, double c)
{
return ((a > b) && ( a > c)) ? (a*a == b*b + c*c) : (b > c ? (b*b == a*a + c*c) : (c*c == b*b + a*a));
}
int main()
{
double side_a, side_b, side_c;
cin >> side_a >> side_b >> side_c;
if(FIsosceles(side_a, side_b, side_c))
{
cout << " and an isosceles triangle";
if(FEquilateral(side_a, side_b, side_c))
{
cout << " and an equilateral triangle";
}
else if(FRightAngle(side_a, side_b, side_c))
{
cout << " and right triangle";
}
}
else if(FRightAngle(side_a, side_b, side_c))
{
cout << " and right triangle";
}
else
{
cout << " Either an scalene triangle or not a triangle";
}
}