2017-01-30 3 views
0

Ich versuche eine Funktion zu erstellen, die Münzen zurückgibt, nachdem ein Artikel gekauft wurde. Ich bin noch nicht fertig, aber der folgende Code ist ein Versuch, die Anzahl der Quartale, Groschen, Nickels und ein paar Cent zu finden, die zurückgegeben werden sollen:Erstellen einer Funktion, die Bargeld aus Fonds in Java zurückgibt

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; 
    } 
} 

Gibt es eine kompaktere Art und Weise eine Funktion zu schaffen, finden die Anzahl der Viertel, Groschen, Nickel und Pennies, die zurückgegeben werden sollen?

+5

Sie sollten keine Gleitkommawerte verwenden, um Währungen darzustellen. Verwenden Sie Ganzzahlen, wobei jeder Betrag, der kein Vielfaches von 100 ist, der "Cent" -Teil ist. –

+0

Danke, ich werde das notieren. – statsguyz

+0

Was soll die Maschine zurückgeben? Die geringste Anzahl von Münzen? –

Antwort

0

Ich sehe einige Probleme mit etwas von diesem Code.

if (remainder % .10 == 0) {

Dies sagt Ihnen, nur wenn Sie den gesamten Rest der Münzen aus in Groschen bezahlen können - es Ihnen nicht sagen, wenn Sie einen Cent oder zwei benötigen. Zum Beispiel, wenn der Rest 0,23 wäre, wäre diese Bedingung falsch, obwohl Sie zwei Groschen bezahlen sollten.

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

gleiche Problem. Wenn Sie noch 0,07 zahlen müssten, wäre diese Bedingung falsch, aber es wäre immer noch angemessen, einen Nickel zu zahlen.

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

Diese Prüfung unnötig scheint, und es loszuwerden könnte Ihren Code kompakter machen. Dies wird immer wahr sein, es sei denn, Sie haben aus irgendeinem Grund Fraktionen von einem Penny. (Dies könnte aufgrund von Rundungsfehlern sein, die, wie in den Kommentaren darauf hingewiesen, unter Verwendung von ganzen Zahlen vermieden werden könnten.)

0

Achtung: calculateChange - nimmt Anzahl von Cent als Parameter

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); 
    } 

} 

Try dies, hoffe dies hilft

1

Sie könnten dies eleganter mit enum s.

  • Erstellen Sie einfach die verschiedenen Coin Objekte eine enum verwenden und den Wert im Konstruktor hinzu. Stellen Sie sicher, dass die enum Instanzen in absteigender Reihenfolge sind.

    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; 
        } 
    } 
    
  • iteriert dann alle verschiedene Arten von Münzen über, und so viele Münzen von dem Änderungsbetrag subtrahiert, bis der Restwert kleiner als der Münzwert ist.

Beispielcode:

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

Der oben genannte Code in der Tat die geringste Anzahl von Münzen zurückgibt - zumindest in diesem Fall. Aber beachte, dass es nicht unbedingt in allen Fällen ist. Es gibt Fälle, in denen es besser ist, mehr Münzen mit einem niedrigeren Wert als solche mit einem höheren Wert zurückzugeben.
Wenn Sie beispielsweise die Münzen TWELVY (Wert 12), DIME (Wert 10), NICKEL (Wert 5) und PENNY (Wert 1) haben und die Änderung 45 wäre, wäre die Mindestanzahl an Münzen 5 (4 Groschen und 1 Penny) statt 8 (3 Twelvies, 1 Nickel und 4 Pennies).

Verwandte Themen