CS50 Problem Set1 cash作业代码运行异常 求错误排查及解决方案
CS50 Problem Set1 cash作业代码问题排查
现有代码的错误点
- 控制语句后存在多余分号:所有
if、while关键字后都错误添加了分号,会直接导致控制逻辑失效。比如while (change_owed>=25);的分号会让while循环体变为空语句,只要条件成立程序就会卡死在该行,不会执行后续大括号内的扣减、计数逻辑。 - while语法错误:处理5美分的
while (change_owed>=5;c++;)不符合C语言while语句语法规范,while括号内仅允许写循环条件表达式,计数逻辑c++应该放在循环体内部。 - 冗余的if判断:每个while循环前的if判断属于多余逻辑,直接保留while循环即可覆盖所有符合条件的场景,无需额外提前判断。
- 变量类型隐患:
change_owed乘以100并取整后仍然存储为float类型,存在浮点数精度误差风险,建议转为int类型存储。 - 输出不符合要求:代码中额外打印了转换为美分后的数值、硬币拆分计算过程,不符合作业仅输出最终硬币总数的要求。
- 编译语法错误:main函数末尾多写了一个右大括号,会直接导致编译失败。
修正后可运行代码
#include <stdio.h> #include <cs50.h> #include <math.h> int main(void) { int quarters = 0; int dimes = 0; int nickels = 0; int pennies = 0; float change_input; do { change_input = get_float("Change owed: "); } while (change_input <= 0); // 转为美分整数避免浮点数精度问题 int change_cents = round(change_input * 100); while (change_cents >= 25) { change_cents -= 25; quarters++; } while (change_cents >= 10) { change_cents -= 10; dimes++; } while (change_cents >= 5) { change_cents -= 5; nickels++; } while(change_cents >= 1) { change_cents -= 1; pennies++; } int total = quarters + dimes + nickels + pennies; printf("%d\n", total); }
内容的提问来源于stack exchange,提问作者Mohamed4
相关产品推荐
相关产品推荐

