Programmverständniss

Michi1986

Mitglied
Hallo, ich sitze jetzt seit 21:30 und versuche nachzuvollziehen von Beginn an, wie eclipse auf diese Lösung kommt! Ich hoffe ihr könnt mir in kurzen Schritten erklären wie eclipse das auskalkuliert!


Java:
 public class Puzzle {
public static void main (String[] args ){
	
	Puzzle4b[] obs = new Puzzle4b[3];
	
	int y = 1;
	int x = 0;
	int erg = 0;
	while (x < 3) {
		obs[x] = new Puzzle4b();
		obs[x].ivar = y;
		y = y * 10;
		x = x + 1;
		
	}
	x = 3;
	while (x > 0) {
		x = x - 1;
		erg = erg + obs[x].machZeug(x);
	}
	System.out.println ("Ergebnis " + erg);
	}
}
class Puzzle4b {
	int ivar;
	public int machZeug (int faktor)
	{
if (ivar > 100) {
	return ivar * faktor;
} else {
	return ivar * (5 - faktor);
}
}
}

Vielen Dank für eure Hilfe :)
 

Michi1986

Mitglied
Erstellung eines neuen Arrays mit 3 Objekten, Referenz obs

Java:
Puzzle4b[] obs = new Puzzle4b[3];


Array obs hat 3 Objekte (0, 1, 2), aber wieviele Referenzen???
da ivar y zugewiesen wird, und y aus y* 10 zusammengerechnet wird ist y immer 10 in diesem Beispiel!

