KWALIFIKACJA INF3 - WRZESIEŃ 2014

PYTANIE NR 32.
Jaką wartość zwróci funkcja zao zdefiniowana w języku C++, wywołana z aktualnym parametrem 3.55
Ilustracja przedstawia fragment kodu źródłowego napisanego w języku programowania C++.
A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Funkcja zwraca typ int, więc wynik wyrażenia (x + 0.5) zostanie niejawnie skonwertowany do liczby całkowitej przez odrzucenie części ułamkowej.
Po podstawieniu x=3.55 otrzymujemy 3.55+0.5=4.05, a po konwersji float→int: 4.05→4.

Pełne wyjaśnienie:

W pokazanej definicji int zao(float x) typem zwracanym jest int. To oznacza, że niezależnie od tego, czy w środku funkcji powstaje wartość zmiennoprzecinkowa, w instrukcji return nastąpi dopasowanie typu do int (niejawna konwersja).

Krok 1: obliczenie wyrażenia w nawiasie. Dla argumentu 3.55 mamy:
3.55 + 0.5 = 4.05. Ten wynik jest typu zmiennoprzecinkowego (co najmniej float).

Krok 2: konwersja na typ całkowity. W C++ konwersja z typu zmiennoprzecinkowego na int odbywa się przez obcięcie części ułamkowej (truncation), a nie przez zaokrąglanie. Dlatego 4.05 po konwersji daje 4.

Dlaczego pozostałe odpowiedzi są błędne?

  • 3 – taki wynik mógłby się pojawić, gdyby odjęto 0.5 albo gdyby błędnie podstawiono argument; nie wynika z podanego kodu.
  • 3.5 – sugeruje pomylenie działania lub oczekiwanie wyniku zmiennoprzecinkowego, ale funkcja nie zwraca float/double, tylko int.
  • 4.05 – to poprawny wynik samego dodawania, jednak nie jest wynikiem funkcji, bo wartość jest jeszcze konwertowana do int.

Wskazówka praktyczna: jeśli celem jest zaokrąglanie, a nie obcinanie, używa się funkcji z <cmath>, np. std::round, std::floor lub std::ceil, zamiast polegać na samym rzutowaniu.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
Oznacza to, że wynik return musi zostać zwrócony jako liczba całkowita. Jeśli w wyrażeniu powstanie wartość zmiennoprzecinkowa (np. 4.05), C++ wykona konwersję do int, co zwykle wiąże się z utratą części ułamkowej.
Przy konwersji typu zmiennoprzecinkowego na całkowity C++ odrzuca część ułamkową (truncation), zamiast zaokrąglać. Przykładowo 4.99 przejdzie na 4, a 4.05 także na 4. To częsty "haczyk" w zadaniach egzaminacyjnych.
4.05 to wynik dodawania, ale funkcja ma typ zwracany int. Zanim wartość zostanie zwrócona, jest konwertowana z float na int, czyli następuje obcięcie części ułamkowej. Dlatego finalnie funkcja zwraca 4, a nie 4.05.
Najpierw oblicz wyrażenie: 3.55 + 0.5 = 4.05. Następnie pamiętaj o typie zwracanym int: 4.05 jest konwertowane na int przez odrzucenie części ułamkowej, więc otrzymujesz 4.
Nie. To nie jest "zaokrąglenie w dół", tylko obcięcie w kierunku zera. Dla liczb dodatnich wygląda to podobnie do podłogi, ale dla ujemnych już nie: np. -3.7 po konwersji na int daje -3, a nie -4.
Najczęściej myli się obcinanie z zaokrąglaniem oraz ignoruje typ zwracany funkcji. Uczeń widzi 4.05 i wybiera tę wartość, zapominając, że return zwraca int. Drugi błąd to przenoszenie nawyków z innych języków lub bibliotek.
Do zaokrąglania używa się funkcji z <cmath>, np. std::round (do najbliższej), std::floor (w dół), std::ceil (w górę). Samo rzutowanie na int nie zaokrągla, tylko obcina część ułamkową.
Dodanie 0.5 bywa używane jako prosty sposób na "prawie-zaokrąglenie" liczb dodatnich, gdy potem następuje obcięcie do int. Działa intuicyjnie dla wielu wartości dodatnich, ale nie jest równoważne pełnemu zaokrąglaniu w każdym przypadku i nie działa tak samo dla liczb ujemnych.
Wskazówką jest różnica typów: gdy wyrażenie w return ma typ float/double, a funkcja zwraca int, kompilator musi dopasować typ. Wtedy zachodzi niejawna konwersja. Na egzaminie warto sprawdzać przede wszystkim: typ zwracany funkcji i typy w wyrażeniu.
Może wpływać na zapis wartości po przecinku (np. 3.55 nie zawsze jest reprezentowane idealnie), ale w tym typie zadania zwykle kluczowa jest zasada: po obliczeniu i tak następuje konwersja na int przez odrzucenie części ułamkowej. Dlatego oczekuje się wyniku 4.
info

To pytanie poprawnie rozwiązuje 64% zdających egzamin. średnie

Źródła:

  • cppreference.com: Floating–integral conversions (C++) – https://en.cppreference.com/w/cpp/language/implicit_conversion (dostęp 2026-03-01)
  • cppreference.com: static_cast – konwersje typów w C++ – https://en.cppreference.com/w/cpp/language/static_cast (dostęp 2026-03-01)
  • cppreference.com: std::round (nagłówek <cmath>) – https://en.cppreference.com/w/cpp/numeric/math/round (dostęp 2026-03-01)

Materiały:

  • Dokumentacja cppreference: rozdział o konwersjach liczbowych w C++
  • Podręcznik/notesy do C++: typy proste i rzutowania
  • Ćwiczenia: porównanie (int)x, std::floor, std::ceil, std::round dla liczb dodatnich i ujemnych

Aktualizacja pytania: 03.04.2026



Aktualizacja pytania: 03.04.2026
📡 Brak połączenia internetowego