3.13.1 zybooks挑战活动:Python找零程序输入45输出异常排查
zyBooks 3.13.1 硬币找零程序Bug定位
问题现象
程序核心逻辑基本完成,但存在特定输入异常:输入总便士数为45时,仅输出2 Dimes,缺失其他面值的输出;输入44、46等数值时输出符合预期。
根因分析
我们先跟踪输入45时的变量执行流程:
- 初始输入
pennies = 45,所有面值计数器初始为0 - 45小于100,美元计数分支不触发,pennies保持45
- 45大于25,进入25美分(Quarter)计数:
quarters = 45//25 = 1,剩余pennies = 45%25 = 20 - 20大于10,进入10美分(Dime)计数:
dimes = 20//10 = 2,剩余pennies = 20%10 = 0 - 剩余pennies为0,后续5美分、1美分计数分支不触发
此时最终计数结果为:quarters=1, dimes=2,其余面值为0,本该输出1 Quarter和2 Dimes,但实际只输出了后者,问题来自两处逻辑错误:
- 核心错误:所有面值的单数输出分支,错误增加了
pennies > 0的前置条件。比如Quarter的输出判断:
输入45时最终剩余pennies为0,即使quarters计数为1,也不满足elif的判断条件,因此不会输出1 Quarter的内容。只有dimes的数量为2,走了if (quarters > 1): print ( quarters,'Quarters') elif (pennies > 0) and (quarters == 1): print (quarters, 'Quarter')dimes>1的分支被正常输出,就出现了只打印2 Dimes的现象。 - 边界错误:所有面值计数的判断条件用了
>而非>=,当剩余便士数刚好等于某面值(比如刚好25、10、5、100)时,不会进入对应计数分支,会导致找零结果完全错误。比如输入25时,程序不会统计1个Quarter,会错误计算为2个Dime加5个Penny。
修复方案
- 所有面值计数的判断条件,将
>替换为>=,覆盖面值相等的边界场景 - 所有面值的输出判断,移除多余的
pennies > 0条件,单复数仅根据当前面值的计数判断:计数大于1输出复数形式,计数等于1输出单数形式,计数为0不输出。
修复后的完整代码:
pennies=int(input()) dollars = 0 quarters = 0 dimes = 0 nickels = 0 if pennies == 0: print('No change') if pennies >= 100: dollars = int(pennies/100) pennies = (pennies%100) if pennies >= 25: quarters = (pennies//25) pennies = (pennies%25) if pennies >= 10: dimes = int(pennies/10) pennies = pennies%10 if pennies >= 5: nickels = int(pennies/5) pennies = (pennies%5) if (dollars > 1): print ( dollars,'Dollars') elif dollars == 1: print (dollars, 'Dollar') if (quarters > 1): print ( quarters,'Quarters') elif quarters == 1: print (quarters, 'Quarter') if (dimes > 1): print ( dimes,'Dimes') elif dimes == 1: print (dimes, 'Dime') if (nickels > 1): print ( nickels,'Nickels') elif nickels == 1: print (nickels, 'Nickel') if (pennies > 1): print ( pennies,'Pennies') elif pennies == 1: print (pennies, 'Penny')
内容的提问来源于stack exchange,提问作者Rylan Champion
相关产品推荐
相关产品推荐

