Pętla FOR

Pętle pozwalają na wielokrotne wykonywanie tego samego kawałka kodu. Dzięki pętlom unikamy niepotrzebnego powtarzania tego samego kodu oraz precyzyjnie możemy sterować tym, ile razy coś ma się wykonać.

Jeśli chcielibyśmy, by nasz samochód poruszał się po trasie przypominającej kształtem kwadrat, moglibyśmy napisać:

move(50);
turn(90);
move(50);
turn(90);
move(50);
turn(90);
move(50);
turn(90);

czyli jazda do przodu i skręt o 90 stopni w prawo, znowu jazda i znowu skręt i tak w kółko.

Jak widać kod staje się trochę nieczytelny, łatwo o pomyłkę i przede wszystkim na pierwszy rzut oka trudno stwierdzić, co ten kod tak naprawdę robi.

Dzięki pętlom możemy tego wszystkiego uniknąć i bardzo łatwo powiedzieć, że daną sekwencję komend – w naszym wypadku jazdę do przodu i skręt – powtarzaj 4 razy.

Pętla FOR

Jedną z pętli, którą możemy zastosować w Javie, jest pętla FOR. Ma ona postać:

for (deklaracja zmiennych; sprawdzenie warunku; modyfikacja zmiennych) {
...
}

W nawiasie po słówku for znajdują się trzy sekcje, oddzielone od siebie znakiem średnika:

  • deklaracja zmiennych – w tej sekcji najczęściej definiować będziemy sobie zmienną, którą w pętlach nazywamy licznikiem, ponieważ pozwala nam na zliczanie, który raz z kolei wykonujemy instrukcje w pętli.
  • sprawdzenie warunku – pętla powinna się kiedyś zakończyć, więc potrzebny będzie warunek (czyli wyrażenie zwracające wartość true lub false), dzięki któremu przed każdym przebiegiem będzie się dało stwierdzić, czy jeszcze wykonywać instrukcje wewnątrz pętli czy też już należy działanie pętli zakończyć.
  • modyfikacja zmiennych – po wykonaniu wszystkich instrukcji wewnątrz pętli będziemy modyfikować wartość licznika i dzięki temu właśnie będziemy wiedzieć, który raz wykonujemy instrukcje w pętli.

Jeszcze słowo o nawiasach klamrowych występujących po słówku for i nawiasach okrągłych: nawiasy klamrowe wyznaczają tzw. ciało pętli. Powtarzane wielokrotnie będzie to, co znajduje się wewnątrz nawiasów klamrowych.

Przykład
for (int k = 0; k < 3; k = k + 1) {
 move(50);
 turn(90);
}

W pierwszej sekcji deklaracji zmiennych mamy int k = 0, to znaczy że jako licznika w pętli będziemy używali zmiennej o nazwie k i jej początkową wartością będzie 0.

W kolejnej sekcji (sprawdzenie warunku) mamy k < 3, to znaczy że przed każdym przebiegiem pętli będziemy sprawdzali, czy wartość licznika k jest mniejsza od liczby 3. Jeśli będzie mniejsza, to instrukcje wewnątrz pętli wykonają się. W momencie, kiedy będzie miało wartość równą 3 lub większą, wyrażenie k < 3 zacznie zwracać wartość false. To będzie znak dla pętli, że należy ją zakończyć i już nie wykonywać więcej instrukcji w pętli.

W ostatniej sekcji modyfikacji zmiennych umieściliśmy: k = k + 1. Zapis ten znaczy, że po każdorazowym przebiegu pętli (czyli po wykonaniu ostatniej instrukcji wewnątrz pętli) wartość licznika zostanie zwiększona o 1.

Ciekawostka pierwsza: zapis k = k + 1 może zostać skrócony do k++, który znaczy dokładnie to samo. ++ po nazwie zmiennej oznacza zwiększenie jej wartości o 1.

Ciekawostka druga: skoro za działanie pętli odpowiada jej warunek, który musi do działania zwrócić wartość true, to bardzo łatwo z pętli wykonującej się kilka razy zrobić pętlą nieskończoną, czyli taką, która nigdy się nie zakończy:

for (int k = 0; true; k = k + 1) {
 move(50);
 turn(90);
}

Na koniec możnaby zapytać, dlaczego początkową wartością licznika k jest 0, a nie np. 1? Nie ma to znaczenia, liczenie w pętli możemy zacząć od dowolnej liczby, np. 123. To nasza sprawa, jakie wartości przyjmować będzie licznik. Ważne, by wartość licznika była w pętli do czegoś przydatna. Tak się dzieje, kiedy wartość licznika służy do wyliczenia czegoś, co jest wykonywane w instrukcji wewnątrz pętli.

Możemy więc jako wartość początkową licznika ustawić 1, ale wtedy żeby pętla również wykonała się razy, musimy zmodyfikować warunek w pętli i zamiast k < 3 musimy napisać k <= 4.