Может ли кто-нибудь помочь мне с этой проблемой замены монет? - PullRequest
0 голосов
/ 19 апреля 2020

Я пытался многое изменить, но у меня всегда ничего не получается. Предполагается, что этот проект выдаст минимальное количество монет, необходимое для оплаты сдачи клиенту.

Когда я запускаю программу, она запрашивает у меня ввод задолженность за изменение , но я делаю не получить никакого вывода, и программа не заканчивается.

import cs50

dollars = float(input("Change Owed: "))
quarters = 0
nickels = 0
dimes = 0
pennies = 0
total_coins = 0


while (dollars<=0):
    dollars = float(input("Change Owed: "))
    continue

while (dollars > 0 ):
    if (dollars >= .25):
        dollars = dollars - .25
        quarters = quarters + 1
        total_coins = total_coins + 1

    if (dollars < .25 and dollars >= .10):
        dollars = dollars - .10
        dimes = dimes + 1
        total_coins = total_coins + 1

    if(dollars < .10 and dollars >= .5):
        dollars = dollars - .5
        nickels = nickels + 1
        total_coins = total_coins + 1

    if (dollars >= .1 and dollars < .5):
        dollars = dollars - .1
        pennies = pennies + 1
        total_coins = total_coins + 1


print ("Quarters: " + str(quarters))
print ("Dimes: " + str(dimes))
print ("Nickels: " + str(nickels))
print ("Pennies: " + str(pennies))
print (total_coins)

1 Ответ

1 голос
/ 19 апреля 2020

Я вижу ошибку, которая, скорее всего, навсегда сделает это l oop go в том, что вы указали неправильные значения для никелей и пенни в некоторых местах. (Зацикливание на вводе доллара немного странно, но, насколько я могу судить, это запрет, если пользователь специально не вводит отрицательное число - если вы хотите проверить на недопустимый ввод, вы также захотите проверьте входные данные, которые вообще не являются числами!)

Тот факт, что вы должны повторять один и тот же код для каждой монеты с одинаковыми значениями, повторяющимися каждый раз, делает этот тип ошибки очень простым для Подходите. Вот предложенный подход, который делает так, чтобы вы указали каждую монету только один раз (что очень легко проверить, чтобы значения были правильными):

from collections import defaultdict
from enum import Enum
from typing import Dict


class Coin(Enum):
    QUARTERS = 0.25
    DIMES = 0.10
    NICKELS = 0.05
    PENNIES = 0.01


while True:
    try:
        dollars = float(input("Change Owed: "))
        assert dollars > 0
        break
    except AssertionError:
        print("I can only dispense non-negative amounts of change!")
    except ValueError:
        print("That's not even a number!")
num_coins: Dict[Coin, int] = defaultdict(int)

for coin in Coin:
    while dollars >= coin.value:
        num_coins[coin] += 1
        dollars -= coin.value

for coin in Coin:
    print(f"{coin.name.title()}: {num_coins[coin]}")
print(f"Total coins: {sum(num_coins.values())}")

Отличная вещь в этом подходе состоит в том, что вы можете очень легко добавлять другие виды монет (например, HALF_DOLLAR = 0.50), и код будет работать только с добавлением этой одной строки в перечисление!

...