if/elif/else语句帮助解决金钱问题

3

我在页面底部更新了我的新代码,作为答案。

所以对于我的CS 170课程,我们必须制作一个程序,用户输入少于10美元,并以最少的硬币找零,不包括纸币或50美分硬币。在大多数情况下,程序表现良好,除非遇到x.x0,例如:

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

您可以对这段代码进行一些修改,其中一些修改可能会解决您的问题。首先,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的decimal模块

2
这并不是你所期望的效果:
elif change >= .10 <= .24:

看起来您想要的是:

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

Python也支持以下功能:

elif .10 <= change <= .24:

但是,接下来你会遇到各种浮点数舍入问题。我建议您首先将输入数字转换为一个整数数量的,并在处理货币时进行所有计算。避免使用浮点数。


elif change >= .10 and change <= .24 可以写成 elif .10 <= change <= .24 - Roshan Mathews
关于 Greg 的警告,我们需要注意浮点数的问题:考虑change=6.60。int(6.60/0.25)得到26个quarters。当我们从change中减去26个quarters(6.60 - 0.25*26),剩下的找零是0.099999999999999645,小于0.10的一角钱价值。因此,您的算法会在找零时给出6.59而不是6.60。建议使用decimal模块来处理货币相关问题(http://docs.python.org/library/decimal.html),或者按照Greg的建议将其转换为分,然后再进行整数运算,而不要使用浮点数。 - Steven Rumbalski

1

所以我用更好的格式解决了它,有更干净的打印代码。感谢大家的帮助!如果有人想知道这两个代码之间的区别,那就是像其他人建议的那样将其从浮点数中取出,并将需要的内容转换为整数,将整数乘以特定金额,比如一美分,然后从找零中减去 int * coin/bill。效果很好。我尝试过使用 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!"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接