2016-10-16 2 views
0

Ich versuche, meine Methoden innerhalb des Haupt zu nennen, aber nach meiner Dollar und Cent Eintritt, die Werte ändern sich nicht, wenn ich sie druckenWerte ändern sich nicht, wenn ich sie drucken

import java.text.DecimalFormat; 
import java.util.Scanner; 

public class ChangeMachine { 


public static void main(String[] args) { 

System.out.println("Change is good"); 

int dollars = 0; 
int cents = 0; 
int toonie = dollars/2; 
int loonie = dollars%2; 
int quarter = cents/25; 
int dime = (cents%25)/10; 
int nickel = ((cents%25)%10)/5; 

    ChangeMachine.getAmountFromUser(dollars, cents); 
    ChangeMachine.calculateCoins(dollars, cents); 
    ChangeMachine.displayInvoice(dollars, cents, toonie, loonie, quarter, dime, nickel); 

} 

Methode zur Eingabe der Dollar und Cent Hier bin ich in der Lage, die Menge eingeben, aber es wird nicht angezeigt, wenn ich versuche, es

Münzen
public static void getAmountFromUser(int dollars, int cents) { 

Scanner input = new Scanner(System.in); 

    System.out.print("How many dollars? "); 
    dollars = input.nextInt(); 

    System.out.print("How many cents? "); 
    cents = input.nextInt(); 
    System.out.println(); 

    input.close(); 

} 

Methode zum anzeigen

public static void calculateCoins (int dollars, int cents){ 
DecimalFormat df = new DecimalFormat("#0.00"); 
double amount = dollars + cents/100.0; 
System.out.println("$"+df.format(amount)+" requires:"); 

//-----Bonus----- 
dollars=dollars+(cents+2)/100; 
cents=(cents+2)%100; 
//--------------- 

} 
berechnen

Methode Münzen anzuzeigen benötigt

public static void displayInvoice (int dollars, int cents, int toonie, int loonie, int quarter, int dime, int nickel){ 


System.out.println(toonie+" Toonies"); 
System.out.println(loonie+" Loonies"); 
System.out.println(quarter+" Quarters"); 
System.out.println(dime+" Dimes"); 
System.out.println(nickel+" Nickels"); 

} 

} 

Antwort

2

... die Werte ändern sich nicht, wenn ich sie drucken

Ja, sollten sie nicht geändert werden, da Java eine Pass- ist Wert-Sprache. Jede primitive Variable, die an eine Methode übergeben wird, wird nicht geändert (Sie übergeben nur einen Wert dieser Variablen, eine neue lokale Variable wird für die Methode erstellt).

Wie löst man das?

  1. einen geänderten Wert von einer Methode zurückkehr
  2. Operationen über Instanzvariablen ohne lokale Variable Verwendung machen
  3. eine benutzerdefinierte Klasse zu schreiben, die Primitiven

EDIT hält:

Wenn wir beginnen Wenn wir über die Rückgabe von mehreren Werten aus einer Methode sprechen, sind unsere Methoden möglicherweise nicht vollständig gut (z. B. brechen Sie das Prinzip der einheitlichen Verantwortung). In diesem Fall müssen wir unsere Methoden umgestalten. Berücksichtigen Sie Methoden mit einer einzigen Verantwortung (calculateDollars, calculateCents, displayCoin). Es wird Ihnen helfen, Ihren Code in kleine logische Teile aufzuteilen und sie unabhängiger zu machen.

EDIT 2:

Nun sind Sie mit Variablen definiert in den Programmbeginn gebunden. Sie wiederum sind mit Werten von Variablen an diesem Punkt verbunden. Werfen Sie einen Blick, wie Sie das korrigieren können:

public int getLoonie(int dollars) { 
    return dollars % 2; 
} 

Besser? nennen lassen Sie es in der displayInvoice:

System.out.println(getLoonie(dollars) + " Loonies"); 

oder viel besser

