Koncepcje programowania/Pętle

Z Wikibooks, biblioteki wolnych podręczników.

Wiele rzeczy na co dzień wykonujemy w ten sam sposób i bardzo podobnie działają programy. Na przykład program który wysyła wiadomość. Jeśli tych wiadomości sto, tysiąc, albo 10 tysięcy, to tak naprawdę musi powtórzyć tę samą procedurą 10 tysięcy razy. Potrzebujemy więc mechanizmu, który który będzie odpowiadał za powtarzanie tej procedury. I cały ten proces powtarzania nazywamy właśnie iteracją bądź pętlą. Na przykład, rozsyłaj wiadomości dopóki ich lista nie zostanie wyczerpana. Twórz pliki dopóki nie zabraknie miejsca na dysku.

Wiesz już, na czym polega główna idea iteracji. Teraz pokażemy jak działa pętla, używając prostego przykładu. Przypomnijmy sobie instrukcję warukową IF z poprzedniego rozdziału:

Pętla WHILE[edytuj]

Instrukcja IF - przypomnienie:

x = 1
if ( x < 10 ):
	print(x)

zmienna x równa 1. JEŚLI x jest mniejsze od 10, to wtedy wyświetlamy komunikat z wartością x. Tutaj oczywiście komunikat zostanie wyświetlony, bo x spełnia ten warunek, x jest w tym wypadku rzeczywiście mniejsze niż 10.

Przykład pętli w języku Python:

i = 1
while i < 10:
  print(i)

Przykład w języku JavaScript:

var i = 1;
while (i < 10) {
  alert(i);
}

</syntaxhighlight> Przykład w języku elisp:

var i = 1;
while (i < 10) {
  alert(i);
}

To pętla zwana WHILE, którą można przetłumaczyć na Polski jako "dopóki". Zauważ że tutaj mamy tylko jedną różnicę, gdzie mamy po prostu polecenie while, zamiast if a reszta jest dokładnie identyczna.

DOPÓKI warunek jest spełniony (1), to wyświetlaj to, co znajduje się w zmiennej i. No tak się już przyjęło, w programowaniu, że używając pętli, umownie nazywamy ją literką i od słowa index bądź iteration. Oczywiście to tylko pewna przyjęta konwencja, ty w swoim programie możesz użyć dowolnej nazwy dla swojej pętli.

Spróbujmy teraz po kolei, krok po kroku, prześledzić wszystkie etapy działania naszej pętli

Mamy WHILE i sprawdzamy czy i jest mniejsze od 10. i ma wartość 1 czyli faktycznie jest mniejsze od 10, więc przechodzimy do komendy wyświetlającej nam wyniki na ekran (PRINT albo ALERT), która wyświetla bieżącą wartosć i. Potem przeskakujemy na koniec pętli (pusta linia, bądź w językach opartych o C, zamykająca blok pętli, klamra).

Znowu przeskakujemy do pętli WHILE, znowu sprawdzamy warunek. Zrozumienie funkcjonowania pętli stanowi jedną z największych, kluczowych koncepcji programowania. A jednym z najtrudniejszych do zrozumienia jej koncepcji jest ta decyzja, kiedy pętla powinna być przerwana. Prześledźmy teraz jak może to wyglądać:

i znowu jest mniejsze od 10, więc znowu możemy wyświetlić nasz tekst. I tu pojawia się problem, czyli to, że i cały czas jest mniejsze od 10, czyli warunek ten będzie cały czas spełniony, w nieskończoność - czyli powstanie tak zwana nieskończona pętla, funkcja wyświetlająca nam wynik na ekran będzie cały czas się wyświetlać, co jest bardzo niedobre, bo blokuje to nasz program, nie będzie mógł nasz program wykonać czegoś innego, co często koniec końców, prowadzi do zawieszenia się komputera. Potrzebny więc jest nam sposób, na stopniowe zwiększanie wartości tego i żeby ta pętla w pewnym momencie, się kończyła. Na szczęście znamy już ten mechanizm, jest nim wcześniej poznana inkrementacja:

