2011-09-20 80 views
3

在頁面底部更新我的新代碼作爲答案。如果/ elif/else語句對錢有幫助

因此,對於我的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 

回答

2

這不是在做你所期望的:

elif change >= .10 <= .24: 

它看起來像你想是這樣的:

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

或Python也支持:

elif .10 <= change <= .24: 

然而,接下來你會跑進去到各種浮點舍入問題。我建議你先將輸入數字轉換爲整數美分,然後以美分執行所有計算。處理金錢時避免使用浮點數。

+0

'elif的變化> = 0.10和變化<= .24'可以寫成'的elif 0.10 <=變化<= .24' –

+0

擴展Greg的警告提防浮點:考慮更改= 6.60。 int(6.60/0.25)給出了26個季度。當我們從變化中減去26個季度(6.60 - 0.25 * 26)時,我們得到0.099999999999999645的剩餘變化,小於0.10的硬幣值。所以你的算法最終會給出6.59而不是6.60的變化。而不是浮點使用十進制模塊錢(http://docs.python.org/library/decimal.html)或按照格雷格的建議轉換爲分,所以你可以處理整數。 –

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 

另外的東西,你正在使用floating point numbers,這往往導致舍入錯誤。爲了避免這些錯誤,我建議將您的資金表示爲整數美分,並將問題中的所有數字乘以100或使用固定點數字如python's decimal module

1

所以我用更乾淨的打印代碼以更好的格式解決了問題。謝謝你們的幫助! 如果有人想知道這兩個代碼之間的區別,它會像其他人所建議的那樣將它從浮點數中提取出來,然後將所需的數據轉換爲整數,將整數乘以特定的數量,例如四分之一,然後減去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!"