# Variablen und ihre Zustände



## Wang (26. Nov 2009)

Hallo! 

Ich bitte um eine Korrektur meiner Lösung zu folgender Aufgabe:



> Geben Sie in einer Textdatei zustand.txt für jede der mit *1*, *2*, *3*, *4* und *5* gekennzeichneten Zeilen an, welche Variablen nach Ausführung der jeweiligen Zeile sichtbar sind. Geben Sie für alle sichtbaren Variablen außerdem deren Wert an.




```
public class Zustand
{
   public static final int CONS = 5;
   public static int number;
   public static int counter;

   public static void main(String[] args)
   {
     {
         // *1*
        int number = 1;
        int i = 10;
        number += i;
        // *2*
     }
     final double d;
     {
        counter=1;
        double e=5.0;
        // *3*
        {
            d = e+counter;
            // *4*
        }
        counter++;
     }
     number = number + CONS;
     // *5*
   }
}
```

Uns wurde außerdem dieser Hinweis gegeben:


> Es ist so gemeint: Was würde das System ausgeben wenn du in der auskommentierten Zeile schreiben würdest “System.out.println(a);”




Meine Lösung:
*1*
CONS = 5

*2*
number = 11

*3*
e = 5.0

*4*
d = 6.0

*5*
number = 16


Vielen Dank für Eure Mühe!


----------



## Gonzo17 (26. Nov 2009)

Ich würde das jetzt so verstehen, dass man alle Variablen angeben soll, die sichtbar sind, nicht nur "die letzte verwendete Variable". Die Frage ist, ob du auch Variablen angeben sollst, die noch nichtmal initialisiert sind. Wenn ja, dann würde das so aussehen für den ersten Schritt:

*1*

CONS = 5
number
counter


Edit sagt außerdem: 
Auf den ersten Blick bist du diesem Programm in die Falle getappt, wenn ich mir deinen Lösungsvorschlag für *5* anschaue. Der ist ziemlich sicher falsch. Also nicht nur, dass du nur eine Variable angibst, sondern auch der Wert, den du da stehen hast.


Edit will sich doch nochmal verbessern:
Das was ich da oben geschrieben habe stimmt auch nicht ganz. Natürlich werden die initialisiert, aber eben mit 0. Also:

*1* 
CONS = 5
number = 0
counter = 0


----------



## javimka (26. Nov 2009)

ich glaube, es gibt noch ein paar mehr. Wenn *1* ausgeführt wurde, dann sind ja auch die statischen variabeln number und counter sichtbar und sind mit 0 initialisiert. Die sind auch bei allen anderen Zeilen sichtbar. Bei *3* ist ja auch noch d sichtbar, aber nicht initialisiert.


----------



## Wang (26. Nov 2009)

Danke Leute für Euren Support! 

Ich habe die Lösung überarbeitet:


```
*1*
CONS = 5
number = 0
counter = 0

*2*
number = 11

*3*
d = 0
e = 5.0

*4*
d = 6.0

*5*
counter = 2
number = 11 + 5
```

Diese Aufgabe ist nicht gerade leicht...


----------



## javimka (26. Nov 2009)

In ein paar Monaten wirst du den Schwierigkeitsgrad anders beurteilen


----------



## Wang (26. Nov 2009)

javimka hat gesagt.:


> In ein paar Monaten wirst du den Schwierigkeitsgrad anders beurteilen





Ist die zuletzt aufgelistete Lösung nach Überprüfung mit Eurem geschulten "Java-Blick" wirklich richtig oder muss noch etwas ergänzt oder geändert werden?

Vielen Dank für den starken Support! :applaus:


----------



## eRaaaa (26. Nov 2009)

Wang hat gesagt.:


> Ist die zuletzt aufgelistete Lösung nach Überprüfung mit Eurem geschulten "Java-Blick" wirklich richtig oder muss noch etwas ergänzt oder geändert werden?



also imo, müsste die bei *5* number = 5 sein, nicht 16. die 11 von oben bekommt der untere block garnicht mit.

also number ist 0, CONS = 5, also 0+5 = 5
;D


----------



## Wang (26. Nov 2009)

Vielen Dank. 
Der Rest ist dann soweit aber richtig/vollständig...?


----------



## Gonzo17 (27. Nov 2009)

Wang hat gesagt.:


> Vielen Dank.
> Der Rest ist dann soweit aber richtig/vollständig...?



Ich denke nicht. *1* stimmt, aber schon *2* ist ja nicht vollständig, weil dort alle Variablen aus *1* auch vorhanden sind. Und i ja auch. Sprich: 

