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

Gor*_*Udo 0 c

float a, b, c;

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

当我输入 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;
    }
Run Code Online (Sandbox Code Playgroud)

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

    if( a < ( b + c )) 
    {
        if( b < ( a + c )) 
        {
            if( c < ( a + b )) 
            {
                printf( "This is a triangle." );                
            }
        }
    }
    else 
    {
        printf( "This is not a triangle." );            
    }
Run Code Online (Sandbox Code Playgroud)

...才不是?我正在查看的解决方案使用后一种代码。但是,当我运行程序时,“这不是三角形”的行在我的命令道具中只是空白。

我在 VS 2019 中使用 notepad++ 和 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;
Run Code Online (Sandbox Code Playgroud)

此解决方案使用 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;
Run Code Online (Sandbox Code Playgroud)

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

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

Era*_*lon 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.");
Run Code Online (Sandbox Code Playgroud)

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