Variablen und ihre Zustände

Status
Nicht offen für weitere Antworten.

Wang

Bekanntes Mitglied
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.

Java:
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! ;)
 
G

Gonzo17

Gast
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
 
Zuletzt bearbeitet von einem Moderator:

javimka

Top Contributor
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

Bekanntes Mitglied
Danke Leute für Euren Support! ;)

Ich habe die Lösung überarbeitet:

Code:
*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...
 

eRaaaa

Top Contributor
;)

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
 
G

Gonzo17

Gast
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

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

Heißt das, dass
Code:
int number = 1;
bei *2* nicht sichtbar ist?
 
K

Klamann

Gast
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...

Java:
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

Bekanntes Mitglied
Vielen Dank, Klamann! :toll:

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

Ich habe die Quelldatei nach Deinem Muster so bearbeitet:

Java:
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:

Code:
*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! ;)
 
G

Gonzo17

Gast
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.


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

Bekanntes Mitglied
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:
Java:
// *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

Bekanntes Mitglied
Allerdings meckert da der Compiler...
Weswegen? Fehlermeldung hilft oft...

Java:
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

Bekanntes Mitglied
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.
Code:
Zustand.number
stimmt.
Aber seltsamerweise geht das nur bei *2* und *3*...
Müsste ich dann nicht auch
Code:
Zustand.counter
schreiben?

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

Java:
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

Bekanntes Mitglied
Hier soweit die Musterlösung:

Code:
*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
Code:
Zustand.number
aber nie
Code:
Zustand.counter
heißt?

Vielen Dank.
 
G

Gonzo17

Gast
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
 
Status
Nicht offen für weitere Antworten.

Oben