KWALIFIKACJA INF2 + INF3 - CZERWIEC 2007

PYTANIE NR 27.
Wywołanie procedury Test (X, Y) polega na


Procedure TEST(var A, B: integer);
var Pom: integer;
begin
 Pom := A;
 A := B;
 B := Pom;
end;



A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Procedura używa parametru przekazywanego przez referencję (var), więc zmienia wartości zmiennych podanych w wywołaniu.
Najpierw zapamiętuje A w Pom, potem przypisuje do A wartość B, a do B wartość z Pom. W efekcie po wywołaniu TEST(X,Y) wartości X i Y są zamienione miejscami.

Pełne wyjaśnienie:

Pokazany kod realizuje klasyczną zamianę (swap) dwóch wartości z użyciem zmiennej pomocniczej. Kluczowe jest to, że parametry procedury są zadeklarowane jako var A, B: integer, czyli są przekazywane przez referencję (procedura może modyfikować zmienne użyte przy wywołaniu).

Kolejne instrukcje działają następująco:

  • Pom := A; – do zmiennej lokalnej Pom kopiowana jest aktualna wartość A.
  • A := B; – do A wpisywana jest wartość B (A przyjmuje "stare B").
  • B := Pom; – do B wraca poprzednia wartość A, przechowana w Pom (B przyjmuje "stare A").

Po zakończeniu procedury wartości A i B są zamienione. Ponieważ były to parametry var, ta zamiana dotyczy też rzeczywistych argumentów wywołania, czyli X i Y.

Dlaczego pozostałe odpowiedzi są niepoprawne?

  • Stwierdzenie o "znalezieniu mniejszej liczby i zapisaniu jej w Pom" jest błędne, bo kod nie wykonuje żadnego porównania (brak instrukcji typu if/relacji < lub >). Pom służy wyłącznie jako bufor.
  • Stwierdzenie o "znalezieniu większej liczby i zapisaniu jej w X" także wymagałoby porównania, którego nie ma. X (czyli A) dostaje wartość Y (B) niezależnie od tego, która liczba jest większa.
  • Stwierdzenie o "podwojeniu wartości" jest błędne, bo nigdzie nie ma operacji mnożenia przez 2 ani dodawania wartości do siebie; są tylko przypisania.

Wskazówka egzaminacyjna: przy takich zadaniach najpierw sprawdź, czy parametry są przekazywane przez referencję (var) czy przez wartość. Następnie prześledź kod "na sucho" na prostym przykładzie (np. A=1, B=2), aby zobaczyć efekt końcowy.

Dodatkowe pytania

Dodatkowe pytania (FAQ):

var oznacza przekazywanie parametru przez referencję.

Procedura dostaje "dostęp" do oryginalnej zmiennej z wywołania, więc przypisania do A i B zmieniają także X i Y. Bez var (przekazanie przez wartość) zmiany dotyczyłyby tylko kopii lokalnych.

To wzorzec: tymczasowo zapisz pierwszą wartość, przepisz drugą na pierwszą, a potem oddaj wartość z bufora do drugiej.

Dzięki temu nie tracisz pierwotnej wartości A, gdy wykonujesz przypisanie A := B.

Zmienna Pom działa jak bufor bezpieczeństwa.

Gdyby wykonać tylko A := B, a potem B := A, to obie zmienne miałyby tę samą wartość (pierwotne A zostałoby utracone). Bufor przechowuje "stare A", aby dało się je później wpisać do B.

Tak, jeśli X i Y są zmiennymi typu całkowitego zgodnymi z parametrami procedury.

Ponieważ parametry A i B są typu var, procedura modyfikuje przekazane zmienne. Po zakończeniu wywołania X ma dawną wartość Y, a Y ma dawną wartość X.

Wykonaj śledzenie krok po kroku, np. A=3, B=8:

  • Pom := A → Pom=3
  • A := B → A=8
  • B := Pom → B=3

Wynik: wartości są zamienione. To najpewniejsza metoda w zadaniach "co zrobi kod".

Nie.

W kodzie nie ma żadnego porównania (brak warunku if ani operatorów < i >). Wszystkie instrukcje to przypisania. Dlatego procedura zawsze wykonuje zamianę, niezależnie od tego, która liczba jest większa.

Najczęstszy błąd to traktowanie var jak zwykłego parametru przez wartość.

Uczniowie analizują kod poprawnie lokalnie, ale zakładają, że X i Y się nie zmienią po powrocie z procedury. Drugi błąd to pomijanie roli bufora i mylenie go z "wynikiem obliczeń".

Przez wartość: procedura dostaje kopię danych, więc zmiany nie wpływają na argument wywołania.

Przez referencję (var): procedura pracuje na oryginalnej zmiennej, więc modyfikacje są widoczne po zakończeniu wywołania. To kluczowe w procedurach zmieniających dane wejściowe.

Najczęściej w algorytmach i operacjach na kolekcjach danych.

Przykład: sortowanie bąbelkowe, sortowanie przez wybór lub dowolny algorytm, w którym trzeba zamieniać miejscami dwa elementy. W aplikacjach webowych to też przydaje się przy obróbce danych po stronie serwera.

Szukaj operacji arytmetycznych.

Podwojenie wymagałoby np. "A := 2*A" albo "A := A + A". Tutaj są wyłącznie przypisania między zmiennymi oraz użycie bufora Pom. Taki układ trzech przypisań jest charakterystyczny właśnie dla zamiany.

info

Statystycznie 64% uczniów zna prawidłową odpowiedź. średnie

Eksperci podkreślają: "W efekcie po wywołaniu TEST(X,Y) wartości X i Y są zamienione miejscami."

Źródła:

  • Free Pascal Reference Guide, "Parameters" (value parameters and var parameters), https://www.freepascal.org/docs-html/ref/refse37.html (dostęp: 27.02.2026)
  • Embarcadero Delphi DocWiki, "var (Delphi)" / opis parametrów var w języku Pascal/Delphi, https://docwiki.embarcadero.com/RADStudio/en/VAR (dostęp: 27.02.2026)
  • Wikipedia, "Swap (computer programming)" – opis idei zamiany wartości z użyciem zmiennej tymczasowej, https://en.wikipedia.org/wiki/Swap_(computer_programming) (dostęp: 27.02.2026)

Materiały:

  • Dokumentacja Free Pascal: rozdział o parametrach (value vs var)
  • Podręcznik do podstaw programowania strukturalnego (procedury, parametry, zmienne lokalne)
  • Ćwiczenia: implementacja zamiany wartości oraz proste sortowania z użyciem procedury swap

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego