Wskaż instrukcję równoważną funkcjonalnie do instrukcji while zapisanej w języku PHP.
| $x = 0; while($x < 5) { echo "$x,"; $x++; } Instrukcja 1 for ($x=0; $x<5; $x++) { echo "$x,"; $x++; } Instrukcja 2 for ($x=0; $x<5; $x+=2) { echo "$x,"; $x++; } Instrukcja 3 for ($x=0; $x<5; $x++) { echo "$x,"; } Instrukcja 4 for ($x=1; $x<=5; $x++) { echo "$x,"; } |
A. Instrukcja 2
B. Instrukcja 1
C. Instrukcja 4
D. Instrukcja 3
Pytanie z egzaminu CKE, styczeń 2022 (arkusz EE.09-SG-22.01).
Instrukcja 3 jest równoważna funkcjonalnie z podaną pętlą while, bo wykonuje dokładnie tę samą sekwencję działań na zmiennej sterującej $x. W obu przypadkach zmienna startuje od wartości 0, warunek kontynuacji to $x < 5, a po każdym wypisaniu wartości następuje zwiększenie $x o 1. Efekt na ekranie będzie więc taki sam: 0,1,2,3,4,. To jest właśnie sedno równoważności pętli: nie chodzi o to, żeby składnia wyglądała podobnie, tylko żeby stan programu i wynik działania były takie same. Moim zdaniem to bardzo praktyczne rozróżnienie, bo w PHP często można zapisać ten sam algorytm pętlą while albo for. Pętla for dobrze pasuje, gdy znamy wartość początkową, warunek końca i krok iteracji. Dobra praktyka jest taka, żeby zmienną sterującą zwiększać w jednym miejscu, najczęściej w nagłówku for, bo kod jest wtedy czytelniejszy i mniej podatny na pomyłki. W projektach webowych, np. przy generowaniu listy elementów HTML z tablicy, taka czytelność naprawdę się przydaje.
W tym zadaniu najłatwiej pomylić się przez patrzenie tylko na ogólny schemat pętli, a nie na rzeczywisty przebieg wartości zmiennej $x. Oryginalna pętla while zaczyna od $x = 0, sprawdza warunek $x < 5, wypisuje bieżącą wartość i dopiero potem zwiększa $x o 1. Dlatego wynik to 0,1,2,3,4,. Równoważna instrukcja musi zachować ten sam start, ten sam warunek zatrzymania, ten sam moment wypisania i taki sam przyrost zmiennej. Jeżeli w pętli for zmienna $x jest zwiększana zarówno w nagłówku pętli, jak i dodatkowo w jej ciele, to iteracje zaczynają przeskakiwać co więcej niż jeden. Wtedy nie dostaniemy pełnego ciągu 0,1,2,3,4, tylko np. wartości parzyste albo jeszcze inny układ. To jest typowy błąd: ktoś widzi $x++ i uznaje, że skoro występuje jak w while, to musi być dobrze, ale nie zauważa drugiego zwiększenia po zakończeniu obiegu pętli for. Równie mylący jest zapis z inną wartością początkową i warunkiem $x <= 5. Taka pętla może wykonać pięć iteracji, ale wypisze 1,2,3,4,5, czyli wynik jest przesunięty. W programowaniu webowym, zwłaszcza w PHP, taka drobna różnica może zmienić indeksy tablic, liczbę generowanych rekordów albo zawartość widoku. Z mojego doświadczenia najlepiej zawsze prześledzić kilka pierwszych obiegów pętli na kartce albo w debuggerze, bo wtedy od razu widać, gdzie zmienna sterująca zmienia się za często albo startuje od złej wartości.