首页 > 解决方案 > 三角形(或直角三角形)的边

问题描述

float a, b, c;

printf( "Enter three nonzero values:\n" );
scanf( "%f%f%f", &a, &b, &c );

当我输入 a = 2、b = 2 和 c = 4 时,为什么...

    if( a < ( b + c )) 
    {
        if( b < ( a + c )) 
        {
            if( c < ( a + b )) 
            {
                printf( "This is a triangle." );
            }
            else 
            {
                printf( "This is not a triangle." );            
            }   
        }
    }
    return 0;
    }

...打印“这不是三角形”但是...

    if( a < ( b + c )) 
    {
        if( b < ( a + c )) 
        {
            if( c < ( a + b )) 
            {
                printf( "This is a triangle." );                
            }
        }
    }
    else 
    {
        printf( "This is not a triangle." );            
    }

...才不是?我正在寻找的解决方案使用后一个代码。但是,当我运行程序时,“这不是三角形”应该是空白的行在我的命令属性中。

我正在为 VS 2019 使用带有开发人员命令提示符的记事本++。

vvvvvvv 已解决 vvvvvvvv

如果与我处于同一学习阶段的任何人感兴趣,这就是我解决练习的方法。我正在使用一本书来学习c编程,而我只阅读了三章。因此,我只想使用从前三章中学到的东西。

float a, b, c, temp, no = 0, count = 1;


printf( "Enter three nonzero values:\n" );
scanf( "%f%f%f", &a, &b, &c );

while ( count < 3 ) {
    if(a + b > c){

        /* Switch place of a and b */

        temp = a;
        a = b;
        b = temp;

        /* Switch place of b and c */

        temp = c;
        c = b;
        b = temp;

        count++;
    }
    else {
        no++;

        /* Switch place of a and b */

        temp = a;
        a = b;
        b = temp;

        /* Switch place of b and c */

        temp = c;
        c = b;
        b = temp;

        count++;
    }
}

if ( no > 0 ) {
    printf ( "This is not a valid triangle." );
}
else {
    printf ( "This is a valid triangle." );
}

return 0;

此解决方案使用 while 循环来确定三角形的边是否可以是有效三角形。我使用变量 temp 来切换边的位置,然后如果其中一个组合不是有效的三角形,则将变量 no 添加到变量 no 中。

我还想补充一点,chegg.com 上这个练习的解决方案是错误的。这让我很困惑。

vvvvvvvv 另一个解决方案 vvvvvvv

我书中的下一个练习是计算三个值是否可以是直角三角形的边。当我解决这个问题时,我意识到同样的代码也可以用于正三角形。

float a, b, largest, temp;


printf( "Enter three nonzero values:\n" );
scanf( "%f%f%f", &largest, &a , &b );


if ( a > largest ) {
    temp = largest;
    largest = a;
    a = temp;
}

if ( b > largest ) {
    temp = largest;
    largest = b;
    b = temp;
}
/* a + b > largest if it's a regular triangle */
if ( a * a + b * b == largest * largest ) {
    printf( "This is a valid right triangle" );
}
else {
    printf( "This is not a valid right triangle" );
}

return 0;

因此,不要循环,只需将变量 a 和 b 与最大的变量进行比较,找出哪个变量最大。然后使用勾股定理找出边是否可以表示直角三角形,或者如果它是正三角形,则 a + b > c。

我更喜欢这种方式,而不是使用不必要的循环。

标签: c

解决方案


因为这是错误的:if( c < ( a + b ))因为4 < (2 + 2)是错误的。因此else分支将执行。在您的第二个变体中,它只会打印“这不是三角形”。当第一个if为假时,否则不是。试试这个

if ( (a < ( b + c )) && (b < ( a + c )) && (c < ( a + b )) )
  printf( "This is a triangle.");
else
  printf( "This is not a triangle.");

注意:这也会打印出来"This is not a triangle.",因为根据您的逻辑,这些值无论如何都不是三角形。


推荐阅读