Temat 06 · 2 × 45 minINF.03
Pętle
Komputer nie nudzi się powtarzaniem – pętla (loop) każe mu wykonać ten sam fragment kodu wiele razy: policzyć sumę dziesięciu cen, sprawdzić każdy checkbox, wygenerować dziesięć obrazków, zamieniać liczbę na binarną cyfra po cyfrze. W tej lekcji poznasz cztery rodzaje pętli, nauczysz się śledzić je krok po kroku (to umiejętność, którą sprawdza część pisemna) i zamieniać opis algorytmu z arkusza na działający kod.
Po co pętla?
Bez pętli powtarzanie oznacza kopiowanie linii:
console.log("Odliczanie: 3");
console.log("Odliczanie: 2");
console.log("Odliczanie: 1");
console.log("Start!");Trzy linie to jeszcze nic, ale przy stu liniach – albo gdy liczba powtórzeń zależy od danych – kopiowanie przestaje działać. Pętla zapisuje to samo raz:
for (let i = 3; i >= 1; i--) {
console.log("Odliczanie: " + i);
}
console.log("Start!");Pętla for
for to pętla z licznikiem. W nawiasie podajesz trzy rzeczy rozdzielone średnikami:
for (inicjalizacja; warunek; krok) {
// ciało pętli – wykonuje się, dopóki warunek jest prawdziwy
}- Inicjalizacja (
let i = 0) – wykonuje się raz, na początku. - Warunek (
i < 3) – sprawdzany przed każdym obiegiem;falsekończy pętlę. - Ciało – wykonuje się, gdy warunek dał
true. - Krok (
i++) – wykonuje się po ciele, przed kolejnym sprawdzeniem warunku.
Co wypisze ten kod?
for (let i = 0; i < 3; i++) {
console.log(i);
}for (let i = 0; i < 3; i++) {
console.log("obieg, i =", i);
}
console.log("koniec pętli");Śledzenie pętli w tabeli
Zanim uruchomisz pętlę, rozpisz ją w tabeli. Dla for (let i = 0; i < 100; i += 10) z document.write(i + ' '):
| krok | i | i < 100? | co się wykonuje |
|---|---|---|---|
| start | 0 | true | wypisuje 0 , potem i += 10 |
| 2 | 10 | true | wypisuje 10 , i += 10 |
| 3 | 20 | true | wypisuje 20 , i += 10 |
| … | … | … | … |
| 10 | 90 | true | wypisuje 90 , i += 10 |
| 11 | 100 | false | koniec – nic nie wypisuje |
Wynik: 0 10 20 30 40 50 60 70 80 90 – 10 obiegów, a i + ' ' to konkatenacja liczby z napisem, więc wyjście jest tekstem ze spacjami.
let wynik = "";
for (let i = 0; i < 100; i += 10) {
wynik += i + " "; // liczba + napis → napis
}
console.log(wynik);Ile razy wykona się ciało pętli for (var i = 1; i <= 10; i += 3)?
Trzy typowe warianty
// od 1 do n włącznie – zauważ <=
const n = 5;
for (let i = 1; i <= n; i++) {
console.log(i);
}
// w dół
for (let i = 3; i > 0; i--) {
console.log("w dół:", i);
}
// co 2 – liczby parzyste od 2 do 10
for (let i = 2; i <= 10; i += 2) {
console.log("parzysta:", i);
}Pętla while
while ma tylko warunek. Sprawdza go przed każdym obiegiem i wykonuje ciało, dopóki jest prawdziwy. Używaj jej, gdy nie wiesz z góry, ile będzie obiegów – np. „dziel, dopóki wynik jest większy od zera”.
let liczba = 37;
let polowienia = 0;
while (liczba > 1) {
liczba = Math.floor(liczba / 2);
polowienia++;
}
console.log("Po", polowienia, "połowieniach zostało", liczba); // 5 połowieńInicjalizację i krok musisz napisać sam – przed pętlą i w jej ciele. Zapomnisz o kroku – pętla nigdy się nie skończy.
for ⇄ while – równoważność
Każdy for da się zapisać jako while, przenosząc inicjalizację przed pętlę, a krok na koniec ciała. To typowe pytanie z arkuszy EE.09.
// wersja for
let a = "";
for (let i = 0; i < 100; i += 10) {
a += i + " ";
}
// równoważna wersja while
let b = "";
let i = 0; // 1. inicjalizacja PRZED pętlą
while (i < 100) { // 2. ten sam warunek
b += i + " "; // 3. to samo ciało
i += 10; // 4. krok NA KOŃCU ciała
}
console.log(a);
console.log(b);
console.log(a === b); // trueKtóry kod jest równoważny pętli for (i = 0; i < 100; i += 10) document.write(i + ' ');?
Pętla do … while
Odwrotność while: ciało wykonuje się najpierw, warunek jest sprawdzany po nim. Pętla wykona się więc co najmniej raz – przydatne, gdy pytasz użytkownika o dane, dopóki nie poda poprawnych.
let proba = 0;
do {
proba++;
console.log("Próba numer", proba);
} while (proba < 3);
console.log("Łącznie prób:", proba); // 3
// nawet gdy warunek od razu jest fałszywy, ciało wykona się raz
let x = 100;
do {
console.log("x =", x, "– to się wypisze, mimo że 100 < 10 jest false");
} while (x < 10);break i continue
break natychmiast kończy pętlę. continue przerywa tylko bieżący obieg i przechodzi do kroku i warunku.
// break – szukamy pierwszej liczby podzielnej przez 7 większej od 50
for (let i = 51; i < 100; i++) {
if (i % 7 === 0) {
console.log("Pierwsza podzielna przez 7:", i);
break; // dalej nie ma sensu szukać
}
}
// continue – pomijamy liczby nieparzyste
let parzyste = "";
for (let i = 1; i <= 10; i++) {
if (i % 2 !== 0) {
continue; // wracamy do i++ i warunku
}
parzyste += i + " ";
}
console.log(parzyste);W switch wewnątrz pętli break kończy tylko switch, nie pętlę – to częsty błąd.
Pętla po tablicy i po napisie
Tablice poznasz dokładnie w lekcji Tablice. Na teraz wystarczy: tablica to lista wartości w nawiasach kwadratowych, tab.length to liczba elementów, a tab[i] to element o indeksie i – indeksy liczymy od 0, więc ostatni ma indeks length - 1.
Klasyczny for z indeksem
const liczby = [3, 8, 5, 12, 7, 6];
let sumaParzystych = 0;
for (let i = 0; i < liczby.length; i++) {
if (liczby[i] % 2 === 0) { // reszta z dzielenia 0 → liczba parzysta
sumaParzystych += liczby[i];
}
}
console.log("Suma parzystych:", sumaParzystych); // 8 + 12 + 6 = 26To schemat z pytań typu „co liczy pętla?” z arkuszy EE.09. Czytasz go tak: zmienna startuje od zera, w pętli coś do niej dodajemy pod warunkiem % 2 == 0 – więc to suma elementów parzystych. Dystraktory: „suma wszystkich”, „suma nieparzystych”, „liczba parzystych” (to byłoby wynik++).
for … of – gdy indeks nie jest potrzebny
const kursy = ["HTML", "CSS", "JavaScript"];
for (const nazwa of kursy) {
console.log("Kurs:", nazwa);
}
// działa też na napisie – znak po znaku
let odwrocony = "";
for (const znak of "kajak") {
odwrocony = znak + odwrocony; // doklejamy każdy znak Z PRZODU
}
console.log(odwrocony); // kajak (palindrom), spróbuj z "kot"for…of jest krótsze i nie da się pomylić o jeden. Gdy potrzebujesz numeru elementu (np. „obraz 1.jpg, 2.jpg…”), użyj klasycznego for.
Co wypisze ten kod?
var liczby = [4, 7, 10, 3];
var wynik = 0;
for (var i = 0; i < liczby.length; i++) {
if (liczby[i] > 5) {
wynik++;
}
}
console.log(wynik);Sumowanie, zliczanie, szukanie – wzorzec akumulatora
Większość pętli w zadaniach ma ten sam szkielet: zmienna startowa przed pętlą, aktualizacja w pętli, odczyt po pętli.
| Zadanie | Start | W pętli | Po pętli |
|---|---|---|---|
| suma | let suma = 0 | suma += x | suma |
| liczba elementów spełniających warunek | let ile = 0 | if (warunek) ile++ | ile |
| największa wartość | let max = tab[0] | if (x > max) max = x | max |
| sklejony napis | let tekst = "" | tekst += x + ", " | tekst |
| czy coś istnieje | let jest = false | if (warunek) jest = true | jest |
const oceny = [4, 5, 3, 5, 2, 4];
let suma = 0;
let ileDobrych = 0;
let najwyzsza = oceny[0];
for (const ocena of oceny) {
suma += ocena;
if (ocena >= 4) {
ileDobrych++;
}
if (ocena > najwyzsza) {
najwyzsza = ocena;
}
}
console.log("Średnia:", (suma / oceny.length).toFixed(2));
console.log("Ocen 4 lub wyższych:", ileDobrych);
console.log("Najwyższa:", najwyzsza);Pętle zagnieżdżone
Pętla w pętli: wewnętrzna wykonuje się w całości przy każdym obiegu zewnętrznej. Dwie pętle po 3 obiegi dają 9 wykonań ciała.
for (let wiersz = 1; wiersz <= 3; wiersz++) {
let linia = "";
for (let kolumna = 1; kolumna <= 5; kolumna++) {
linia += (wiersz * kolumna) + "\t";
}
console.log(linia);
}Zmienna linia jest deklarowana w zewnętrznej pętli, więc każdy wiersz zaczyna się od pustego napisu.
Algorytm z opisu krokowego
Arkusz praktyczny czasem podaje algorytm „po ludzku” i oczekuje pętli (styczeń 2025, INF.03-06-25.01 – konwersja na system binarny). Trening: suma cyfr liczby.
Opis: „Dopóki liczba jest większa od zera: weź resztę z dzielenia przez 10 (ostatnia cyfra), dodaj ją do sumy, a liczbę podziel całkowicie przez 10.”
Tabela śledzenia dla 472:
| obieg | liczba na starcie | liczba % 10 | suma po dodaniu | liczba po podzieleniu |
|---|---|---|---|---|
| 1 | 472 | 2 | 2 | 47 |
| 2 | 47 | 7 | 9 | 4 |
| 3 | 4 | 4 | 13 | 0 |
| – | 0 | warunek 0 > 0 fałszywy – koniec |
let liczba = 472;
let suma = 0;
while (liczba > 0) {
const cyfra = liczba % 10; // ostatnia cyfra
suma += cyfra;
liczba = Math.floor(liczba / 10); // „dzielenie całkowite” – obcinamy część ułamkową
}
console.log("Suma cyfr:", suma); // 13Przepis na każdy taki algorytm: (1) nazwij zmienne z opisu, (2) „dopóki” → while, „dla każdego” → for, (3) każdą czynność z opisu zamień na jedną linię, (4) rozpisz tabelę dla małej liczby i porównaj z konsolą.
Zapowiedź: pętla generuje elementy strony
W jednym z arkuszy ze stycznia 2026 pętla tworzy dziesięć obrazków. Tworzenie elementów poznasz w lekcji Tworzenie elementów; dziś pętla skleja tylko tekst listy.
<button id="generuj">Wygeneruj listę</button>
<ol id="lista"></ol>const przycisk = document.getElementById('generuj');
const lista = document.getElementById('lista');
przycisk.addEventListener('click', () => {
let elementy = '';
for (let numer = 1; numer <= 5; numer++) {
elementy += `<li>Wzór numer ${numer} (plik ${numer}.jpg)</li>`;
}
lista.innerHTML = elementy;
});Na egzaminie
Ściąga
| Składnia | Co robi | Przykład |
|---|---|---|
for (let i = 0; i < n; i++) { } | pętla z licznikiem: start raz, warunek przed obiegiem, krok po | for (let i = 1; i <= 10; i++) – 1…10 |
for (let i = n; i > 0; i--) | w dół | 10…1 |
i += k jako krok | co k | for (let i = 0; i < 100; i += 10) – 0, 10…90 |
while (warunek) { } | dopóki warunek prawdziwy; krok piszesz sam w ciele | while (x > 0) { x = Math.floor(x / 2); } |
do { } while (warunek); | jak while, ale ciało wykona się co najmniej raz | pytanie o dane aż będą poprawne |
for (const el of tablica) { } | po każdym elemencie tablicy / znaku napisu | for (const z of "abc") |
break | kończy całą pętlę | po znalezieniu szukanego |
continue | pomija resztę obiegu, idzie do kroku | pomiń nieparzyste |
tab[i], tab.length | element o indeksie i (od 0), liczba elementów | ostatni: tab[tab.length - 1] |
x % 10, Math.floor(x / 10) | ostatnia cyfra, odcięcie ostatniej cyfry | algorytmy cyfra po cyfrze |
| akumulator | let s = 0 przed pętlą, s += x w pętli | suma, zliczanie, max |
Zadania
Parzyste i ich suma
Wypisz w konsoli wszystkie liczby parzyste od 2 do 20 w jednej linii oddzielone spacjami, a w drugiej linii ich sumę. Zrób to dwa razy: raz pętlą z krokiem i += 2, raz pętlą po wszystkich liczbach 1–20 z continue dla nieparzystych. Obie wersje mają dać ten sam wynik (suma 110).
Pokaż rozwiązanie
// Wersja 1: krok co 2
let linia1 = "";
let suma1 = 0;
for (let i = 2; i <= 20; i += 2) {
linia1 += i + " ";
suma1 += i;
}
console.log(linia1.trim());
console.log("Suma:", suma1);
// Wersja 2: wszystkie liczby, nieparzyste pomijamy
let linia2 = "";
let suma2 = 0;
for (let i = 1; i <= 20; i++) {
if (i % 2 !== 0) {
continue; // nieparzysta – do następnego obiegu
}
linia2 += i + " ";
suma2 += i;
}
console.log(linia2.trim());
console.log("Suma:", suma2, "| zgodne:", suma1 === suma2);Tabela śledzenia i zamiana na while
Dana jest pętla:
let x = 1;
let licznik = 0;
for (let i = 1; i <= 6; i++) {
x = x * 2;
if (x > 20) {
licznik++;
}
}
console.log(x, licznik);- Bez uruchamiania wypełnij tabelę z kolumnami
i,xpo podwojeniu,x > 20,licznikdla każdego obiegu i podaj, co wypiszeconsole.log. - Przepisz pętlę na
whiletak, by dała identyczny wynik. - Dopiero teraz uruchom obie wersje i porównaj z tabelą.
Pokaż rozwiązanie
Tabela:
i | x | x > 20 | licznik |
|---|---|---|---|
| 1 | 2 | nie | 0 |
| 2 | 4 | nie | 0 |
| 3 | 8 | nie | 0 |
| 4 | 16 | nie | 0 |
| 5 | 32 | tak | 1 |
| 6 | 64 | tak | 2 |
Wypisze 64 2.
// oryginał
let x = 1;
let licznik = 0;
for (let i = 1; i <= 6; i++) {
x = x * 2;
if (x > 20) {
licznik++;
}
}
console.log(x, licznik);
// wersja while – inicjalizacja przed, krok na końcu ciała
let x2 = 1;
let licznik2 = 0;
let i = 1;
while (i <= 6) {
x2 = x2 * 2;
if (x2 > 20) {
licznik2++;
}
i++;
}
console.log(x2, licznik2);Statystyki ocen
Dana jest tablica ocen const oceny = [3, 5, 4, 2, 5, 1, 4]. Jedną pętlą wylicz i wypisz: średnią zaokrągloną do dwóch miejsc po przecinku, najwyższą i najniższą ocenę, liczbę ocen niedostatecznych (1) oraz – jako true/false – czy jest choć jedna piątka. Na końcu wypisz oceny w jednej linii w formacie 3, 5, 4, 2, 5, 1, 4 (bez przecinka na końcu – zastanów się, jak to zrobić w pętli).
Pokaż rozwiązanie
const oceny = [3, 5, 4, 2, 5, 1, 4];
let suma = 0;
let najwyzsza = oceny[0];
let najnizsza = oceny[0];
let ileJedynek = 0;
let jestPiatka = false;
let lista = "";
for (let i = 0; i < oceny.length; i++) {
const ocena = oceny[i];
suma += ocena;
if (ocena > najwyzsza) najwyzsza = ocena;
if (ocena < najnizsza) najnizsza = ocena;
if (ocena === 1) ileJedynek++;
if (ocena === 5) jestPiatka = true;
// przecinek tylko PRZED elementami, które nie są pierwsze
if (i > 0) {
lista += ", ";
}
lista += ocena;
}
console.log("Średnia:", (suma / oceny.length).toFixed(2)); // 3.43
console.log("Najwyższa:", najwyzsza, "Najniższa:", najnizsza);
console.log("Jedynek:", ileJedynek, "| jest piątka:", jestPiatka);
console.log(lista);Alternatywa dla ostatniej linii: oceny.join(", ") – poznasz w lekcji o tablicach.
Konwersja na system binarny
Zadanie według wzoru z sesji styczeń 2025 (INF.03-06-25.01). Na stronie jest pole tekstowe „Wpisz liczbę dziesiętną”, przycisk „Przelicz na binarny” i akapit z tekstem „Brak obliczeń”. Po kliknięciu akapit ma pokazać liczbę w systemie dwójkowym, z cyframi pogrupowanymi po cztery od prawej i oddzielonymi spacją, np. dla 181 → 1011 0101. Arkusz podaje algorytm:
- Dopóki liczba jest większa od 0: zapisz resztę z dzielenia liczby przez 2 jako kolejną cyfrę wyniku, a liczbę podziel całkowicie przez 2.
- Otrzymany ciąg cyfr odwróć (pierwsza wyliczona reszta to ostatnia cyfra).
- Wstaw spację co 4 cyfry, licząc od prawej.
Formularz dodasz w module DOM. Dziś napisz funkcję naBinarny(liczba), która zwraca gotowy napis, bez użycia toString(2) (arkusz żąda algorytmu). Przetestuj dla 5 (101), 181 (1011 0101), 1000 (11 1110 1000) i 0 (0).
Kryteria w stylu „Zasad oceniania” (0/1):
- 5.1 skrypt zawiera pętlę realizującą opisany algorytm (reszta z dzielenia przez 2, dzielenie całkowite),
- 5.2 cyfry są odwrócone (poprawna kolejność binarna),
- 5.3 wynik pogrupowany po 4 cyfry od prawej, oddzielone pojedynczą spacją,
- 5.4 poprawny wynik dla dwóch różnych liczb,
- 5.5 znaczące nazwy zmiennych i funkcji.
Pokaż rozwiązanie
function naBinarny(liczba) {
if (liczba === 0) {
return "0"; // algorytm z while nie wykonałby się ani razu
}
// Krok 1: zbieramy reszty z dzielenia przez 2
let reszty = "";
let pozostalo = liczba;
while (pozostalo > 0) {
reszty += pozostalo % 2; // 0 lub 1 doklejane jako znak
pozostalo = Math.floor(pozostalo / 2);
}
// Krok 2: odwracamy – pierwsza reszta to ostatnia cyfra
let binarnie = "";
for (const cyfra of reszty) {
binarnie = cyfra + binarnie;
}
// Krok 3: spacja co 4 cyfry od PRAWEJ – idziemy od końca i liczymy znaki
let pogrupowane = "";
let licznikCyfr = 0;
for (let i = binarnie.length - 1; i >= 0; i--) {
if (licznikCyfr > 0 && licznikCyfr % 4 === 0) {
pogrupowane = " " + pogrupowane;
}
pogrupowane = binarnie[i] + pogrupowane;
licznikCyfr++;
}
return pogrupowane;
}
console.log(naBinarny(5)); // 101
console.log(naBinarny(181)); // 1011 0101
console.log(naBinarny(1000)); // 11 1110 1000
console.log(naBinarny(0)); // 0
// kontrola wbudowaną metodą (na egzaminie – tylko do sprawdzenia siebie)
console.log((181).toString(2) === naBinarny(181).replace(/ /g, "")); // trueNa egzaminie wartość z pola to napis – przed obliczeniem zamień ją Number(pole.value). Jeśli wynik ma mieć oznaczenie podstawy, indeks dolny „(2)” dopiszesz jako <sub>(2)</sub> w innerHTML.
Dziesięć obrazów w pętli
Zadanie wzorowane na arkuszu ze stycznia 2026, w którym pętla generowała dziesięć obrazów z dymkami. Skrypt ma wygenerować dziesięć obrazów 1.jpg … 10.jpg, każdy z klasą wzory i dymkiem (atrybut title) „Wzór nr N”. Napisz funkcję generujGalerie(ile), która pętlą skleja i zwraca kod HTML tych obrazów – po jednym elemencie <img> w linii, w formacie dokładnie:
<img src="1.jpg" alt="Wzór nr 1" title="Wzór nr 1" class="wzory">
Wypisz wynik dla ile = 10 i sprawdź: pierwszy numer to 1 (nie 0), ostatni to 10, każdy wiersz ma numer w src, alt i title. Podpowiedź: aby wstawić cudzysłowy do napisu, użyj template stringa w odwrotnych apostrofach.
Pokaż rozwiązanie
function generujGalerie(ile) {
let html = "";
for (let numer = 1; numer <= ile; numer++) { // od 1 do ile włącznie – nie od 0!
html += `<img src="${numer}.jpg" alt="Wzór nr ${numer}" title="Wzór nr ${numer}" class="wzory">\n`;
}
return html;
}
const kod = generujGalerie(10);
console.log(kod);
console.log("Liczba obrazów:", kod.split("\n").length - 1); // 10 (ostatni \n daje pusty element)W module DOM ten sam kod wstawisz przez sekcja.innerHTML = generujGalerie(10) albo – lepiej – stworzysz elementy document.createElement("img") w tej samej pętli.
Test powtórkowy
Test powtórkowy
Format jak w części pisemnej INF.03. Licz obiegi: pierwsza wartość, ostatnia wartość, krok.
Co wypisze ten kod?
for (var i = 0; i < 100; i += 10) {
document.write(i + ' ');
}Fragment kodu ma za zadanie:
var wynik = 0;
for (var i = 0; i < liczby.length; i++) {
if (liczby[i] % 2 == 0) {
wynik += liczby[i];
}
}Który zapis jest równoważny instrukcji x += 10; dla x = 0?
Ile razy wykona się ciało pętli while (i > 0) { i -= 3; } dla i = 10?
Która pętla NIGDY się nie zakończy?
Co wypisze ten kod?
var tekst = "";
var i = 10;
do {
tekst += i + ",";
i += 5;
} while (i < 10);
console.log(tekst);Po wykonaniu kodu var s = 0; for (var i = 1; i <= 4; i++) { s += i; } zmienna s ma wartość:
Instrukcja continue wewnątrz pętli:
Które zapisy są funkcjonalnie równoważne?
Co wypisze ten kod?
var tab = [5, 1, 8, 3];
var m = tab[0];
for (var i = 1; i < tab.length; i++) {
if (tab[i] > m) {
m = tab[i];
}
}
document.write(m);