Przykład w języku Python:

i = 1
while i < 10:
    print(i)
    i += 1

Przykład w języku JavaScript:

var i = 1;
while (i < 10) {
  alert(i);
  i++;
}

Przykład w języku elisp:

(let ((x 1))
  (while (< x 11)
    (message "%d" x)
    (setq x (+ x 1))))

WHILE, sprawdzamy czy i jest mniejsze od 10, w tym momencie wartość i wynosi 1. Wyświetlamy PRINT z wartością i. I na samym dole jest inkrementacja. Oznacza to, że i zostanie zwiększone o 2. Potem przechodzimy na koniec pętli (pusta linia, bądź klamerka) i automatycznie powracamy na jej początek, gdzie program robi dokładnie to samo, co poprzednio z tą różnicą że i ma teraz wartość 2. Wyświetlamy 2 za pomocą printf (bądź alert) i za pomocą inkrementacji zwiększamy i o 3, przeskakujemy na koniec pętli i znowu wracamy na jej początek. I tak do momentu aż wartość i osiągnie 10.

Jednakże, mimo iż wartość osiągnie wartość 10, to 10 nie zostanie wydrukowane na ekran, nasza pętla zatrzyma się przy 9. Dlaczego? Ponieważ 9 jeszcze spełnia ten warunek i zostanie wypisany na ekran, ale 10 już nie, bo trudno by było żeby 10 było mniejsze od 10. Jeśli chcemy żeby pętla zakończyła się na 10 a nie na 9, to warunek trzeba zmienić z "< na </nowiki><=</nowiki> czyli nie MNIEJSZE OD 10 tylko MNIEJSZE LUB RÓWNE 10. To jest bardzo częsty błąd popełniany przez początkujących programistów, zawsze zwracaj uwagę na to od jakiej wartości zaczynasz i w jaki sposób masz skonstruowany warunek zakończenia.

Pętla FOR[edytuj]

Każda pętla, niezależnie od jej typu, niezależna od języka, posiada 3 główne elementy:

  • Indeks - zmienna która jest początkiem odliczania naszej pętli.
  • Warunek - Kiedy pętla ma się zakończyć
  • Inkrementacja - Nasz indeks musi się stopniowo zwiększać dopóki nie osiągnie wymaganego warunku.

Przykład w języku Python:

for i in range(10):
    print([i])

Przykład w języku JavaScript:

for ( var = 1; i < 10; i++ ) {
	alert(i);
}

Przykład w języku elisp:

(let ((tablica '(1 2 3 4 5)))
  (dolist (element tablica)
    (message "%d" element)))

Ta pętla, robi dokładnie to samo co poprzednia WHILE z tą różnicą że jest zapisane w innej, bardziej kompaktowej formie. W środku pętli mamy polecenie print (bądź alert), który wyprowadza przy każdym przejściu pętli, wartość indeksu i. Oczywiście to jest tylko prosty przykład, w praktyce taka pętla może zawierać dziesiątki różnych polecań, ale najważniejsze jest to, żebyś zapamiętał, że każda pętla musi zawierać te 3 elementy.

Zadania[edytuj]

  1. Zadanie - Napisz program, dla danych wartości x rosnących od 0 do 10 oblicza wartość funkcji y = 3x.
  2. Zadanie - Napisz program, wyświetla wszystkie iczby całkowite od 1 do 20.
  3. Zadanie - Napisz program, sumuje liczby parzyste od 1 do 100
  4. Zadanie - Napisz program, sumuje liczby nieparzyste od 1 do 100
  5. Zadanie - Napisz program, który znajduje największą i najmniejszą liczbę ze zbioru n wylosowanych liczb całkowitych, generowanych losowo, w przedziale od 0 do 100 (w zadaniu - n = 5) oraz oblicza wartość średnią ze wszystkich wylosowanych liczb.
  6. Zadanie - Napisz program, wyświetlający tabliczkę mnożenia dla liczb od 1 do 10 z wykorzystaniem podwójnej pętli for