Wskaż funkcję JavaScript, za pomocą której można obliczyć połowę kwadratu liczby przekazanej jako argument.
A.
function wynik(a) { return a/2+a/2; }
B.
function wynik(a) { return a*a/2; }
C.
function wynik(a) { return 2*a/a; }
D.
function wynik(a) { return a*2/2; }
Pytanie z egzaminu CKE, styczeń 2021 (arkusz EE.09-SG-21.01).
Funkcja function wynik(a) { return a*a/2; } oblicza dokładnie to, o co pyta zadanie, czyli połowę kwadratu liczby przekazanej jako argument. Najpierw wykonywane jest mnożenie a*a, czyli podniesienie wartości do kwadratu, a potem wynik dzielony jest przez 2. Matematycznie odpowiada to zapisowi $f(a)=a^2/2$. Dla przykładu, gdy a = 6, funkcja policzy 6*6/2, czyli 36/2 = 18. W JavaScript operatory * i / mają ten sam priorytet i są wykonywane od lewej do prawej, więc zapis jest poprawny, choć w praktyce często dałbym nawiasy: return (a*a)/2;, bo kod jest wtedy czytelniejszy dla człowieka. Moim zdaniem to dobra praktyka, szczególnie w testach i projektach zespołowych. W nowoczesnym JavaScript można też spotkać zapis a**2/2 albo Math.pow(a, 2)/2, ale klasyczne a*a jest proste, szybkie i zrozumiałe. W realnych aplikacjach taka funkcja mogłaby być użyta np. w obliczeniach geometrycznych, fizycznych albo przy przetwarzaniu danych liczbowych, pod warunkiem że wcześniej upewnimy się, że argument jest liczbą.
W tym zadaniu łatwo pomylić kilka podobnie wyglądających działań, bo wszystkie odpowiedzi używają argumentu a i operatorów arytmetycznych JavaScript. Trzeba jednak pamiętać, że połowa kwadratu liczby to nie to samo, co połowa liczby dodana do połowy liczby. Wyrażenie a/2+a/2 upraszcza się do a, więc dla wartości 10 wynik byłby 10, a nie 50. To typowy błąd wynikający z patrzenia na samo dzielenie przez 2, bez sprawdzenia, czy wcześniej faktycznie powstał kwadrat liczby. Podobnie zapis a*2/2 też ostatecznie daje a, bo mnożenie przez 2 i dzielenie przez 2 wzajemnie się znoszą. Taki kod nie podnosi argumentu do kwadratu, tylko robi niepotrzebne działania, które nie zmieniają wartości. Wyrażenie 2*a/a jest jeszcze bardziej mylące, bo dla a różnego od zera zwraca po prostu 2, a dla a = 0 prowadzi w JavaScript do NaN, czyli wyniku nieliczbowego. Tu dochodzi jeszcze ryzyko dzielenia przez argument, którego wartości nie kontrolujemy. Z mojego doświadczenia najlepiej najpierw zapisać wzór matematyczny: $a^2/2$, a dopiero potem przepisać go na składnię języka. W JavaScript kwadrat można uzyskać przez a*a, a**2 albo Math.pow(a, 2). Najważniejsze jest, żeby nie zgubić operacji podnoszenia do kwadratu, bo samo dzielenie przez 2 nie wystarcza.