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 JavaScript

Słowa kluczowe: JavaScript Operatory logiczne w JavaScript Operatory porównania w JavaScript Przedziały liczbowe Typ boolean w JavaScript

W języku JavaScript należy zapisać warunek, który będzie spełniony, gdy zmienna a będzie dowolną liczbą naturalną dodatnią (bez 0) lub gdy zmienna b będzie dowolną liczbą z przedziału domkniętego od 10 do 100. Użyte w tym warunku wyrażenie logiczne będzie miało postać

A. (a > 0) && ((b >= 10) || (b <= 100))
B. (a > 0) || ((b >= 10) || (b <= 100))
C. (a > 0) || ((b >= 10) && (b <= 100))
D. (a > 0) && ((b >= 10) && (b <= 100))

Pytanie z egzaminu CKE, czerwiec 2018 (arkusz E.14-X-18.06).

Wyrażenie (a > 0) || ((b >= 10) && (b <= 100)) dobrze oddaje sens warunku z treści zadania. Mamy tu dwie niezależne sytuacje: albo zmienna a jest większa od 0, albo zmienna b mieści się w przedziale domkniętym od 10 do 100. W JavaScript operator || oznacza logiczne LUB, więc wystarczy spełnienie jednej z tych części. Natomiast sprawdzenie, czy b należy do przedziału, musi być zapisane przez &&, bo liczba ma być jednocześnie większa lub równa 10 oraz mniejsza lub równa 100. To jest bardzo ważny schemat przy walidacji formularzy, np. gdy użytkownik może podać poprawny wiek albo poprawną wartość punktów z zakresu. Z mojego doświadczenia nawiasy są tutaj dobrą praktyką, mimo że JavaScript ma określone priorytety operatorów. Kod jest czytelniejszy i trudniej się pomylić przy późniejszych zmianach. W prawdziwej aplikacji warto jeszcze pamiętać, że samo a > 0 nie sprawdza, czy a jest liczbą całkowitą naturalną. Bardziej ścisły zapis mógłby używać Number.isInteger(a) && a > 0, ale w tym pytaniu chodzi głównie o poprawne połączenie warunków logicznych.
Najczęstszy problem w tym zadaniu wynika z pomylenia dwóch różnych znaczeń operatorów logicznych. Gdy sprawdzamy przynależność do przedziału domkniętego od 10 do 100, nie można użyć operatora || między warunkami b >= 10 oraz b <= 100. Taki zapis mówi w praktyce: b jest co najmniej 10 lub b jest najwyżej 100. Dla zwykłych liczb jest to prawie zawsze prawda, bo liczba mniejsza od 10 spełni warunek b <= 100, a liczba większa od 100 spełni warunek b >= 10. Czyli zamiast ograniczenia zakresu powstaje warunek zbyt szeroki, praktycznie bezużyteczny w walidacji danych. To taki klasyczny błąd przy tłumaczeniu zdania z języka polskiego na kod.

Druga pułapka dotyczy połączenia warunku dla a z warunkiem dla b. W treści występuje słowo lub, więc program ma zaakceptować sytuację, gdy spełniona jest jedna z możliwości. Jeżeli użyje się && między całym warunkiem dla a i całym warunkiem dla b, wtedy wymagamy jednocześnie dodatniego a oraz b z przedziału. To jest znacznie mocniejsze ograniczenie niż opisano. W praktyce taki błąd mógłby spowodować odrzucanie poprawnych danych użytkownika, np. w formularzu, gdzie dopuszczalne są alternatywne sposoby spełnienia kryterium. Dobra zasada jest prosta: zakres liczbowy łączymy przez &&, bo dolna i górna granica muszą obowiązywać razem, a alternatywne przypadki z treści zadania łączymy przez ||. Nawiasy pomagają widzieć tę strukturę i moim zdaniem warto ich używać nawet wtedy, gdy operator precedence w JavaScript dałby taki sam wynik.

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.