You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CS50 Pset2 Coke Machine程序while循环问题调试求助

可乐机程序故障排查与修复

需求说明

  • 机器售卖50美分的可口可乐,仅接受25、10、5美分硬币
  • 提示用户逐个插入硬币,每次输入后显示剩余应付款
  • 当总投入金额≥50美分时,输出应找零金额;忽略非指定面额的输入

问题代码

初始代码

coins = [25,10,5]

def main():
    amount_due = 50
    print(f"Amount Due: {amount_due}")
    coin = evaluated(amount_due)


def evaluated(a):
    while True:
        coin = int(input("Insert Coin:").strip())
        if coin != coins:
            print(f"Please enter your coins in the following increments: {coins}")
            return coin
        elif coin == coins:
            continue

def amount_due(coin, amount_due):
   remainder = amount_due-coin
   if remainder <= 0:
        print(f"Change owed: {remainder}")

   if remainder > 0:
        print(f"Amount due: {remainder}")
        return remainder

main()

更新后代码(修正了成员判断逻辑)

coins = [25,10,5]

def main():
    amount_due = 50
    print(f"Amount Due: {amount_due}")
    coin = evaluated(amount_due)


def evaluated(a):
    while True:
        coin = int(input("Insert Coin:").strip())
        if coin not in coins:
            print(f"Please enter your coins in the following increments: {coins}")
            return coin

        elif coin in coins:
            continue


def amount_due(coin, amount_due):
   remainder = amount_due-coin
   if remainder <= 0:
        print(f"Change owed: {remainder}")

   if remainder > 0:
        print(f"Amount due: {remainder}")
        return remainder

main()

核心问题排查

  1. evaluated函数逻辑完全错误

    • 遇到有效硬币时用continue,会直接重新进入循环,不会返回有效硬币给主函数
    • 遇到无效硬币时直接return coin,导致主函数拿到无效硬币后没有后续处理
    • 函数参数a完全未使用,属于冗余参数
  2. main函数没有循环处理流程

    • 仅调用一次evaluated,无法实现多次插入硬币的需求
    • 未调用amount_due函数来更新剩余应付款或计算找零
  3. amount_due函数计算逻辑错误

    • 找零金额应为正数,原代码会输出负数(比如投入60美分,会输出Change owed: -10)
    • 没有处理剩余应付款的循环更新,无法持续接收新硬币

修复后的完整代码

coins = [25, 10, 5]

def main():
    amount_due = 50
    print(f"Amount Due: {amount_due}")
    
    while amount_due > 0:
        coin = get_valid_coin()
        amount_due -= coin
        if amount_due <= 0:
            print(f"Change owed: {abs(amount_due)}")
        else:
            print(f"Amount Due: {amount_due}")

def get_valid_coin():
    while True:
        try:
            coin = int(input("Insert Coin: ").strip())
            if coin in coins:
                return coin
            else:
                print(f"Please enter coins in denominations: {coins}")
        except ValueError:
            print("Invalid input. Please enter an integer coin value.")

main()

修复说明

  • 重命名evaluated为get_valid_coin,语义更清晰,移除冗余参数
  • get_valid_coin循环直到获取有效硬币才返回,无效输入仅提示不返回
  • main函数通过while循环持续处理硬币插入,直到剩余应付款≤0
  • 修正找零计算逻辑,用abs(amount_due)确保输出正数
  • 增加try-except捕获非整数输入,提升鲁棒性

内容的提问来源于stack exchange,提问作者Mia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 16:35:22