System.out.println(getLoonie(userCash.getDollars()) + " Loonies"); 
+0

Wie gebe ich mehrere Werte aus einer Methode zurück? – obonmarc

+0

Sie könnten eine einfache Klasse "Input" erstellen, die die Dollars und Cents enthält, die vom Benutzer eingegeben wurden, und eine Instanz dieser Klasse zurückgeben. –

+0

@obonmarc Oder Sie könnten einfach ein Array von int zurückgeben. Aber eine Klasse wird empfohlen. Dann könnten Sie diese Klasse als ein einziges Parameterargument für die anderen Methoden verwenden (vorausgesetzt, Sie können ihre Werte ändern oder ändern). –

1

Verweise auf Parameter Argumente (lokale Variablen) in Java sind pass-by-Wert, anstatt Pass-by-reference.

Jede Methode hat ihre eigenen lokalen Variablenverweise. Wenn Sie einer lokalen Variablenreferenz einen neuen Wert zuweisen, ist diese Änderung lokal für diese Methode.

Edit:

Hier ist eine Möglichkeit, es zu tun:

import java.text.DecimalFormat; 
import java.util.Scanner; 

public final class ChangeMachine { 
    private ChangeMachine() { 

    } 

    public static Cash getAmountFromUser() { 
     try(final Scanner input = new Scanner(System.in)) { 
      System.out.print("How many dollars? "); 

      final int dollars = input.nextInt(); 

      System.out.print("How many cents? "); 

      final int cents = input.nextInt(); 

      return new Cash(dollars, cents); 
     } 
    } 

    public static void calculateCoins(final Cash cash) { 
     final DecimalFormat decimalFormat = new DecimalFormat("#0.00"); 

     final double amount = cash.getDollars() + cash.getCents()/100.0D; 

     System.out.println("$" + decimalFormat.format(amount) + " requires:"); 

     cash.setDollars(cash.getDollars() + (cash.getCents() + 2)/100); 
     cash.setCents((cash.getCents() + 2) % 100); 
    } 

    public static void displayInvoice(final Cash cash) { 
     System.out.println(cash.calculateToonies() + " Toonies"); 
     System.out.println(cash.calculateLoonies() + " Loonies"); 
     System.out.println(cash.calculateQuarters() + " Quarters"); 
     System.out.println(cash.calculateDimes() + " Dimes"); 
     System.out.println(cash.calculateNickels() + " Nickels"); 
    } 

    public static void main(final String[] args) { 
     final Cash cash = getAmountFromUser(); 

     calculateCoins(cash); 
     displayInvoice(cash); 
    } 

    private static final class Cash { 
     private int cents; 
     private int dollars; 

     public Cash(final int dollars, final int cents) { 
      this.dollars = dollars; 
      this.cents = cents; 
     } 

     public int calculateDimes() { 
      return this.cents % 25/10; 
     } 

     public int calculateLoonies() { 
      return this.dollars % 2; 
     } 

     public int calculateNickels() { 
      return this.cents % 25 % 10/5; 
     } 

     public int calculateQuarters() { 
      return this.cents/25; 
     } 

     public int calculateToonies() { 
      return this.dollars/2; 
     } 

     public int getCents() { 
      return this.cents; 
     } 

     public int getDollars() { 
      return this.dollars; 
     } 

     public void setCents(final int cents) { 
      this.cents = cents; 
     } 

     public void setDollars(final int dollars) { 
      this.dollars = dollars; 
     } 
    } 
} 
0

Können Sie diesen Code kompilieren, bevor? Ich habe nur die Methoden ChangeMachine, getAmountFromUser und CalculateCoins überprüft, um sie in Notepad ++ zu überprüfen, und mehrere Fehler gefunden. Die letzten zwei Codezeilen in getAmountFromUser, System.out.println(); und 'input.close();' scheint nicht notwendig zu sein.

Wie für die anderen Fehler, sehe ich viele class, interface, or enum expected Fehler.

Verwandte Themen