输入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

