2017-01-30 3 views
0

アイテムを購入した後にコインを返す関数を作成しようとしています。私は完成しないんだけど、下のコードが返されるべき四半期、ダイム、硬貨やペニーの数を見つけるための試みである:Javaの資金から現金を返す関数を作成する

public String getChange(VendingMachine vendingMachine, Change change) { 

    double dispensedQuarters = 0; 
    double dispensedDimes = 0; 
    double dispensedNickels = 0; 
    double dispensedPennies = 0; 
    double d = Double.parseDouble(vendingMachine.getFunds()); 

    if (d % .25 == 0) { 
     dispensedQuarters = d/.25; 
    } else if (d % .25 != 0) { 
     double remainder = d % .25; 
     d = d - remainder; 
     dispensedQuarters = d/.25; 

     if (remainder % .10 == 0) { 
      dispensedDimes = remainder/.10; 
     } else if (remainder % .05 == 0) { 
      dispensedNickels = remainder/.05; 
     } else if (remainder % .01 == 0) { 
      dispensedPennies = remainder/.01; 
     } else { 
      dispensedDimes = dispensedNickels = dispensedPennies = 0; 
     } 

    } else if (d % .10 == 0) { 
     dispensedDimes = d/.10; 
    } else if (d % .05 == 0) { 
     dispensedNickels = d/.10; 
    } 
} 

することができます関数を作成するよりコンパクトな方法はありますニッチ、ニックル、ペニーの数は返されますか?

+5

実際には、通貨を表すために浮動小数点値を使用するべきではありません。整数を使用します。整数は100の倍数ではなく、 'セント'の部分です。 –

+0

ありがとう、私はそれをメモします。 – statsguyz

+0

マシンは何を返すべきですか?最小のコイン数ですか? –

答えて

0

このコードのいくつかの問題があります。

if (remainder % .10 == 0) {

あなたはダイムであなたのコインの全体の残りを支払うことができる場合にのみわかります - あなたはダイムまたは2を必要とする場合、それはあなたを教えてくれありません。たとえば、残余が0.23だった場合、2つのダイムを支払うべきであるにもかかわらず、この条件は偽になります。

} else if (remainder % .05 == 0) {

同じ問題。支払う金額が0.07であれば、この条件は間違いですが、それでもニッケルを支払うことは適切です。

else if (remainder % .01 == 0) {

このチェックは不要なようで、それを取り除くことはあなたのコードをよりコンパクトに作ることができます。あなたが何らかの理由でペニーの端数を持たない限り、は常にとなります。 (これは、コメントで指摘されたとして、整数を使用することによって回避することができ、丸め誤差、である可能性があります。)

0

は注意:calculateChange - パラメータ

public class QuarterDimeNickelPenny { 

    public static void main(String[] args) { 

     calculateChange(94); // Should be 3, 1, 1, 4 
     calculateChange(50); // Should be 2, 0, 0, 0 
     calculateChange(30); // Should be 1, 0, 1, 0 
     calculateChange(14); // Should be 0, 1, 0, 4 
     calculateChange(69); // Should be 2, 1, 1, 4 
     calculateChange(75); // Should be 3, 0, 0, 0 
    } 


    private static void calculateChange(int cents) { 
     int quarters = cents/25; 
     int leftover = cents - quarters * 25; 
     int dimes = leftover/10; 
     leftover = leftover - dimes * 10; 
     int nickels = leftover/5; 
     leftover = leftover - nickels * 5; 
     int pennies = leftover; 

     System.out.println(quarters + ", " + dimes + ", " + nickels + ", " + pennies); 
    } 

} 

てみてセントの数を取りますこれは、これが役立つことを願って

1

enumを使用すると、これをよりエレガントに行うことができます。

  • だけenumを使用して異なる​​オブジェクトを作成し、コンストラクタに値を追加します。 enumインスタンスが降順であることを確認してください。

    enum Coin { 
    
        QUARTER(25), DIME(10), NICKEL(5), PENNY(1); 
    
        private final int value; 
    
        private Coin(int value) { 
         this.value = value; 
        } 
    
        public int getValue() { 
         return this.value; 
        } 
    } 
    
  • 次にコインのすべての異なるタイプの反復処理、残りの値は、コイン値より小さくなるまでの変化量からのような多くのコインを引きます。

例コードは:

getCoins(95); 
// returns a list with 3 quarters and 2 dimes. 

上記のコードは、実際にコインの最小数を返すない - 少なくともこの場合には。しかし、すべての場合に必ずしもそうであるとは限らないことに注意してください。より高い価値のものよりも低い価値のコインを返す方が良い場合があります。
たとえば、硬貨TWELVY(値12)、DIME(値10)、NICKEL(値5)およびPENNY(値1)があり、変更が45の場合、コインの最小数は5になります4ダミー、1ペニー)の代わりに8(3つのtwelvies、1ニッケルと4ペニー)。

関連する問題