我的程序找到三角形C ++的类型,我遇到了if-else语句的问题

时间:2015-03-14 11:02:38

标签: c++ if-statement

这是我正在处理的简单代码。代码的目标是接受三个浮点值,然后确定它是什么类型的三角形;等边,等腰,斜角肌,直角或这些的组合。

#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语句。是否有任何我错过而且没有注意到的错误?如果不是,那我该如何更改我的代码呢?提前谢谢!

编辑:在测试运行中,如果我输入相同的数字,输出将是:

  

它是等边三角形和直角三角形

但如果我输入满足其他要求的数字,则输出:

  

它是(取决于输入)三角形和等边三角形

也许我在直角部分或等边部分做错了什么或者我错过了其他什么?

5 个答案:

答案 0 :(得分:2)

你太复杂了。尝试创建不同的函数来确定三角形是否属于某个类型,然后标记它,并使用==而不是=:

我该怎么做:

在第一次测试中,不要写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" : ""是条件表达式: 在?标记之前有一个条件,如果为真,它返回"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(...)和其他人都是函数,你可以在第一部分用你的语句替换它们,我只是不想复制它以获得更紧凑的代码。

我希望它有所帮助。

答案 1 :(得分:0)

Isosceles可以是右角三角形你需要在isosceles三角形条件下使用if语句设置相同的条件

答案 2 :(得分:0)

考虑到三角形的边,你想知道

  

它是什么类型的三角形;等边,等腰,斜角肌,直角或这些的组合


如果您第一次考虑四种类型的角度分类:

  • 等边
  • 等腰
  • 不等边
  • 不是三角形(例如,一个长度大于另外两个长度,或者一个或多个长度不是正数等)。

然后考虑它是否是一个直角三角形(如果它是等腰或斜角),代码将更容易编写和理解。

你正在测试同一个if语句链中的直角三角形,如等腰和斜角,但你可以是直角斜角或直角等腰。

答案 3 :(得分:0)

你正在使用&#34;否则如果&#34;本程序的案例。一旦第一个条件成立,编译器就会跳过下面提到的所有测试用例。最安全的赌注是使用多个if()条件并为三角形分配布尔标志。

示例:

if(equilateral)
  bool Equilateral=true;

if(isoceles)
  bool Isoceles=true;


if(rightAngled)
  bool RightAngled=true;

现在您可以检查是否有正确的角度isoceles条件,如果为true,您可以将其标志设置为true。

最后,您编写特定的测试用例以找出三角形实际上是什么。

答案 4 :(得分:0)

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";
    }
}