*2*
CONS = 5
this.number = 0
counter = 0
i = 10
number = 11

Dementsprechend ist eben bei *3*, *4* und *5* auch nicht alles vollständig. Du musst halt nur aufpassen, dass du zwischen den beiden Variablen number unterscheidest, weiss nicht ob meine Schreibweise da optimal ist.


----------



## Wang (27. Nov 2009)

Danke soweit.
Ich fürchte, ich stehe gewaltig auf dem Schlauch...

Heißt das, dass 
	
	
	
	





```
int number = 1;
```
 bei *2* nicht sichtbar ist?


----------



## Klamann (27. Nov 2009)

Wenn du schon den Hinweis zitierst 





> Es ist so gemeint: Was würde das System ausgeben wenn du in der auskommentierten Zeile schreiben würdest “System.out.println(a);”


 dann mach das doch einfach so...


```
public class Zustand
{
    public static final int CONS = 5;
    public static int number;
    public static int counter;
	
    public static void main(String[] args)
    {
        {
            // *1*
			System.out.println("Cons: " + CONS + " Number: " + number + " Counter: " + counter);		// Variablen da rein
			int number = 1;
			int i = 10;
			number += i;
            // *2*
        }
        final double d;
        {
			counter=1;
			double e=5.0;
            // *3*
			{
				d = e+counter;
				// *4*
			}
        counter++;
        }
		number = number + CONS;
            // *5*
    }
}
```

Der Compiler meldet dir Fehler, wenn eine der Variablen nicht sichtbar ist. Außerdem sagt er dir den Wert der Variablen, und mehr ist in der Aufgabenstellung ja nicht gefragt.
Bitte nicht 1:1 abschreiben, die Korrektoren vergleichen ab und zu...


----------



## Wang (27. Nov 2009)

Vielen Dank, Klamann! :toll:

Keine Angst, eine Datei Zustand.java ist ja nicht abzugeben. 

Ich habe die Quelldatei nach Deinem Muster so bearbeitet:


```
public class Zustand
{
    public static final int CONS = 5;
    public static int number;
    public static int counter;
    
    public static void main(String[] args)
    {
        {
            // *1*
            System.out.println("Cons: " + CONS + " Number: " + number + " Counter: " + counter);        // Variablen da rein
            int number = 1;
            int i = 10;
            number += i;
            // *2*
            System.out.println("Cons: " + CONS + " Number: " + number + " Counter: " + counter + " i: " + i);        // Variablen da rein
        }
        final double d;
        {
            counter=1;
            double e=5.0;
            // *3*
            System.out.println("Cons: " + CONS + " Number: " + number + " Counter: " + counter + " e: " + e);        // Variablen da rein
            {
                d = e+counter;
                // *4*
            System.out.println("Cons: " + CONS + " Number: " + number + " Counter: " + counter + " d: " + d + " e: " + e);        // Variablen da rein
            }
        counter++;
        }
        number = number + CONS;
            // *5*
            System.out.println("Cons: " + CONS + " Number: " + number + " Counter: " + counter + " d: " + d);        // Variablen da rein
    }
}
```

Entsprechend sieht dann die Lösung so aus:


```
*1*
CONS = 5
number = 0
counter = 0

*2*
CONS = 5
number = 11
counter = 0
i = 10

*3*
CONS = 5
number = 0
counter = 1
e = 5.0

*4*
CONS = 5
number = 0
counter = 1
d = 6.0
e = 5.0

*5*
CONS = 5
number = 5
counter = 2
d = 6.0
```

Aber:
Die *2* hier weicht etwas von der Version von Gonzo17 ab, kann ich das dennoch so belassen... ???:L

Nehme ich bei *3* noch die d dazu, meckert der Compiler, dass d noch nicht initialisiert wurde...

Vielen Dank für Euren starken Support!


----------



## Gonzo17 (30. Nov 2009)

Wang hat gesagt.:


> Aber:
> Die *2* hier weicht etwas von der Version von Gonzo17 ab, kann ich das dennoch so belassen... ???:L



Die Variable "number", die du da ausgeben lässt, ist die, die in diesem Block definiert und initialisert wurde. Es fehlt aber noch die Variable "number", die schon vor dem Starten der main-Methode definiert wurde. Die Variable kannst du dann mit "this.number" ansprechen. 




Wang hat gesagt.:


> Nehme ich bei *3* noch die d dazu, meckert der Compiler, dass d noch nicht initialisiert wurde..



