CS50第1周Cash作业逻辑疑问与代码测试异常求助
CS50第1周Cash作业问题解析
我搞不懂CS50第1周Cash作业的测试逻辑——按贪心算法优先用最大面额硬币的话,73美分找零应该是2个quarter、2个dime和3个penny,28美分是1个quarter加3个penny,但测试要求73美分的calculate_dimes返回7,28美分的calculate_nickels返回5,这到底是怎么回事?
我的代码
#include <cs50.h> #include <stdio.h> int get_cents(void); int calculate_quarters(int cents); int calculate_dimes(int cents); int calculate_nickels(int cents); int calculate_pennies(int cents); int main(void) { // Ask how many cents the customer is owed int cents = get_cents(); // Calculate the number of quarters to give the customer int quarters = calculate_quarters(cents); cents = cents - quarters * 25; // Calculate the number of dimes to give the customer int dimes = calculate_dimes(cents); cents = cents - dimes * 10; // Calculate the number of nickels to give the customer int nickels = calculate_nickels(cents); cents = cents - nickels * 5; // Calculate the number of pennies to give the customer int pennies = calculate_pennies(cents); cents = cents - pennies * 1; // Sum coins int coins = quarters + dimes + nickels + pennies; // Print total number of coins to give the customer printf("%i\n", coins); printf("quarters: %i\ndimes: %i\nnickels:%i\npennies:%i\n ", quarters, dimes, nickels, pennies); } int quarters, dimes, nickels, pennies; int get_cents(void) { int cents; do { cents = get_int("Change owed: "); } while (cents < 0); return cents; } int calculate_quarters(int cents) { // TODO quarters = cents / 25; return quarters; } int calculate_dimes(int cents) { // TODO dimes = (cents % 25) / 10; return dimes; } int calculate_nickels(int cents) { // TODO nickels = (cents % 25 % 10) / 5; return nickels; } int calculate_pennies(int cents) { // TODO pennies = cents % 25 % 10; return pennies; }
CS50测试结果
:) cash.c exists :) cash.c compiles :) get_cents returns integer number of cents :) get_cents rejects negative input :) get_cents rejects a non-numeric input of "foo" :) calculate_quarters returns 2 when input is 50 :) calculate_quarters returns 1 when input is 42 :) calculate_dimes returns 1 when input is 10 :) calculate_dimes returns 1 when input is 15 :( calculate_dimes returns 7 when input is 73 expected "7", not "2" :) calculate_nickels returns 1 when input is 5 :( calculate_nickels returns 5 when input is 28 expected "5", not "0" :) calculate_pennies returns 4 when input is 4 :) input of 41 cents yields output of 4 coins :) input of 160 cents yields output of 7 coins
我的程序输出
cash/ $ ./cash Change owed: 73 7 quarters: 2 dimes: 2 nickels:0 pennies:3 cash/ $ ./cash Change owed: 28 4 quarters: 1 dimes: 0 nickels:0 pennies:3
问题原因与修正方案
核心错误是你误解了测试用例的调用逻辑:测试是单独调用每个计算函数的,不是像main函数那样先扣减大面额后传值。比如:
- 测试
calculate_dimes(73)时,输入的是完整的73美分,不是扣完quarter剩下的23美分,所以正确结果是73 / 10 = 7 - 测试
calculate_nickels(28)时,输入的是完整的28美分,不是扣完quarter剩下的3美分,所以正确结果是28 /5 =5
你的代码还有两个问题:
- 没必要用全局变量存储硬币数量,容易引发意外问题
- 每个计算函数里错误地对输入做了
%25这类取余操作——这是main函数的职责,单个计算函数只需要接收当前剩余美分数,返回该面额最多能用的数量(即cents / 面额值)
修正后的计算函数如下:
int calculate_quarters(int cents) { return cents / 25; } int calculate_dimes(int cents) { return cents / 10; } int calculate_nickels(int cents) { return cents / 5; } int calculate_pennies(int cents) { return cents; }
main函数里的逻辑是对的:先算quarters,扣减后传剩余值给dimes,以此类推——测试只是单独验证每个函数的独立计算能力,和main里的串联逻辑不冲突。
内容的提问来源于stack exchange,提问作者user21322673
相关产品推荐
相关产品推荐

