CS50三角形合法性判断程序仅输出无效结果的问题排查
问题分析与解决
首先明确三角形有效性的核心逻辑:必须同时满足三个条件:a+b>c、a+c>b、b+c>a,只要有一个条件不满足,就是无效三角形。
你遇到的情况本质是:原来代码里的第二个return false逻辑写反了,导致合法的三角形被提前判定为无效;当你把这个return false换成printf("DEBUG")后,错误的提前返回被取消,函数会执行到最后的return true,所以所有输入都显示有效。
常见错误排查方向
- 条件判断写反:比如本该判断
if (a + c <= b)才返回false,结果写成了if (a + c > b)就返回false,这会直接把合法的三角形判定为无效。 - 逻辑运算符误用:比如把需要用
||(或)的场景写成了&&(与),或者反过来。举个典型的错误结构:
这种情况下,只要a+c>b(合法情况)就会直接返回false,自然所有输入都显示无效;去掉这个return后,函数会走到最后return true,所以全显示有效。bool valid_triangle(int a, int b, int c) { if (a + b <= c) return false; if (a + c > b) return false; // 这里条件写反了,原本应该是<= if (b + c <= a) return false; return true; } - 输入值异常:虽然CS50练习题一般会保证输入正整数,但也可以检查下是否有读入错误,比如输入的数值有没有被正确存储到变量里。
快速验证方法
你可以在函数里加打印,直接输出三个条件的结果:
bool valid_triangle(int a, int b, int c) { printf("a+b>c: %d | a+c>b: %d | b+c>a: %d\n", a+b>c, a+c>b, b+c>a); if (a + b <= c) return false; if (a + c <= b) { printf("DEBUG\n"); // 注释掉原来的return false } if (b + c <= a) return false; return true; }
测试几个典型用例:比如3、4、5(有效),1、2、3(无效),看打印的条件结果和程序输出是否匹配,就能立刻定位哪个条件出了问题。
总结:问题根源就是第二个return false的条件判断逻辑错误,错误拦截了合法的三角形;去掉这个return后,错误拦截消失,函数正常返回true,所以所有情况都显示有效了。
内容的提问来源于stack exchange,提问作者Zane
相关产品推荐
相关产品推荐

