2010-09-14 115 views
3

我需要一些幫助,我的作業分配。我的任務是創建一個程序,創建一個對象,接受付款,發出確切的變化,告訴我需要使用哪些硬幣,然後告訴我在到期後有多少錢。以下是我寫的代碼。 USmoney類已完成並正在運行。老師提供了一張備忘單。然而,它是主要類(CoinCalc),獲得付款的付款並從支付的金額中扣除付款,以使我可以更改我遇到的問題。非常感激任何的幫助。需要幫助Java作業

public class USmoney { 
    int dollars = 0; 
    int cents = 0; 

    public USmoney(int newcents) { 
    dollars = newcents /100; 
    cents = newcents %100; 
    } 
    public USmoney(int dollars, int cents) { 
    this.dollars = dollars; 
    this.cents = cents; 
    } 

    public int getDollars() { 
    return dollars; 
    } 

    public int getCents(){ 
    return cents; 
    } 
} 

public class CoinCalc { 
    public static void main(String[] args) { 
    USmoney Till1 = new USmoney(100,0); 
    USmoney billTotal = new USmoney(49); 
    USmoney amountPaid = new USmoney(100); 

    double penny = 1; 
    double nickel = 5; 
    double dime = 10; 
    double quarter = 25; 

    double[] Coin = new double []{penny,nickel,dime,quarter}; 

    } 

    private void changeFor(USmoney billTotal, USmoney amountPaid) { 
    } 
} 
+12

說「我遇到問題」並不是特別有用。怎麼了?會發生什麼*不是*? – BalusC 2010-09-14 13:20:20

+0

是的,請更具體地說明您遇到問題的哪個方面。 – wheaties 2010-09-14 13:28:09

+2

我的歉意,主要方法(coinCalc)不完整。我卡住了,不知道該從哪裏出發。它需要返回它需要給出的變化,以得出billTotal(49)和amountPaid(100)之間的差異,然後將該數額轉換爲特定的硬幣,即兩個季度和一個paenny。 – Jon 2010-09-14 13:30:13

回答

2

這是knapsack problem的變體光盤,你有幾個步驟來實現

  1. 計算總的變化
  2. 使用硬幣的數量最少
  3. 手託變化

我d首先在USMoney類中實現一個帶有第一個簽名的方法,然後閱讀揹包問題以實現第二種方法。

public USMoney subtract(final USMoney value); 

public double[] getCoins(final USMoney value); 
+2

揹包問題?問題可能是相關的,但這個問題要容易得多。對於這個作業問題來說,動態編程是過度的。 – Ishtar 2010-09-14 15:13:39

+0

我只是想給出一個答案,不提供解決方案,它的1維打包問題取決於作業的重點是學習Java還是考慮算法。 – 2010-09-14 15:29:28

0

爲了調用changeFor()方法,您需要對CoinCalc類的引用。你可以這樣做不同的方式,一種方式是聲明CoinCalc類的變量在main()方法,像這樣:

CoinCalc cc = new CoinCalc(); 

cc.changeFor(billTotal, amountPaid); 

但仍存在問題,該方法changeFor()目前並沒有與你已經聲明瞭until對象和硬幣數組,它們在changeFor()方法中是不可訪問的。

因此,對這個問題進行了一下,然後回來給我們工作...

編輯

這是我會怎麼構建它,billTotalfloat amountPaidUSMoney對象internaly保持跟蹤每種面值的錢(1美元鈔票,四分之一,一角錢,鎳和一分錢)。當有人付錢時,他們會給你不同數量的這些錢。 USMoney需求和方法將返回它擁有的貨幣種類(美元,季度等)的價值。

tillUSMoney的另一個實例,它具有不同面值的貨幣的初始值。

USMoney有一個名爲changeFor(float bill, USMoney paid)的方法,該方法返回另一個USMoney實例。您需要調用它像這樣:然後

USMoney change = till.changeFor(bill, amountPaid); 

changeFor()方法來確定如何基於什麼是在tillbillamountPaid值之間的差異做出改變。注意如果你沒有足夠的宿舍,你的計算應該足夠聰明,如果它足夠的話可以使用硬幣和鎳幣。如果你想真的得到巧妙拋出一個例外,如果你不能做出改變。

