C语言美元找零程序输出异常问题排查求助
找零程序修复方案
核心问题说明
- 变量传递错误:
main函数中定义的cents未初始化,user_change内的cents是局部变量,无法被外部直接访问,且函数没有返回计算得到的美分数值,导致传入user_cents的是随机垃圾值,出现异常的大额数字输出。 - 1元纸币计算逻辑错误:拆分完5元面值后剩余的
updated_amt本身就是1元纸币的数量,原有代码错误执行dollar_bills = updated_amt / 100,计算结果必然为0,不符合预期。 - 美分转换逻辑错误:美分计算时需要将小数部分乘以100而非10,同时
user_cents参数类型为int,传入浮点型小数会导致精度丢失。 - 函数返回值逻辑缺失:
user_change声明了double类型返回值,但函数内没有return语句,main中也没有接收返回结果。
修复后完整代码
#include <stdio.h> // 函数返回剩余的美分数值 double user_change(double); void user_cents(double cents); int main() { double user_amt, cents; printf("Hello User!\n\nHow much money would you like change for?\nEnter any amount: $"); scanf("%lf", &user_amt); // 接收返回的美分数值 cents = user_change(user_amt); user_cents(cents); return 0; } double user_change (double user_amt) { int updated_amt = (int) user_amt; int hundreds, fifties, tens, fives, dollar_bills; double cents = user_amt - updated_amt; hundreds = updated_amt / 100; updated_amt %= 100; fifties = updated_amt / 50; updated_amt %= 50; tens = updated_amt / 10; updated_amt %= 10; fives = updated_amt / 5; updated_amt %= 5; // 剩余金额就是1元纸币数量 dollar_bills = updated_amt; printf("\nDollar Bills: %d\n", dollar_bills); // 返回美分部分 return cents; } void user_cents(double cents) { // 乘以100转成整数美分,加0.5避免浮点数精度误差 int balance = (int)(cents * 100 + 0.5); int quarters, dimes, nickels, pennies; quarters = balance / 25; balance %= 25; dimes = balance / 10; balance %= 10; nickels = balance / 5; balance %= 5; pennies = balance; printf("Quarters: %d\nDime: %d\nNickel: %d\nPennies: %d\n", quarters, dimes, nickels, pennies); }
运行验证
输入4.67后即可得到与预期一致的输出:
Dollar Bills: 4 Quarters: 2 Dime: 1 Nickel: 1 Pennies: 2
内容的提问来源于stack exchange,提问作者neelish
相关产品推荐
相关产品推荐

