Przejdź do głównej treści

Kwalifikacja: INF.03 - Tworzenie i administrowanie stronami i aplikacjami internetowymi oraz bazami danych

Zawód: Technik informatyk, Technik programista

Kategorie: Programowanie webowe Algorytmy i podstawy informatyki

Słowa kluczowe: Funkcje w C++ Konwersja float na int w C++

Jaką wartość zwróci funkcja zao zdefiniowana w języku C++, wywołana z aktualnym parametrem 3.55?

int zao(float x){
   return (x + 0.5);
}
A. 4
Dobrze. 3.55 + 0.5 = 4.05, a typ zwracany int obcina część ułamkową do 4.
B. 3.5
Źle. Funkcja typu int nie zwraca części ułamkowej, a 3.5 nie wynika z działania.
C. 3
Źle. 3 wyszłoby po obcięciu argumentu przed dodaniem 0.5, a dodawanie odbywa się na liczbie 3.55.
D. 4.05
Źle. 4.05 to wartość wyrażenia, ale typ int odcina część ułamkową.

Pytanie z egzaminu CKE, wrzesień 2014 (arkusz E.14-X-14.08).

Poprawny wynik to 4. Funkcja oblicza x + 0.5, czyli 3.55 + 0.5 = 4.05, ale typ zwracany zadeklarowano jako int. Przy zwracaniu wartości zmiennoprzecinkowej z funkcji typu int kompilator wykonuje niejawną konwersję, która obcina część ułamkową (zaokrągla w stronę zera). Z 4.05 zostaje więc 4.

Dodanie 0.5 przed obcięciem to znany sposób na zaokrąglenie liczby dodatniej do najbliższej całkowitej: 3.4 + 0.5 = 3.9, co daje 3, a 3.6 + 0.5 = 4.1, co daje 4. Do zapamiętania: konwersja float na int nie zaokrągla, tylko odcina ułamek. Do zaokrąglania w C++ służy funkcja round() z biblioteki cmath.

Najczęstszy błąd w tym pytaniu to policzenie samego działania i pominięcie typu funkcji. Wynik 4.05 jest poprawną wartością wyrażenia x + 0.5, ale funkcja zadeklarowana jako int nie może zwrócić liczby z częścią ułamkową - zostanie ona odcięta. Wynik 3.5 też ma część ułamkową, więc z tego samego powodu nie może być wynikiem, a do tego nie pasuje do żadnego rachunku w kodzie.

Wynik 3 otrzymałoby się, gdyby obcięto argument jeszcze przed dodaniem 0.5 albo gdyby funkcja w ogóle nie dodawała połówki. Tak się jednak nie dzieje: parametr x jest typu float, więc przechowuje 3.55, dodawanie odbywa się na liczbach zmiennoprzecinkowych, a konwersja do int następuje dopiero przy instrukcji return. Analizując taki kod, warto zawsze ustalić kolejno: typ parametru, wartość wyrażenia i typ zwracany.

Wymagane logowanie

Ocenianie trudności pytań jest dostępne tylko dla zalogowanych użytkowników. Zaloguj się, aby skorzystać z pełni możliwości platformy.

Twoja ocena pomoże innym uczniom w przygotowaniu do egzaminu, a Tobie pozwoli na dostęp do spersonalizowanych statystyk.

Zgłoś błąd w pytaniu

Rozwiń sekcję i zmień pole, którego dotyczy błąd. Wysłane zostaną tylko zmienione sekcje.

Błędna kwalifikacja
Błąd w treści pytania
Błąd w treści odpowiedzi
Błąd w obrazie
Dane kontaktowe (opcjonalnie)
Podaj email, jeśli chcesz otrzymać informację o rozpatrzeniu zgłoszenia.