+0

這就是問題的一部分。我可以在腦海中看到每種方法大部分都需要做什麼。但我似乎不能在代碼中得到它。基本上,changefor方法需要採用與billTotal和amountPaid對象的區別。如果這個邏輯是正確的,你如何減去這些對象的屬性。還是我完全脫離基地? – Jon 2010-09-14 13:41:19

0

它看起來像你想與你的changeFor算法的幫助,所以這裏是一個輪廓:

首先從amountPaid減去BILLTOTAL。那會讓你做出多少改變。

然後製作一些變量來保存您要給出的變化量。對於季度,角錢,鎳,便士中的每一種,如果changeRemaining>硬幣的價值,則添加硬幣並減去該值。爲每個硬幣做這件事,直到該硬幣的價值未通過測試,然後轉向下一枚硬幣。

+0

那正是我需要的。但是,我如何減去這兩個對象? – Jon 2010-09-14 13:44:23

+0

想一想你如何在紙上做到這一點,例如2.20美元--1.3美元= 0.90美元 - 你有美元和美分作爲單獨的價值,所以你需要先處理美分,然後美元 – 2010-09-14 13:57:00

+0

對不起,我的意思是如何我要麼將對象billTotal和amountPaid設置爲int值,以便我可以對它們進行數學運算 – Jon 2010-09-14 14:12:15

2

這裏有兩個問題,您可以單獨考慮。

  1. 您是否可以用算法描述如何確定問題的答案?
  2. 鑑於此描述,你可以把它變成Java代碼嗎?

我會解決的第一個項目開始:這是必須要了解到底是什麼輸入和輸出要求的是什麼,你能給出如何解決精確的僞代碼描述問題。如果您不知道什麼是僞代碼,請在維基百科上查看它。然後你可以開始考慮如何用Java編寫代碼。從算法角度來看,您的問題非常簡單。

假設客戶支付的金額爲X,對於成本爲C的項目。 首先,您必須檢查X> = C,否則客戶的付款不夠,您可以在此停止。

假設X> = C,並且您可以給出確切的更改,那麼交易完成後,價格上漲的金額將增加C,因爲這正是客戶最終支付的金額。

現在,您必須給予的更改量應該等於X-C。打電話給Y.

測試你有多少次可用的最大硬幣分配Y: 假設最大的硬幣有價值V,那麼你應該給這個值的客戶Y/V硬幣。 之後,您需要向客戶支付餘額Y'= Y-(Y/V)* V。確保你知道如何在Java中工作(請參閱本文末尾的鏈接)。 重複使用第二大硬幣支付Y'的程序,依此類推。

2. 我不會寫出Java中的所有東西,但有些事情你應該考慮。

是否包含「錢」而沒有明確指定它包含的鈔票/硬幣,還是應該將錢作爲一些鈔票和硬幣代表?

你會做整數除法,所以你的硬幣值不應該是雙倍,但是整數。

您需要從計算變化的函數內部訪問硬幣值(硬幣值多少等),因此不同硬幣的值應該可以聲明爲類CoinCalc的靜態成員變量,而不是在一個函數裏面。

您需要確保您知道if-else語句和while循環的工作原理以及如何分配給變量。那麼你應該能夠編寫解決方案。

您還需要決定解決方案究竟是什麼。它可以是硬幣名稱列表,其名稱在每次需要時重複,例如, [一角,一分錢,一分錢],或者可能是一個四位數字的數組,說明需要多少錢,硬幣,鎳和便士。如果您想要一個列表,您應該通過閱讀Java文檔中的條目LinkedList來了解列表數據結構如何在Java中工作。

祝你好運!

注意:因爲我是新用戶,所以無法發佈儘可能多的鏈接。您可以通過使用googling java部門並選擇mindprod.com的鏈接,在Java中找到對部門的很好的描述。

+0

優秀!這是很大的幫助。我的問題如何將我的billTotal和amountPaid對象變成整數,所以我可以做他們的基本數學函數 – Jon 2010-09-14 14:13:45

+0

int billCents = 100 * billTotal.getDollars()+ billTotal.getCents() – okintheory 2010-09-14 14:27:46