KWALIFIKACJA INF2 + INF3 - CZERWIEC 2006

PYTANIE NR 10.
Instrukcję case t of ... w przedstawionym fragmencie programu można zastąpić


var t:integer; 
 
begin 
write('Podaj rok '); 
readln(x); 
t:=x div 1000; 
case t of 
1:write('M'); 
2:write('MM'); 
3:write('MMM'); 
end;



A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Instrukcja case realizuje wybór jednej z kilku gałęzi na podstawie wartości zmiennej, więc można ją zapisać jako serię instrukcji warunkowych if (np. osobne sprawdzenia t=1, t=2, t=3). Pętle for/while/repeat służą do powtarzania, a nie do jednorazowego wyboru ścieżki.

Pełne wyjaśnienie:

Instrukcja case (odpowiednik switch w innych językach) jest strukturą sterującą do wielokrotnego wyboru: program porównuje wartość wyrażenia (tu: zmiennej t) z kolejnymi etykietami przypadków i wykonuje kod tylko dla dopasowanego przypadku. W pokazanym fragmencie, dla t równego 1, 2 lub 3 wypisywany jest odpowiednio napis "M", "MM" albo "MMM".

Taki mechanizm jest semantycznie równoważny zapisowi przy użyciu instrukcji warunkowych, bo w praktyce można napisać:

  • oddzielne warunki: if t=1 then ...; if t=2 then ...; if t=3 then ...;
  • albo łańcuch if ... else if ... else if, gdy przypadki wzajemnie się wykluczają.

Dlatego poprawna jest odpowiedź mówiąca o zastąpieniu trzema instrukcjami warunkowymi: każdy przypadek case można zamienić na osobny warunek sprawdzający tę samą zmienną.

Pozostałe propozycje są niepoprawne, bo pętle (for ... do, while ... do, repeat ... until) służą do wielokrotnego wykonywania fragmentu kodu aż do spełnienia warunku zakończenia lub przejścia po zakresie. W tym zadaniu nie ma potrzeby powtarzania instrukcji: wybór napisu następuje jednokrotnie na podstawie wartości t. Użycie pętli byłoby sztuczne i zmieniałoby naturalny sens konstrukcji (selekcja vs iteracja).

Wskazówka egzaminacyjna: gdy pytanie dotyczy zamiany case, szukaj odpowiedzi związanej z if-then-else. Gdy dotyczy for/while/repeat, zwykle chodzi o powtarzanie oraz warunek zakończenia, a nie o wybór jednej z wielu gałęzi.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Instrukcja case służy do wyboru jednej z wielu gałęzi wykonania na podstawie wartości wyrażenia (np. zmiennej). Program porównuje wartość z etykietami przypadków i wykonuje kod tylko dla dopasowanego przypadku. To konstrukcja selekcji, a nie powtarzania.
Case i seria if mogą opisywać tę samą logikę: sprawdzanie, czy zmienna ma wartość 1, 2, 3 itd., i wykonanie odpowiedniej akcji. Jeśli w if porównujesz tę samą zmienną do konkretnych wartości, otrzymujesz funkcjonalnie równoważny wybór jak w case.
Praktycznie zapisujesz trzy niezależne warunki, np. sprawdzasz kolejno t=1, t=2, t=3 i w każdym przypadku wykonujesz inną operację (np. wypisanie tekstu). To najprostszy odpowiednik case dla małej liczby przypadków.
Zwykle nie. For służy do iteracji po zakresie i wielokrotnego wykonania tego samego fragmentu kodu. Case wybiera jedną z kilku różnych akcji i wykonuje ją raz. Da się sztucznie symulować wybór w pętli, ale to nie jest naturalny ani czytelny zamiennik.
While i repeat-until są konstrukcjami powtarzania: wykonują blok wielokrotnie do spełnienia warunku. Case nie powtarza działania, tylko wybiera gałąź na podstawie wartości. Zamiana case na pętlę zmienia charakter algorytmu i może wprowadzić błędy (np. niekończącą się iterację).
Case jest wygodny, gdy wybór zależy od jednej zmiennej i wielu stałych wartości (czytelność, porządek). If-then-else jest lepsze, gdy warunki są złożone (nierówności, zakresy, kilka zmiennych) lub gdy potrzebujesz nietypowej logiki, której nie da się prosto ująć jako listy wartości.
Najczęstszy błąd to mylenie selekcji z iteracją: uczeń widzi "sterowanie przepływem" i automatycznie wybiera pętlę. Pomaga zapamiętać: case/if wybiera jedną ścieżkę i kończy, a for/while/repeat powtarzają wykonanie do osiągnięcia warunku stop.
"Semantycznie równoważne" znaczy, że mimo innego zapisu dają ten sam efekt działania programu dla tych samych danych wejściowych. W tym kontekście: dobrze napisany zestaw instrukcji if może realizować dokładnie ten sam wybór gałęzi co instrukcja case.
Zasadniczo tak, jeśli zachowasz te same warunki dopasowania i tę samą kolejność/wykluczanie przypadków. Trzeba uważać na sytuacje z gałęzią domyślną (np. else/default) oraz na to, by warunki były rozłączne, gdy w case tylko jeden przypadek ma się wykonać.
Wystarczy zauważyć, że case porównuje jedną zmienną z kilkoma wartościami i wybiera jedną akcję. Naturalnym odpowiednikiem jest seria porównań tej samej zmiennej w if. Jeśli w odpowiedziach są tylko pętle, pamiętaj: pętle służą do powtarzania, a nie wyboru.
info

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

Według specjalistów z branży: "Instrukcja case realizuje wybór jednej z kilku gałęzi na podstawie wartości zmiennej, więc można ją zapisać jako serię instrukcji warunkowych if (np. osobne sprawdzenia t=1, t=2, t=3)."

Źródła:

  • Free Pascal Reference Guide – "Statements" / instrukcja CASE (dokumentacja projektu Free Pascal), https://www.freepascal.org/docs-html/ref/refsu19.html (dostęp: 2026-03-01)
  • Free Pascal Reference Guide – "Statements" / instrukcja IF (dokumentacja projektu Free Pascal), https://www.freepascal.org/docs-html/ref/refsu16.html (dostęp: 2026-03-01)
  • Wikipedia – "Switch statement" (opis równoważności z if-then-else oraz idei wielokrotnego wyboru), https://en.wikipedia.org/wiki/Switch_statement (dostęp: 2026-03-01)

Materiały:

  • Dokumentacja Free Pascal: opis instrukcji case oraz if
  • Materiały dydaktyczne o strukturach sterujących (selekcja i iteracja) dla szkół technicznych
  • Ćwiczenia z refaktoryzacji: przepisywanie case na if-then-else i odwrotnie

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego