KWALIFIKACJA INF2 + INF3 - CZERWIEC 2009

PYTANIE NR 25.
Po wykonaniu instrukcji zamieszczonych w tabelce, na ekranie monitora
Ilustracja przedstawia fragment kodu w języku programowania Pascal.
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Zmienna s ma wartość 30, więc wyrażenie s mod 3 daje resztę z dzielenia 30 przez 3, czyli 0. W instrukcji case zdefiniowano przypadki tylko dla 1 i 2, dlatego wynik 0 nie pasuje do żadnego z nich. Zostaje wykonana gałąź else, która wypisuje tekst "start".

Pełne wyjaśnienie:

W tym zadaniu trzeba prześledzić wykonanie krótkiego fragmentu programu w Pascalu, w którym użyto operatora mod oraz instrukcji wielokrotnego wyboru case.

1) Obliczenie wyrażenia sterującego
Najpierw następuje przypisanie s := 30. Następnie program oblicza wyrażenie s mod 3. Operator mod zwraca resztę z dzielenia całkowitego, więc:

  • 30 dzieli się przez 3 bez reszty,
  • zatem 30 mod 3 = 0.

2) Dopasowanie w instrukcji case
Instrukcja case s mod 3 of porównuje otrzymaną wartość z wymienionymi etykietami przypadków. W kodzie są dwie etykiety: 1 i 2. Ponieważ obliczony wynik to 0, nie pasuje on ani do 1, ani do 2.

3) Rola klauzuli else
Gdy żadna etykieta nie pasuje, wykonywana jest gałąź else. W tej gałęzi znajduje się instrukcja write('start'), więc na ekranie pojawi się napis start.

Dlaczego pozostałe odpowiedzi są niepoprawne?

  • Odpowiedź "wyświetli się napis stop." byłaby prawdziwa tylko wtedy, gdyby s mod 3 wyniosło 1. Dla s=30 to nie zachodzi.
  • Odpowiedź "wyświetli się napis koniec." byłaby prawdziwa tylko wtedy, gdyby s mod 3 wyniosło 2. To również nie zachodzi.
  • Odpowiedź "nie zostanie wyświetlony żaden napis." jest błędna, bo instrukcja write realizuje wypisanie tekstu; nie jest do tego potrzebne użycie read ani writeln (writeln jedynie dopisuje znak nowej linii).

Wskazówka egzaminacyjna: w zadaniach z case zawsze sprawdź, czy może wystąpić wartość "spoza listy" (np. 0 przy użyciu mod). Wtedy kluczowa jest gałąź else.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
mod zwraca resztę z dzielenia całkowitego. Przykład: 10 mod 3 = 1, bo 10 = 3*3 + 1. Gdy liczba dzieli się bez reszty, wynik to 0 (np. 30 mod 3 = 0). To częsty element zadań na analizę kodu.
Ponieważ 30 jest wielokrotnością 3: 30 = 3 * 10. Skoro dzielenie jest "równe", nie zostaje żadna reszta. Właśnie tę resztę zwraca operator mod, więc w tym przypadku wynikiem jest 0.
Instrukcja case wybiera jedną gałąź na podstawie wartości wyrażenia. Program porównuje wynik z etykietami (np. 1, 2, 3). Gdy znajdzie dopasowanie, wykona przypisany blok. Jeśli nie ma dopasowania, może wykonać gałąź else.
Gałąź else jest "domyślna": uruchamia się, gdy żadna z wymienionych etykiet w case nie pasuje do wartości wyrażenia. Dzięki temu program obsługuje także sytuacje nieprzewidziane lub rzadkie, zamiast nie wykonywać nic.
Tak. write odpowiada za wypisanie tekstu na standardowe wyjście (ekran). Instrukcje read/readln służą do wczytywania danych i nie są wymagane, aby coś się wyświetliło. Różnica: writeln dodatkowo przechodzi do nowej linii.
write wypisuje tekst i pozostawia kursor w tej samej linii, tuż po wypisanym fragmencie. writeln robi to samo, ale na końcu dopisuje znak końca linii (przechodzi do następnej linii). W zadaniach zwykle chodzi o sam fakt wypisania.
Najpierw policz wartość wyrażenia sterującego (np. s mod 3) i sprawdź, czy jest wśród wypisanych etykiet. Jeśli nie, od razu przechodzisz do gałęzi else. To skraca analizę i zmniejsza ryzyko pomyłki w czytaniu kodu.
W typowych zadaniach z liczbami nieujemnymi wynik a mod b mieści się w zakresie od 0 do b-1. To oznacza, że wartość 0 jest jak najbardziej możliwa i często prowadzi do uruchomienia gałęzi domyślnej (else), jeśli nie uwzględniono jej w case.
Bo oba operatory dotyczą dzielenia całkowitego i często występują obok siebie. div zwraca iloraz całkowity (np. 10 div 3 = 3), a mod zwraca resztę (10 mod 3 = 1). Pomyłka zmienia wynik wyrażenia i prowadzi do złej gałęzi.
case jest szczególnie czytelny, gdy porównujesz jedną zmienną/wyrażenie do wielu konkretnych wartości (np. menu: 1, 2, 3, 4). Przy wielu zagnieżdżeniach if kod robi się mniej przejrzysty. Gałąź else pozwala obsłużyć "pozostałe" przypadki.
info

Około 58% zdających odpowiada poprawnie na to pytanie. średnie

Specjaliści zwracają uwagę: "Zmienna s ma wartość 30, więc wyrażenie s mod 3 daje resztę z dzielenia 30 przez 3, czyli 0."

Źródła:

  • Free Pascal Reference Guide (FPC), rozdział o instrukcjach sterujących: "case statement" - https://www.freepascal.org/docs-html/ref/refsu21.html (dostęp 2026-02-28)
  • Free Pascal Reference Guide (FPC), rozdział o wyrażeniach i operatorach: operator "mod" - https://www.freepascal.org/docs-html/ref/refse14.html (dostęp 2026-02-28)
  • GNU Pascal Manual, opis operatorów arytmetycznych (w tym mod) i instrukcji wyboru - https://www.gnu-pascal.de/gpc/ (odpowiednie sekcje dokumentacji, dostęp 2026-02-28)

Materiały:

  • Dokumentacja Free Pascal: opis instrukcji case oraz funkcji/operacji arytmetycznych
  • Podręcznik do podstaw programowania strukturalnego (rozdziały: instrukcje warunkowe i wielokrotnego wyboru)
  • Ćwiczenia: śledzenie wykonania krótkich fragmentów kodu z mod i case na kartce

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego