Temat 08 · 2 × 45 minINF.03
Tablice
Do tej pory każda wartość miała własną zmienną. Gdy danych jest więcej – dziewięć gotowych odpowiedzi chatu, siedem zdjęć galerii, ceny trzech kursów – potrzebujesz jednej „listy” z numerowanymi miejscami. To tablica (array). W tej lekcji nauczysz się ją tworzyć, czytać i zmieniać, przechodzić po niej pętlą oraz losować z niej element – dokładnie tak, jak wymagał arkusz z czerwca 2024.
Tworzenie tablicy i dostęp do elementów
Tablicę najprościej zapisać literałem: wartości w nawiasach kwadratowych, rozdzielone przecinkami. Każdy element ma indeks – numer miejsca liczony od zera.
const kursy = ["HTML", "CSS", "JavaScript", "PHP"];
console.log(kursy[0]); // HTML – pierwszy element ma indeks 0
console.log(kursy[3]); // PHP – czwarty element ma indeks 3
console.log(kursy.length); // 4 – liczba elementów
console.log(kursy[kursy.length - 1]); // PHP – ostatni element: length minus 1
console.log(kursy[4]); // undefined – takiego indeksu nie ma, ale błędu nie będzie
console.log(kursy); // cała tablicaTablica może zawierać dowolne typy, także mieszane: [1, "dwa", true, null]. Zwykle jednak trzymasz w niej wartości jednego rodzaju (same ceny, same nazwy plików).
Co wypisze ten kod?
var zdjecia = ["1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg", "6.jpg", "7.jpg"];
document.write(zdjecia.length + " " + zdjecia[6] + " " + zdjecia[7]);Zmiana elementów
Element zmienisz, przypisując wartość pod indeksem. Działa to także dla const – stała blokuje tylko podmianę całej tablicy na inną, nie zmiany w jej środku.
const ceny = [12, 14, 18];
ceny[1] = 15; // zmiana istniejącego elementu
ceny[3] = 20; // dopisanie pod nowym indeksem – tablica rośnie
console.log(ceny, ceny.length); // [12, 15, 18, 20] 4const ceny = [12, 14, 18];
ceny.push(20); // OK – zmiana zawartości
console.log(ceny);
ceny = [1, 2, 3]; // TypeError – nie można podmienić stałej na inną tablicęnew Array() – zapis, który musisz rozpoznać
Starszy sposób to konstruktor new Array(...). Spotkasz go w testach, ale w swoim kodzie używaj [].
const a = new Array(1, 2, 3); // [1, 2, 3] – elementy jako argumenty
const b = new Array(3); // UWAGA: jedna liczba = pusta tablica o długości 3, nie [3]
const c = [3]; // literał – tablica z jednym elementem 3
console.log(a, b.length, c);Dodawanie i usuwanie elementów
| Metoda | Co robi | Zwraca | Zmienia tablicę? |
|---|---|---|---|
push(x) | dodaje x na koniec | nową długość | tak |
pop() | usuwa ostatni | usunięty element | tak |
unshift(x) | dodaje x na początek | nową długość | tak |
shift() | usuwa pierwszy | usunięty element | tak |
splice(i, ile, ...nowe) | od indeksu i usuwa ile elementów i wstawia nowe | tablicę usuniętych | tak |
const zadania = ["kupić mleko", "oddać książkę"];
zadania.push("nauczyć się tablic"); // na koniec
zadania.unshift("wstać"); // na początek
console.log(zadania);
const ostatnie = zadania.pop(); // usuwa i oddaje ostatni
const pierwsze = zadania.shift(); // usuwa i oddaje pierwszy
console.log(ostatnie, "|", pierwsze);
console.log(zadania); // zostały dwa środkowe
zadania.splice(1, 1, "zadzwonić do babci", "wyrzucić śmieci"); // od indeksu 1 usuń 1, wstaw 2
console.log(zadania);Co wypisze ten kod?
const koszyk = ["chleb", "masło"];
const n = koszyk.push("ser");
console.log(n, koszyk.length, koszyk[2]);Szukanie: indexOf i includes
const miasta = ["Warszawa", "Katowice", "Gdańsk"];
console.log(miasta.indexOf("Katowice")); // 1 – indeks pierwszego wystąpienia
console.log(miasta.indexOf("Kraków")); // -1 – nie ma takiego elementu
console.log(miasta.includes("Gdańsk")); // true – czy zawiera
console.log(miasta.includes("gdańsk")); // false – wielkość liter ma znaczenie
// typowy wzorzec: sprawdź, zanim użyjesz
if (miasta.indexOf("Kraków") === -1) {
console.log("Kraków nie jest na liście");
}indexOf porównuje ściśle (===): w tablicy liczb [1, 2, 3] wywołanie indexOf("2") zwróci -1.
Tablica ⇄ napis: join i split
join(separator) skleja elementy w jeden napis; split(separator) na napisie robi odwrotność – rozcina go na tablicę. To para metod z pytań egzaminacyjnych („która metoda zamienia napis na tablicę?” – split).
const oceny = [4, 5, 3, 5];
console.log(oceny.join(", ")); // 4, 5, 3, 5 – napis
console.log(oceny.join("")); // 4535
console.log(String(oceny)); // 4,5,3,5 – domyślny separator to przecinek
const wiersz = "Jan;Kowalski;3B";
const dane = wiersz.split(";"); // ["Jan", "Kowalski", "3B"]
console.log(dane, dane[1]);
const slowa = "to jest zdanie".split(" ");
console.log(slowa.length, "słów"); // 3 słów
console.log("abc".split("")); // ["a", "b", "c"] – na pojedyncze znakiFragment tablicy: slice (nie myl ze splice)
slice(od, do) kopiuje elementy od indeksu od do do (bez do) i zwraca nową tablicę. Oryginał się nie zmienia. splice – z literą „p” – wycina z oryginału. Dwie litery różnicy, zupełnie inne działanie.
const litery = ["a", "b", "c", "d", "e"];
console.log(litery.slice(1, 3)); // ["b", "c"] – indeksy 1 i 2, bez 3
console.log(litery.slice(2)); // ["c", "d", "e"] – od indeksu 2 do końca
console.log(litery.slice(-2)); // ["d", "e"] – dwa ostatnie
console.log(litery); // oryginał nietknięty
const wyciete = litery.splice(1, 2); // usuwa 2 elementy od indeksu 1
console.log(wyciete, litery); // ["b", "c"] ["a", "d", "e"] – oryginał zmienionyPętla po tablicy
Dwa sposoby z lekcji Pętle: for z indeksem, gdy numer jest potrzebny, i for…of, gdy liczy się tylko wartość.
const ceny = [5000, 3000, 1500];
const zaznaczone = [true, false, true]; // który kurs klient wybrał
let suma = 0;
for (let i = 0; i < ceny.length; i++) { // indeks łączy obie tablice
if (zaznaczone[i]) {
suma += ceny[i];
}
}
console.log("Koszt zaznaczonych kursów:", suma); // 6500
for (const cena of ceny) { // bez indeksu – prosto po wartościach
console.log("Kurs za", cena, "zł");
}Sortowanie: sort porównuje jak napisy
sort() bez argumentu zamienia elementy na napisy i układa je „słownikowo”. Dla słów to w porządku, dla liczb – katastrofa: "10" stoi przed "9", bo "1" jest przed "9".
Co wypisze ten kod?
const liczby = [10, 9, 1, 25];
liczby.sort();
console.log(liczby);const liczby = [10, 9, 1, 25];
console.log([...liczby].sort()); // [1, 10, 25, 9] – jak napisy!
console.log([...liczby].sort((a, b) => a - b)); // [1, 9, 10, 25] – rosnąco
console.log([...liczby].sort((a, b) => b - a)); // [25, 10, 9, 1] – malejąco
const slowa = ["gruszka", "Jabłko", "banan"];
console.log([...slowa].sort()); // ["Jabłko", "banan", "gruszka"] – wielkie litery przed małymi
console.log([...slowa].sort((a, b) => a.localeCompare(b, "pl"))); // alfabetycznie po polskuZapis [...liczby] tworzy kopię, bo sort zmienia oryginalną tablicę (tak jak reverse). Funkcja porównująca (a, b) => a - b zwraca liczbę ujemną, gdy a ma być przed b – stąd rosnąco; b - a odwraca porządek.
Losowy element
Jeden z arkuszy z czerwca 2024 kazał losować jedną z dziewięciu gotowych odpowiedzi chatu. Wzorzec jest zawsze ten sam:
const odpowiedzi = ["Cześć!", "Jak mogę pomóc?", "Super, że piszesz.", "Daj mi chwilę…"];
const indeks = Math.floor(Math.random() * odpowiedzi.length); // liczba całkowita 0…length-1
console.log("Indeks:", indeks, "→", odpowiedzi[indeks]);Dlaczego to działa: Math.random() daje liczbę z przedziału [0, 1), pomnożona przez length (4) daje [0, 4), a Math.floor obcina do 0, 1, 2 lub 3 – dokładnie wszystkie indeksy, nigdy 4. Gdybyś użył Math.round, czwórka wypadałaby czasem i dała undefined.
Przypisanie nie kopiuje tablicy
Zmienna z tablicą nie „zawiera” tablicy – wskazuje na nią (metafora karteczki z lekcji o zmiennych). const b = a przykleja drugą karteczkę do tej samej tablicy.
Co wypisze ten kod?
const a = [1, 2, 3];
const b = a;
b.push(4);
console.log(a.length, b.length);const oryginal = [1, 2, 3];
const alias = oryginal; // ta sama tablica, druga nazwa
const kopia = [...oryginal]; // nowa tablica z tymi samymi elementami (można też oryginal.slice())
alias.push(4);
kopia.push(99);
console.log(oryginal); // [1, 2, 3, 4] – zmiana przez alias widoczna
console.log(kopia); // [1, 2, 3, 99] – kopia żyje osobno
console.log(oryginal === alias, oryginal === kopia); // true false – === porównuje „tożsamość”, nie zawartośćZ tego samego powodu [1, 2] === [1, 2] daje false – to dwie różne tablice. Zawartość porównasz np. przez join() albo pętlą. Więcej w lekcji Referencje.
typeof tablicy i inne drobiazgi
const tab = [3, 1, 2];
console.log(typeof tab); // object – tablica to rodzaj obiektu
console.log(Array.isArray(tab)); // true – tak sprawdzasz, czy to tablica
console.log(tab.at(-1)); // 2 – ostatni element (krótszy zapis niż tab[tab.length - 1])
console.log([].length, [[1, 2], [3]].length); // 0 2 – tablica tablic liczy wiersze
console.log(tab.reverse()); // [2, 1, 3] – odwraca W MIEJSCU (zmienia tab)Zapowiedź: losowa odpowiedź na stronie
Tak będzie wyglądał „Generuj losową odpowiedź” z arkusza czerwiec 2024 – pełną wersję z doklejaniem bloków zrobisz w lekcji Tworzenie elementów.
<button id="losuj">Generuj losową odpowiedź</button>
<p id="odpowiedz">…</p>const odpowiedzi = [
'Dzień dobry, w czym mogę pomóc?',
'Rozumiem, sprawdzam to.',
'Proszę o chwilę cierpliwości.',
'Czy mogę jeszcze w czymś pomóc?',
];
const przycisk = document.getElementById('losuj');
const akapit = document.getElementById('odpowiedz');
przycisk.addEventListener('click', () => {
const indeks = Math.floor(Math.random() * odpowiedzi.length);
akapit.textContent = odpowiedzi[indeks];
});Na egzaminie
Ściąga
| Składnia | Co robi | Przykład |
|---|---|---|
const t = [1, 2, 3] | literał tablicy (zalecany) | new Array(1, 2, 3) – to samo; new Array(3) – 3 puste miejsca |
t[i], t[i] = x | odczyt / zapis elementu o indeksie i (od 0) | t[0] → 1 |
t.length | liczba elementów; ostatni indeks to length - 1 | t[t.length - 1], t.at(-1) |
push(x) / pop() | dodaj na koniec / usuń z końca | push zwraca długość, pop – element |
unshift(x) / shift() | dodaj na początek / usuń z początku | |
indexOf(x) | indeks lub -1 | t.indexOf(5) === -1 → brak |
includes(x) | true/false | t.includes(2) |
join(sep) | tablica → napis | [4, 5].join(", ") → "4, 5" |
napis.split(sep) | napis → tablica | "a;b".split(";") → ["a", "b"] |
slice(od, do) | kopia fragmentu, bez do, nie zmienia | t.slice(1, 3) |
splice(i, ile, ...nowe) | usuwa/wstawia w miejscu, zwraca usunięte | t.splice(1, 1) |
sort((a, b) => a - b) | sortuje liczby rosnąco w miejscu; bez komparatora – jak napisy | [10, 9, 1].sort() → [1, 10, 9] |
reverse() | odwraca w miejscu | "abc".split("").reverse().join("") |
t[Math.floor(Math.random() * t.length)] | losowy element | |
[...t], t.slice() | kopia tablicy (const b = t to nie kopia) | |
Array.isArray(t) | czy to tablica (typeof daje "object") |
Zadania
Lista zakupów
Utwórz tablicę zakupy z trzema produktami. Następnie: dodaj jeden produkt na koniec i jeden na początek, wypisz liczbę elementów i ostatni element, sprawdź (includes), czy na liście jest „mleko”, usuń pierwszy element i wypisz całą listę jako jeden napis rozdzielony przecinkiem i spacją.
Pokaż rozwiązanie
const zakupy = ["chleb", "masło", "ser"];
zakupy.push("mleko"); // na koniec
zakupy.unshift("woda"); // na początek
console.log("Elementów:", zakupy.length); // 5
console.log("Ostatni:", zakupy[zakupy.length - 1]); // mleko
console.log("Jest mleko?", zakupy.includes("mleko")); // true
zakupy.shift(); // usuwa "woda"
console.log(zakupy.join(", ")); // chleb, masło, ser, mlekoStatystyki bez wbudowanych skrótów
Dla tablicy const temperatury = [12, 18, -3, 25, 7, 18] napisz funkcje: suma(tab), najwieksza(tab), ileRazy(tab, wartosc) (ile razy wartość występuje) i tylkoDodatnie(tab) (zwraca nową tablicę z liczbami większymi od zera, oryginał bez zmian). Użyj pętli, nie Math.max ani metod wyższego rzędu. Sprawdź wyniki: 77, 25, 2 (dla 18), [12, 18, 25, 7, 18], a potem wypisz oryginał, by potwierdzić, że się nie zmienił.
Pokaż rozwiązanie
const temperatury = [12, 18, -3, 25, 7, 18];
function suma(tab) {
let wynik = 0;
for (const liczba of tab) {
wynik += liczba;
}
return wynik;
}
function najwieksza(tab) {
let max = tab[0]; // start od pierwszego elementu, nie od 0 (tablica może mieć same ujemne)
for (let i = 1; i < tab.length; i++) {
if (tab[i] > max) max = tab[i];
}
return max;
}
function ileRazy(tab, wartosc) {
let licznik = 0;
for (const element of tab) {
if (element === wartosc) licznik++;
}
return licznik;
}
function tylkoDodatnie(tab) {
const wynik = []; // nowa tablica – oryginał zostaje
for (const liczba of tab) {
if (liczba > 0) wynik.push(liczba);
}
return wynik;
}
console.log(suma(temperatury)); // 77
console.log(najwieksza(temperatury)); // 25
console.log(ileRazy(temperatury, 18)); // 2
console.log(tylkoDodatnie(temperatury)); // [12, 18, 25, 7, 18]
console.log(temperatury); // [12, 18, -3, 25, 7, 18] – bez zmianGaleria z zawijaniem
W jednym z arkuszy z czerwca 2024 przyciski < i > zmieniają zdjęcie 1.jpg…7.jpg, a po ostatnim wraca pierwsze (i odwrotnie). Zapisz nazwy plików w tablicy zdjecia, a numer aktualnego zdjęcia w zmiennej indeks zadeklarowanej poza funkcjami. Napisz funkcje nastepne() i poprzednie(), które zmieniają indeks z zawijaniem i wypisują Pokazuję: 3.jpg. Zasymuluj: 8 kliknięć > (powinno skończyć na 2.jpg), potem 3 kliknięcia < (koniec na 6.jpg).
Pokaż rozwiązanie
const zdjecia = ["1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg", "6.jpg", "7.jpg"];
let indeks = 0; // stan – poza funkcjami, pamięta między kliknięciami
function pokaz() {
console.log("Pokazuję:", zdjecia[indeks]);
}
function nastepne() {
indeks++;
if (indeks >= zdjecia.length) { // za ostatnim → pierwsze
indeks = 0;
}
pokaz();
}
function poprzednie() {
indeks--;
if (indeks < 0) { // przed pierwszym → ostatnie
indeks = zdjecia.length - 1;
}
pokaz();
}
for (let klik = 1; klik <= 8; klik++) nastepne(); // 2,3,4,5,6,7,1,2
for (let klik = 1; klik <= 3; klik++) poprzednie(); // 1,7,6Krótszy zapis zawijania w przód: indeks = (indeks + 1) % zdjecia.length – reszta z dzielenia sama „przeskakuje” z 6 na 0. W tył: indeks = (indeks - 1 + zdjecia.length) % zdjecia.length.
Chat: losowa odpowiedź z tablicy
Zadanie według wzoru z sesji czerwiec 2024. Strona chatu ma przycisk „Generuj losową odpowiedź”. Skrypt ma z predefiniowanej tablicy dziewięciu napisów (treści dowolne, np. gotowe odpowiedzi konsultanta) wylosować jeden – indeks od 0 do 8 – i dokleić go jako nową wiadomość. Doklejanie elementów do strony zrobisz w module DOM; dziś przygotuj logikę:
- tablica
odpowiedziz 9 napisami, - funkcja
losowaOdpowiedz()zwracająca losowy element, - funkcja
testLosowania(ile)– wywołujelosowaOdpowiedz()ilerazy, zlicza w drugiej tablicylicznik(9 zer), ile razy padł każdy indeks, i zwraca tę tablicę. Dla 9000 prób każda pozycja powinna mieć około 1000; sprawdź też, że suma liczników to dokładnieilei że nigdy nie wypadł indeks 9.
Kryteria w stylu „Zasad oceniania” (0/1):
- 5.1 odpowiedzi są przechowywane w tablicy (nie w dziewięciu zmiennych),
- 5.2 indeks jest losowany z użyciem
Math.randomi zaokrąglany w dół, - 5.3 losowany indeks zawsze mieści się w zakresie 0–8 (nigdy
undefined), - 5.4 funkcja zwraca tekst odpowiedzi,
- 5.5 znaczące nazwy zmiennych i funkcji.
Pokaż rozwiązanie
const odpowiedzi = [
"Dzień dobry, w czym mogę pomóc?",
"Już sprawdzam Twoje zamówienie.",
"Proszę o numer zamówienia.",
"Przesyłka jest w drodze.",
"Przykro mi, to nie zależy od nas.",
"Czy mogę jeszcze w czymś pomóc?",
"Dziękuję za kontakt!",
"Przekazuję sprawę do działu reklamacji.",
"Do usłyszenia!",
];
function losowyIndeks() {
return Math.floor(Math.random() * odpowiedzi.length); // 0…8, nigdy 9
}
function losowaOdpowiedz() {
return odpowiedzi[losowyIndeks()];
}
function testLosowania(ile) {
const licznik = [0, 0, 0, 0, 0, 0, 0, 0, 0]; // tyle zer, ile odpowiedzi
for (let proba = 0; proba < ile; proba++) {
licznik[losowyIndeks()]++;
}
return licznik;
}
console.log(losowaOdpowiedz()); // inna przy każdym uruchomieniu
const wyniki = testLosowania(9000);
console.log(wyniki); // każda pozycja ok. 1000
let razem = 0;
for (const n of wyniki) razem += n;
console.log("Suma prób:", razem, "| indeks 9 nigdy:", wyniki[9] === undefined && wyniki.length === 9);Gdybyś użył Math.round(Math.random() * 8), krańcowe indeksy 0 i 8 wypadałyby dwa razy rzadziej niż pozostałe – Math.floor(... * length) daje równe szanse.
Ranking punktów
Masz dwie tablice: imiona = ["Ola", "Bartek", "Kasia", "Tomek"] i punkty = [72, 95, 72, 48] (ten sam indeks = ta sama osoba). Napisz program, który:
- wypisze ranking od najwyższej liczby punktów – w formacie
1. Bartek – 95 pkt– bez rozsypania par imię–punkty (podpowiedź: sortuj tablicę indeksów[0, 1, 2, 3]komparatorem, który porównujepunkty[a]ipunkty[b]), - wypisze imiona osób z wynikiem co najmniej 50 jako jeden napis rozdzielony przecinkami,
- znajdzie, kto ma najwięcej punktów, przez
indexOfnajwiększej wartości.
Pokaż rozwiązanie
const imiona = ["Ola", "Bartek", "Kasia", "Tomek"];
const punkty = [72, 95, 72, 48];
// 1. sortujemy INDEKSY, nie punkty – pary zostają razem
const kolejnosc = [0, 1, 2, 3];
kolejnosc.sort((a, b) => punkty[b] - punkty[a]); // malejąco po punktach
for (let miejsce = 0; miejsce < kolejnosc.length; miejsce++) {
const i = kolejnosc[miejsce];
console.log(`${miejsce + 1}. ${imiona[i]} – ${punkty[i]} pkt`);
}
// 2. zdali – nowa tablica + join
const zdali = [];
for (let i = 0; i < imiona.length; i++) {
if (punkty[i] >= 50) zdali.push(imiona[i]);
}
console.log("Zdali:", zdali.join(", ")); // Ola, Bartek, Kasia
// 3. zwycięzca przez indexOf
let maxPunkty = punkty[0];
for (const p of punkty) if (p > maxPunkty) maxPunkty = p;
const indeksZwyciezcy = punkty.indexOf(maxPunkty);
console.log("Najwięcej punktów:", imiona[indeksZwyciezcy], maxPunkty);Lepszym nośnikiem takich danych są obiekty { imie: "Ola", punkty: 72 } w jednej tablicy – poznasz je w lekcji Obiekty.
Test powtórkowy
Test powtórkowy
Format jak w części pisemnej INF.03. Kod bywa w dialekcie egzaminacyjnym (var, ==, document.write).
Który zapis tworzący tablicę jest niepoprawny?
Jaką wartość będzie miała zmienna wynik po wykonaniu kodu?
var liczby = [4, 7, 10, 3, 6];
var wynik = 0;
for (var i = 0; i < liczby.length; i++) {
if (liczby[i] % 2 == 0) {
wynik += liczby[i];
}
}Która metoda zamienia napis na tablicę?
Co wypisze ten kod?
var t = [5, 10, 15];
document.write(t.length + " " + t[t.length - 1]);Fragment funkcji ma za zadanie:
for (var i = 0; i < tab.length; i++) {
tab[i] = i;
}Co wypisze ten kod?
const liczby = [3, 20, 100];
liczby.sort();
console.log(liczby[0]);Wyrażenie Math.floor(Math.random() * 9) zwraca:
Co wypisze ten kod?
var a = [1, 2, 3];
var b = a;
b[0] = 100;
console.log(a[0]);Po wykonaniu var t = ['a', 'b', 'c', 'd']; var w = t.slice(1, 3); zmienna w zawiera:
Które wywołanie usunie ostatni element tablicy t i zwróci go?