if / elif / else оператор помогите с деньгами - PullRequest
3 голосов
/ 20 сентября 2011

Обновлен мой новый код внизу страницы в качестве ответа.

Итак, для моего класса CS 170 мы должны составить программу, в которой пользователь вводит данные менее чем за 10 долларов, и сдача возвращается в наименьшем количестве монет, без купюр или штук 50 центов. По большей части программа работает хорошо, за исключением случаев, когда вы сталкиваетесь с x.x0 e.g.:

Python 2.7.2 (v2.7.2:8527427914a2, Jun 11 2011, 15:22:34) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
Amount due:
 7.80
Amount in return
 2.20.
Quaters in return 8.
Dimes in return 0.
Nickels in return 4.
>>> 

программа полностью пропускает секцию центов и прямиком к никелам, предлагая 4 в качестве решения, когда наименьшее количество должно быть 8 кварталов, 2 цента и конец. Кроме того, я не очень хорошо разбираюсь в циклах, но я знаю, что это было бы возможно, и намного короче код, и было бы неплохо очистить рекомендации по коду. Спасибо за любую помощь!

# optional.py
# Calculating the least amount of change in return for a $10 bill.

## amount due
due = input("Amount due:\n ")
## if amount is more than 10, exit program
if due > 10.00:
    print "Please enter a number lower then 10.00."
    exit()
## if amount is less than 0, exit program
if due < 0:
    print "Please enter a number greater than 0.00."
    exit()
## subtract amount from 10
else:
    change = 10.00 - due
    print "Amount in return\n %0.2f." % change
## if amount is 0, no change
if change == 0:
    print "No change in return."
## passes expression if previous not met
    pass
elif change >= .25:
## setting q, dividing change by .25
    q = change / .25
## maaking q an integer
    quaters = int(q)
    print "Quaters in return %r." % quaters
## subtracting quaters from chane
    change = change - (quaters *.25)

if change < .10:
    pass
elif change >= .10 <= .24:
    d = change * .1
    dimes = int(d)
    print "Dimes in return %r." % dimes
    change = change - (dimes * .1)

if change < .05:
    pass
elif change >=.05 <=.09:
    n = change / .05
    nickels = int(n)
    print "Nickels in return %r." % nickels
    change = change - (nickels * .05)

if change == .01:
    pennies = change / .01
    print "Pennies in return %r." % pennies
elif change >=.01 <=.04:
    p = change / .01
    print "Pennies in return %0.0f." % p

Ответы [ 3 ]

3 голосов
/ 20 сентября 2011

Есть несколько изменений, которые вы можете внести, чтобы очистить этот код, и одно из них может решить вашу проблему. Во-первых, pass абсолютно ничего не делает. Обычно он используется в качестве заполнителя для цикла или функции, которые будут заполнены позже. Кроме того, условия ваших elif операторов являются взаимоисключающими с if заявлениями, которым они следуют, поэтому

if change == 0:
    print "No change in return."
## passes expression if previous not met
    pass
elif change >= .25:
## setting q, dividing change by .25
    q = change / .25
## maaking q an integer
    quaters = int(q)
    print "Quaters in return %r." % quaters
## subtracting quaters from chane
    change = change - (quaters *.25)

можно переписать как

if change >= .25:
## setting q, dividing change by .25
    q = change / .25
## making q an integer
    quaters = int(q)
    print "Quaters in return %r." % quaters
## subtracting quaters from change
    change = change - (quaters *.25)

для каждого if / elif оператора. Также в заявлении

if change >=.01 <=.04:

вы проверяете, есть ли

change >= .01 and .01 <= .04

Чтобы заставить его делать то, что вы хотите, утверждение должно быть переписано как

if .01 <= change <= .04

Кроме того, вы используете числа с плавающей запятой , которые часто приводят к ошибкам округления. Чтобы избежать этих ошибок, я бы предложил либо представить ваши деньги в виде целого числа центов, и умножить все числа в вашей задаче на 100 или использовать что-то с числами с фиксированной точкой, например десятичный модуль python .

2 голосов
/ 20 сентября 2011

Это не то, что вы ожидаете:

elif change >= .10 <= .24:

Похоже, вы намереваетесь что-то вроде:

elif change >= .10 and change <= .24:

или Python также поддерживает:

elif .10 <= change <= .24:

Однако в дальнейшем вы столкнетесь с различными проблемами округления с плавающей запятой.Я предлагаю вам сначала преобразовать входное число в целое число центов и выполнить все вычисления в центах.Избегайте чисел с плавающей запятой при работе с деньгами.

1 голос
/ 23 сентября 2011

Итак, я получил его в лучшем формате с более чистым кодом печати.Спасибо за помощь, ребята!Если кто-то хочет узнать разницу между двумя кодами, он выкачивает ее из числа с плавающей запятой, как предлагали другие, и конвертирует то, что нужно, в целые числа, умножая целые числа на определенную сумму, скажем четверть, а затем вычитая int * coin /счет от изменения.Сработало хорошо.Я попытался поэкспериментировать с утверждением for, но это не получилось слишком хорошо, так как я еще не очень много знаю об этом.До следующей встречи ...

Еще раз спасибо, ребята!

Вот готовый код для всех, кто интересуется этим:

import sys

due = input("Please enter the amount due on the item(s):\n ")
# if over $10, exit
if due > 10:
    print "Please enter an amount lower then 10."
    sys.exit(1)
## if under/equal 0, exit
if due <= 0:
    print "Please enter an amount greater than 0."
    sys.exit(2)
## 10 - due = change, converts change into cents by * by 100 (100 pennies per dollar)
else :
    change = 1000 - (due * 100)
## if change is 0, done
    if change == 0:
        print "No change in return!"
## if not 0 makes change2 for amount in return
    else:
        change2 = change / 100
        print "Amount in return:\n $%.2f." % change2
## if change > 500, subract 500 and you get 1 $5 bill

if 500.0 <= change:
    bill_5 = change / 500
    b5 = int(bill_5)
    change = change - 500

## if change is over 100, change divided by 100 and subtracted from change for quaters

if 100.0 <= change:
    dollars = change / 100
    dollar = int(dollars)
    change = change - (dollar * 100)

if 25 <= change < 100:
    quaters = change / 25
    quater = int(quaters)
    change = change - (quater * 25)

if 10 <= change <= 24:
    dimes = change / 10
    dime = int(dimes)
    change = change - (dime * 10)

if 5 <= change < 10:
    nickels = change / 5
    nickel = int(nickels)
    change = change - (nickel * 5)

if 0 < change < 5:
    pennies = change / 1
    penny = int(pennies)
    change = change - (penny * 1)

print "Change in return:\n $5:%i\n $1:%i\n Quaters:%i\n Dimes:%i\n Nickels:%i\n Pennies:%i " % (
    b5, dollar, quater, dime, nickel, penny )


if 0 >= change:
    print "Done!"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...