在C ++中确定等腰直角三角形

时间:2018-09-29 10:53:12

标签: c++

如您所知

等腰三角形具有直角三角形等腰三角形功能。

示例:

int a,b,c; //a,b and c are three triangle edge.
cout << "please insert a,b,c" << endl;
cin >> a;
cin >> b;
cin >> c;
if(a==b || b==c || c==a){
   cout << "isosceles triangle";
}
else if(a*a==b*b+c*c ||b*b==c*c+a*a || c*c==a*a+b*b)
{
   cout<<"right triangle");
} 

这就是我确定直角三角形和等腰三角形的方式

为什么我不这样做呢?

if(pow(a,2)==pow(b,2)+pow(c,2) ||pow(b,2)==pow(c,2)+pow(a,2) || pow(c,2)==pow(a,2)+pow(b,2)){
        if(a==b || b==c || c==a){
            cout << "isosceles right triangle";
        }
        else{
            cout << "right tri";
        }
 }

问题是:确定等腰直角三角形必须输入平方根号。

Isosceles Right Triangle

问题:当a = 1,b = 1,c = sqrt(2)

如何在C ++中将其确定为等腰直角三角形

2 个答案:

答案 0 :(得分:1)

在您的示例中,所有边长abc的类型均为int。等腰直角三角形不能具有所有整数边长。可能应该使用floatdouble

如果您知道数学上的测试方法,那么用代码实现它应该非常简单。唯一要记住的是,在大多数情况下,由于舍入误差,直接比较浮点数是没有意义的。

数学等式a 2 = b 2 + c 2 应该这样检查:

std::abs(a*a - b*b - c*c) < EPSILON

其中EPSILON很小,可以忍受浮点数的有限精度。

答案 1 :(得分:0)

基于Evg的评论,这是一个示例实现:

bool IsRightTriangle(double a, double b, double c)
{
    double max_allowed_error = 0.1;
    return (std::abs(a*a - b*b - c*c) <= max_allowed_error) || (std::abs(b*b - c*c - a*a) <= max_allowed_error) || (std::abs(c*c - a*a - b*b) <= max_allowed_error) ;
}

bool IsIsosceles(double a, double b, double c)
{
    return a == b || b == c || c == a;
}

int main()
{
    double a, b, c;
    cout << "\nEnter length of first side of the triangle ";
    cin >> a;
    cout << "\nEnter length of second side of the triangle ";
    cin >> b;
    cout << "\nEnter length of third side of the triangle ";
    cin >> c;    

    bool iso = IsIsosceles(a, b, c);
    bool rt = IsRightTriangle(a, b, c);

    if (iso && rt) std::cout << "\n Triangle is a Right Isosceles Triangle\n";
    else
        if (iso) std::cout << "\n Triangle is an Isosceles Triangle \n";
        else
            if (rt) std::cout << "\n Triangle is a Right Triangle \n";
}