You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

输入a=2,b=2,c=4时两段C语言三角形判断代码输出差异原因咨询

关于三角形合法性判断的代码问题解析

一、你的两段代码差异原因分析

针对输入a=2、b=2、c=4的场景,我们逐个拆解逻辑:

第一段代码的执行逻辑

float a, b, c; 
printf( "Enter three nonzero values:\n" ); 
scanf( "%f%f%f", &a, &b, &c ); 
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;

当c=4,a+b=4时,c < (a+b)等价于4 < 4,条件不成立,所以会进入最内层if的else分支,直接输出This is not a triangle——这个逻辑覆盖了第三个条件不满足的场景,所以能正常输出结果。

第二段代码的执行逻辑

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

这里的else只绑定到最外层的第一个if,只有当a < (b+c)不成立时才会触发。而当前输入下,前两个条件a < b+c(2<6)、b < a+c(2<6)都成立,但第三个条件c < a+b不成立,此时既不会执行最内层的printf,也不会触发外层的else(因为外层if的条件是成立的),所以没有任何输出——这就是你看到空白的核心原因。

简单说,第二段代码的逻辑漏洞是:只处理了最外层条件不成立的情况,却没覆盖“前两个条件成立但第三个不成立”的场景,导致部分非法情况没有输出。

二、你基于循环的实现方案解析

你用while循环结合交换变量的思路来判断合法性,逻辑是可行的:

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){ 
        /* 交换a和b,再交换b和c */
        temp = a; a = b; b = temp; 
        temp = c; c = b; b = temp; 
        count++; 
    } else { 
        no++; 
        /* 同样的交换逻辑 */
        temp = a; a = b; b = temp; 
        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;

核心思路是通过循环遍历所有边的组合,只要有任意一组不满足两边之和大于第三边,就通过no计数标记,最后根据no的值判断合法性。这个方案确实能覆盖所有情况,也验证了你提到的Chegg方案存在错误。

三、更简洁的优化方案(支持直角三角形判断)

其实不需要循环,只需要先找出最长边,再判断最长边与另外两边的关系即可——因为三角形的合法性只需要保证最长边小于另外两边之和,而直角三角形可以用勾股定理验证:

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; 
} 
// 判断普通三角形
if (a + b > largest) {
    // 进一步判断直角三角形(注意浮点数精度问题,实际可加误差范围)
    if ( fabs(a*a + b*b - largest*largest) < 1e-6 ) { 
        printf( "This is a valid right triangle" ); 
    } else { 
        printf( "This is a valid triangle" ); 
    }
} else {
    printf( "This is not a valid triangle" );
}
return 0;

这个方案的优势是逻辑更清晰,避免了循环的复杂性,同时可以扩展判断直角三角形的功能。这里额外补充:由于浮点数存在精度误差,实际判断勾股定理时,建议用一个极小的误差范围(比如1e-6)来避免精度问题导致的误判。


内容的提问来源于stack exchange,提问作者Gordon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 23:52:50