三角形(或直角三角形)的边

时间:2020-03-19 11:57:54

标签: c

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

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

我正在将Notepad ++与VS 2019的Developer Command Prompt一起使用。

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处添加一个。

我还想补充一点,在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是正三角形,则找出边。

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

3 个答案:

答案 0 :(得分:6)

因为这是错误的: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.",因为按照您的逻辑使用这些值,它始终不是三角形。

答案 1 :(得分:2)

您缺少括号

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

        }else {
            printf( "This is not a triangle." );

        } 

如果之前没有关闭

答案 2 :(得分:0)

注意大括号和缩进。

在第一个示例中:

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

要获得第三个if语句,前两个if(第一个 AND 第二个if)必须为真。我们的第三个if语句有一个else分支,如果第三个条件为false,则将执行该分支。

在第二个示例中:

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

else分支仅在第一个条件为false时才会执行。如果第一个条件为true,则此else将永远不会执行。


话虽如此,第一个例子翻译为:

如果 a小于b+c 并且 b小于a+c AND < / strong> c小于a+b

然后 这是一个三角形

其他 这不是三角形

第二个示例翻译为:

如果 a小于b+c

然后检查其他条件

其他 这不是三角形


请注意,comparing float的数字是