Przejdź do głównej treści
INF.03-01-23.01-SGStyczeń 2023 · 32 kroki · ok. 66 min · 36 kryteriów z klucza

Rozwiązanie krok po kroku: Portal o farbach (Nowoczesny kod (grid))

To drugi sposób rozwiązania tego samego arkusza. Wynik jest ten sam - baza malarz z czterema zapytaniami, grafika 300 × 300 px z pikselizacją, strony mieszamy.html i cena.html z arkuszem stylów styl_1.css i kalkulatorem farby - i tak samo spełnia każde kryterium klucza. Inna jest droga:

  • siatka CSS zamiast float: cały układ opisuje jedna reguła dla <body> - kolumny 25%, 50% i 25% oraz nazwane obszary (grid-template-areas), bez clear przy stopce,
  • znaczniki opisujące treść: menu w <nav>, blok środkowy w <main>, obraz w <aside>, a kolory z arkusza w zmiennych CSS,
  • zapytania pisane czytelnie: każda klauzula w osobnej linii, aliasy tabel, cena litra zaokrąglona do groszy i widok tworzony poleceniem, które można bezpiecznie powtórzyć,
  • skrypt w osobnym pliku cena.js, podpięty słuchaczem zdarzenia zamiast atrybutu onclick, ze sprawdzeniem wpisanej powierzchni i wynikiem wpisywanym jako zwykły tekst.

Na końcu krótkie porównanie z wersją podstawową (zakładka obok). Baza i grafika pochodzą z prawdziwego archiwum zad1, zapytania są policzone na MariaDB 10.4, a kalkulator w podglądzie działa naprawdę - wpisz powierzchnię i kliknij „Policz”.

Jak liczą się punkty. Klucz ma 36 kryteriów (R.1.1 - R.5.5), każde za 1 punkt. Próg zdania to 75%, czyli 27 punktów. Przy każdym kroku jest napisane, które kryteria spełnia.

  1. Etap 1: Baza danych

    Kroki 1-7 · po tym etapie masz 6 z 36 kryteriów (pkt)

    Krok 1: Baza danych malarz

    Kryteria:

    R.1.1 Wykonano import tabel do bazy danych malarz czynność udokumentowano plikiem o nazwie import w formacie PNG

    ok. 2 min
    Polecenie z arkusza

    Utwórz bazę danych o nazwie malarz.

    Rozpakuj zad1.zip z pulpitu (hasło 2ws3ed!#) do folderu z numerem zdającego: malarz.sql i obraz.png. W phpMyAdmin Nowa → malarz albo zapytaniem:

    CREATE DATABASE malarz CHARACTER SET utf8mb4 COLLATE utf8mb4_polish_ci;
    

    Arkusz nie podaje porównywania, więc wybór należy do Ciebie. Tabele z malarz.sql mają zestaw utf8mb4 zapisany we własnej definicji, więc ustawienie bazy ich nie zmienia.

  2. Krok 2: Import tabel z pliku malarz.sql

    Kryteria:

    R.1.1 Wykonano import tabel do bazy danych malarz czynność udokumentowano plikiem o nazwie import w formacie PNG

    ok. 2 min
    Polecenie z arkusza

    Do bazy malarz zaimportuj tabele z pliku malarz.sql z rozpakowanego archiwum.

    Zaznaczona baza malarz, Import → malarz.sql → Wykonaj. Dwie tabele z obrazu 1 w relacji 1..n przez pole id_farby: farby (7 kolorów, cena puszki i pojemnosc w litrach) i malowanie (pomieszczenie, ściana, farba i liczba puszek). Kolor biały jest zapisany bez polskiej litery - „bialy”.

  3. Krok 3: Zrzut ekranu import.png

    Kryteria:

    R.1.1 Wykonano import tabel do bazy danych malarz czynność udokumentowano plikiem o nazwie import w formacie PNG

    ok. 2 min
    Polecenie z arkusza

    Wykonaj zrzut ekranu po imporcie. Zrzut zapisz w formacie PNG i nazwij import. Nie kadruj zrzutu. Powinien on obejmować cały ekran monitora, z widocznym paskiem zadań. Na zrzucie powinny być widoczne elementy wskazujące na poprawnie wykonany import tabel.

    Cały ekran z paskiem zadań, w PNG, pod nazwą import. Zrzuty zapytań kw1 - kw4 będą już w JPEG.

    Typowe błędy

    Wykadrowany zrzut albo zrzut bez paska zadań nie jest oceniany (uwaga w kluczu przy R.1).

  4. Krok 4: Zapytanie 1: cena i pojemność czerwonej farby

    Kryteria: ,

    R.1.2 Zapisano plik kwerendy.txt zawierający co najmniej jedno zapytanie SQL, wynikające z treści zadania

    R.1.3 Utworzono zapytanie 1 wybierające jedynie cenę i pojemność czerwonej puszki farby. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT cena, pojemnosc FROM farby WHERE kolor = "czerwony"; oraz wynik działania udokumentowano zrzutem, na którym widoczny jest jedynie rekord z wartościami 30 i 3

    ok. 1 min
    Polecenie z arkusza

    Zapytanie 1: wybierające jedynie cenę i pojemność czerwonej puszki farby.

    Każda klauzula w osobnej linii - łatwiej przeczytać i poprawić, a phpMyAdmin wykona zapytanie tak samo. Tekst w apostrofach: w SQL to zapis standardowy, działający w każdym trybie serwera. Wynik: 30 i 3 - jak w kluczu. Zapytanie do kwerendy.txt, zrzut kw1.jpg.

    kwerendy.txt Tekst nowy plik
    -- Zapytanie 1
    SELECT cena, pojemnosc
    FROM farby
    WHERE kolor = 'czerwony';
    Podgląd strony po tym kroku
    Podgląd strony po kroku 4
  5. Krok 5: Zapytanie 2: cena jednego litra farby

    Kryteria:

    R.1.4 Utworzono zapytanie 2 wybierające jedynie kolor oraz cenę jednego litra farby wyliczoną z pól cena i pojemnosc dla wszystkich farb. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT kolor, cena/pojemnosc AS "cena jednostkowa" FROM farby; lub SELECT kolor, cena/pojemnosc FROM farby; oraz wynik działania udokumentowano zrzutem, na którym są widoczne nazwy farb z odpowiadającą ceną jednostkową, z zaokrągleniem lub bez, biały - 4; czerwony - 10; niebieski - 11,6; żółty - 5,5; zielony - 7,5; czarny - 25; fioletowy - 21,3

    ok. 2 min
    Polecenie z arkusza

    Zapytanie 2: wybierające jedynie kolor oraz cenę jednego litra farby, wyliczoną z pól cena i pojemnosc dla wszystkich farb. Cena jednego litra farby powinna być podpisana jako „cena jednostkowa”.

    • cena / pojemnosc - wyrażenie liczone osobno dla każdego wiersza,
    • ROUND(..., 2) - cena to pieniądze, więc wystarczą grosze: 11.67 zamiast 11.6667 (klucz przyjmuje wynik „z zaokrągleniem lub bez”),
    • alias ze spacją w odwrotnych apostrofach `cena jednostkowa` - w MySQL i MariaDB to zapis nazwy kolumny; cudzysłów z przykładu w kluczu też zadziała.

    Wynik: biały 4.00, czerwony 10.00, niebieski 11.67, żółty 5.50, zielony 7.50, czarny 25.00, fioletowy 21.33. Zrzut: kw2.jpg.

    kwerendy.txt Tekst zmienione: 4 linie
    -- Zapytanie 1
    SELECT cena, pojemnosc
    FROM farby
    WHERE kolor = 'czerwony';
    
    -- Zapytanie 2
    SELECT kolor, ROUND(cena / pojemnosc, 2) AS `cena jednostkowa`
    FROM farby;
    Podgląd strony po tym kroku
    Podgląd strony po kroku 5
  6. Krok 6: Zapytanie 3: farby dla pomieszczenia 3

    Kryteria:

    R.1.5 Utworzono zapytanie 3 wybierające jedynie nazwy kolorów farb i liczbę puszek dla pomieszczenia o identyfikatorze 3. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT kolor, liczba_puszek FROM malowanie JOIN farby ON malowanie.id_farby = farby.id_farby WHERE id_pomieszczenia = 3; oraz wynik działania udokumentowano zrzutem, na którym są widoczne jedynie wartości: zielony, 2; czerwony, 2

    ok. 3 min
    Polecenie z arkusza

    Zapytanie 3: wybierające jedynie nazwy kolorów farb i liczbę puszek dla pomieszczenia o identyfikatorze 3.

    • aliasy tabel m i f - krótki przedrostek mówi, z której tabeli pochodzi każde pole,
    • JOIN ... ON f.id_farby = m.id_farby - relacja z obrazu 1, zapisana przy złączeniu, a nie w WHERE,
    • WHERE m.id_pomieszczenia = 3 - warunek z arkusza,
    • ORDER BY m.id_sciany - wiersze w kolejności ścian; bez sortowania serwer może oddać je w dowolnej kolejności.

    Wynik: zielony 2 i czerwony 2 - jak w kluczu. Zrzut: kw3.jpg.

    Typowe błędy

    ON id_farby = id_farby bez przedrostków kończy się błędem „column is ambiguous” - pole o tej nazwie jest w obu tabelach.

    kwerendy.txt Tekst zmienione: 7 linii
    -- Zapytanie 1
    SELECT cena, pojemnosc
    FROM farby
    WHERE kolor = 'czerwony';
    
    -- Zapytanie 2
    SELECT kolor, ROUND(cena / pojemnosc, 2) AS `cena jednostkowa`
    FROM farby;
    
    -- Zapytanie 3
    SELECT f.kolor, m.liczba_puszek
    FROM malowanie AS m
    JOIN farby AS f ON f.id_farby = m.id_farby
    WHERE m.id_pomieszczenia = 3
    ORDER BY m.id_sciany;
    Podgląd strony po tym kroku
    Podgląd strony po kroku 6
  7. Krok 7: Zapytanie 4: widok pomieszczenie1

    Kryteria:

    R.1.6 Utworzono zapytanie 4 tworzące widok o nazwie pomieszczenie1 , w którym znajdują się jedynie pola id_sciany, id_farby, liczba_puszek dla pomieszczenia o id równym 1 . W pliku z kwerendami lub na zrzucie istnieje zapis np.: CREATE VIEW pomieszczenie1 AS SELECT id_sciany, id_farby, liczba_puszek FROM malowanie WHERE id_pomieszczenia = 1; oraz wynik działania udokumentowano zrzutem, na którym widać drzewo Widoki z widokiem o nazwie pomieszczenie1 lub jedynie dane widoku: 1, 1, 3; 2, 3, 2; 3, 1, 3; 4, 1, 2

    ok. 3 min
    Polecenie z arkusza

    Zapytanie 4: tworzące widok (perspektywę) o nazwie pomieszczenie1, w którym znajdują się jedynie pola id_sciany, id_farby, liczba_puszek dla pomieszczenia o id równym 1. Aby udokumentować poprawność wykonania zapytania na zrzucie ekranu o nazwie kw4 powinien znajdować się otwarty widok pomieszczenie1 z drzewa Widoki.

    Widok to zapytanie zapisane pod nazwą: w bazie wygląda jak tabela, ale danych nie kopiuje - przy każdym otwarciu wykonuje swoje SELECT od nowa. CREATE OR REPLACE VIEW tworzy widok, a gdy już istnieje - podmienia go; drugie wykonanie nie kończy się błędem, więc poprawkę w zapytaniu wystarczy wykonać jeszcze raz (sprawdzone dwukrotnym wykonaniem na bazie z archiwum).

    Widok pojawia się w lewym drzewie phpMyAdmina w gałęzi Widoki; otwórz go i zrób zrzut kw4.jpg z czterema wierszami: 1, 1, 3; 2, 3, 2; 3, 1, 3; 4, 1, 2.

    kwerendy.txt Tekst zmienione: 6 linii
    -- Zapytanie 1
    SELECT cena, pojemnosc
    FROM farby
    WHERE kolor = 'czerwony';
    
    -- Zapytanie 2
    SELECT kolor, ROUND(cena / pojemnosc, 2) AS `cena jednostkowa`
    FROM farby;
    
    -- Zapytanie 3
    SELECT f.kolor, m.liczba_puszek
    FROM malowanie AS m
    JOIN farby AS f ON f.id_farby = m.id_farby
    WHERE m.id_pomieszczenia = 3
    ORDER BY m.id_sciany;
    
    -- Zapytanie 4
    CREATE OR REPLACE VIEW pomieszczenie1 AS
    SELECT id_sciany, id_farby, liczba_puszek
    FROM malowanie
    WHERE id_pomieszczenia = 1;
    Podgląd strony po tym kroku
    Podgląd strony po kroku 7
  8. Etap 2: Grafika i strony HTML

    Kroki 8-18 · po tym etapie masz 19 z 36 kryteriów (pkt)

    Krok 8: obraz.png: 300 × 300 px i pikselizacja

    Kryteria:

    R.2.1 Grafikę obraz.png przeskalowano do rozmiarów dokładnie 300 px na 300 px oraz widoczny jest efekt pikselizacji

    ok. 3 min
    Polecenie z arkusza

    Plik obraz.png należy przeskalować do rozmiarów 300 px na 300 px oraz zastosować filtr powodujący efekt pikselizacji, widoczny na obrazie 2.

    Grafika jest taka sama jak w wersji podstawowej. Obraz ma 500 × 500 px: w GIMP-ie Obraz → Skaluj obraz do 300 × 300, potem Filtry → Rozmycie → Pikselizacja (tu bloki po 15 px) i Eksportuj jako obraz.png.

    Podgląd strony po tym kroku
    Podgląd strony po kroku 8
  9. Krok 9: Plik mieszamy.html: HTML5, język, kodowanie

    Kryteria:

    R.2.2 Witrynę internetową zapisano w plikach mieszamy.html i cena.html oraz zapisano jawnie standard kodowania polskich znaków i deklarację HTML5 <!DOCTYPE HTML> i zadeklarowano język witryny: polski np. <html lang="pl">

    ok. 2 min
    Polecenie z arkusza

    Cechy witryny: Składa się z podstron mieszamy.html i cena.html. Podstrony różnią się jedynie blokiem środkowym. Cechy wspólne obu podstron: Zapisane w języku HTML 5. Jawnie zastosowany właściwy standard kodowania polskich znaków. Zadeklarowany język witryny: polski.

    Najpierw cała strona mieszamy.html, a cena.html powstanie z jej kopii. <!DOCTYPE html>, <html lang="pl"> i <meta charset="UTF-8"> jako pierwszy element <head> - razem R.2.2.

    mieszamy.html HTML nowy plik
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (mieszamy.html)
  10. Krok 10: Tytuł strony

    Kryteria:

    R.2.3 Nadano tytuł stronie: malarz

    ok. 1 min
    Polecenie z arkusza

    Tytuł strony widoczny na karcie przeglądarki: „malarz”.

    <title>malarz</title> małą literą, jak w arkuszu (R.2.3), i viewport - telefon nie pomniejsza strony do szerokości ekranu komputera.

    mieszamy.html HTML zmienione: 2 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>malarz</title>
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (mieszamy.html)
  11. Krok 11: Podpięcie arkusza stylów

    Kryteria:

    R.3.5 Przynajmniej jedna strona zawiera działające połączenie z zewnętrznym arkuszem stylów o nazwie styl_1.css , formatowanie pochodzi jedynie z tego arkusza Uwaga: kryterium to nie jest spełnione również, gdy zdający źle przypisał co najmniej jeden selektor do bloku (np. kropka zamiast #)

    ok. 1 min
    Polecenie z arkusza

    Arkusz stylów w pliku o nazwie styl_1.css prawidłowo połączony z kodem strony.

    Nazwa z podkreśleniem i cyfrą: styl_1.css. Całe formatowanie pochodzi z tego pliku - bez atrybutów style w HTML-u (R.3.5).

    Typowe błędy

    styl.css zamiast styl_1.css odcina wszystkie style - przepada R.3.5, a cały rezultat R.4 egzaminator ocenia wtedy już tylko w kodzie.

    mieszamy.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>malarz</title>
        <link rel="stylesheet" href="styl_1.css">
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (mieszamy.html)
  12. Krok 12: Bloki: baner, menu, treść, obraz, stopka

    Kryteria:

    R.2.4 Układ strony zdefiniowano dzieląc ją na bloki: baner, lewy, środkowy i prawy oraz stopkę. Zastosowano znaczniki sekcji

    ok. 2 min
    Polecenie z arkusza

    Podział strony na bloki: na górze blok banera, poniżej trzy bloki: lewy, środkowy i prawy, na dole blok stopki. Podział zrealizowany za pomocą znaczników sekcji tak, aby po uruchomieniu w przeglądarce wygląd układu bloków był zgodny z obrazem 2.

    Pięć znaczników sekcji HTML5, każdy mówi, co zawiera (R.2.4):

    • <header> - baner,
    • <nav> - blok lewy, bo jest w nim menu z odnośnikami do podstron,
    • <main> - blok środkowy, główna treść; tylko on różni się między podstronami,
    • <aside> - blok prawy z obrazem, treść dodatkowa obok głównej,
    • <footer> - stopka.

    Każdy znacznik występuje na stronie raz, więc nie potrzebuje identyfikatora - w CSS wystarczy jego nazwa.

    mieszamy.html HTML zmienione: 10 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>malarz</title>
        <link rel="stylesheet" href="styl_1.css">
    </head>
    <body>
        <header>
        </header>
        <nav>
        </nav>
        <main>
        </main>
        <aside>
        </aside>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (mieszamy.html)
  13. Krok 13: Baner

    ok. 1 min
    Polecenie z arkusza

    Zawartość banera: nagłówek pierwszego stopnia o treści: „Malowanie pokoi i biur”.

    <h1> w <header>.

    mieszamy.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>malarz</title>
        <link rel="stylesheet" href="styl_1.css">
    </head>
    <body>
        <header>
            <h1>Malowanie pokoi i biur</h1>
        </header>
        <nav>
        </nav>
        <main>
        </main>
        <aside>
        </aside>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (mieszamy.html)
  14. Krok 14: Blok lewy: menu z odnośnikami

    Kryteria: ,

    R.2.6 W bloku lewym umieszczono listę punktowaną z dwoma elementami, zastosowano znaczniki <ul>, <li>

    R.3.2 Po wybraniu odnośnika "Mieszamy" otwiera się podstrona mieszamy.html oraz po wybraniu odnośnika "Wyceniamy" otwiera się podstrona cena.html

    ok. 2 min
    Polecenie z arkusza

    Zawartość bloku lewego: Nagłówek drugiego stopnia o treści: „Menu”. Lista punktowana (nieuporządkowana) z elementami: Odnośnik o treści: „Mieszamy”, prowadzący do strony mieszamy.html. Odnośnik o treści: „Wyceniamy” prowadzący do strony cena.html.

    Lista <ul> z dwoma <li>, w każdym odnośnik do podstrony z tego samego folderu (R.2.6, R.3.2). aria-current="page" oznacza odnośnik do strony, na której uczeń właśnie jest - czytnik ekranu odczyta „bieżąca strona”, a w cena.html atrybut przejdzie na drugi odnośnik. W podglądzie kliknięcia są zablokowane.

    mieszamy.html HTML zmienione: 5 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>malarz</title>
        <link rel="stylesheet" href="styl_1.css">
    </head>
    <body>
        <header>
            <h1>Malowanie pokoi i biur</h1>
        </header>
        <nav>
            <h2>Menu</h2>
            <ul>
                <li><a href="mieszamy.html" aria-current="page">Mieszamy</a></li>
                <li><a href="cena.html">Wyceniamy</a></li>
            </ul>
        </nav>
        <main>
        </main>
        <aside>
        </aside>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (mieszamy.html)
  15. Krok 15: Blok prawy: obraz

    Kryteria:

    R.2.7 W bloku prawym umieszczono obraz o nazwie obraz.png z tekstem alternatywnym "Próbki farb"

    ok. 1 min
    Polecenie z arkusza

    Zawartość bloku prawego: Obraz o nazwie obraz.png i tekście alternatywnym: „Próbki farb”.

    Przetworzony obraz z tekstem alternatywnym z arkusza (R.2.7). Wymiarów nie podajesz w HTML-u - szerokość ustali arkusz stylów.

    mieszamy.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>malarz</title>
        <link rel="stylesheet" href="styl_1.css">
    </head>
    <body>
        <header>
            <h1>Malowanie pokoi i biur</h1>
        </header>
        <nav>
            <h2>Menu</h2>
            <ul>
                <li><a href="mieszamy.html" aria-current="page">Mieszamy</a></li>
                <li><a href="cena.html">Wyceniamy</a></li>
            </ul>
        </nav>
        <main>
        </main>
        <aside>
            <img src="obraz.png" alt="Próbki farb">
        </aside>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (mieszamy.html)
  16. Krok 16: Stopka

    ok. 1 min
    Polecenie z arkusza

    Zawartość stopki: nagłówek trzeciego stopnia o treści: „MALARZ”, paragraf (akapit) „Stronę opracował:”, dalej wstawiony numer zdającego.

    <h3> i akapit. Na egzaminie po dwukropku wpisujesz swój numer zdającego (PESEL), tu stoi autor rozwiązania.

    mieszamy.html HTML zmienione: 2 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>malarz</title>
        <link rel="stylesheet" href="styl_1.css">
    </head>
    <body>
        <header>
            <h1>Malowanie pokoi i biur</h1>
        </header>
        <nav>
            <h2>Menu</h2>
            <ul>
                <li><a href="mieszamy.html" aria-current="page">Mieszamy</a></li>
                <li><a href="cena.html">Wyceniamy</a></li>
            </ul>
        </nav>
        <main>
        </main>
        <aside>
            <img src="obraz.png" alt="Próbki farb">
        </aside>
        <footer>
            <h3>MALARZ</h3>
            <p>Stronę opracował: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (mieszamy.html)
  17. Krok 17: Blok środkowy mieszamy.html: tabela barw

    Kryteria: , ,

    R.2.5 W banerze zapisano nagłówek h1: "Malowanie pokoi i biur”, w bloku lewym h2: "Menu", w bloku środkowym przynajmniej jeden z h2: "Barwy i ich pochodne" lub "Zapotrzebowanie na farbę" oraz w stopce h3: "MALARZ" i paragraf

    R.2.8 W bloku środkowym mieszamy.html umieszczono tabelę 3x3, zastosowano znaczniki <table>, <tr>, <td>, opcjonalnie <th>

    R.2.9 Zdefiniowano komórki nagłówkowe, z czego pierwsze dwie są połączone, zastosowano znaczniki <th> oraz atrybut colspan=2

    ok. 3 min
    Polecenie z arkusza

    Zawartość bloku środkowego podstrony mieszamy.html: nagłówek drugiego stopnia o treści: „Barwy i ich pochodne”, tabela o trzech kolumnach i trzech wierszach, której treść jest zgodna z obrazem 2. Pierwszy wiersz zawiera komórki nagłówkowe, z czego komórka pierwsza i druga są połączone.

    • wiersz nagłówkowy w <thead>, dane w <tbody> - przeglądarka i czytnik ekranu wiedzą, które wiersze opisują kolumny,
    • „Składowe” zajmuje dwie kolumny: colspan="2" (R.2.9), a scope mówi, że komórka nagłówkowa opisuje grupę kolumn (colgroup) albo jedną kolumnę (col),
    • dwa wiersze danych: żółty + czerwony = pomarańczowy, czerwony + niebieski = fioletowy - razem tabela 3 × 3 (R.2.8).

    Strona ma już wszystkie nagłówki i akapit w stopce (R.2.5).

    mieszamy.html HTML zmienione: 21 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>malarz</title>
        <link rel="stylesheet" href="styl_1.css">
    </head>
    <body>
        <header>
            <h1>Malowanie pokoi i biur</h1>
        </header>
        <nav>
            <h2>Menu</h2>
            <ul>
                <li><a href="mieszamy.html" aria-current="page">Mieszamy</a></li>
                <li><a href="cena.html">Wyceniamy</a></li>
            </ul>
        </nav>
        <main>
            <h2>Barwy i ich pochodne</h2>
            <table>
                <thead>
                    <tr>
                        <th colspan="2" scope="colgroup">Składowe</th>
                        <th scope="col">Wynik</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td>żółty</td>
                        <td>czerwony</td>
                        <td>pomarańczowy</td>
                    </tr>
                    <tr>
                        <td>czerwony</td>
                        <td>niebieski</td>
                        <td>fioletowy</td>
                    </tr>
                </tbody>
            </table>
        </main>
        <aside>
            <img src="obraz.png" alt="Próbki farb">
        </aside>
        <footer>
            <h3>MALARZ</h3>
            <p>Stronę opracował: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (mieszamy.html)
  18. Krok 18: Strona cena.html: pole liczbowe i przycisk

    Kryteria: ,

    R.2.10 W bloku środkowym cena.html umieszczono pole edycyjne i przycisk, oznaczenie metra kwadratowego zapisano z indeksem górnym

    R.3.3 Pole edycyjne jest typu numerycznego

    ok. 3 min
    Polecenie z arkusza

    Zawartość bloku środkowego podstrony cena.html – obraz 3: Nagłówek drugiego stopnia o treści: „Zapotrzebowanie na farbę”. Pole edycyjne typu numerycznego poprzedzone napisem „Powierzchnia malowania (m2):”. Oznaczenie metra kwadratowego zapisane z indeksem górnym. Przycisk „Policz”, po jego wybraniu uruchamia się skrypt.

    Kopia mieszamy.html zapisana jako cena.html; inny jest tylko blok <main> (i aria-current przy drugim odnośniku):

    • napis w <label for="area"> - kliknięcie napisu ustawia kursor w polu; „m²” to m<sup>2</sup>, indeks górny (R.2.10),
    • <input type="number"> - pole numeryczne (R.3.3); min="0" blokuje strzałkami wartości ujemne, a step="any" dopuszcza ułamki, np. 12,5 m²,
    • <button type="button" id="count"> - przycisk bez atrybutu onclick: zdarzenie podepnie skrypt,
    • <p id="result" aria-live="polite"> - miejsce na wynik; czytnik ekranu przeczyta zmianę bez przenoszenia fokusu.
    cena.html HTML nowy plik
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>malarz</title>
        <link rel="stylesheet" href="styl_1.css">
    </head>
    <body>
        <header>
            <h1>Malowanie pokoi i biur</h1>
        </header>
        <nav>
            <h2>Menu</h2>
            <ul>
                <li><a href="mieszamy.html">Mieszamy</a></li>
                <li><a href="cena.html" aria-current="page">Wyceniamy</a></li>
            </ul>
        </nav>
        <main>
            <h2>Zapotrzebowanie na farbę</h2>
            <label for="area">Powierzchnia malowania (m<sup>2</sup>):</label>
            <input type="number" id="area" min="0" step="any">
            <button type="button" id="count">Policz</button>
            <p id="result" aria-live="polite"></p>
        </main>
        <aside>
            <img src="obraz.png" alt="Próbki farb">
        </aside>
        <footer>
            <h3>MALARZ</h3>
            <p>Stronę opracował: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (cena.html)
  19. Etap 3: Styl CSS

    Kroki 19-26 · po tym etapie masz 30 z 36 kryteriów (pkt)

    Krok 19: Plik styl_1.css: zmienne i krój czcionki

    Kryteria:

    R.4.1 Ustawiono domyślne formatowanie wszystkich selektorów (*): krój czcionki Cambria

    ok. 2 min
    Polecenie z arkusza

    Ustawione domyślne wartości dla wszystkich selektorów stylu CSS: krój czcionki Cambria.

    Trzy kolory tła z arkusza w zmiennych (--banner, --side, --middle) - każdy pojawia się w regule jako var(...), a zmiana odcienia to jedna linia. Selektor * z Cambrią i krojem zapasowym serif, gdyby Cambrii nie było w systemie (R.4.1).

    styl_1.css CSS nowy plik
    :root {
        --banner: #829EB9;
        --side: #B3C6D9;
        --middle: #E0E9F1;
    }
    
    * {
        font-family: Cambria, serif;
    }
    Podgląd strony po tym kroku (mieszamy.html)
  20. Krok 20: Układ: siatka z nazwanymi obszarami

    Kryteria:

    R.3.1 Układ bloków po uruchomieniu przynajmniej jednej strony w przeglądarce jest zgodny z obrazem 2 w arkuszu (prawidłowo zastosowano właściwości CSS układające bloki na stronie, np. float i clear albo display flex albo grid). Dopuszcza się zachodzenie obrazu z bloku prawego na stopkę.

    ok. 3 min
    Polecenie z arkusza

    Podział zrealizowany za pomocą znaczników sekcji tak, aby po uruchomieniu w przeglądarce wygląd układu bloków był zgodny z obrazem 2.

    display: grid na <body> zamienia stronę w siatkę:

    • grid-template-columns: 25% 50% 25% - trzy kolumny o szerokościach z arkusza; klucz przy R.4.4 wprost przyjmuje szerokości zapisane w ten sposób,
    • grid-template-areas - mapa strony narysowana tekstem: baner i stopka zajmują wszystkie trzy kolumny, a w środkowym rzędzie stoją nav, main i aside,
    • grid-area przypisuje każdy blok do obszaru z mapy.

    Bloki nie mają własnej szerokości, nie ma float ani clear - kolejność i położenie wynikają z mapy. Zmiana układu (np. obraz pod treścią na telefonie) to zmiana samej mapy, bez ruszania HTML-u (R.3.1).

    Typowe błędy

    width: 25% dopisane jeszcze na blokach w siatce liczy się od kolumny, nie od strony - blok miałby wtedy 25% z 25%, czyli około 6% szerokości okna.

    styl_1.css CSS zmienione: 29 linii
    :root {
        --banner: #829EB9;
        --side: #B3C6D9;
        --middle: #E0E9F1;
    }
    
    * {
        font-family: Cambria, serif;
    }
    
    body {
        display: grid;
        grid-template-columns: 25% 50% 25%;
        grid-template-areas:
            "header header header"
            "nav    main   aside"
            "footer footer footer";
    }
    
    header {
        grid-area: header;
    }
    
    nav {
        grid-area: nav;
    }
    
    main {
        grid-area: main;
    }
    
    aside {
        grid-area: aside;
    }
    
    footer {
        grid-area: footer;
    }
    Podgląd strony po tym kroku (mieszamy.html)
  21. Krok 21: Baner i stopka

    Kryteria:

    R.4.3 Ustawiono biały kolor czcionki dla banera i stopki

    ok. 1 min
    Polecenie z arkusza

    Wspólne dla banera i stopki: kolor tła: #829EB9, biały kolor czcionki, tekst wyśrodkowany, marginesy wewnętrzne: 10 px.

    Jedna reguła dla dwóch selektorów, kolor ze zmiennej.

    styl_1.css CSS zmienione: 8 linii
    :root {
        --banner: #829EB9;
        --side: #B3C6D9;
        --middle: #E0E9F1;
    }
    
    * {
        font-family: Cambria, serif;
    }
    
    body {
        display: grid;
        grid-template-columns: 25% 50% 25%;
        grid-template-areas:
            "header header header"
            "nav    main   aside"
            "footer footer footer";
    }
    
    header {
        grid-area: header;
    }
    
    nav {
        grid-area: nav;
    }
    
    main {
        grid-area: main;
    }
    
    aside {
        grid-area: aside;
    }
    
    footer {
        grid-area: footer;
    }
    
    header,
    footer {
        background-color: var(--banner);
        color: white;
        text-align: center;
        padding: 10px;
    }
    Podgląd strony po tym kroku (mieszamy.html)
  22. Krok 22: Bloki lewy i prawy

    ok. 1 min
    Polecenie z arkusza

    Wspólne dla bloków lewego i prawego: kolor tła: #B3C6D9, wysokość 400 px, szerokość: 25%, margines wewnętrzny górny: 100 px.

    Szerokość 25% już jest - w grid-template-columns. Tu kolor, wysokość i padding-top; blok ma na stronie 400 px treści plus 100 px marginesu wewnętrznego.

    styl_1.css CSS zmienione: 7 linii
    :root {
        --banner: #829EB9;
        --side: #B3C6D9;
        --middle: #E0E9F1;
    }
    
    * {
        font-family: Cambria, serif;
    }
    
    body {
        display: grid;
        grid-template-columns: 25% 50% 25%;
        grid-template-areas:
            "header header header"
            "nav    main   aside"
            "footer footer footer";
    }
    
    header {
        grid-area: header;
    }
    
    nav {
        grid-area: nav;
    }
    
    main {
        grid-area: main;
    }
    
    aside {
        grid-area: aside;
    }
    
    footer {
        grid-area: footer;
    }
    
    header,
    footer {
        background-color: var(--banner);
        color: white;
        text-align: center;
        padding: 10px;
    }
    
    nav,
    aside {
        background-color: var(--side);
        height: 400px;
        padding-top: 100px;
    }
    Podgląd strony po tym kroku (mieszamy.html)
  23. Krok 23: Blok środkowy

    Kryteria: , ,

    R.4.2 Ustawiono kolor tła #829EB9 dla banera i stopki, #B3C6D9 dla bloku lewego i prawego, #E0E9F1 dla bloku środkowego

    R.4.5 Ustawiono wysokość 400px dla bloków lewego, środkowego i prawego

    R.4.7 Ustawiono wyrównanie tekstu do środka dla bloków banera, stopki, środkowego

    ok. 1 min
    Polecenie z arkusza

    Dla bloku środkowego: kolor tła: #E0E9F1, wysokość 400 px, szerokość: 50%, tekst wyśrodkowany, margines wewnętrzny górny: 100 px.

    Szerokość 50% daje środkowa kolumna siatki. Ta reguła domyka kolory tła bloków (R.4.2), wysokości (R.4.5) i wyśrodkowanie tekstu w banerze, stopce i bloku środkowym (R.4.7).

    styl_1.css CSS zmienione: 7 linii
    :root {
        --banner: #829EB9;
        --side: #B3C6D9;
        --middle: #E0E9F1;
    }
    
    * {
        font-family: Cambria, serif;
    }
    
    body {
        display: grid;
        grid-template-columns: 25% 50% 25%;
        grid-template-areas:
            "header header header"
            "nav    main   aside"
            "footer footer footer";
    }
    
    header {
        grid-area: header;
    }
    
    nav {
        grid-area: nav;
    }
    
    main {
        grid-area: main;
    }
    
    aside {
        grid-area: aside;
    }
    
    footer {
        grid-area: footer;
    }
    
    header,
    footer {
        background-color: var(--banner);
        color: white;
        text-align: center;
        padding: 10px;
    }
    
    nav,
    aside {
        background-color: var(--side);
        height: 400px;
        padding-top: 100px;
    }
    
    main {
        background-color: var(--middle);
        height: 400px;
        text-align: center;
        padding-top: 100px;
    }
    Podgląd strony po tym kroku (mieszamy.html)
  24. Krok 24: Tabela: ramka, szerokość, wyśrodkowanie

    Kryteria:

    R.4.6 Ustawiono marginesy wewnętrzne (padding) 10px dla banera i stopki, wewnętrzny górny 100px dla bloków lewego, środkowego i prawego oraz dla tabeli margin:auto;

    ok. 2 min
    Polecenie z arkusza

    Dla selektora tabeli: obramowanie linią ciągłą o szerokości 1 px i kolorze DimGray, szerokość 80%, marginesy zewnętrzne automatycznie wyliczane przez przeglądarkę, obramowanie połączone w jedną linię.

    margin: auto przy szerokości 80% dzieli wolne miejsce po równo na lewo i prawo - tabela staje na środku bloku. border-collapse: collapse łączy ramki tabeli i komórek w jedną linię. Wszystkie marginesy wewnętrzne i margin: auto tabeli są ustawione (R.4.6).

    styl_1.css CSS zmienione: 7 linii
    :root {
        --banner: #829EB9;
        --side: #B3C6D9;
        --middle: #E0E9F1;
    }
    
    * {
        font-family: Cambria, serif;
    }
    
    body {
        display: grid;
        grid-template-columns: 25% 50% 25%;
        grid-template-areas:
            "header header header"
            "nav    main   aside"
            "footer footer footer";
    }
    
    header {
        grid-area: header;
    }
    
    nav {
        grid-area: nav;
    }
    
    main {
        grid-area: main;
    }
    
    aside {
        grid-area: aside;
    }
    
    footer {
        grid-area: footer;
    }
    
    header,
    footer {
        background-color: var(--banner);
        color: white;
        text-align: center;
        padding: 10px;
    }
    
    nav,
    aside {
        background-color: var(--side);
        height: 400px;
        padding-top: 100px;
    }
    
    main {
        background-color: var(--middle);
        height: 400px;
        text-align: center;
        padding-top: 100px;
    }
    
    table {
        border: 1px solid DimGray;
        width: 80%;
        margin: auto;
        border-collapse: collapse;
    }
    Podgląd strony po tym kroku (mieszamy.html)
  25. Krok 25: Komórki: ramki i kolor pod kursorem

    Kryteria: ,

    R.4.8 Ustawiono obramowanie dla tabeli i selektora td: 1px solid DimGray, obramowanie połączone border-collapse: collapse; (nie jest wymagane dla th)

    R.4.9 Gdy kursor myszy znajdzie się jedynie na komórce tabeli jej kolor tła zamienia się na SteelBlue a kolor czcionki na biały (td:hover)

    ok. 2 min
    Polecenie z arkusza

    Dla selektora komórki tabeli i komórki nagłówkowej: obramowanie linią ciągłą o szerokości 1 px i kolorze DimGray, obramowanie połączone w jedną linię. Gdy kursor myszy znajdzie się na komórce tabeli jej kolor tła zamienia się na SteelBlue a kolor czcionki na biały.

    Selektory znaczników td i th, jak każe uwaga arkusza. td:hover zmienia tylko zwykłą komórkę pod kursorem - nagłówki zostają bez zmian, bo klucz ocenia „jedynie komórkę tabeli” (R.4.8, R.4.9). Najedź na komórkę w podglądzie.

    styl_1.css CSS zmienione: 11 linii
    :root {
        --banner: #829EB9;
        --side: #B3C6D9;
        --middle: #E0E9F1;
    }
    
    * {
        font-family: Cambria, serif;
    }
    
    body {
        display: grid;
        grid-template-columns: 25% 50% 25%;
        grid-template-areas:
            "header header header"
            "nav    main   aside"
            "footer footer footer";
    }
    
    header {
        grid-area: header;
    }
    
    nav {
        grid-area: nav;
    }
    
    main {
        grid-area: main;
    }
    
    aside {
        grid-area: aside;
    }
    
    footer {
        grid-area: footer;
    }
    
    header,
    footer {
        background-color: var(--banner);
        color: white;
        text-align: center;
        padding: 10px;
    }
    
    nav,
    aside {
        background-color: var(--side);
        height: 400px;
        padding-top: 100px;
    }
    
    main {
        background-color: var(--middle);
        height: 400px;
        text-align: center;
        padding-top: 100px;
    }
    
    table {
        border: 1px solid DimGray;
        width: 80%;
        margin: auto;
        border-collapse: collapse;
    }
    
    td,
    th {
        border: 1px solid DimGray;
        border-collapse: collapse;
    }
    
    td:hover {
        background-color: SteelBlue;
        color: white;
    }
    Podgląd strony po tym kroku (mieszamy.html)
  26. Krok 26: Obraz: szerokość bloku i zaokrąglenie

    Kryteria: ,

    R.4.4 Ustawiono szerokość 25% dla bloku lewego i prawego, 50% dla środkowego (width lub grid- template-columns lub flex), 80% dla selektora table i 100% dla selektora img

    R.4.10 Ustawiono dla obrazu zaokrąglenie rogów 20px (border-radius)

    ok. 1 min
    Polecenie z arkusza

    Dla selektora obrazu: szerokość 100%, zaokrąglenie rogów 20 px.

    Obraz liczy 100% od szerokości <aside>, czyli od trzeciej kolumny siatki - wypełnia blok prawy jak w wersji podstawowej. Szerokości z arkusza są komplet: kolumny siatki, tabela 80% i obraz 100% (R.4.4, R.4.10).

    styl_1.css CSS zmienione: 5 linii
    :root {
        --banner: #829EB9;
        --side: #B3C6D9;
        --middle: #E0E9F1;
    }
    
    * {
        font-family: Cambria, serif;
    }
    
    body {
        display: grid;
        grid-template-columns: 25% 50% 25%;
        grid-template-areas:
            "header header header"
            "nav    main   aside"
            "footer footer footer";
    }
    
    header {
        grid-area: header;
    }
    
    nav {
        grid-area: nav;
    }
    
    main {
        grid-area: main;
    }
    
    aside {
        grid-area: aside;
    }
    
    footer {
        grid-area: footer;
    }
    
    header,
    footer {
        background-color: var(--banner);
        color: white;
        text-align: center;
        padding: 10px;
    }
    
    nav,
    aside {
        background-color: var(--side);
        height: 400px;
        padding-top: 100px;
    }
    
    main {
        background-color: var(--middle);
        height: 400px;
        text-align: center;
        padding-top: 100px;
    }
    
    table {
        border: 1px solid DimGray;
        width: 80%;
        margin: auto;
        border-collapse: collapse;
    }
    
    td,
    th {
        border: 1px solid DimGray;
        border-collapse: collapse;
    }
    
    td:hover {
        background-color: SteelBlue;
        color: white;
    }
    
    img {
        width: 100%;
        border-radius: 20px;
    }
    Podgląd strony po tym kroku (mieszamy.html)
  27. Etap 4: Skrypt JavaScript

    Kroki 27-30 · po tym etapie masz 36 z 36 kryteriów (pkt)

    Krok 27: Plik cena.js i słuchacz kliknięcia

    Kryteria: ,

    R.3.4 Dla przycisku zdefiniowano obsługę zdarzenia kliknięcia (atrybut onClick lub słuchacz zdarzenia click, lub właściwość onclick obiektu DOM)

    R.5.1 Skrypt napisano w języku JavaScript, zawiera on przynajmniej jedną instrukcję języka zgodną ze składnią

    ok. 3 min
    Polecenie z arkusza

    Skrypt wykonywany po stronie przeglądarki, na podstronie cena.html ma za zadanie: Pobrać z pola edycyjnego wielkość powierzchni do pomalowania.

    Skrypt dostaje własny plik cena.js, podpięty w <head> strony cena.html. Arkusz nie mówi, gdzie ma stać kod JavaScript, a klucz ocenia skrypt po działaniu albo „w kodzie witryny” - plik cena.js też należy do witryny.

    • defer - przeglądarka pobiera skrypt równolegle ze stroną, ale uruchamia go dopiero po zbudowaniu całego HTML-u, więc querySelector znajdzie pole i przycisk,
    • const - odwołania do pola i akapitu wyniku są znajdowane raz i się nie zmieniają,
    • addEventListener('click', ...) - obsługa kliknięcia przycisku (R.3.4); funkcja strzałkowa () => { } jest na razie pusta (R.5.1).
    Typowe błędy

    Skrypt w <head> bez defer wykonuje się przed powstaniem przycisku - querySelector zwraca null, a addEventListener kończy się błędem w konsoli.

    cena.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>malarz</title>
        <link rel="stylesheet" href="styl_1.css">
        <script src="cena.js" defer></script>
    </head>
    <body>
        <header>
            <h1>Malowanie pokoi i biur</h1>
        </header>
        <nav>
            <h2>Menu</h2>
            <ul>
                <li><a href="mieszamy.html">Mieszamy</a></li>
                <li><a href="cena.html" aria-current="page">Wyceniamy</a></li>
            </ul>
        </nav>
        <main>
            <h2>Zapotrzebowanie na farbę</h2>
            <label for="area">Powierzchnia malowania (m<sup>2</sup>):</label>
            <input type="number" id="area" min="0" step="any">
            <button type="button" id="count">Policz</button>
            <p id="result" aria-live="polite"></p>
        </main>
        <aside>
            <img src="obraz.png" alt="Próbki farb">
        </aside>
        <footer>
            <h3>MALARZ</h3>
            <p>Stronę opracował: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    cena.js JavaScript nowy plik
    const areaInput = document.querySelector('#area');
    const result = document.querySelector('#result');
    
    document.querySelector('#count').addEventListener('click', () => {
    });
    Podgląd strony po tym kroku (cena.html)
  28. Krok 28: Odczyt powierzchni z pola i sprawdzenie wartości

    Kryteria:

    R.5.2 Skrypt pobiera z pola edycyjnego wielkość powierzchni do pomalowania

    ok. 3 min
    Polecenie z arkusza

    Pobrać z pola edycyjnego wielkość powierzchni do pomalowania.

    valueAsNumber zwraca zawartość pola liczbowego od razu jako liczbę (R.5.2) - bez zamiany tekstu „10” na 10. Gdy pole jest puste albo wpisano coś, co nie jest liczbą, wynikiem jest NaN.

    Warunek !Number.isFinite(area) || area <= 0 łapie oba przypadki: puste pole i wartość zero albo ujemną. Skrypt wpisuje wtedy prośbę o poprawną powierzchnię i kończy działanie (return) - bez niego uczeń zobaczyłby „Liczba potrzebnych puszek: NaN” albo „0”.

    cena.js JavaScript zmienione: 5 linii
    const areaInput = document.querySelector('#area');
    const result = document.querySelector('#result');
    
    document.querySelector('#count').addEventListener('click', () => {
        const area = areaInput.valueAsNumber;
        if (!Number.isFinite(area) || area <= 0) {
            result.textContent = 'Podaj powierzchnię większą od zera.';
            return;
        }
    });
    Podgląd strony po tym kroku (cena.html)
  29. Krok 29: Liczba puszek z zaokrągleniem w górę

    Kryteria: ,

    R.5.3 Do obliczenia liczby puszek wykonywane jest dzielenie pola powierzchni przez 4

    R.5.4 Obliczona liczba puszek jest liczbą całkowitą, zawsze zaokrągloną do góry (dowolną metodą)

    ok. 2 min
    Polecenie z arkusza

    Na podstawie pobranej wartości wyliczyć minimalną liczbę puszek wystarczającą do pomalowania tej powierzchni, przy założeniu, że: Jedna puszka zawiera 1 litr farby. 1 litr farby wystarcza do pomalowania powierzchni 4 m2. Obliczona liczba puszek jest liczbą naturalną, zaokrągloną w górę, np. do pomalowania powierzchni 6 m2, potrzeba 2 puszek, a nie 1,5.

    • stała SQUARE_METRES_PER_CAN = 4 na początku pliku: liczba z arkusza ma nazwę i komentarz, więc wiadomo, skąd się wzięła; powierzchnia dzielona jest przez 4 (R.5.3),
    • Math.ceil zaokrągla zawsze w górę: 6 / 4 = 1,5 → 2 puszki, 10 / 4 = 2,5 → 3 (R.5.4).
    Typowe błędy

    Math.round(5 / 4) daje 1 - za mało farby. Zaokrąglenie „do najbliższej” nie jest zaokrągleniem w górę, a parseInt i Math.floor obcinają w dół.

    cena.js JavaScript zmienione: 3 linie
    const SQUARE_METRES_PER_CAN = 4;    // 1 puszka = 1 litr = 4 m²
    
    const areaInput = document.querySelector('#area');
    const result = document.querySelector('#result');
    
    document.querySelector('#count').addEventListener('click', () => {
        const area = areaInput.valueAsNumber;
        if (!Number.isFinite(area) || area <= 0) {
            result.textContent = 'Podaj powierzchnię większą od zera.';
            return;
        }
        const cans = Math.ceil(area / SQUARE_METRES_PER_CAN);
    });
    Podgląd strony po tym kroku (cena.html)
  30. Krok 30: Wynik pod przyciskiem

    Kryteria:

    R.5.5 Pod przyciskiem wyświetlony jest wynik działania skryptu, w postaci tekstu: „Liczba potrzebnych puszek: <wynik>”, gdzie <wynik> został obliczony skryptem

    ok. 2 min
    Polecenie z arkusza

    Obliczony wynik jest wyświetlony pod przyciskiem i poprzedzony napisem o treści: „Liczba potrzebnych puszek: ” – obraz 3.

    Szablon tekstowy w odwrotnych apostrofach wstawia wartość w miejsce ${cans} - bez sklejania napisów plusem. textContent wpisuje do akapitu zwykły tekst, więc nic nie zostanie zinterpretowane jako HTML (R.5.5).

    Wpisz w podglądzie 10 i kliknij „Policz”: „Liczba potrzebnych puszek: 3”, jak na obrazie 3. Sprawdzone w Chrome: 6 m² → 2, 4 m² → 1, 4,5 m² → 2, a puste pole, 0 i −5 dają prośbę o poprawną powierzchnię.

    cena.js JavaScript zmienione: 1 linia
    const SQUARE_METRES_PER_CAN = 4;    // 1 puszka = 1 litr = 4 m²
    
    const areaInput = document.querySelector('#area');
    const result = document.querySelector('#result');
    
    document.querySelector('#count').addEventListener('click', () => {
        const area = areaInput.valueAsNumber;
        if (!Number.isFinite(area) || area <= 0) {
            result.textContent = 'Podaj powierzchnię większą od zera.';
            return;
        }
        const cans = Math.ceil(area / SQUARE_METRES_PER_CAN);
        result.textContent = `Liczba potrzebnych puszek: ${cans}`;
    });
    Podgląd strony po tym kroku (cena.html)
  31. Etap 5: Porównanie z wersją podstawową

    Krok 31 · po tym etapie masz 36 z 36 kryteriów (pkt)

    Krok 31: Co jest inaczej i którą wersję wybrać na egzaminie

    ok. 3 min

    Obie wersje dają komplet 36 punktów. Różnice:

    wersja podstawowawersja nowoczesna
    układfloat: left bloków i clear stopkisiatka na <body> z grid-template-areas
    szerokości blokówwidth na każdym blokugrid-template-columns: 25% 50% 25%
    bloki<section> z id<nav>, <main>, <aside>
    kolorywpisane w regułyzmienne CSS
    tabelasame <tr><thead>, <tbody>, scope
    zapytania 2-4wynik z czterema miejscami, złączenie bez aliasów, CREATE VIEWROUND(..., 2), aliasy i ORDER BY, CREATE OR REPLACE VIEW
    skryptw <script> na stronie, onclick w HTML-uplik cena.js z defer, addEventListener
    puste pole, liczba ujemnawynik 0 albo NaNprośba o poprawną powierzchnię
    wypisanie wynikuinnerHTMLtextContent i szablon tekstowy

    Pomiar w Chrome przy oknie 1024 i 1280 px: bloki mają dokładnie 25%, 50% i 25% szerokości strony, bez poziomego paska przewijania.

    Na egzaminie wersja podstawowa trzyma się funkcji z tabeli 1 arkusza (onclick, innerHTML) i układu, który zna większość uczniów. Siatka wymaga zapamiętania składni grid-template-areas, ale cały układ mieści się w jednej regule i nie zależy od kolejności bloków w HTML-u. Klucz przyjmuje oba sposoby (R.3.1, R.3.4).

    Podgląd strony bez zmian - taki jak po kroku 30.

  32. Etap 6: Oddanie pracy

    Krok 32 · po tym etapie masz 36 z 36 kryteriów (pkt)

    Krok 32: Plik przeglądarka.txt i nagranie płyty

    ok. 5 min
    Polecenie z arkusza

    Po zakończeniu pracy utwórz w folderze z numerem zdającego plik tekstowy o nazwie przeglądarka.txt. Zapisz w nim nazwę przeglądarki internetowej, w której weryfikowana była poprawność działania witryny. Nagraj płytę z rezultatami pracy. W folderze z numerem zdającego powinny się znajdować pliki: cena.html, import.png, kw1.jpg, kw2.jpg, kw3.jpg, kw4.jpg, kwerendy.txt, mieszamy.html, obraz.png, przeglądarka.txt, styl_1.css, ewentualnie inne przygotowane pliki.

    Plik cena.js to jeden z „innych przygotowanych plików” - bez niego kalkulator nie działa, więc musi trafić na płytę razem ze stronami. Strony otwierają się wprost z dysku, bez serwera. Nagraj płytę, sprawdź jej odczyt i opisz ją numerem zdającego.

    Typowe błędy

    Płyta bez cena.js - kalkulator nie działa, a przy sprawdzaniu w kodzie egzaminator nie znajdzie skryptu (R.5).

    przeglądarka.txt Tekst nowy plik
    Google Chrome

    Podgląd strony bez zmian - taki jak po kroku 30.

Podgląd

To jedno z możliwych rozwiązań. Egzaminator ocenia spełnienie kryteriów z klucza odpowiedzi, a nie zgodność z tym kodem - inna, poprawna droga też daje punkty.

Autor rozwiązania: . Licencja CC BY-NC 4.0 - kopiowanie i przeróbki do celów niekomercyjnych, z podaniem autora i źródła (link do tej strony) (zasady wykorzystania). Treść arkusza i klucza oceniania pochodzi z CKE.