Przejdź do głównej treści
  1. Strona główna
  2. Technik informatyk
  3. INF.03
  4. Pytanie

Kwalifikacja: INF.03 - Tworzenie i administrowanie stronami i aplikacjami internetowymi oraz bazami danych

Zawód: Technik informatyk, Technik programista

Kategorie: Programowanie webowe Algorytmy i podstawy informatyki PHP

Wynikiem działania poniższej pętli for w przedstawionym kodzie PHP jest wyświetlenie liczb:
<?php
   for($i=5;$i>1;$i-=2)
       echo ($i%2)." ";
?>

W tej pętli kluczowe jest spokojne przejście po trzech częściach instrukcji for: inicjalizacji, warunku oraz kroku po każdym obiegu. Zmienna $i startuje od wartości 5. Warunek wykonania pętli to $i > 1, więc ciało pętli działa tylko wtedy, gdy $i jest większe od 1. W pierwszym obiegu mamy $i = 5, a wyrażenie $i % 2 daje resztę z dzielenia przez 2. Liczba 5 jest nieparzysta, więc reszta wynosi 1 i zostaje wypisane 1. Następnie wykonywany jest krok $i -= 2, czyli $i zmniejsza się do 3. Warunek nadal jest spełniony, bo 3 > 1, więc znowu liczymy 3 % 2, co także daje 1. Po tym $i spada do 1, a warunek 1 > 1 jest fałszywy, więc pętla się kończy. Wynik to 1 1. Moim zdaniem najbezpieczniejsza metoda przy takich zadaniach to krótka tabelka z wartościami zmiennej, bo w prawdziwym PHP bardzo łatwo pomylić moment sprawdzania warunku z momentem zmiany licznika. Operator % jest często używany praktycznie, np. do sprawdzania parzystości identyfikatorów, numerów wierszy tabeli czy cyklicznego wykonywania operacji co n-ty element. Dobra praktyka to też czytelne formatowanie pętli i unikanie zbyt skomplikowanych wyrażeń w jednej linii, bo potem debugowanie robi się średnio przyjemne.
W tym zadaniu najczęstsza pomyłka polega na założeniu, że skoro licznik zmniejsza się o 2, to reszta z dzielenia przez 2 będzie się zmieniała naprzemiennie między 1 i 0. Tak jednak nie działa arytmetyka modulo. Jeżeli zaczynamy od liczby nieparzystej, czyli od 5, i za każdym razem odejmujemy 2, to cały czas zostajemy przy liczbach nieparzystych: 5, 3, 1, -1 i tak dalej. W tej konkretnej pętli wartością 1 już się nie zajmujemy w ciele pętli, bo warunek brzmi $i > 1. To oznacza, że ciało pętli wykona się dla $i = 5 oraz $i = 3, ale nie dla $i = 1. Dlatego nie może pojawić się wynik zawierający 0, bo ani 5 % 2, ani 3 % 2 nie daje zera. Zero pojawiłoby się dopiero przy liczbie parzystej, na przykład 4 % 2 albo 2 % 2. Drugi typowy błąd to doliczenie dodatkowego obiegu dla $i = 1. W pętli for w PHP warunek jest sprawdzany przed wykonaniem ciała pętli, a nie po nim. Gdy po drugim obiegu zmienna $i zostaje zmniejszona z 3 do 1, interpreter wraca do warunku i sprawdza 1 > 1. To jest fałsz, bo 1 nie jest większe od 1, tylko równe 1. Z mojego doświadczenia takie zadania najlepiej rozpisywać krok po kroku: wartość licznika, wynik modulo, potem zmiana licznika. Wtedy od razu widać, że odpowiedzi z trzema lub czterema liczbami zakładają zbyt dużą liczbę iteracji, a odpowiedzi z zerem zakładają pojawienie się liczby parzystej, której tu po prostu nie ma.

Wymagane logowanie

Ocenianie trudności pytań jest dostępne tylko dla zalogowanych użytkowników. Zaloguj się, aby skorzystać z pełni możliwości platformy.

Twoja ocena pomoże innym uczniom w przygotowaniu do egzaminu, a Tobie pozwoli na dostęp do spersonalizowanych statystyk.

Zgłoś błąd w pytaniu

Rozwiń sekcję i zmień pole, którego dotyczy błąd. Wyślemy tylko zmienione sekcje.

Błędna kwalifikacja
Błąd w treści pytania
Błąd w treści odpowiedzi
Błąd w obrazie
Dane kontaktowe (opcjonalnie)
Podaj email, jeśli chcesz otrzymać informację o rozpatrzeniu zgłoszenia.