Program zapisany w języku PHP ma za zadanie obliczyć średnią pozytywnych ocen ucznia od 2 do 6. Warunek wybierania ocen w pętli liczącej średnią powinien zawierać wyrażenie logiczne
A. $ocena >= 2 and $ocena <= 6
B. $ocena >= 2 or $ocena <= 6
C. $ocena > 2 or $ocena < 6
D. $ocena > 2 and $ocena < 6
Pytanie z egzaminu CKE, czerwiec 2021 (arkusz EE.09-SG-21.06).
Wyrażenie ocena >= 2 and ocena <= 6 jest właściwe, bo sprawdza jednocześnie dwa ograniczenia zakresu: dolną granicę i górną granicę. W skali szkolnej oceny pozytywne od 2 do 6 obejmują także same wartości 2 i 6, więc trzeba użyć operatorów >= oraz <=. Gdyby w pętli liczącej średnią pojawiła się ocena równa 2, powinna zostać doliczona. Tak samo ocena 6, bo to przecież poprawna ocena końcowa albo cząstkowa, zależnie od sytuacji. Operator and oznacza koniunkcję, czyli oba warunki muszą być spełnione naraz. W praktyce taki warunek zabezpiecza algorytm przed doliczeniem wartości spoza zakresu, np. 1, 0, 7 albo danych błędnie wprowadzonych. Z mojego doświadczenia to jest bardzo częsty fragment walidacji danych w formularzach PHP. W profesjonalnym kodzie często dopisałoby się jeszcze sprawdzenie typu, np. czy wartość jest liczbą, bo formularze HTML przesyłają dane jako tekst. W wielu projektach zamiast and spotkasz też operator &&, bo ma bardziej typowe użycie w instrukcjach warunkowych i jest czytelny dla programistów znających C, JavaScript czy Java. Sama logika pozostaje jednak taka sama: wartość ma należeć do zamkniętego przedziału od 2 do 6.
Najczęstszy błąd w tym pytaniu polega na pomyleniu warunku zakresu z luźnym sprawdzaniem jednej z dwóch nierówności. Jeżeli użyje się operatora or, program zaakceptuje prawie każdą liczbę, bo wystarczy spełnienie tylko jednej części warunku. Dla przykładu ocena 1 nie spełnia warunku ocena >= 2, ale spełnia ocena <= 6, więc przy użyciu or zostałaby błędnie doliczona do średniej. Podobnie ocena 7 spełnia ocena >= 2, mimo że przekracza maksymalną ocenę szkolną. To jest klasyczna pułapka przy walidacji zakresów: gdy wartość ma być między dwiema granicami, potrzebna jest koniunkcja, czyli and, a nie alternatywa. Druga sprawa to granice przedziału. Zapisy z samym > oraz < odrzucają wartości równe granicom. W tym zadaniu oceny pozytywne są od 2 do 6, czyli 2 i 6 także mają być brane pod uwagę. Warunek ocena > 2 and ocena < 6 przepuściłby tylko 3, 4 i 5, więc średnia byłaby zafałszowana. Moim zdaniem warto tu zapamiętać prostą zasadę z praktyki programowania: przedział zamknięty zapisujemy jako wartość >= minimum and wartość <= maksimum. Przedział otwarty, z samymi znakami > i <, stosuje się tylko wtedy, gdy granice faktycznie nie należą do dozwolonego zbioru. W aplikacjach webowych, szczególnie w PHP przy obsłudze formularzy, takie drobiazgi mają znaczenie, bo jeden zły operator logiczny potrafi przepuścić niepoprawne dane i potem wynik obliczeń wygląda wiarygodnie, ale jest po prostu niepoprawny.