Jakie elementy wypisze wywołanie funkcji wypisz(2) napisanej w języku JavaScript?function wypisz(a)
{
for(var i=1;i<6;i++)
{
a++;
if((a%2==0)||(a%3==0))
document.write(a+" ");
}
}
Wynik działania funkcji to 3 4 6, ponieważ pętla for wykona się dla i = 1, 2, 3, 4, 5, czyli dokładnie pięć razy. Na początku funkcja dostaje argument a = 2. Ważny szczegół: w każdej iteracji najpierw wykonywane jest a++, a dopiero potem sprawdzany jest warunek w instrukcji if. Dlatego sprawdzane wartości zmiennej a to kolejno: 3, 4, 5, 6, 7. Warunek (a % 2 == 0) || (a % 3 == 0) oznacza: wypisz liczbę, jeżeli jest podzielna przez 2 lub przez 3. Operator % zwraca resztę z dzielenia, więc np. 4 % 2 daje 0, a 5 % 2 już nie. Liczba 3 jest podzielna przez 3, liczba 4 przez 2, liczba 5 nie spełnia żadnego z warunków, liczba 6 spełnia oba, a 7 znowu żadnego. Dlatego document.write(a + " ") wypisze 3 4 6, z odstępami między liczbami. Moim zdaniem to bardzo dobre ćwiczenie na czytanie kodu krok po kroku, bo łatwo tu przegapić kolejność instrukcji. W praktyce podobne warunki stosuje się np. przy filtrowaniu danych, wybieraniu elementów spełniających kryteria albo generowaniu raportów. W nowoczesnym JavaScripcie częściej używa się let zamiast var oraz operatora === zamiast ==, bo daje to czytelniejsze i bezpieczniejsze porównania. Zamiast document.write w realnych projektach lepiej użyć console.log do testów albo modyfikować DOM przez textContent, append czy inne metody, bo document.write może nadpisać dokument i jest raczej starym sposobem.
W tym zadaniu najczęstszy błąd wynika z nieuwzględnienia kolejności wykonywania instrukcji. Funkcja startuje z wartością a = 2, ale ta wartość nie jest od razu wypisywana. Najpierw pętla wchodzi do bloku, potem wykonuje a++, czyli zwiększa zmienną o 1, i dopiero po tym sprawdza warunek. Dlatego pojawienie się liczby 2 w wyniku oznaczałoby, że ktoś potraktował wartość początkową jako element wyjścia, choć w kodzie nie ma żadnego document.write przed inkrementacją. To drobny szczegół, ale w programowaniu takie rzeczy robią sporą różnicę.
Niepoprawne jest też myślenie, że funkcja wypisze tylko 6. Instrukcja if znajduje się wewnątrz pętli, więc warunek jest sprawdzany przy każdej iteracji, a nie dopiero na końcu. document.write może zostać wykonane kilka razy, za każdym razem dla aktualnej wartości a. Warto więc rozpisać sobie tabelkę: po zwiększeniu a mamy kolejno 3, 4, 5, 6, 7. Z tych liczb przechodzą tylko te, które są podzielne przez 2 lub przez 3.
Z kolei wynik zawierający 8 sugeruje błędne odczytanie zakresu pętli. Warunek i < 6 oznacza, że pętla kończy się przed osiągnięciem i równego 6. Nie ma więc szóstej iteracji, w której a mogłoby wzrosnąć do 8. To klasyczna pułapka przy pętlach for: trzeba patrzeć jednocześnie na wartość startową, warunek kontynuacji i moment zwiększania licznika. Z mojego doświadczenia najlepiej takie fragmenty analizować ręcznie, linijka po linijce, bo wtedy od razu widać, które wartości naprawdę trafiają do warunku. W praktycznym JavaScripcie ta umiejętność przydaje się przy debugowaniu pętli, filtrowaniu tablic i obsłudze danych w interfejsie strony.
Niepoprawne jest też myślenie, że funkcja wypisze tylko 6. Instrukcja if znajduje się wewnątrz pętli, więc warunek jest sprawdzany przy każdej iteracji, a nie dopiero na końcu. document.write może zostać wykonane kilka razy, za każdym razem dla aktualnej wartości a. Warto więc rozpisać sobie tabelkę: po zwiększeniu a mamy kolejno 3, 4, 5, 6, 7. Z tych liczb przechodzą tylko te, które są podzielne przez 2 lub przez 3.
Z kolei wynik zawierający 8 sugeruje błędne odczytanie zakresu pętli. Warunek i < 6 oznacza, że pętla kończy się przed osiągnięciem i równego 6. Nie ma więc szóstej iteracji, w której a mogłoby wzrosnąć do 8. To klasyczna pułapka przy pętlach for: trzeba patrzeć jednocześnie na wartość startową, warunek kontynuacji i moment zwiększania licznika. Z mojego doświadczenia najlepiej takie fragmenty analizować ręcznie, linijka po linijce, bo wtedy od razu widać, które wartości naprawdę trafiają do warunku. W praktycznym JavaScripcie ta umiejętność przydaje się przy debugowaniu pętli, filtrowaniu tablic i obsłudze danych w interfejsie strony.