Pętla for - Programowanie jest łatwe

Kontrola nad przebiegiem pętli może spędzić sen z powiek. Nieskończona pętla, przerwanie się z nieokreślonych powodów… Aby zapewnić większą kontrolę nad iteratorem, do dyspozycji mamy pętlę for.

swirl-1243159.jpg

W większości przypadków, gdy mamy do czynienia z pętlami, które mają wykonać się dokładnie n razy, używamy konstrukcji typu:

int i = 0;

while (i < 100) {
  // …
  i++;
}

Nie jest to może dużym problemem, jednak za każdym razem, gdy budujemy taką pętlę musimy pamiętać o iteratorze- jaką ma mieć wartość początkową, końcową (warunek stopu) i co ma się z nim dziać po każdym obiegu pętli. Celem zwiększenia czytelności programów, większość języków programowania wyposażona jest w pętlę for, której główną zaletą jest fakt, że wszystkie rzeczy związane z iteratorem znajdują się w jednym miejscu. Zwiększa to czytelność kodu i sprawia, że jest zdecydowanie mniej rzeczy, które można przez przypadek pominąć. Ogólna konstrukcja pętli for wygląda następująco:

for (inicjalizacja iteratora; warunek stopu; instrukcje, które mają się wykonać po każdym obiegu) {
  //
}

Jak widać, wszystkie rzeczy związane z iteratorem oraz warunkiem stopu znajdują się w jednym miejscu (a nawet w jednej linii). Przepisując przykład z pętlą while na pętlę for, otrzymalibyśmy następującą konstrukcję:

for (int i = 0; i < 100; i++) {
  //… 
}

Prawda, że zgrabne? Jednym rzutem oka możemy objąć wszystko, co ma związek z iteratorem, jak ma się zachować. Igiełka.

Manipulacja wartości iteratora

Pętla for, poza zgrabniejszą budową ma jeszcze kilka innych zalet, z których możemy korzystać. Zwróć uwagę na zwiększenie iteratora i++. Czyli to samo co i = i + 1. Po każdym obiegu i zwiększy swoją wartość. Możemy użyć dowolnej instrukcji, a nawet wywołać funkcję i za jej pomocą sterować zmianą wartości iteratora. Na przykład:

for (int i = 0; i < 100; i+= 2) {}

Czyli po każdym obiegu i zostanie zwiększone o 2.

for (int i = 0; i < 100; i = obliczenia(i)) {}

Po każdym obiegu zostanie uruchomiona funkcja obliczenia, z i jako jej parametrem, a wynik zostanie zapisany do i.

Co więcej, można wykonać kilka instrukcji w tym miejscu, np.

int j = 10;
for (int i = 0; i < 100; i++, j+= i+1) {}

Czyli po każdym obiegu zwiększony zostanie iterator oraz wartość zmiennej j zostanie powiększona o wartość tego i plus jeden.

Coś o liście inicjalizującej iterator

Po pierwsze, w klasycznym C, kompilator nie pozwoli na zapis taki, jaki zademonstrowałem powyżej, ponieważ w C wszystkie zmienne muszą zostać zadeklarowane na początku funkcji. W takim przypadku należałoby użyć:

int i;
for (i = 0; i < 100; i++) {}

Na liście inicjalizującej można umieścić więcej niż jedną instrukcję, tak samo, jak w przypadku instrukcji przypisania:

int i, j;
for (i = 0, j = 10; i < 100; i++) {}

Można także inicjalizować wartości iteratorów przy użyciu funkcji.

Warunek stopu

W przypadku pętli for, zasady są identyczne jak w przypadku warunków czy pętli while. Również, jak w przypadku while i do… while, można użyć instrukcji break do przerwania pętli, niezależnie od warunku stopu. Użycie instrukcji continue spowoduje pominięcie kolejnych instrukcji w bloku pętli i przejście do jej początku i wykonania instrukcji zawartych w miejscu manipulacji iteratora.

Ćwiczenia

  1. Co się stanie, po wykonaniu poniższego kodu:

    for (int i = 0; i < 10; ++i) {}

    Jaka jest różnica między zapisem i++ a ++i w przypadku pętli for?

  2. Napisz pętlę for, która wyświetli wartości ciągu Fibonacciego, nie przekraczające wartości 200.

  3. Co się stanie, gdy zostanie pominięta inicjalizacja iteratora?

  4. Czy można pominąć instrukcje zwiększające wartość iteratora? Jaki ma to wpływ na przebieg pętli?

  5. Co się stanie, gdy wewnątrz zmodyfikujemy wartość iteratora?

Dodano: 2018-04-27 08:27 przez Piotr Poźniak

ćwiczenia , pętle , for , cotinue , break ,
Piotr Poźniak
O autorze:

Programuję od ponad 15 lat. Prowadzę software house. Angażuję i zachęcam wszystkich do programowania w ramach inicjatywy Programowanie jest łatwe.