[JAVA=42] while (x < 3) {
obs[x] = new Puzzle4b();
obs[x].ivar = y;
y = y * 10;
x = x + 1;[/code]

x wird 3 zugewiesen. Schleife wird solange ausgeführt wie x größer als 0 ist! Also 3 mal! Muss nicht x = x -1 hinter erg = erg + .... stehen?

[JAVA=42] x = 3;
while (x > 0) {
x = x - 1;
erg = erg + obs[x].machZeug(x);
}[/code]

der int faktor wird von obs[x].machZeug(x) übernommen!

[JAVA=42]class Puzzle4b {
int ivar;
public int machZeug (int faktor)
{[/code]

Wenn ivar (10) kleiner als 100 dann gibt er den Wert ivar (10)* faktor (0) wohin zurück?

[JAVA=42]if (ivar > 100) {
return ivar * faktor;
} else {
return ivar * (5 - faktor);[/code]
 

CortPoker

Aktives Mitglied
Erstellung eines neuen Arrays mit 3 Objekten, Referenz obs

[JAVA=42] while (x < 3) {
obs[x] = new Puzzle4b();
obs[x].ivar = y;
y = y * 10;
x = x + 1;[/code]

x wird 3 zugewiesen. Schleife wird solange ausgeführt wie x größer als 0 ist! Also 3 mal! Muss nicht x = x -1 hinter erg = erg + .... stehen?

[JAVA=42] x = 3;
while (x > 0) {
x = x - 1;
erg = erg + obs[x].machZeug(x);
}[/code]

Das mit x siehst du richtig. Weis dem x einfach die 0 zu, dann kannst du die obere Schleife nutzen. An solchen Stellen kannst du auch super den In- bzw. Dekrementor nutzen
Java:
x++;
bzw.
Java:
x--;
Zum erg kann ich dir nichts 100&iges sagen, da ich nicht weiß, was das macht. Rein logisch würde ich aber schon sagen, sollte es eigentlich vor
Java:
x = x -  1;

Willst du dein return Statement nun sehen, nutze entweder die toString()-Methode, oder lass dir die Methode über System.out.println(); ausgeben.
 
Zuletzt bearbeitet:

Landei

Top Contributor
Entweder Testausgaben ([c]System.out.println[/c]) einbauen oder lieber gleich lernen, wie man in der IDE deines Vertrauens den Debugger benutzt.
 
M

Marcinek

Gast
Erstellung eines neuen Arrays mit 3 Objekten, Referenz obs


Java Code:
1
Puzzle4b[] obs = new Puzzle4b[3];

Array obs hat 3 Objekte (0, 1, 2), aber wieviele Referenzen???

Nein,

hier hast du ein Array = eine Referenz und KEINE Objekte.

Die Objekte von Typ Puzzle4b werden weiter unten mit new Puzzle4b() erstellt. Und dann ist ein Objekt = eine Referenz. Aber warum das hier wichtig ist, weiß ich nicht.
 
F

Firephoenix

Gast
Entweder Testausgaben ([c]System.out.println[/c]) einbauen oder lieber gleich lernen, wie man in der IDE deines Vertrauens den Debugger benutzt.

Allgemein stimme ich dir da zu, aber die Ausgabe sieht so aus wie eine von den Klausuraufgaben mit der Frage "Beschreiben sie wie Java das Ergebnis ausgewertet unter Angabe von der jeweiligen Zeile" oder irgend etwas ähnliches.

Und auf dem Level finde ich persönlich sollte man einfach mal selbst Compiler spielen, denn damit entwickelt man auch ein Codeverständniss, das einem später hilft Fehler schneller zu finden oder auch beim schreiben zu vermeiden - die sysouts oder den Debugger würde ich allerdings zur Kontrolle der Ergebnisse auf alle Fälle mit nutzen.

Gruß
 

Michi1986

Mitglied
Vielen Dank erstmal...

Java:
obs[x].ivar = y;

ist da ivar nun jeweils 0, 1, 2 oder 0, 10, 20 ?


Wo geht der Rückgabewert hin?

Java:
return ivar * faktor;

Achja, und zu dem IDE und dem Debugger. Ich bin noch nicht soweit und weiß garnicht was das ist und wie man den Debugger anwendet! Aber ich hoffe auf Hilfe:)

Ich verstehe das ganze so:

JVM geht in das Array geht das ERSTE mal die Schleife durch kommt auf Y = 0; (bzw. Ivar 0)
JVM geht in das Array geht das ZWEITE mal die Schleife durch kommt auf Y = 10; (Ivar 10)
JVM geht in das Array geht das DRITTE mal die Schleife durch kommt auf Y = 20;(ivar 20)

jetzt sieht die JVM das X 3 zugeordnet wird, und gibt dadruch das ja die Schleife X > 0 vorgibt, 2 Ausgaben, 2 Werte aus bei
Java:
[B]erg =  erg + obs.machZeug(x)[/B]

bei der Methode machZeug ist dabei jedoch ivar immer kleiner wie 100, und er gibt in der AUsgabe eigentlich den returnwert von ivar * faktor zurück! Sprich 20 * 2 und 10 * 1!

Wo liegt mein Denkfehler?
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Vielen Dank erstmal...

Java:
obs[x].ivar = y;

ist da ivar nun jeweils 0, 1, 2 oder 0, 10, 20 ?
Weder noch. Geh doch einfach den Code per Hand durch und berechne die Werte in den Variablen selbst:
[JAVA=9] while (x < 3) {
obs[x] = new Puzzle4b();
obs[x].ivar = y;
y = y * 10;
x = x + 1;

}[/code]
Wo geht der Rückgabewert hin?
Wo wird die Methode machZeug(...) aufgerufen!? Da "landet" auch der Rückgabewert.
 

Michael...

Top Contributor
Ich verstehe es nicht, ich komme net weiter ich komme immer auf andere Ergebnisse!
Was verstehst Du nicht?
y=1 : y wird mit dem Wert 1 initialisiert

Java:
    while (x < 3) {
        //obs[x] = new Puzzle4b();
        //obs[x].ivar = y;
        y = y * 10;
        x = x + 1;
    }
Wie oft wird diese Schleife durchlaufen? Welchen Wert hat y nach dem ersten, zweiten... Durchlauf?
das es nicht soetwas wie einen STepper gibt der die anzeigt wie das Programm arbeitet! das nervt mich total!
Ich nehme an Du sprichst von einem Debugger? Die gängigen IDEs liefern einen solchen mit.
 

Michi1986

Mitglied
ERSTE SCHLEIFE

y= 10

ZWEITE

y= 100

DRITTE

y= 1000

oder?

ja, Debugger, aber wann funktioniert der? nur wenn man Fehler hat oder? Bei Racket war der STepper da und man konnte es nachvollziehen!
 

localhost1

Mitglied
welche ergebnisse kommen denn raus und welche erwartest du?
füg dir doch so zwischenergebnisse ein, z.b. bei

Java:
     while (x < 3) {
        obs[x] = new Puzzle4b();
        obs[x].ivar = y;
        y = y * 10;
        x = x + 1;
    }
kannst du

Java:
     while (x < 3) {
        System.out.println("x ist : " +x);
        obs[x] = new Puzzle4b();
        obs[x].ivar = y;
        System.out.println("y ist : " +y);
        y = y * 10;
        x = x + 1;
        System.out.println("x ist jetzt : " +x);
        System.out.println("y ist jetzt : " +y);
    }

machen. Vor allem über die Zeile y = y*10 solltest du dir Gedanken machen. Erst wird die rechte Seite ausgerechnet und dann der linken zugewiesen. Und zwar NACHDEM obs[x].ivar zugewiesen wurde.
 
Zuletzt bearbeitet:

Neue Themen


Oben