W języku JavaScript zapisano funkcję.
function fun1(f) { if (f < 0) f = f * (-1); return f }Ma ona za zadanie
A. zwrócić wartość bezwzględną z f
B. wypisać wartość odwrotną do f
C. wypisać wartość bezwzględną z f
D. zwrócić wartość odwrotną do f
Pytanie z egzaminu CKE, styczeń 2017 (arkusz E.14-X-17.01).
Ta funkcja rzeczywiście zwraca wartość bezwzględną argumentu f. Działa to tak: jeżeli f jest mniejsze od 0, czyli jest liczbą ujemną, zostaje pomnożone przez -1. W efekcie np. -7 zmienia się na 7, a -3.5 na 3.5. Jeżeli f jest równe 0 albo dodatnie, warunek f < 0 nie zostaje spełniony i wartość pozostaje bez zmian. Na końcu instrukcja return f oddaje wynik działania funkcji do miejsca, z którego została wywołana. To ważne: funkcja nie wypisuje nic na ekranie, tylko zwraca wartość, którą można potem zapisać do zmiennej, użyć w obliczeniach albo przekazać dalej. W praktyce taka logika przydaje się np. przy obliczaniu odległości, różnicy między wartościami, walidacji danych liczbowych czy prostych algorytmach matematycznych. W JavaScript do tego samego celu zwykle używa się wbudowanej funkcji Math.abs(f), bo jest czytelniejsza i zgodna z dobrą praktyką: nie piszemy ręcznie czegoś, co język już dobrze obsługuje. Moim zdaniem warto jednak rozumieć taki zapis, bo pokazuje klasyczny schemat: warunek, modyfikacja zmiennej i zwrócenie wyniku.
W tym kodzie łatwo pomylić kilka pojęć, zwłaszcza jeśli patrzy się tylko na fragment f * (-1). Pomnożenie liczby ujemnej przez -1 nie daje wartości odwrotnej w sensie matematycznym. Wartość odwrotna to raczej 1/f, na przykład odwrotnością 4 jest 0.25. Tutaj natomiast chodzi o zmianę znaku liczby ujemnej na dodatni, czyli dokładnie o uzyskanie wartości bezwzględnej. Dla f = -8 funkcja zwróci 8, ale dla f = 8 zwróci nadal 8. To pasuje do definicji wartości bezwzględnej, która mówi, że wynik nie jest ujemny.
Drugie częste nieporozumienie dotyczy słowa „wypisać”. W JavaScript samo return nie pokazuje nic użytkownikowi. Nie pojawi się tekst w konsoli, na stronie ani w oknie alertu. Do wypisywania używa się na przykład console.log(...), document.write(...) albo modyfikacji DOM, np. ustawienia textContent jakiegoś elementu. Return działa inaczej: kończy wykonanie funkcji i przekazuje wynik do kodu wywołującego. Z mojego doświadczenia to jest jedna z tych rzeczy, które na początku programowania mocno się mieszają, bo „funkcja coś robi”, ale nie zawsze oznacza to wyświetlanie wyniku.
Niepoprawne wnioski biorą się też z utożsamiania wartości przeciwnej, odwrotnej i bezwzględnej. Wartość przeciwna do -5 to 5, odwrotna to -0.2, a bezwzględna to 5. W analizowanej funkcji zmiana następuje tylko wtedy, gdy liczba jest ujemna, więc dla liczb dodatnich nie ma żadnego odwracania ani zmiany znaku. Dlatego najbardziej precyzyjny opis działania tej funkcji to zwrócenie wartości bezwzględnej z f, a nie jej wypisanie ani obliczenie odwrotności.
Drugie częste nieporozumienie dotyczy słowa „wypisać”. W JavaScript samo return nie pokazuje nic użytkownikowi. Nie pojawi się tekst w konsoli, na stronie ani w oknie alertu. Do wypisywania używa się na przykład console.log(...), document.write(...) albo modyfikacji DOM, np. ustawienia textContent jakiegoś elementu. Return działa inaczej: kończy wykonanie funkcji i przekazuje wynik do kodu wywołującego. Z mojego doświadczenia to jest jedna z tych rzeczy, które na początku programowania mocno się mieszają, bo „funkcja coś robi”, ale nie zawsze oznacza to wyświetlanie wyniku.
Niepoprawne wnioski biorą się też z utożsamiania wartości przeciwnej, odwrotnej i bezwzględnej. Wartość przeciwna do -5 to 5, odwrotna to -0.2, a bezwzględna to 5. W analizowanej funkcji zmiana następuje tylko wtedy, gdy liczba jest ujemna, więc dla liczb dodatnich nie ma żadnego odwracania ani zmiany znaku. Dlatego najbardziej precyzyjny opis działania tej funkcji to zwrócenie wartości bezwzględnej z f, a nie jej wypisanie ani obliczenie odwrotności.