# Variable mit Methode initialisieren



## bjcoon (15. Mai 2008)

Folgende Methode habe ich geschrieben:


```
public static double kalkuliere() {

	double operand1 = Console.inpDouble();
	double ergebnis = 2;

	System.out.println("Bitte geben Sie eine Zahl ein");
                System.out.println(operand1);
                System.out.println("Bitte geben Sie eine Rechenart ein.");
	Console.inpChar();
	System.out.println("Bitte geben Sie eine weitere Zahl ein.");
	Console.inpDouble();

	return ergebnis;

	}
```

Die Variable ergebnis bitte erst mal ignorieren. Die Initialisierung mit 2 ist erstmal zur Zufriedenstellung der return-Anweisung.

Jedenfalls kommt die Methode irgendwie nicht damit klar, dass ich dir Variable operand1 mit der Methode Console.inpDouble() initialisieren will. Ist das generell nicht möglich Variablen mit Methoden als Wert zu initialisieren?

Was diese Methode machen soll??

Sie soll eingegebene Zahlen mit dem eingegebenen Rechenoperator berechnen. Die Methoden Console.inpDouble und Console.inpChar sind Methoden zum Einlesen der Werte.

Wie schreibe ich die Methode kalkuliere() anders?

Vielen Dank


----------



## SlaterB (15. Mai 2008)

>  Ist das generell nicht möglich Variablen mit Methoden als Wert zu initialisieren? 

doch ist gut möglich, wenn du als Wert nicht die Methode an sich sondern deren Rückgabewert meinst (bei SOFORTIGER Ausführung),
poste doch mal die andere Operation und die Fehlermeldung
--------

> System.out.println("Bitte geben Sie eine Zahl ein"); 
>                System.out.println(operand1); 

die Operation wurde dann aber schon vor deinem println ausgeführt,


--------

> System.out.println("Bitte geben Sie eine weitere Zahl ein."); 
>   Console.inpDouble(); 

hier verwendest du den Rückgabewert von 
inpDouble(); gar nicht,


----------



## bjcoon (15. Mai 2008)