Da hat er ja auch vollkommen Recht.  Soweit ich weiss werden Variablen, die man innerhalb einer Methode definiert, nicht automatisch initialisiert, das muss man dann selbst machen. Kann auch sein, dass ich mich da irre, aber das geht ja schon aus dem hervor, was Eclipse dir da meldet.


----------



## Wang (30. Nov 2009)

Gonzo17 hat gesagt.:


> Die Variable "number", die du da ausgeben lässt, ist die, die in diesem Block definiert und initialisert wurde. Es fehlt aber noch die Variable "number", die schon vor dem Starten der main-Methode definiert wurde. Die Variable kannst du dann mit "this.number" ansprechen.



Danke, Gonzo17.
Wie genau meinst du das mit ansprechen...?
Ich habe das so verstanden:

```
// *2*
System.out.println("Cons: " + CONS + " Number: " + number + " Counter: " + counter + " i: " + i + " Anfangs-Variable: " + this.number);        // Variablen da rein
```

Allerdings meckert da der Compiler...


----------



## Painii (1. Dez 2009)

Wang hat gesagt.:


> Allerdings meckert da der Compiler...


Weswegen? Fehlermeldung hilft oft...



> ```
> System.out.println("Cons: " + CONS + " Number: " + number + " Counter: " + counter + " i: " + i + " Anfangs-Variable: " + this.number);        // Variablen da rein
> ```


Bin mir mal wieder nicht sicher, aber this ist für Objekte da, deine Variablen da oben sind static -> statt this.number eher Zustand.number?


----------



## Wang (1. Dez 2009)

Painii hat gesagt.:


> Bin mir mal wieder nicht sicher, aber this ist für Objekte da, deine Variablen da oben sind static -> statt this.number eher Zustand.number?



Danke, Painii. 
	
	
	
	





```
Zustand.number
```
 stimmt.
Aber seltsamerweise geht das nur bei *2* und *3*...
Müsste ich dann nicht auch 
	
	
	
	





```
Zustand.counter
```
 schreiben?

Komischerweise werden teilweise nicht die Anfangswerte 0 ausgegeben. ???:L


```
public class Zustand
{
    public static final int CONS = 5;
    public static int number;
    public static int counter;
    
    public static void main(String[] args)
    {
        {
            // *1*
            System.out.println("Cons: " + CONS + " Number: " + number + " Counter: " + counter);        // Variablen da rein
            int number = 1;
            int i = 10;
            number += i;
            // *2*
            System.out.println("Cons: " + CONS + " Number: " + number + " Counter: " + counter + " i: " + i + " Anfangs-Variable number: " + Zustand.number);        // Variablen da rein
        }
        final double d;
        {
            counter=1;
            double e=5.0;
            // *3*
            System.out.println("Cons: " + CONS + " Number: " + number + " Counter: " + counter + " e: " + e + " Anfangs-Variable number: " + Zustand.number + " Anfangs-Variable counter: " + Zustand.counter);        // Variablen da rein
            {
                d = e+counter;
                // *4*
            System.out.println("Cons: " + CONS + " Number: " + number + " Counter: " + counter + " d: " + d + " e: " + e);        // Variablen da rein
            }
        counter++;
        }
        number = number + CONS;
            // *5*
            System.out.println("Cons: " + CONS + " Number: " + number + " Counter: " + counter + " d: " + d + " Anfangs-Variable number: " + Zustand.number + " Anfangs-Variable counter: " + Zustand.counter);        // Variablen da rein
    }
}
```


----------



## Wang (2. Dez 2009)

Hier soweit die Musterlösung:


```
*1*
CONS = 5
Zustand.number = 0
counter = 0

*2*
CONS = 5
Zustand.number = 0
counter = 0
number = 11
i = 10

*3*
CONS = 5
Zustand.number = 0
counter = 1
d = _
e = 5.0

*4*
CONS = 5
Zustand.number = 0
counter = 1
d = 6.0
e = 5.0

*5*
CONS = 5
Zustand.number = 5
counter = 2
d = 6.0
```

Kurze Frage:
Kann mir bitte jemand erklären, warum es zwar 
	
	
	
	





```
Zustand.number
```
 aber nie 
	
	
	
	





```
Zustand.counter
```
 heißt?

Vielen Dank.


----------



## Gonzo17 (7. Dez 2009)

Hm ja das mit this.number war irgendwie Quatsch, aber ihr habts ja herausgefunden. 

Warum bei dir Zustand.counter nicht funktioniert weiss ich nicht, bei mir klappt das ohne Meckern vom Compiler. ???:L


----------

