Z = 0 N = 1 dopóki Z < 3: N = N * 2 + 1 Z = Z + 1 wypisz N Która wartość zostanie wypisana przez algorytm?
Z = 0 N = 1 dopóki Z < 3: N = N * 2 + 1 Z = Z + 1 wypisz NKtóra wartość zostanie wypisana przez algorytm?
A. 3
B. 15
C. 5
D. 7
Pytanie z egzaminu CKE, styczeń 2021 (arkusz EE.09-SG-21.01).
Wynik 15 wynika z dokładnego prześledzenia pętli dopóki. Na początku mamy Z = 0 oraz N = 1. Warunek Z < 3 jest sprawdzany przed każdym wykonaniem instrukcji w pętli, więc pętla wykona się dla wartości Z równych 0, 1 i 2. W pierwszym przebiegu N = 1 * 2 + 1, czyli 3, a Z rośnie do 1. W drugim przebiegu N = 3 * 2 + 1, czyli 7, a Z rośnie do 2. W trzecim przebiegu N = 7 * 2 + 1, czyli 15, a Z rośnie do 3. Dopiero wtedy warunek Z < 3 jest fałszywy i program przechodzi do instrukcji wypisz N. Moim zdaniem najlepszą metodą przy takich zadaniach jest zrobienie małej tabeli śledzenia zmiennych, bo od razu widać, jak zmieniają się wartości po każdej iteracji. To jest bardzo praktyczne także w normalnym programowaniu, np. w JavaScript, PHP czy Pythonie, gdy analizujemy licznik pętli, sumowanie danych, generowanie kolejnych wartości albo prosty algorytm przetwarzania rekordów. Dobra praktyka branżowa to zawsze kontrolować kolejność instrukcji w pętli oraz warunek zakończenia, bo błędy typu off-by-one, czyli wykonanie pętli o jeden raz za dużo albo za mało, są naprawdę częste.
Niepoprawne wyniki zwykle biorą się z tego, że pętla została policzona zbyt krótko albo pomylono moment sprawdzania warunku. W tym algorytmie warunek Z < 3 jest sprawdzany na początku każdego obiegu, ale zmienna Z startuje od 0, więc mamy trzy pełne wykonania pętli: dla Z = 0, Z = 1 i Z = 2. To jest klasyczna sytuacja, gdzie łatwo pomyśleć, że skoro w warunku jest liczba 3, to coś wykona się dwa razy albo że po osiągnięciu Z = 3 pętla jeszcze raz zadziała. Nie zadziała, bo 3 < 3 jest fałszem. Wynik 3 oznaczałby zatrzymanie się już po pierwszym przeliczeniu N, czyli po wykonaniu tylko jednego obiegu. Wynik 7 pojawia się po dwóch obiegach, więc też jest za wcześnie. Wartość 5 mogłaby wynikać z błędnego liczenia działania, na przykład potraktowania wzoru jak N = N + 2 + 1 albo nieuwzględnienia, że nowe N z poprzedniej iteracji jest używane w następnej. W programowaniu to ważna sprawa: instrukcja N = N * 2 + 1 nie opisuje równania matematycznego do rozwiązania, tylko przypisanie nowej wartości do zmiennej. Najpierw obliczana jest prawa strona na podstawie aktualnego N, a dopiero potem wynik trafia z powrotem do N. Z mojego doświadczenia najbezpieczniej jest wypisać sobie kolejne stany zmiennych po każdej iteracji, bo wtedy nie zgaduje się wyniku, tylko normalnie symuluje działanie algorytmu.