Przykład z książki "Rusz głową! Java" (Rozdział 5. Pomieszane komunikaty)

0

Witam wszystkich! Od całkiem niedawna rozpoczęłam przygodę z nauką programowania w Javie. Aktualnie czytam "Rusz głową! Java", rozwiązując w międzyczasie zadania z tej książki. Natrafiłam na jedno zadanie, którego kompletnie nie jestem w stanie zrozumieć...

screenshot-20211118145326.png

Zwracam się do Was z ogromną prośbą o wyjaśnienie (łopatologiczne rozpisanie), dlaczego** wynik to: 54 6**?

Będę ogromnie wdzięczna za wszelką możliwą pomoc! :)

2

Podłącz sobie debugger i przejdź krok po kroku przez wykonanie. Ten kod celowo został napisany tak, żeby miał mało zrozumiałem wykonanie, więc zamiast łamać sobie głowę wygodniej pomóc sobie komputerem.

5

Mamy tu dwie pętle zagnieżdżone. Zewnętrzna wykona się 3 razy, zaś wewnętrzna też 3 razy, przy czym przy czym break nigdy nie nastąpi.

W każdej iteracji
x zwiększy się o 6 zaś
y o -4 oraz o -2 na zewnątrz wewnętrznej pętli (po jej ciele).

Zatem 3*3*6 = 9 * 6 = 54
oraz 30 - 3*(3 + 1)*2 = 30 - 24 = 6

PS.
break nie nastąpi bo x będzie zawsze przy teście na break miało wartości zgodnie z wzorem 6*n - 3, a więc 3, 9, 15 etc..

10

screenshot-20211118151413.png

2

Wybaczcie...


class PomieszanePetleFor {
    public static void main(String[] args) {
        int x = 0;
        int y = 30;
        for (int zewn = 0; zewn < 3; zewn++) {
            for (int wewn = 4; wewn > 1; wewn--) {
                x = x + 3;
                y = y - 2;
                if (x == 6) {
                    break;
                }
                x = x + 3;
            }
            y = y - 2;
        }
        System.out.println(x + " " + y);
    }
}

2

@Agnes94:

class PomieszanePetleFor { //klasa PomieszanePetleFor
    public static void main(String[] args) { // jest to metoda startowa programu. To od niej zaczyna się wykonywanie wszystkich instrukcji.
        int x = 0; //deklaracja i inicjalizacja zmiennej x
        int y = 30;//deklaracja i inicjalizacja zmiennej y
        for (int zewn = 0; zewn < 3; zewn++) { //for(wyrażenie początkowe ; warunek ; modyfikator_licznika)
            for (int wewn = 4; wewn > 1; wewn--) {
                x = x + 3; // przypisanie x+3 do zmiennej x
                y = y - 2;// przypisanie y-2 do zmiennej y
                if (x == 6) {  // Blok kodu jest wywoływany, jeśli warunek jest prawdziwy
                    break; //instrukcja przerywająca, która powoduje przerwanie wykonywania bloku
                }
                x = x + 3; // przypisanie zmiennej x wartosci x+3
            }
            y = y - 2;// przypisanie zmiennej y wartosci y-2
        }
        System.out.println(x + " " + y);//wypisanie wartosci zmiennej x i y
    }
}

Tutaj mozesz przesledzic jak kod jest wykonywany: https://cscircles.cemc.uwaterloo.ca/java_visualize/
Polecam tez debugger https://www.jetbrains.com/help/idea/debugging-code.html

0

@mpaw:

Wyliczenie x jest dla mnie zrozumiałe, natomiast nie bardzo rozumiem y...

oraz 30 - 3(3 + 1)2 = 30 - 24 = 6

od y = 30 odejmujemy 3 jako 3krotne wykonanie pętli, ale co się dzieje dalej? Skąd się wzięła dalsza część równania?

Dziękuję bardzo! :)

1

@Agnes94: zauważ, że po pętli wewnętrznej, ale w pętli zewnętrznej też masz instrukcję z y ;)

U Ciebie, linijka 15 (w listingu jaki podałaś)

0

@p_agon:

Pięknie dziękuję!

Szczególnie za podesłane linki! Z pewnością przydadzą mi się przy wykonywaniu dalszych zadań! :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1