```
import java.io.*;

/** Klasse zum Einlesen von Konsoleneingaben

 * @author Harald Loose (loose@fh-brandenburg.de)
 * @version 1.00, 16.11.2003
 */
public class Console {

  /* Der Aufbau eines gepufferten Eingabestroms ermöglicht das spätere Einlesen
   *  einer Zeile, die dann durch gegeignete Parser ausgewertet werden kann.
   */
  /** Referenz eines gepufferten Eingabestroms
   */
  private static BufferedReader br = new BufferedReader (new InputStreamReader(System.in));

  /** Liest einen String ein.
   *  @return Wert vom Typ <tt>String</tt>, eingelesen von der Tastatur
   */
  public static String inpString() {
    while (true) {
      try {
        return br.readLine();
      }
      catch (Exception e) {
        System.err.println("Eingabefehler");
      }
    }
  }

  /** Liest eine ganze Zahl ein.
   *  @return Wert vom Typ <tt>int</tt>, eingelesen von der Tastatur
   */
  public static int inpInt() {
    while (true) {
      try {
        return Integer.parseInt(br.readLine());
      }
      catch (Exception e) {
        System.err.println("Eingabefehler");
      }
    }
  }

  /** Liest eine Fließkommazahl ein.
   *  @return Wert vom Typ <tt>float</tt>, eingelesen von der Tastatur
   */
  public static float inpFloat() {
    while (true) {
      try {
        return Float.parseFloat(br.readLine());
      }
      catch (NumberFormatException nfe) {
         System.err.println();
         System.err.println("Eingabefehler");
         System.err.println("Eine Fliesskommazahl bitte mit Punkt als Dezimaltrenner eingeben.");
         System.err.println();
      }
      catch (Exception e) {
        System.err.println("Eingabefehler");
      }
    }
  }

  /** Liest eine doppeltgenaue Fließkommazahl ein.
   *  @return Wert vom Typ <tt>double</tt>, eingelesen von der Tastatur
   */
  public static double inpDouble() {
    String x;
    while ( true ) {
      try {
        x = br.readLine();
        return Double.parseDouble(x);
      }
      catch (NumberFormatException nfe) {
         System.err.println();
         System.err.println("Eingabefehler");
         System.err.println("Eine Fliesskommazahl bitte mit Punkt als Dezimaltrenner eingeben.");
         System.err.println();
      }
      catch (Exception e) {
        System.err.println("Eingabefehler");
      }
    }
  }

  /** Liest ein Zeichen ein.
   *  @return Wert vom Typ <tt>char</tt>, eingelesen von der Tastatur
   */
  public static char inpChar() {
    String buffer;
    while (true) {
      try {
        buffer = br.readLine();
        return buffer.charAt(0);
      }
      catch (Exception e) {
        System.err.println("Eingabefehler");
      }
    }
  }

  /** Liest einen logischen Wert ein.
   *  @return Wert vom Typ <tt>boolean</tt>, eingelesen von der Tastatur
   */
  public static boolean inpBoolean() {
    String buffer;
    while (true) {
      try {
        buffer = br.readLine();
        return Boolean.valueOf(buffer).booleanValue();
      }
      catch (Exception e) {
        System.err.println("Eingabefehler");
      }
    }
  }

  /** Testet und zeigt die Verwendung der Methoden */
  public static void main (String args []) {
	System.out.println("Geben Sie eine Zeichenkette ein: ");
	System.out.println("Sie haben " + inpString() + " eingegeben.");
	System.out.println("Geben Sie ein Zeichen ein: ");
	System.out.println("Sie haben " + inpChar() + " eingegeben.");
	System.out.println("Geben Sie eine ganze Zahl ein: ");
	System.out.println("Sie haben " + inpInt() + " eingegeben.");
	System.out.println("Geben Sie eine float-Zahl ein: ");
	System.out.println("Sie haben " + inpFloat() + " eingegeben.");
	System.out.println("Geben Sie eine double-Zahl ein: ");
	System.out.println("Sie haben " + inpDouble() + " eingegeben.");
	System.out.println("Geben Sie einen logischen Wert ein: ");
	System.out.println("Sie haben " + inpBoolean() + " eingegeben.");
  }
}
```

Das ist der Code der Datei dessen Methoden ich benutzen und nicht ändern soll.


----------



## bjcoon (15. Mai 2008)

So gesehen existiert keine Fehlermeldung.
Anscheinend will er ohne Variablenaufruf den Wert meiner Variable operand1 = Console.inpDouble() direkt ausführen.
Warum macht er das auch ohne Variablenaufruf?


----------



## SlaterB (15. Mai 2008)

was ist ein Variablenaufruf, eine Verwendung der Variable etwa in System.out.println?

die Methode wird ausgeführt, weil du sie aufrufst, sie hat nichts mit der Variablen zu tun, darin wird lediglich der Rückgabewert gespeichert,

Methoden kann man nicht in Variablen speichern, wenn man sowas dynamisch machen will muss man schon eine Menge tricksen,
bei deinem Verständnis der einfachen Grundlagen erspare ich persönlich mir aber die Odyssee, das zu erklären


----------



## bjcoon (15. Mai 2008)

```
public class Kalkulator {

	public static void main (String[]args) {

	double ergebnisKalkulation;
	ergebnisKalkulation = 0;

	Kalkulator calc = new Kalkulator();

	calc.kalkuliere(ergebnisKalkulation);
	System.out.println(ergebnisKalkulation);

	}

	double kalkuliere(double ergebnisKalkulation) {

	double operand1;
	double operand2;
	char operator;
	double ergebnis = 0;

	//Hier werden alle Operanden und Operatoren eingelesen
	System.out.println("Bitte geben Sie eine Zahl ein.");
	operand1 = Console.inpDouble();
	System.out.println("Bitte geben Sie eine weitere Zahl ein.");
	operand2 = Console.inpDouble();
	System.out.println("Bitte geben Sie die gewünschte Rechenoperation ein.\n'+' für Addition\n'-' für Subtraktion\n'*' für Multiplikation\n'/' fuer Division");
	operator = Console.inpChar();

	switch (operator) {
		case '+': ergebnis = operand1 + operand2;
		break;
		case '-': ergebnis = operand1 - operand2;
		break;
		case '*': ergebnis = operand1 * operand2;
		break;
		case '/': ergebnis = operand1 / operand2;
		break;
	}

	return ergebnis;

	}

}
```

Theoretisch soll die Methode kalkuliere() an meine Variable ergebnisKalkulation den Wert der Methodenvariable ergebnis übergeben.
Innerhalb der Methode kalkuliere() hat die Variable ergebnis den Wert Rechenoperation, allerdings wird dieser nicht an die Variable ergebnisKalkulation übergeben.
Wo ist der Fehler?


----------



## SlaterB (15. Mai 2008)

immer noch absolute Grundlagen:
Parameter werden als Wert übergeben, in der Methode kalkuliere ist ergebnisKalkulation eine ganz andere Variable,
die Methode kann nicht zaubernd die lokale Variable des Aufrufers ändern,
zudem speicherst du das Ergebnis ja in 'ergebnis', nicht in 'ergebnisKalkulation'

nach welcher Regel soll der wert von 'ergebnis' in kalkuliere() auf einmal in die Variable 'ergebnisKalkulation' des Aufrufers geschrieben werden?
eine Programmiersprache muss doch systematisch arbeiten..

und es ist ganz leicht: kalkuliere() gibt ja den Inhalt von ergebnis als Rückgabewert zurück,
also diesen Rückgabewert verwenden:

ergebnisKalkulation = calc.kalkuliere();

den Parameter für diese Operation kannst du weglassen, wird gar nicht benutzt


----------



## bjcoon (15. Mai 2008)

ich will ja auch nur den Wert der Variable ergebnis aus der Methode kalkuliere() dem der Variable ergebnisKalkulation übergeben. Deswegen steht der ja auch im Kopf der Methode.

Wie übergebe ich wem den Wert aus ergebnis einer x-beliebigen Variable denn dann?
Ich darf ja schließlich keine Variablen mit gleichem Namen deklarieren...


----------



## SlaterB (15. Mai 2008)

SlaterB hat gesagt.:
			
		

> und es ist ganz leicht: kalkuliere() gibt ja den Inhalt von ergebnis als Rückgabewert zurück,
> also diesen Rückgabewert verwenden:
> 
> ergebnisKalkulation = calc.kalkuliere();
> ...


----------



## Guest (15. Mai 2008)

bjcoon hat gesagt.:
			
		

> ich will ja auch nur den Wert der Variable ergebnis aus der Methode kalkuliere() dem der Variable ergebnisKalkulation übergeben. Deswegen steht der ja auch im Kopf der Methode.



Nein, ergebnisKalkulation wird der Methode als Parameter übergeben, während du ergebnis als return-Wert zurückgibst. Das sind zwei verschiedene Sachen.



			
				bjcoon hat gesagt.:
			
		

> Wie übergebe ich wem den Wert aus ergebnis einer x-beliebigen Variable denn dann?
> Ich darf ja schließlich keine Variablen mit gleichem Namen deklarieren...



ergebnisKalukation = calc.kalkuliere();

Und dann wirfst du den Parameter ergebnisKalukation aus der Methode kalkuliere() wieder raus.


----------



## bjcoon (15. Mai 2008)

Vielen Dank nochmal.

Weitere Frage:
Warum fordert Java in der folgenden Methode eine integer-Variable und ist nicht mit meiner boolean-Variable zufrieden!?


```
boolean wiederhole() {

		boolean wahl;
		System.out.println("Möchten Sie eine neue Berechnung durchführen? (j/n)");

		switch (wahl) {
			case 'j': wahl=true;
                                                break;
			case 'J': wahl=true;
                                                break;
			case 'n': wahl=false;
                                                break;
			case 'N': wahl=false;
                                                break;
		}

		return wahl;

	}
```


----------



## SlaterB (15. Mai 2008)

weil switches nur mit Zahltypen funktionieren, nicht mit boolean

übrigens sind 'j', 'J' usw keine boolean-Werte, welchen Sinn hat das swich?
du musst einen char von der Konsole einlesen und über diesen kannst du dann switchen


----------

