Java Programmfluss

Diskutiere Java Programmfluss im Allgemeine Java-Themen Bereich.
K

kafa175

Hallo, ich schreibe bald eine Klausur in Objektorientierte Softwareentwicklung und finde es bisschen schwer den Überblick zu behalten.
Java:
    public static void main(String[] args) {
        
    int y = 5;
    int x = 13;
    
    while (x>=y) {
        System.out.println(x +" "+y);
        for (int i = y; i>0; i=i-4) {
            System.out.println("I: " + i+ " " + x + " "+ y);
            y +=3;
        }
        if ( x== 13) {
            x++;
            continue;
        }
        System.out.println(x + " " +y);
        x++;
        
    }
    }
Ich habe es in Eclipse mal ausgegeben, aber leider komme ich nicht auf das Ergebnis wie in der Konsole. Die while Schleife hat ja noch eine innere for schleife, danach noch eine Bedingung. Wird dann als erstes die for Schleife auf die Variablen angewendet, so lange, bis i nicht mehr größer als 0 sein kann (in den Minus bereich geht)uund dann geht es über in die bedingung mit x==13 und führt diese aus? Könntet ihr mir Tipps geben, wie ich den Überblick behalte und es richtig lösen kann?
 
T

temi

Einfach von oben nach unten durchgehen. Zuerst werden die Variablen x/y zugewiesen, danach die Bedingung der while-Schleife geprüft. Da sie erfüllt ist geht es jetzt innerhalb der while-Schleife weiter. Ausgabe. for-Schleife....
 
Zuletzt bearbeitet:
K

kafa175

Ja klar weiß ich, dass ich von oben nach unten durchgehen sollte. Zum Beispiel die if Bedingung wird nur ein einziges mal ausgeführt ist ja klar, weil x größer als 13 wird. So ist die Ausgabe:
13 5
I: 5 13 5
I: 1 13 8
14 11
I: 11 14 11
I: 7 14 14
I: 3 14 17
14 20 <- warum wird hier dann nicht nochmal um 1 erweitert wegen dem
System.out.println(x + " " +y);
x++; ?
 
MoxxiManagarm

MoxxiManagarm

Im Zweifelsfall hilft Zettel und Stift. z.B. als Tabelle, welche Zustände und Aktionen (hier Ausgabe) aufführt

xyiAusgabe
Init135
Betrete while-Schleife13 5
Betrete for-Schleife5
1. Iteration81I: 5 13 5
2. Iteration11-3I: 1 13 8
Bedingung erfüllt14
Nächste Iteration while-Schleife14 11
Betrete for-Schleife11
1. Iteration147I: 11 14 11
2. Iteration173I: 7 14 14
3. Iteration20-1I: 3 14 17
Bedingung nicht erfüllt1514 20
x ist nun kleiner y
 
J

JustNobody

Am Ende wird x noch einmal erhöht auf 15. Aber 15 ist nicht >= 20 und damit geht er aus der while Schleife raus. Und danach macht er nichts mehr ...

Du kannst es ja mal mit dem Debugger ansehen oder nach der Schleife noch einmal X ausgeben.
 
K

kafa175

Java:
    static int p(int a, int b) {
        if (!(a > b))
            return b - 343;
        return (a + b) % 2 == 1 ? (a + p(a - 1, b + 2)) : (a + p(a - 2, b + 1));

    }

    public static void main(String[] args) {
        System.out.println(p(49, 25));
    }
}
Könnte mir jemand hier bei dem Programmfluss helfen? Das Ergebnis wäre 42, ich komme einfach nicht auf das Ergebnis. 😣
 
L

LimDul

Zerleg das doch mal in einzelne Blöcke und mach aus dem ?-Operator ein echtes if / else.

Dann sollte es vielleicht klarer werden. Ansonsten - da steckt eine Rekursion drin, einfach Zwischenergebnisse ausgeben lassen.
 
J

JustNobody

Dann gehen wir einfach einmal Schritt für Schritt durch:
a>b? 49>25: Das ist wahr.
!wahr? falsch
Also wird das if nicht ausgeführt.

Also geht es mit dem unteren return weiter:
a+b? 49+25 = 74
74%2? 0
0 ==1? falsch
Also wird der Bereich vor dem : nicht gemacht (a + p(a - 1, b + 2)) - es geht dahinter weiter ... also mit

a+ p(a - 2, b + 1)
49 + p(47, 26)
============

Also merken wir uns dies und machen es für p(47, 26) noch einmal.Wieder das untere, aber summe ist nun ungerade:
47 + p(46, 28)

Mit dem Obrigen ist das 49 + 47 + p(46, 28)

a immer noch größer b, also unteres return, ist wieder gerade also
46 + p(44, 29)
==> 49 + 47 + 46 + p(44,29)

unteres return, ungerade Summe: 44 + p(43, 31) ==> 49 + 47 + 46 + 44 + p(43, 31)

unteres return, gerade Summe: 43 + p(41, 32) ==> 49 + 47 + 46 + 44 + 43 + p(41, 32)

unteres return, ungerade Summe: 41 + p(40, 34) ==> 49 + 47 + 46 + 44 + 43 + 41 + p(40, 34)

unteres return, gerade Summe: 40 + p(38, 35) ==> 49 + 47 + 46 + 44 + 43 + 41 + 40 + p(38, 35)

unteres return ungerade Summe: 38 + p(37, 37) ==> 49 + 47 + 46 + 44 + 43 + 41 + 40 + 38 + p(37, 37)

Jetzt ist a nicht mehr größer b - das if wird ausgeführt: b-343 = 37 - 343 = -306

Damit haben wir 49 + 47 + 46 + 44 + 43 + 41 + 40 + 38 - 306 = 42

Also die Regel ist halt klar:
So lange wie a > b gilt, wird die Summe betrachtet:
bei ungerade wird bei den Parametern -1 und +2 gerechnet, bei gerade -2 und +1.
 
K

kafa175

Was ich aber nicht verstehe ist, da ist doch keine Schleife, wieso wird es immer und immer wieder durchgegangen?
 
J

JustNobody

Im unteren return ist doch ein rekursiver Aufruf:

return (a + b) % 2 == 1 ? (a + p(a - 1, b + 2)) : (a + p(a - 2, b + 1));

Einmal: p(a - 1, b + 2)
Und: p(a - 2, b + 1)
 
Thema: 

Java Programmfluss

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben