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

Rozwiązanie krok po kroku: Portal o farbach (Wersja podstawowa)

Rozwiązanie buduje stronę firmy malarskiej: baza malarz z farbami i planem malowania ścian i cztery zapytania (warunek, wyrażenie z dzieleniem i aliasem, złączenie tabel, a na koniec widok CREATE VIEW), grafika przeskalowana do 300 × 300 px z filtrem pikselizacji, dwie strony HTML - mieszamy.html z tabelą barw (scalone komórki nagłówkowe) i cena.html z kalkulatorem farby - oraz style w styl_1.css. W tym arkuszu nie ma PHP: skrypt działa w przeglądarce, w JavaScripcie - pobiera powierzchnię z pola liczbowego i liczy potrzebne puszki, zaokrąglając w górę.

Kroki idą zdanie po zdaniu za treścią arkusza - przy każdym jest polecenie z arkusza, a kod pokazuje dokładnie te linie, które je spełniają. Skrypt jest najpierw pisany najprościej, z atrybutem onclick i innerHTML, a na końcu zostaje przerobiony na wersję z prawdziwych projektów: słuchacz zdarzenia, sprawdzenie wpisanej wartości i textContent.

To jest wersja podstawowa. W zakładce „Nowoczesny kod (grid)” jest drugi sposób rozwiązania tego samego arkusza: bloki ustawione siatką CSS z nazwanymi obszarami (grid-template-areas) w znacznikach <nav>, <main> i <aside>, kolory w zmiennych CSS, a skrypt w osobnym pliku cena.js ze słuchaczem zdarzenia i sprawdzeniem wpisanej powierzchni - obie wersje są zgodne z kluczem.

Baza i grafika pochodzą z prawdziwego archiwum zad1 (załącznik do arkusza, hasło w treści zadania). Zrzuty wyników zapytań są odtworzone z tej bazy - na egzaminie robisz je sam, z całego ekranu. 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 części praktycznej to 75%, czyli 27 punktów - można stracić 9 kryteriów i nadal zdać. Przy każdym kroku jest napisane, które kryteria spełnia; egzaminator ocenia spełnienie kryteriów z klucza, nie zgodność z tym kodem.

  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, nazwa malarz, porównywanie np. utf8mb4_polish_ci. Tabel z malarz.sql to nie zmienia: obie mają zestaw utf8mb4 zapisany we własnej definicji, a porównywanie bazy dziedziczą tylko tabele zakładane później bez własnego ustawienia.

  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.

    Import → malarz.sql → Wykonaj. Dwie tabele z obrazu 1, w relacji 1..n przez pole id_farby: farby (7 kolorów z cena za puszkę i pojemnosc w litrach) i malowanie (które ściany którego pomieszczenia malujesz jaką farbą i ilu puszkami). Uwaga: kolor biały zapisano w bazie 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.

    Print Screen, zapis jako import.png - import w PNG, zrzuty zapytań w JPEG.

  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.

    Dwie kolumny i warunek na kolorze. 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”.

    W SELECT można wpisać nie tylko kolumnę, ale wyrażenie: cena / pojemnosc liczy cenę litra dla każdego wiersza osobno. Alias ze spacją bierze cudzysłów: AS "cena jednostkowa". MySQL dzieli liczby całkowite z dokładnością do czterech miejsc: biały 4.0000, niebieski 11.6667, fioletowy 21.3333 - wartości jak w kluczu. Zrzut: kw2.jpg.

    kwerendy.txt Tekst zmienione: 3 linie
    -- Zapytanie 1
    SELECT cena, pojemnosc FROM farby WHERE kolor = "czerwony";
    
    -- Zapytanie 2
    SELECT kolor, cena / pojemnosc 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. 2 min
    Polecenie z arkusza

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

    Liczba puszek jest w malowanie, nazwa koloru w farby - łączysz je po id_farby. Kolumna o tej samej nazwie jest w obu tabelach, więc w warunku złączenia poprzedzasz ją nazwą tabeli. Wynik: zielony 2 i czerwony 2 - jak w kluczu. Zrzut: kw3.jpg.

    kwerendy.txt Tekst zmienione: 3 linie
    -- Zapytanie 1
    SELECT cena, pojemnosc FROM farby WHERE kolor = "czerwony";
    
    -- Zapytanie 2
    SELECT kolor, cena / pojemnosc AS "cena jednostkowa" FROM farby;
    
    -- Zapytanie 3
    SELECT kolor, liczba_puszek FROM malowanie JOIN farby ON malowanie.id_farby = farby.id_farby WHERE id_pomieszczenia = 3;
    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 zapisane pod nazwą zapytanie, które w bazie wygląda jak tabela: CREATE VIEW pomieszczenie1 AS SELECT ... - po AS zwykłe zapytanie z kolumnami i warunkiem z arkusza. Danych nie kopiuje: przy każdym otwarciu widok wykonuje swoje zapytanie od nowa. W phpMyAdmin pojawia się w lewym drzewie w gałęzi Widoki - klikasz go i robisz zrzut kw4.jpg z czterema wierszami: 1, 1, 3; 2, 3, 2; 3, 1, 3; 4, 1, 2.

    Typowe błędy

    Drugie wykonanie CREATE VIEW z tą samą nazwą kończy się błędem „Table already exists”. Poprawka widoku: CREATE OR REPLACE VIEW.

    kwerendy.txt Tekst zmienione: 3 linie
    -- Zapytanie 1
    SELECT cena, pojemnosc FROM farby WHERE kolor = "czerwony";
    
    -- Zapytanie 2
    SELECT kolor, cena / pojemnosc AS "cena jednostkowa" FROM farby;
    
    -- Zapytanie 3
    SELECT kolor, liczba_puszek FROM malowanie JOIN farby ON malowanie.id_farby = farby.id_farby WHERE id_pomieszczenia = 3;
    
    -- Zapytanie 4
    CREATE 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-20 · po tym etapie masz 20 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.

    Obraz ma 500 × 500 px. W GIMP-ie: Obraz → Skaluj obraz, 300 × 300 (obraz jest kwadratowy, więc łańcuch proporcji może zostać zamknięty). Potem Filtry → Rozmycie → Pikselizacja: obraz rozpada się na kwadratowe bloki jednolitego koloru - tu bloki po 15 px. Eksportuj jako obraz.png, nadpisując plik (R.2.1).

    Podgląd strony po tym kroku
    Podgląd strony po kroku 8
  9. Krok 9: Plik mieszamy.html w HTML5

    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.

    Zbuduj całą stronę mieszamy.html, a cena.html powstanie z jej kopii - różnią się tylko blokiem środkowym. <!DOCTYPE html> i szkielet strony.

    mieszamy.html HTML nowy plik
    <!DOCTYPE html>
    <html>
    <head>
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (mieszamy.html)
  10. Krok 10: Kodowanie polskich znaków

    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. 1 min
    Polecenie z arkusza

    Jawnie zastosowany właściwy standard kodowania polskich znaków.

    <meta charset="UTF-8"> jako pierwszy element <head>.

    mieszamy.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html>
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (mieszamy.html)
  11. Krok 11: Język strony

    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. 1 min
    Polecenie z arkusza

    Zadeklarowany język witryny: polski.

    lang="pl" w <html>.

    mieszamy.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (mieszamy.html)
  12. Krok 12: 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).

    mieszamy.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>malarz</title>
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (mieszamy.html)
  13. Krok 13: 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.

    Uwaga na nazwę: styl_1.css, z podkreśleniem i cyfrą.

    Typowe błędy

    styl.css (jak w większości arkuszy) zamiast styl_1.css odcina wszystkie style - klucz R.3.5 i cały rezultat R.4.

    mieszamy.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>malarz</title>
        <link rel="stylesheet" href="styl_1.css">
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (mieszamy.html)
  14. Krok 14: Bloki: baner, trzy bloki, 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.

    <header>, trzy <section> z identyfikatorami left, middle, right (po angielsku) i <footer> (R.2.4).

    mieszamy.html HTML zmienione: 10 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>malarz</title>
        <link rel="stylesheet" href="styl_1.css">
    </head>
    <body>
        <header>
        </header>
        <section id="left">
        </section>
        <section id="middle">
        </section>
        <section id="right">
        </section>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (mieszamy.html)
  15. Krok 15: Baner

    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

    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">
        <title>malarz</title>
        <link rel="stylesheet" href="styl_1.css">
    </head>
    <body>
        <header>
            <h1>Malowanie pokoi i biur</h1>
        </header>
        <section id="left">
        </section>
        <section id="middle">
        </section>
        <section id="right">
        </section>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (mieszamy.html)
  16. Krok 16: Blok lewy: menu z odnośnikami

    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.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>, a w każdym <li> odnośnik do drugiej podstrony. Ścieżki względne - same nazwy plików z tego samego folderu (R.2.6, R.3.2). W podglądzie kliknięcia są zablokowane.

    mieszamy.html HTML zmienione: 5 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>malarz</title>
        <link rel="stylesheet" href="styl_1.css">
    </head>
    <body>
        <header>
            <h1>Malowanie pokoi i biur</h1>
        </header>
        <section id="left">
            <h2>Menu</h2>
            <ul>
                <li><a href="mieszamy.html">Mieszamy</a></li>
                <li><a href="cena.html">Wyceniamy</a></li>
            </ul>
        </section>
        <section id="middle">
        </section>
        <section id="right">
        </section>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (mieszamy.html)
  17. Krok 17: 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).

    mieszamy.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>malarz</title>
        <link rel="stylesheet" href="styl_1.css">
    </head>
    <body>
        <header>
            <h1>Malowanie pokoi i biur</h1>
        </header>
        <section id="left">
            <h2>Menu</h2>
            <ul>
                <li><a href="mieszamy.html">Mieszamy</a></li>
                <li><a href="cena.html">Wyceniamy</a></li>
            </ul>
        </section>
        <section id="middle">
        </section>
        <section id="right">
            <img src="obraz.png" alt="Próbki farb">
        </section>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (mieszamy.html)
  18. Krok 18: Stopka

    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

    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 paragraf. Na egzaminie po dwukropku wpisujesz swój numer zdającego (PESEL).

    mieszamy.html HTML zmienione: 2 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>malarz</title>
        <link rel="stylesheet" href="styl_1.css">
    </head>
    <body>
        <header>
            <h1>Malowanie pokoi i biur</h1>
        </header>
        <section id="left">
            <h2>Menu</h2>
            <ul>
                <li><a href="mieszamy.html">Mieszamy</a></li>
                <li><a href="cena.html">Wyceniamy</a></li>
            </ul>
        </section>
        <section id="middle">
        </section>
        <section id="right">
            <img src="obraz.png" alt="Próbki farb">
        </section>
        <footer>
            <h3>MALARZ</h3>
            <p>Stronę opracował: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (mieszamy.html)
  19. Krok 19: 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.

    Pierwszy wiersz: komórka nagłówkowa „Składowe” połączona z drugą - colspan="2" - i „Wynik”. Dwa kolejne wiersze to zwykłe komórki <td>: żółty + czerwony = pomarańczowy, czerwony + niebieski = fioletowy (R.2.8, R.2.9).

    mieszamy.html HTML zmienione: 17 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>malarz</title>
        <link rel="stylesheet" href="styl_1.css">
    </head>
    <body>
        <header>
            <h1>Malowanie pokoi i biur</h1>
        </header>
        <section id="left">
            <h2>Menu</h2>
            <ul>
                <li><a href="mieszamy.html">Mieszamy</a></li>
                <li><a href="cena.html">Wyceniamy</a></li>
            </ul>
        </section>
        <section id="middle">
            <h2>Barwy i ich pochodne</h2>
            <table>
                <tr>
                    <th colspan="2">Składowe</th>
                    <th>Wynik</th>
                </tr>
                <tr>
                    <td>żółty</td>
                    <td>czerwony</td>
                    <td>pomarańczowy</td>
                </tr>
                <tr>
                    <td>czerwony</td>
                    <td>niebieski</td>
                    <td>fioletowy</td>
                </tr>
            </table>
        </section>
        <section id="right">
            <img src="obraz.png" alt="Próbki farb">
        </section>
        <footer>
            <h3>MALARZ</h3>
            <p>Stronę opracował: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (mieszamy.html)
  20. Krok 20: 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

    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)

    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.

    Zapisz mieszamy.html jako cena.html i podmień zawartość bloku środkowego:

    • napis przed polem w <label for="area">; „m²” to m<sup>2</sup> - indeks górny (R.2.10),
    • <input type="number"> - pole numeryczne: przeglądarka przyjmie tylko liczbę i doda strzałki (R.3.3),
    • przycisk z onclick="countCans()" - kliknięcie wywoła funkcję JavaScript, którą zaraz napiszesz (R.3.4),
    • pusty akapit <p id="result"> - tu skrypt wpisze wynik.

    Na razie kliknięcie kończy się błędem w konsoli przeglądarki - funkcji jeszcze nie ma.

    cena.html HTML nowy plik
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>malarz</title>
        <link rel="stylesheet" href="styl_1.css">
    </head>
    <body>
        <header>
            <h1>Malowanie pokoi i biur</h1>
        </header>
        <section id="left">
            <h2>Menu</h2>
            <ul>
                <li><a href="mieszamy.html">Mieszamy</a></li>
                <li><a href="cena.html">Wyceniamy</a></li>
            </ul>
        </section>
        <section id="middle">
            <h2>Zapotrzebowanie na farbę</h2>
            <label for="area">Powierzchnia malowania (m<sup>2</sup>):</label>
            <input type="number" id="area">
            <button onclick="countCans()">Policz</button>
            <p id="result"></p>
        </section>
        <section id="right">
            <img src="obraz.png" alt="Próbki farb">
        </section>
        <footer>
            <h3>MALARZ</h3>
            <p>Stronę opracował: Bartosz Bryniarski</p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (cena.html)
  21. Etap 3: Styl CSS

    Kroki 21-28 · po tym etapie masz 31 z 36 kryteriów (pkt)

    Krok 21: Plik styl_1.css: krój czcionki

    Kryteria:

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

    ok. 1 min
    Polecenie z arkusza

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

    Utwórz styl_1.css; selektor * (R.4.1).

    styl_1.css CSS nowy plik
    * {
        font-family: Cambria;
    }
    Podgląd strony po tym kroku (mieszamy.html)
  22. Krok 22: Baner i stopka

    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.3 Ustawiono biały kolor czcionki dla banera i stopki

    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;

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

    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.

    styl_1.css CSS zmienione: 6 linii
    * {
        font-family: Cambria;
    }
    header, footer {
        background-color: #829EB9;
        color: white;
        text-align: center;
        padding: 10px;
    }
    Podgląd strony po tym kroku (mieszamy.html)
  23. Krok 23: Bloki lewy i prawy

    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.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.5 Ustawiono wysokość 400px dla bloków lewego, środkowego i prawego

    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. 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.

    padding-top - tylko górny margines wewnętrzny. Wysokość bloku na stronie to 400 px treści plus 100 px marginesu.

    styl_1.css CSS zmienione: 6 linii
    * {
        font-family: Cambria;
    }
    header, footer {
        background-color: #829EB9;
        color: white;
        text-align: center;
        padding: 10px;
    }
    #left, #right {
        background-color: #B3C6D9;
        height: 400px;
        width: 25%;
        padding-top: 100px;
    }
    Podgląd strony po tym kroku (mieszamy.html)
  24. Krok 24: 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.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.5 Ustawiono wysokość 400px dla bloków lewego, środkowego i prawego

    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;

    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.

    25% + 50% + 25% = 100% szerokości - bez poziomych marginesów, żeby bloki zmieściły się obok siebie.

    styl_1.css CSS zmienione: 7 linii
    * {
        font-family: Cambria;
    }
    header, footer {
        background-color: #829EB9;
        color: white;
        text-align: center;
        padding: 10px;
    }
    #left, #right {
        background-color: #B3C6D9;
        height: 400px;
        width: 25%;
        padding-top: 100px;
    }
    #middle {
        background-color: #E0E9F1;
        height: 400px;
        width: 50%;
        text-align: center;
        padding-top: 100px;
    }
    Podgląd strony po tym kroku (mieszamy.html)
  25. Krok 25: Tabela: ramka, szerokość, wyśrodkowanie

    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.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;

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

    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 - „marginesy wyliczane przez przeglądarkę”: przy ustalonej szerokości (80%) przeglądarka dzieli wolne miejsce po równo na lewo i prawo, więc tabela staje na środku. border-collapse: collapse łączy ramki komórek w jedną linię.

    styl_1.css CSS zmienione: 6 linii
    * {
        font-family: Cambria;
    }
    header, footer {
        background-color: #829EB9;
        color: white;
        text-align: center;
        padding: 10px;
    }
    #left, #right {
        background-color: #B3C6D9;
        height: 400px;
        width: 25%;
        padding-top: 100px;
    }
    #middle {
        background-color: #E0E9F1;
        height: 400px;
        width: 50%;
        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)
  26. Krok 26: 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.

    td, th - ramki komórek. td:hover zmienia wygląd tylko zwykłej komórki pod kursorem; komórki nagłówkowe zostają bez zmian (klucz R.4.9: „jedynie na komórce tabeli”). Najedź na komórkę w podglądzie.

    styl_1.css CSS zmienione: 8 linii
    * {
        font-family: Cambria;
    }
    header, footer {
        background-color: #829EB9;
        color: white;
        text-align: center;
        padding: 10px;
    }
    #left, #right {
        background-color: #B3C6D9;
        height: 400px;
        width: 25%;
        padding-top: 100px;
    }
    #middle {
        background-color: #E0E9F1;
        height: 400px;
        width: 50%;
        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)
  27. Krok 27: 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 wypełnia szerokość bloku prawego - jest wtedy wyższy niż blok i może zachodzić na stopkę, co klucz wprost dopuszcza (R.3.1).

    styl_1.css CSS zmienione: 4 linie
    * {
        font-family: Cambria;
    }
    header, footer {
        background-color: #829EB9;
        color: white;
        text-align: center;
        padding: 10px;
    }
    #left, #right {
        background-color: #B3C6D9;
        height: 400px;
        width: 25%;
        padding-top: 100px;
    }
    #middle {
        background-color: #E0E9F1;
        height: 400px;
        width: 50%;
        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)
  28. Krok 28: Układ bloków zgodny z obrazem 2

    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. 2 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.

    section { float: left; } - trzy bloki obok siebie; footer { clear: both; } - stopka pod nimi (R.3.1).

    styl_1.css CSS zmienione: 6 linii
    * {
        font-family: Cambria;
    }
    footer {
        clear: both;
    }
    header, footer {
        background-color: #829EB9;
        color: white;
        text-align: center;
        padding: 10px;
    }
    section {
        float: left;
    }
    #left, #right {
        background-color: #B3C6D9;
        height: 400px;
        width: 25%;
        padding-top: 100px;
    }
    #middle {
        background-color: #E0E9F1;
        height: 400px;
        width: 50%;
        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)
  29. Etap 4: Skrypt JavaScript

    Kroki 29-32 · po tym etapie masz 36 z 36 kryteriów (pkt)

    Krok 29: Funkcja countCans wywoływana przyciskiem

    Kryteria:

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

    ok. 2 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 JavaScript piszesz w <script> na końcu <body> strony cena.html - wykonuje się w przeglądarce, bez serwera. Zdefiniuj funkcję o tej samej nazwie, co w onclick przycisku: countCans (policz puszki). Na razie jest pusta - kliknięcie „Policz” nie powoduje już błędu, ale niczego nie robi.

    cena.html HTML zmienione: 4 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>malarz</title>
        <link rel="stylesheet" href="styl_1.css">
    </head>
    <body>
        <header>
            <h1>Malowanie pokoi i biur</h1>
        </header>
        <section id="left">
            <h2>Menu</h2>
            <ul>
                <li><a href="mieszamy.html">Mieszamy</a></li>
                <li><a href="cena.html">Wyceniamy</a></li>
            </ul>
        </section>
        <section id="middle">
            <h2>Zapotrzebowanie na farbę</h2>
            <label for="area">Powierzchnia malowania (m<sup>2</sup>):</label>
            <input type="number" id="area">
            <button onclick="countCans()">Policz</button>
            <p id="result"></p>
        </section>
        <section id="right">
            <img src="obraz.png" alt="Próbki farb">
        </section>
        <footer>
            <h3>MALARZ</h3>
            <p>Stronę opracował: Bartosz Bryniarski</p>
        </footer>
        <script>
            function countCans() {
            }
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (cena.html)
  30. Krok 30: Odczyt powierzchni z pola

    Kryteria:

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

    ok. 1 min
    Polecenie z arkusza

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

    document.getElementById("area") znajduje pole po identyfikatorze (tabela 1 arkusza), a .value to jego zawartość. Zapisz ją w zmiennej area (powierzchnia) zadeklarowanej słowem let (R.5.2).

    cena.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>malarz</title>
        <link rel="stylesheet" href="styl_1.css">
    </head>
    <body>
        <header>
            <h1>Malowanie pokoi i biur</h1>
        </header>
        <section id="left">
            <h2>Menu</h2>
            <ul>
                <li><a href="mieszamy.html">Mieszamy</a></li>
                <li><a href="cena.html">Wyceniamy</a></li>
            </ul>
        </section>
        <section id="middle">
            <h2>Zapotrzebowanie na farbę</h2>
            <label for="area">Powierzchnia malowania (m<sup>2</sup>):</label>
            <input type="number" id="area">
            <button onclick="countCans()">Policz</button>
            <p id="result"></p>
        </section>
        <section id="right">
            <img src="obraz.png" alt="Próbki farb">
        </section>
        <footer>
            <h3>MALARZ</h3>
            <p>Stronę opracował: Bartosz Bryniarski</p>
        </footer>
        <script>
            function countCans() {
                let area = document.getElementById("area").value;
            }
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (cena.html)
  31. Krok 31: 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.

    Puszka (1 litr) maluje 4 m², więc liczba puszek to powierzchnia podzielona przez 4 (R.5.3). Puszek nie kupuje się w ułamkach: 6 / 4 = 1,5 to w praktyce 2 puszki. Math.ceil zaokrągla zawsze w górę (R.5.4). Pole ma wartość tekstową („10”), ale operator / w JavaScripcie sam zamienia ją na liczbę.

    Typowe błędy

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

    cena.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>malarz</title>
        <link rel="stylesheet" href="styl_1.css">
    </head>
    <body>
        <header>
            <h1>Malowanie pokoi i biur</h1>
        </header>
        <section id="left">
            <h2>Menu</h2>
            <ul>
                <li><a href="mieszamy.html">Mieszamy</a></li>
                <li><a href="cena.html">Wyceniamy</a></li>
            </ul>
        </section>
        <section id="middle">
            <h2>Zapotrzebowanie na farbę</h2>
            <label for="area">Powierzchnia malowania (m<sup>2</sup>):</label>
            <input type="number" id="area">
            <button onclick="countCans()">Policz</button>
            <p id="result"></p>
        </section>
        <section id="right">
            <img src="obraz.png" alt="Próbki farb">
        </section>
        <footer>
            <h3>MALARZ</h3>
            <p>Stronę opracował: Bartosz Bryniarski</p>
        </footer>
        <script>
            function countCans() {
                let area = document.getElementById("area").value;
                let cans = Math.ceil(area / 4);
            }
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (cena.html)
  32. Krok 32: 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.

    Wynik wpisujesz do pustego akapitu result przez innerHTML (tabela 1). Wpisz w podglądzie 10 i kliknij „Policz”: „Liczba potrzebnych puszek: 3” - jak na obrazie 3 (10 / 4 = 2,5, w górę 3) (R.5.5).

    cena.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>malarz</title>
        <link rel="stylesheet" href="styl_1.css">
    </head>
    <body>
        <header>
            <h1>Malowanie pokoi i biur</h1>
        </header>
        <section id="left">
            <h2>Menu</h2>
            <ul>
                <li><a href="mieszamy.html">Mieszamy</a></li>
                <li><a href="cena.html">Wyceniamy</a></li>
            </ul>
        </section>
        <section id="middle">
            <h2>Zapotrzebowanie na farbę</h2>
            <label for="area">Powierzchnia malowania (m<sup>2</sup>):</label>
            <input type="number" id="area">
            <button onclick="countCans()">Policz</button>
            <p id="result"></p>
        </section>
        <section id="right">
            <img src="obraz.png" alt="Próbki farb">
        </section>
        <footer>
            <h3>MALARZ</h3>
            <p>Stronę opracował: Bartosz Bryniarski</p>
        </footer>
        <script>
            function countCans() {
                let area = document.getElementById("area").value;
                let cans = Math.ceil(area / 4);
                document.getElementById("result").innerHTML = "Liczba potrzebnych puszek: " + cans;
            }
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (cena.html)
  33. Etap 5: Dobre praktyki (poza kluczem)

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

    Krok 33: Słuchacz zdarzenia, sprawdzenie wartości i textContent

    ok. 4 min
    Polecenie z arkusza

    Przycisk „Policz”, po jego wybraniu uruchamia się skrypt.

    Trzy poprawki z prawdziwych projektów:

    • addEventListener("click", countCans) zamiast atrybutu onclick w HTML: zachowanie przycisku jest w skrypcie, a HTML opisuje tylko wygląd. Przycisk dostaje identyfikator count.
    • Sprawdzenie wartości: puste pole albo liczba ujemna dawały „Liczba potrzebnych puszek: 0”. Number() zamienia tekst na liczbę (puste pole to 0), a warunek wypisuje prośbę o poprawną powierzchnię.
    • textContent zamiast innerHTML - wpisujesz zwykły tekst, więc nic nie zostanie zinterpretowane jako HTML.

    Stara linia z innerHTML zostaje w komentarzu. Na egzaminie wystarczy wersja wcześniejsza - klucz przyjmuje onclick (R.3.4) i tego nie sprawdza.

    cena.html HTML zmienione: 11 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <title>malarz</title>
        <link rel="stylesheet" href="styl_1.css">
    </head>
    <body>
        <header>
            <h1>Malowanie pokoi i biur</h1>
        </header>
        <section id="left">
            <h2>Menu</h2>
            <ul>
                <li><a href="mieszamy.html">Mieszamy</a></li>
                <li><a href="cena.html">Wyceniamy</a></li>
            </ul>
        </section>
        <section id="middle">
            <h2>Zapotrzebowanie na farbę</h2>
            <label for="area">Powierzchnia malowania (m<sup>2</sup>):</label>
            <input type="number" id="area">
            <button id="count">Policz</button>
            <p id="result"></p>
        </section>
        <section id="right">
            <img src="obraz.png" alt="Próbki farb">
        </section>
        <footer>
            <h3>MALARZ</h3>
            <p>Stronę opracował: Bartosz Bryniarski</p>
        </footer>
        <script>
            function countCans() {
                let area = Number(document.getElementById("area").value);
                let result = document.getElementById("result");
                if (area <= 0) {
                    result.textContent = "Podaj powierzchnię większą od zera.";
                    return;
                }
                let cans = Math.ceil(area / 4);
                result.textContent = "Liczba potrzebnych puszek: " + cans;
                // document.getElementById("result").innerHTML = "Liczba potrzebnych puszek: " + cans;
            }
    
            document.getElementById("count").addEventListener("click", countCans);
        </script>
    </body>
    </html>
    Podgląd strony po tym kroku (cena.html)
  34. Etap 6: Oddanie pracy

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

    Krok 34: 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.

    W przeglądarka.txt wpisujesz nazwę przeglądarki, w której sprawdzasz strony. Strony w tym arkuszu nie wymagają serwera - otwierają się wprost z dysku.

    Sprawdź listę plików z arkusza, nagraj płytę, sprawdź jej odczyt i opisz ją numerem zdającego.

    przeglądarka.txt Tekst nowy plik
    Google Chrome

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

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.