INF.03-02-25.01-SGStyczeń 2025 · 52 kroki · ok. 97 min · 40 kryteriów z klucza
Rozwiązanie krok po kroku: Strona firmy montażu paneli (Wersja podstawowa)
Rozwiązanie buduje stronę firmy montującej panele podłogowe: baza przewozy z osobami i zadaniami (baza i strona dotyczą w tym arkuszu różnych tematów - to dwie niezależne części) i cztery zapytania - wzorzec LIKE, wzorzec z sortowaniem, grupowanieGROUP BY z licznikiem i aliasem oraz usunięcie kolumnyALTER TABLE, potem grafika z napisem na przezroczystym tle i trzy zdjęcia paneli przeskalowane do 500 × 70 px, trzy strony HTML - index.html z rodzajami paneli, oferta.html z tabelą o scalonych komórkach i koszty.html z kalkulatorem - i style w style.css, z gradientami w nagłówku i stopce. PHP tu nie ma: skrypt działa w przeglądarce, w JavaScripcie - mnoży szerokość przez długość, dobiera stawkę do zaznaczonego rodzaju panelu i sprawdza, czy pola są wypełnione.
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, warunkami if i innerHTML, a na końcu zostaje przerobiony na wersję z prawdziwych projektów: słuchacz zdarzenia, stawki w obiekcie zamiast drabinki warunków, sprawdzenie liczb i textContent.
To jest wersja podstawowa. W zakładce „Nowoczesny kod (grid, osobny skrypt)” jest drugi sposób rozwiązania tego samego arkusza: kolory w zmiennych CSS, kalkulator ułożony siatką CSS zamiast <br>, stawki w obiekcie zamiast drabinki if i skrypt w osobnym pliku z nasłuchiwaczem zdarzenia i sprawdzeniem danych od pierwszej linii - obie wersje są zgodne z kluczem.
Baza i zdjęcia pochodzą z prawdziwego archiwum pliki12 (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 wymiary, zaznacz rodzaj panelu i kliknij „Oblicz”.
Jak liczą się punkty. Klucz ma 40 kryteriów (R.1.1 - R.5.9), każde za 1 punkt. Próg zdania części praktycznej to 75%, czyli 30 punktów - można stracić 10 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.
Suwak i strzałki obok niego - albo ←→ na klawiaturze - przechodzą krok po kroku; wyjaśnienie, pliki i podgląd zmieniają się razem z krokiem.
Lista „Etap” przenosi od razu do wybranego etapu.
„Rozwiązuję samodzielnie” chowa rozwiązanie kroku - najpierw własna próba, potem odsłonięcie.
„Tryb prezentacji” pokazuje same kroki, bez menu strony - na rzutnik.
Etap 1: Baza danych
Kroki 1-7 · po tym etapie masz 6 z 40 kryteriów (pkt)
Krok 1: Baza danych przewozy
Kryteria:
R.1.1 Wykonany import tabel do bazy danych przewozy, co jest udokumentowane w pliku import.png
ok. 2 min
Polecenie z arkusza
Utwórz bazę danych o nazwie przewozy, z zestawem polskich znaków (np. utf8_unicode_ci).
Rozpakuj pliki12.7z z pulpitu (hasło P@neLePodLoGowe!+, ze znakami na końcu) do folderu z numerem zdającego: baza.sql i trzy zdjęcia paneli. W phpMyAdmin: Nowa, nazwa przewozy, porównywanie z polskimi znakami, np. utf8_unicode_ci albo utf8mb4_polish_ci.
Krok 2: Import tabel z pliku baza.sql
Kryteria:
R.1.1 Wykonany import tabel do bazy danych przewozy, co jest udokumentowane w pliku import.png
ok. 2 min
Polecenie z arkusza
Do utworzonej bazy zaimportuj tabele z pliku baza.sql z rozpakowanego archiwum.
Wybierz bazę przewozy w lewym drzewie, potem Import → baza.sql → Wykonaj. Powstają dwie tabele z ilustracji 1: osoby (6 osób z imieniem, nazwiskiem i telefonem) i zadania (7 zadań z datą). Relacja 1..n: zadania.osoba_id → osoby.id_osoba - jedna osoba może mieć wiele zadań.
Krok 3: Zrzut ekranu import.png
Kryteria:
R.1.1 Wykonany import tabel do bazy danych przewozy, co jest udokumentowane w pliku import.png
ok. 2 min
Polecenie z arkusza
Wykonaj zrzut ekranu po imporcie. Zapisz zrzut w formacie PNG pod nazwą 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 i zapis jako import.png - tu wszystkie zrzuty są w PNG. Na zrzucie widać komunikat o udanym imporcie i dwie tabele w drzewie bazy.
Typowe błędy
Wykadrowany zrzut albo zrzut bez paska zadań nie jest oceniany (uwaga w kluczu przy R.1).
Krok 4: Zapytanie 1: osoby z imieniem na literę A
Kryteria: ,
R.1.2 Zapisany plik kwerendy.txt zawierający co najmniej jedno zapytanie SQL, wynikające z treści zadania
R.1.3 Wykonane zapytanie 1 wybierające jedynie imiona i nazwiska osób, których imiona rozpoczynają się od litery A. W pliku z kwerendami lub na zrzucie istnieje zapis np. SELECT imie, nazwisko FROM osoby WHERE imie LIKE "A%"; oraz wynik działania udokumentowany zrzutem, na którym widoczne są dokładnie 2 wiersze z danymi Anna A. oraz Arkadiusz G.
ok. 2 min
Polecenie z arkusza
Zapytanie 1: wybierające jedynie imiona i nazwiska osób, których imiona rozpoczynają się od litery A.
SELECT imie, nazwisko - „jedynie imiona i nazwiska”,
FROM osoby,
WHERE imie LIKE "A%" - LIKE porównuje ze wzorcem: A na początku, a % zastępuje dowolny ciąg znaków (także pusty). „Rozpoczynają się od A” to właśnie A%.
Wynik: Anna A. i Arkadiusz G. - dwa wiersze, jak w kluczu. Zapytanie zapisujesz w kwerendy.txt, zrzut jako kw1.png.
Typowe błędy
WHERE imie = "A%" szuka imienia dosłownie „A%” - znak % działa jako wzorzec tylko z LIKE.
kwerendy.txtTekstnowy plik
-- Zapytanie 1SELECT imie, nazwisko FROM osoby WHERE imie LIKE "A%";
Podgląd strony po tym kroku
Krok 5: Zapytanie 2: zadania z meblami według daty
Kryteria:
R.1.4 Wykonane zapytanie 2 wybierające jedynie nazwy zadań (pole zadanie ) i daty, w których nazwie zadania zawiera się słowo „mebli”, posortowane rosnąco według daty. W pliku z kwerendami lub na zrzucie istnieje zapis np. SELECT zadanie, data FROM zadania WHERE zadanie LIKE "%mebli%" ORDER BY data; (opcjonalnie ASC ) oraz wynik działania udokumentowany zrzutem, na którym widoczne są dokładnie 2 rekordy z datami 2019-11-06 i 2021-01-26
ok. 2 min
Polecenie z arkusza
Zapytanie 2: wybierające jedynie nazwy zadań (pole zadanie) i daty, w których w nazwie zadania zawiera się słowo „mebli”, posortowane rosnąco według daty.
SELECT zadanie, data FROM zadania,
WHERE zadanie LIKE "%mebli%" - „zawiera się”: % z obu stron, więc słowo może stać w dowolnym miejscu,
ORDER BY data - sortowanie rosnące jest domyślne, ASC można dopisać.
Wynik: dwa przewozy mebli, z datami 2019-11-06 i 2021-01-26 - jak w kluczu. Zrzut: kw2.png.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT imie, nazwisko FROM osoby WHERE imie LIKE "A%";-- Zapytanie 2SELECT zadanie, data FROM zadania WHERE zadanie LIKE "%mebli%" ORDER BY data;
Podgląd strony po tym kroku
Krok 6: Zapytanie 3: liczba zadań każdej osoby
Kryteria:
R.1.5 Wykonane zapytanie 3 wybierające jedynie pogrupowane nazwiska osób i odpowiadającą im liczbę zadań. Kolumna z liczbą zadań jest nazwana „Liczba zadań” (alias). W pliku z kwerendami lub na zrzucie istnieje zapis np. SELECT nazwisko, COUNT(zadania.id_zadania) AS "Liczba zadań" FROM osoby JOIN zadania ON id_osoba = osoba_id GROUP BY nazwisko; (możliwe również LEFTJOIN oraz porównanie kluczy po WHERE ) oraz wynik działania udokumentowany zrzutem, na którym są widoczne dokładnie 4 rekordy z danymi: A. 2; G. 2; K. 1; W. 2 lub 6 rekordów A. 2; C. 0; G. 2; K. 1; L. 0; W. 2
ok. 3 min
Polecenie z arkusza
Zapytanie 3: wybierające jedynie pogrupowane nazwiska osób i odpowiadającą im liczbę zadań. Kolumnie z liczbą zadań należy nadać nazwę (alias) „Liczba zadań”. Należy posłużyć się relacją.
FROM osoby JOIN zadania ON id_osoba = osoba_id - relacja: każde zadanie łączysz z osobą, która je wykonuje,
GROUP BY nazwisko - wiersze z tym samym nazwiskiem zwijają się w jeden,
COUNT(zadania.id_zadania) - w każdej grupie liczy, ile było zadań,
AS "Liczba zadań" - alias ze spacją i polską literą, więc w cudzysłowie.
Wynik: A. 2, G. 2, K. 1, W. 2 - cztery wiersze, jak w kluczu. Osoby bez zadań (C. i L.) przy zwykłym JOIN nie pojawiają się; z LEFT JOIN byłyby z liczbą 0 - klucz uznaje obie wersje. Zrzut: kw3.png.
Typowe błędy
COUNT(*) z LEFT JOIN liczy też wiersz osoby bez zadań - C. i L. dostałyby 1 zamiast 0. Przy LEFT JOIN licz kolumnę z tabeli zadania.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT imie, nazwisko FROM osoby WHERE imie LIKE "A%";-- Zapytanie 2SELECT zadanie, data FROM zadania WHERE zadanie LIKE "%mebli%" ORDER BY data;-- Zapytanie 3SELECT nazwisko, COUNT(zadania.id_zadania) AS "Liczba zadań" FROM osoby JOIN zadania ON id_osoba = osoba_id GROUP BY nazwisko;
Podgląd strony po tym kroku
Krok 7: Zapytanie 4: usunięcie kolumny telefon
Kryteria:
R.1.6 Wykonane zapytanie 4 usuwające kolumnę telefon z tabeli osoby . W pliku z kwerendami lub na zrzucie istnieje zapis np. ALTER TABLE osoby DROP COLUMN telefon; oraz wynik działania udokumentowany zrzutem, na którym jest widoczny komunikat o poprawnie wykonanym zapytaniu lub tabela osoby bez kolumny telefon
ok. 2 min
Polecenie z arkusza
Zapytanie 4: usuwające kolumnę telefon z tabeli osoby.
Zmiana budowy tabeli to ALTER TABLE, a usunięcie kolumny - DROP COLUMN z jej nazwą. Kolumna znika razem z danymi wszystkich wierszy, bez pytania o potwierdzenie. Na zrzucie kw4.png wystarczy komunikat o poprawnym wykonaniu albo podgląd tabeli osoby z trzema kolumnami.
Typowe błędy
DELETE telefon FROM osoby nie działa - DELETE usuwa wiersze, nie kolumny. Kolumny zmienia się tylko przez ALTER TABLE.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT imie, nazwisko FROM osoby WHERE imie LIKE "A%";-- Zapytanie 2SELECT zadanie, data FROM zadania WHERE zadanie LIKE "%mebli%" ORDER BY data;-- Zapytanie 3SELECT nazwisko, COUNT(zadania.id_zadania) AS "Liczba zadań" FROM osoby JOIN zadania ON id_osoba = osoba_id GROUP BY nazwisko;-- Zapytanie 4ALTER TABLE osoby DROP COLUMN telefon;
Podgląd strony po tym kroku
Etap 2: Grafika i strony HTML
Kroki 8-32 · po tym etapie masz 20 z 40 kryteriów (pkt)
Krok 8: Kolor napisu pobrany z laminowane.png
Kryteria:
R.2.2 Na grafice znajduje się napis "Montaż paneli podłogowych" zapisany czcionką bezszeryfową o dowolnym odcieniu koloru brązowego
ok. 3 min
Polecenie z arkusza
Kolor wypełnienia liter obrazu otrzymany z grafiki laminowane.png. Czynność tą udokumentuj zrzutem ekranu o nazwie kolor.png.
Otwórz laminowane.png w GIMP-ie i narzędziem Pipeta (klawisz O) kliknij w brązowe pole deski - pobrany kolor staje się kolorem pierwszoplanowym. Tu wyszedł #a26f3a. Teraz Print Screen z widocznym obrazem i oknem koloru i zapis jako kolor.png. Klucz uzna dowolny odcień brązu (R.2.2).
Podgląd strony po tym kroku
Krok 9: Grafika montaz_paneli.png
Kryteria: ,
R.2.1 Grafika z pliku montaz_paneli.png ma wymiary dokładnie: szerokość 400 px i wysokość 50 px oraz przezroczyste tło
R.2.2 Na grafice znajduje się napis "Montaż paneli podłogowych" zapisany czcionką bezszeryfową o dowolnym odcieniu koloru brązowego
ok. 4 min
Polecenie z arkusza
Przygotowanie grafiki o nazwie montaz_paneli.png: szerokość obrazu 400 px, wysokość 50 px, tło przezroczyste, napis "Montaż paneli podłogowych", pogrubioną czcionką bezszeryfową (sans-serif), w rozmiarze 27.
Plik → Nowy: 400 × 50 px, w opcjach zaawansowanych Wypełnienie: Przezroczystość. Narzędzie Tekst: czcionka bezszeryfowa pogrubiona, np. Arial Bold albo Sans-serif Bold, rozmiar 27 px, kolor - ten pobrany pipetą. Wpisz napis i wyrównaj go do środka obrazu. Eksportuj jakomontaz_paneli.png - format PNG zachowuje przezroczystość, JPEG by ją zamienił na biel (R.2.1, R.2.2).
Typowe błędy
Nowy obraz z domyślnym białym wypełnieniem nie ma przezroczystego tła - na stronie z gradientem widać biały prostokąt, a kryterium R.2.1 nie jest spełnione.
Podgląd strony po tym kroku
Krok 10: Trzy zdjęcia paneli: dokładnie 500 × 70 px
Kryteria:
R.2.3 Grafiki laminowane.png , winylowe.png, deska.png mają wymiary dokładnie: szerokość 500 px i wysokość 70 px
ok. 4 min
Polecenie z arkusza
Przygotowanie grafik laminowane.png, winylowe.png, deska.png: Obrazy należy przeskalować dokładnie do szerokości 500 px i wysokości 70 px.
Każde zdjęcie ma 480 × 300 px. Obraz → Skaluj obraz, rozpinasz łańcuch proporcji i wpisujesz 500 i 70 - zdjęcie się spłaszczy, ale arkusz wymaga dokładnie tych wymiarów. Eksportuj jako pod tą samą nazwą. Trzy razy, dla każdego pliku (R.2.3).
Typowe błędy
Przy zamkniętym łańcuchu po wpisaniu szerokości 500 GIMP sam wylicza wysokość 313 - obraz ma złe wymiary i kryterium R.2.3 przepada.
Podgląd strony po tym kroku
Krok 11: Plik index.html w HTML5
Kryteria:
R.2.4 Witryna internetowa zapisana w plikach index.html, oferta.html i koszty.html oraz zapisany jawnie standard kodowania polskich znaków, deklaracja HTML5 <!DOCTYPE HTML>, zadeklarowany język witryny: polski np. <html lang="pl"> oraz nadany tytuł strony "Montaż paneli podłogowych". Strona zawiera sekcje head i body
ok. 2 min
Polecenie z arkusza
Cechy witryny: Składa się z podstron o nazwach index.html, oferta.html i koszty.html. Cechy wspólne dla stron: Zapisane w języku HTML5.
Zbuduj całą stronę index.html, a oferta.html i koszty.html powstaną z jej kopii - różnią się tylko blokiem głównym.
R.2.4 Witryna internetowa zapisana w plikach index.html, oferta.html i koszty.html oraz zapisany jawnie standard kodowania polskich znaków, deklaracja HTML5 <!DOCTYPE HTML>, zadeklarowany język witryny: polski np. <html lang="pl"> oraz nadany tytuł strony "Montaż paneli podłogowych". Strona zawiera sekcje head i body
R.2.4 Witryna internetowa zapisana w plikach index.html, oferta.html i koszty.html oraz zapisany jawnie standard kodowania polskich znaków, deklaracja HTML5 <!DOCTYPE HTML>, zadeklarowany język witryny: polski np. <html lang="pl"> oraz nadany tytuł strony "Montaż paneli podłogowych". Strona zawiera sekcje head i body
ok. 1 min
Polecenie z arkusza
Jawnie zastosowany właściwy standard kodowania polskich znaków.
<meta charset="UTF-8"> jako pierwszy element <head>.
R.2.4 Witryna internetowa zapisana w plikach index.html, oferta.html i koszty.html oraz zapisany jawnie standard kodowania polskich znaków, deklaracja HTML5 <!DOCTYPE HTML>, zadeklarowany język witryny: polski np. <html lang="pl"> oraz nadany tytuł strony "Montaż paneli podłogowych". Strona zawiera sekcje head i body
ok. 1 min
Polecenie z arkusza
Tytuł strony widoczny na karcie przeglądarki: „Montaż paneli podłogowych”.
R.3.5 Strona zawiera działające połączenie z zewnętrznym arkuszem stylów o nazwie style.css formatowanie CSS 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 style.css prawidłowo połączony z kodem strony.
Nazwa w tym arkuszu: style.css, z „e” na końcu.
Typowe błędy
styl.css zamiast style.css odcina wszystkie style - kryterium R.3.5, a rezultat R.4 jest wtedy oceniany tylko z kodu.
R.2.5 Zdefiniowany układ strony dzielący ją na bloki: nagłówkowy, menu, główny i stopki przy pomocy semantycznych znaczników sekcji języka HTML5 zgodnie z ich znaczeniem, w tym do części nagłówkowej - header, do stopki - footer. Dopuszcza się dodatkowe użycie bloków div lub section
ok. 2 min
Polecenie z arkusza
Podział strony na bloki: nagłówkowy, poniżej menu, poniżej główny, na dole stopka. Podział zrealizowany za pomocą semantycznych znaczników sekcji języka HTML5 tak, aby po uruchomieniu w przeglądarce wygląd układu bloków był zgodny z ilustracją 3.
<header> - nagłówek strony, <nav> - menu, <main> - treść główna, <footer> - stopka. Klucz wymaga znaczników semantycznych, w tym wprost header i footer (R.2.5). Bloki stoją jeden pod drugim bez żadnego pozycjonowania.
Zawartość Menu: Odnośnik "Strona Główna" prowadzący do strony index.html. Odnośnik "Oferta" prowadzący do strony oferta.html. Odnośnik "Kalkulator kosztów" prowadzący do strony koszty.html.
Trzy znaczniki <a> ze ścieżkami względnymi - same nazwy plików z tego samego folderu (R.3.2). W podglądzie kliknięcia są zablokowane.
R.2.6 W bloku głównym umieszczony przynajmniej jeden <h1>: "Panele podłogowe" (główna) lub "Koszt montażu paneli podłogowych" (oferta), lub "Kalkulator kosztów montażu" (koszty); w stopce umieszczony <h5> z numerem zdającego oraz umieszczone 3 paragrafy na stronie głównej w bloku głównym
ok. 1 min
Polecenie z arkusza
Zawartość stopki: nagłówek piątego stopnia o treści "Autor strony: ", dalej wstawiony numer zdającego.
Tym razem nie akapit, lecz nagłówek <h5>. Na egzaminie po dwukropku wpisujesz swój numer zdającego (PESEL) - tutaj stoi imię i nazwisko autora rozwiązania.
R.2.6 W bloku głównym umieszczony przynajmniej jeden <h1>: "Panele podłogowe" (główna) lub "Koszt montażu paneli podłogowych" (oferta), lub "Kalkulator kosztów montażu" (koszty); w stopce umieszczony <h5> z numerem zdającego oraz umieszczone 3 paragrafy na stronie głównej w bloku głównym
ok. 1 min
Polecenie z arkusza
Zawartość bloku głównego strony index.html: Nagłówek pierwszego stopnia o treści "Panele podłogowe".
R.2.6 W bloku głównym umieszczony przynajmniej jeden <h1>: "Panele podłogowe" (główna) lub "Koszt montażu paneli podłogowych" (oferta), lub "Kalkulator kosztów montażu" (koszty); w stopce umieszczony <h5> z numerem zdającego oraz umieszczone 3 paragrafy na stronie głównej w bloku głównym
R.2.8 W bloku głównym strony głównej umieszczone 3 obrazy z plików laminowane.png , winylowe.png i deska.png , każdy z nich zawiera tekst alternatywny
ok. 1 min
Polecenie z arkusza
Obraz laminowane.png, z tekstem alternatywnym „Laminowane”. Akapit o treści "Panele laminowane".
R.2.6 W bloku głównym umieszczony przynajmniej jeden <h1>: "Panele podłogowe" (główna) lub "Koszt montażu paneli podłogowych" (oferta), lub "Kalkulator kosztów montażu" (koszty); w stopce umieszczony <h5> z numerem zdającego oraz umieszczone 3 paragrafy na stronie głównej w bloku głównym
R.2.8 W bloku głównym strony głównej umieszczone 3 obrazy z plików laminowane.png , winylowe.png i deska.png , każdy z nich zawiera tekst alternatywny
ok. 1 min
Polecenie z arkusza
Obraz deska.png, z tekstem alternatywnym „Deska”. Akapit o treści "Deska podłogowa".
Trzecia para. Klucz sprawdza trzy obrazy z tekstami alternatywnymi i trzy akapity w bloku głównym (R.2.6, R.2.8).
R.2.6 W bloku głównym umieszczony przynajmniej jeden <h1>: "Panele podłogowe" (główna) lub "Koszt montażu paneli podłogowych" (oferta), lub "Kalkulator kosztów montażu" (koszty); w stopce umieszczony <h5> z numerem zdającego oraz umieszczone 3 paragrafy na stronie głównej w bloku głównym
ok. 2 min
Polecenie z arkusza
Zawartość bloku głównego strony oferta.html: Nagłówek pierwszego stopnia o treści "Koszt montażu paneli podłogowych".
Zapisz index.html jako oferta.html - nagłówek, menu i stopka zostają - i w <main> zostaw tylko nowy <h1>.
Krok 25: Tabela: dwa wiersze nagłówka ze scalonymi komórkami
Kryteria:
R.2.9 W bloku głównym strony z ofertą umieszczona tabela o 4 kolumnach i 5 wierszach, zastosowane znaczniki <table>, <tr>, <td> oraz układ tabeli jest zgodny z ilustracją 4 arkusza egzaminacyjnego, zastosowane atrybuty rowspan i colspan
ok. 4 min
Polecenie z arkusza
Tabela o 4 kolumnach i 5 wierszach, z czego niektóre wiersze / kolumny są scalone. Treść i wygląd tabeli przedstawiony jest na ilustracji 4.
Na ilustracji 4 nagłówek tabeli zajmuje dwa wiersze:
„Rodzaj paneli” i „Koszt montażu” sięgają przez oba wiersze - rowspan="2" scala komórki w pionie,
„Rozmiar” zajmuje dwie kolumny - colspan="2" scala w poziomie,
drugi wiersz ma więc tylko dwie komórki: „Szerokość” i „Długość” - pozostałe miejsca zajmują już komórki scalone z pierwszego wiersza.
Na ilustracji napisy nie są pogrubione, więc to zwykłe komórki <td> (R.2.9).
Typowe błędy
Dopisanie w drugim wierszu czterech komórek, mimo scalenia, wypycha tabelę o kolumnę w prawo - komórka scalona rowspan już zajmuje swoje miejsce w wierszu poniżej.
R.2.9 W bloku głównym strony z ofertą umieszczona tabela o 4 kolumnach i 5 wierszach, zastosowane znaczniki <table>, <tr>, <td> oraz układ tabeli jest zgodny z ilustracją 4 arkusza egzaminacyjnego, zastosowane atrybuty rowspan i colspan
ok. 3 min
Polecenie z arkusza
Treść i wygląd tabeli przedstawiony jest na ilustracji 4.
Trzy zwykłe wiersze po cztery komórki, z danymi z ilustracji 4. Razem 5 wierszy i 4 kolumny - jak w arkuszu (R.2.9). Ostatnia kolumna to stawki za m², których użyje skrypt: 12, 14 i 18 zł.
R.2.6 W bloku głównym umieszczony przynajmniej jeden <h1>: "Panele podłogowe" (główna) lub "Koszt montażu paneli podłogowych" (oferta), lub "Kalkulator kosztów montażu" (koszty); w stopce umieszczony <h5> z numerem zdającego oraz umieszczone 3 paragrafy na stronie głównej w bloku głównym
ok. 1 min
Polecenie z arkusza
Zawartość bloku głównego strony koszty.html: Nagłówek pierwszego stopnia o treści "Kalkulator kosztów montażu".
Trzecia kopia, koszty.html, z nowym <h1> w bloku głównym.
R.2.10 W bloku głównym strony z kosztami umieszczone dwa pola edycyjne, trzy pola opcji i przycisk "Oblicz". Przynajmniej z jednym polem powiązana etykieta <label>
R.3.4 Na stronie koszty pola edycyjne są typu number, a pola opcji typu radio. W jednym momencie może być zaznaczona tylko jedna opcja (np. mają ustawioną tę samą wartość atrybutu name )
ok. 2 min
Polecenie z arkusza
Obok siebie dwa pola edycyjne typu numerycznego poprzedzone etykietami: „Szerokość pomieszczenia [m]: ", "Długość pomieszczenia [m]: ".
Etykieta <label for> i pole <input type="number"> - dwa razy. Etykiety i pola są elementami liniowymi, więc bez <br> stoją obok siebie w jednym wierszu, jak na ilustracji 5 (R.2.10, R.3.4). Identyfikatory po angielsku: width i length.
R.2.10 W bloku głównym strony z kosztami umieszczone dwa pola edycyjne, trzy pola opcji i przycisk "Oblicz". Przynajmniej z jednym polem powiązana etykieta <label>
R.3.4 Na stronie koszty pola edycyjne są typu number, a pola opcji typu radio. W jednym momencie może być zaznaczona tylko jedna opcja (np. mają ustawioną tę samą wartość atrybutu name )
ok. 3 min
Polecenie z arkusza
Jedno pod drugim trzy pola opcji z etykietami o treści: "Panele laminowane", "Panele winylowe", "Deska podłogowa". Pola są zgrupowane tak, że w jednym momencie można zaznaczyć tylko jedno pole.
Pole opcji to <input type="radio">. Grupę tworzy wspólna wartość atrybutu name: wszystkie trzy mają name="panel", więc zaznaczenie jednego odznacza pozostałe (R.3.4). Każde ma własne id - po nim skrypt sprawdzi, które jest zaznaczone. <br> układa je jedno pod drugim. Kliknij kolejne opcje w podglądzie.
Typowe błędy
Różne wartości name (albo brak name) robią z pól trzy niezależne przełączniki - da się zaznaczyć wszystkie naraz i kryterium R.3.4 przepada.
R.2.10 W bloku głównym strony z kosztami umieszczone dwa pola edycyjne, trzy pola opcji i przycisk "Oblicz". Przynajmniej z jednym polem powiązana etykieta <label>
R.3.3 Na stronie koszty zdefiniowane dla przycisku zdarzenie związane z jego wciśnięciem, uruchamiające funkcję skryptu (obsługa zdarzenia zdefiniowana w HTML np. onClick lub w skrypcie np.addEventListener zmienna.onClick = …)
ok. 1 min
Polecenie z arkusza
Poniżej przycisk o treści "Oblicz", którego wybranie uruchamia skrypt.
<button> z onclick="calculate()" - kliknięcie wywoła funkcję JavaScript, którą napiszesz w części o skrypcie (R.3.3). Na razie kliknięcie kończy się błędem w konsoli - funkcji jeszcze nie ma.
R.4.3 Ustawione gradienty liniowe pionowe: dla bloku nagłówkowego od koloru #A0522D do #F5DEB3 np. linear-gradient(#A0522D, #F5DEB3) oraz dla stopki od koloru #F5DEB3 do #A0522D np. linear-gradient(#F5DEB3, #A0522D)
R.4.6 Ustawione marginesy wewnętrzne (padding) 30px dla bloków nagłówkowego i stopki, 14px dla bloku menu, 50px dla bloku głównego, 10px dla odnośnika i 5px dla selektora td
ok. 2 min
Polecenie z arkusza
Dla bloku nagłówkowego: marginesy wewnętrzne 30 px, gradient pionowy od koloru #A0522D do koloru #F5DEB3.
Gradient to w CSS obraz tła: background-image: linear-gradient(kolor1, kolor2). Bez podanego kierunku przejście biegnie z góry na dół - czyli jest pionowe (opis w ramce „CSS Linear Gradients” arkusza). Od rdzawego #A0522D u góry do pszenicznego #F5DEB3 na dole (R.4.3, R.4.6).
Typowe błędy
background-color: linear-gradient(#A0522D, #F5DEB3) nie działa - gradient jest obrazem, więc należy do background-image (albo skrótu background).
R.4.2 Ustawiony kolor tła Wheat dla bloku menu i głównego oraz kolor tła Sienna i kolor czcionki biały dla selektora a
R.4.6 Ustawione marginesy wewnętrzne (padding) 30px dla bloków nagłówkowego i stopki, 14px dla bloku menu, 50px dla bloku głównego, 10px dla odnośnika i 5px dla selektora td
ok. 1 min
Polecenie z arkusza
Dla bloku menu: kolor tła Wheat, marginesy wewnętrzne 14 px.
Wheat to nazwa koloru w CSS - ten sam pszeniczny odcień, co #F5DEB3, w którym kończy się gradient nagłówka.
R.4.2 Ustawiony kolor tła Wheat dla bloku menu i głównego oraz kolor tła Sienna i kolor czcionki biały dla selektora a
R.4.6 Ustawione marginesy wewnętrzne (padding) 30px dla bloków nagłówkowego i stopki, 14px dla bloku menu, 50px dla bloku głównego, 10px dla odnośnika i 5px dla selektora td
ok. 1 min
Polecenie z arkusza
Dla bloku głównego: kolor tła Wheat, marginesy wewnętrzne 50 px.
To samo tło, co menu - na ilustracji 3 oba bloki zlewają się w jedno pole.
R.4.3 Ustawione gradienty liniowe pionowe: dla bloku nagłówkowego od koloru #A0522D do #F5DEB3 np. linear-gradient(#A0522D, #F5DEB3) oraz dla stopki od koloru #F5DEB3 do #A0522D np. linear-gradient(#F5DEB3, #A0522D)
R.4.6 Ustawione marginesy wewnętrzne (padding) 30px dla bloków nagłówkowego i stopki, 14px dla bloku menu, 50px dla bloku głównego, 10px dla odnośnika i 5px dla selektora td
ok. 1 min
Polecenie z arkusza
Dla stopki: marginesy wewnętrzne 30 px, gradient pionowy od koloru #F5DEB3 do koloru #A0522D.
Kolory zamienione miejscami: jasny u góry przechodzi w ciemny na dole strony (R.4.3, R.4.6).
R.4.2 Ustawiony kolor tła Wheat dla bloku menu i głównego oraz kolor tła Sienna i kolor czcionki biały dla selektora a
R.4.5 Ustawione cechy czcionki dla odnośnika: czcionka pogrubiona, bez podkreślenia
R.4.6 Ustawione marginesy wewnętrzne (padding) 30px dla bloków nagłówkowego i stopki, 14px dla bloku menu, 50px dla bloku głównego, 10px dla odnośnika i 5px dla selektora td
R.4.7 Ustawione marginesy zewnętrzne (margin) auto dla tabeli, 20px dla odnośnika
ok. 2 min
Polecenie z arkusza
Dla selektora odnośnika: kolor tła Sienna, biały kolor czcionki, czcionka pogrubiona, bez podkreślenia, marginesy wewnętrzne 10 px, zewnętrzne 20 px.
Tym razem selektor znacznika a - arkusz wymaga go wprost. „Bez podkreślenia” to text-decoration: none (R.4.2, R.4.5, R.4.6, R.4.7).
R.4.9 Ustawione dla tabeli i komórki tabeli obramowanie 1px solid Sienna oraz dla tabeli obramowanie połączone border-collapse: collapse;
ok. 2 min
Polecenie z arkusza
Wspólne dla selektora tabeli i selektora komórki tabeli: obramowanie o szerokości 1px linią ciągłą koloru Sienna, obramowanie połączone w jedną linię.
Jedna reguła dla dwóch selektorów: table, td. border-collapse: collapse łączy podwójne ramki sąsiednich komórek w jedną linię, jak na ilustracji 4 (R.4.9).
R.4.7 Ustawione marginesy zewnętrzne (margin) auto dla tabeli, 20px dla odnośnika
ok. 1 min
Polecenie z arkusza
Dodatkowo dla selektora tabeli: szerokość 70%, marginesy zewnętrzne automatycznie wyliczane przez przeglądarkę.
margin: auto - przy ustalonej szerokości 70% przeglądarka dzieli wolne miejsce po równo na lewo i prawo, więc tabela staje na środku. Samo text-align: center z body tabeli nie przesunie, bo wyrównuje tylko zawartość linii (R.4.4, R.4.7).
R.4.6 Ustawione marginesy wewnętrzne (padding) 30px dla bloków nagłówkowego i stopki, 14px dla bloku menu, 50px dla bloku głównego, 10px dla odnośnika i 5px dla selektora td
ok. 1 min
Polecenie z arkusza
Dla selektora komórki tabeli: marginesy wewnętrzne 5 px.
R.3.1 Układ bloków po uruchomieniu w przeglądarce jest zgodny z ilustracją 3 w arkuszu egzaminacyjnym
ok. 2 min
Polecenie z arkusza
Uwaga: styl CSS ciała strony, odnośnika, tabeli i komórki tabeli należy zdefiniować wyłącznie przy pomocy selektora tych znaczników. Jest to uwarunkowane projektem późniejszej rozbudowy witryny.
Sprawdź całość na index.html: nagłówek z gradientem, menu i blok główny w kolorze Wheat, stopka z odwróconym gradientem - bloki stoją jeden pod drugim, zgodnie z ilustracją 3 (R.3.1). Style body, a, table i td są zapisane selektorami znaczników, bez klas - klucz uznaje R.4.2, R.4.4, R.4.6 i R.4.8 tylko w tej postaci.
Podgląd strony po tym kroku (index.html)
Etap 4: Skrypt JavaScript
Kroki 45-50 · po tym etapie masz 40 z 40 kryteriów (pkt)
Krok 45: Funkcja calculate wywoływana przyciskiem
Kryteria:
R.5.1 Skrypt jest napisany w języku JavaScript i zawiera przynajmniej jedną poprawną składniowo instrukcję wynikającą z treści zadania
ok. 1 min
Polecenie z arkusza
Wykonywany po stronie klienta, na stronie koszty.html po kliknięciu przycisku „Oblicz”.
Skrypt w <script> na końcu <body> strony koszty.html - wykonuje się w przeglądarce. Funkcja ma tę samą nazwę, co w onclick przycisku: calculate. Na razie jest pusta.
R.5.2 Skrypt pobiera dane z przynajmniej jednego pola edycyjnego oraz wykorzystuje pole .value obiektu
ok. 2 min
Polecenie z arkusza
Skrypt pobiera dane z pól edycyjnych i pól opcji.
document.getElementById znajduje pole po identyfikatorze, a .value to jego zawartość - wpisany tekst, np. „4”. Puste pole daje pusty napis "" - z tego skorzystasz przy sprawdzaniu (R.5.2).
R.5.6 Jeżeli jedno z pól edycyjnych jest puste, skrypt wyświetla dowolną metodą tekst: "Wprowadź poprawne dane."
R.5.8 Przynajmniej jeden tekst jest wyświetlany w paragrafie pod przyciskiem
ok. 2 min
Polecenie z arkusza
Jeżeli oba pola edycyjne zostały wypełnione, skrypt oblicza pole powierzchni pomieszczenia i koszt montażu. W przeciwnym wypadku skrypt wyświetla komunikat "Wprowadź poprawne dane."
&& (i) - oba pola muszą być niepuste. Gdy któregoś brakuje, gałąź else wpisuje komunikat do akapitu result przez innerHTML. Kliknij „Oblicz” w podglądzie przy pustych polach (R.5.6, R.5.8).
Typowe błędy
|| (lub) zamiast && przepuszcza jedno puste pole - skrypt liczy wtedy pole powierzchni 0.
R.5.3 Skrypt pobiera dane z przynajmniej jednego pola opcji oraz wykorzystuje pole .checked obiektu
R.5.5 Koszt montażu policzony jako wynik mnożenia pola powierzchni przez 12, jeśli wybrano panel laminowany lub przez 14, jeśli wybrano panel winylowy, lub przez 18, jeśli wybrano deskę podłogową
ok. 3 min
Polecenie z arkusza
Oblicza koszt montażu uwzględniając pole powierzchni oraz typ panelu i koszt z tabeli 1.
Właściwość checked pola opcji ma wartość true, gdy pole jest zaznaczone. Z grupy zaznaczone może być tylko jedno, więc wystarczy drabinka if ... else if: stawka z tabeli 1 - 12 zł/m² za laminowane, 14 za winylowe, 18 za deskę - razy pole powierzchni (R.5.3, R.5.5).
R.5.7 Jeżeli oba pola edycyjne są wypełnione, skrypt wyświetla tekst: "Pole powierzchni pomieszczenia: <pole>, koszt montażu <koszt>”, gdzie pola <> oznaczają wartości obliczone skryptem
R.5.8 Przynajmniej jeden tekst jest wyświetlany w paragrafie pod przyciskiem
R.5.9 W skryptach zastosowana przynajmniej jedna zmienna lub funkcja oraz nazwy wszystkich funkcji i zmiennych są w języku polskim lub angielskim i odzwierciedlają cel zastosowania
ok. 2 min
Polecenie z arkusza
W paragrafie pod przyciskiem wyświetla napis: „Pole powierzchni pomieszczenia: <pole>, koszt montażu <koszt>”, gdzie pola <> oznaczają wartości obliczone skryptem.
Napis składasz operatorem + i wpisujesz do akapitu result. Wpisz w podglądzie 4 i 3, zaznacz „Deska podłogowa” i kliknij „Oblicz”: „Pole powierzchni pomieszczenia: 12, koszt montażu 216” (12 × 18) - jak na ilustracji 5 (R.5.7, R.5.8). Zmienne nazwane po angielsku mówią, co przechowują (R.5.9).
Krok 51 · po tym etapie masz 40 z 40 kryteriów (pkt)
Krok 51: Stawki w obiekcie, sprawdzenie danych, słuchacz zdarzenia
ok. 5 min
Polecenie z arkusza
Przycisk "Oblicz", którego wybranie uruchamia skrypt.
Poprawki z prawdziwych projektów:
Stawki w obiekcieRATES zamiast drabinki if: pola opcji dostają value, a querySelector('input[name="panel"]:checked') od razu zwraca zaznaczone. Nowy rodzaj paneli to jedna linia w obiekcie i jedno pole w HTML.
Sprawdzenie danych: wersja z egzaminu przepuszczała ujemne wymiary i brak zaznaczonego panelu (koszt 0). Number() zamienia tekst na liczbę, a warunek odrzuca wymiary nie większe od zera i brak wyboru.
addEventListener zamiast onclick w HTML i textContent zamiast innerHTML.
Wersja z egzaminu zostaje w komentarzu pod nową. Na egzaminie wystarczy wersja wcześniejsza - klucz sprawdza .value, .checked i komunikat dla pustego pola (R.5.2, R.5.3, R.5.6), a dodatkowych zabezpieczeń nie wymaga.
koszty.htmlHTMLzmienione: 24 linie
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Montaż paneli podłogowych</title> <linkrel="stylesheet"href="style.css"></head><body> <header> <imgsrc="montaz_paneli.png"alt="firma usługowa"> </header> <nav> <ahref="index.html">Strona Główna</a> <ahref="oferta.html">Oferta</a> <ahref="koszty.html">Kalkulator kosztów</a> </nav> <main> <h1>Kalkulator kosztów montażu</h1> <labelfor="width">Szerokość pomieszczenia [m]: </label> <inputtype="number"id="width"> <labelfor="length">Długość pomieszczenia [m]: </label> <inputtype="number"id="length"> <p>Typ panelu</p> <inputtype="radio"name="panel"id="laminated"value="laminated"> <labelfor="laminated">Panele laminowane</label><br> <inputtype="radio"name="panel"id="vinyl"value="vinyl"> <labelfor="vinyl">Panele winylowe</label><br> <inputtype="radio"name="panel"id="board"value="board"> <labelfor="board">Deska podłogowa</label><br> <buttonid="calculate">Oblicz</button> <pid="result"></p> </main> <footer> <h5>Autor strony: Bartosz Bryniarski</h5> </footer> <script>const RATES = { laminated: 12, vinyl: 14, board: 18 };function calculate() {let width = Number(document.getElementById("width").value);let length = Number(document.getElementById("length").value);let panel = document.querySelector('input[name="panel"]:checked');let result = document.getElementById("result");if (width <= 0 || length <= 0 || panel == null) { result.textContent = "Wprowadź poprawne dane.";return; }let area = width * length;let cost = area * RATES[panel.value]; result.textContent = "Pole powierzchni pomieszczenia: " + area + ", koszt montażu " + cost; }document.getElementById("calculate").addEventListener("click", calculate);/* Wersja z egzaminu: function calculate() { let width = document.getElementById("width").value; let length = document.getElementById("length").value; if (width != "" && length != "") { let area = width * length; let cost = 0; if (document.getElementById("laminated").checked) { cost = area * 12; } else if (document.getElementById("vinyl").checked) { cost = area * 14; } else if (document.getElementById("board").checked) { cost = area * 18; } document.getElementById("result").innerHTML = "Pole powierzchni pomieszczenia: " + area + ", koszt montażu " + cost; } else { document.getElementById("result").innerHTML = "Wprowadź poprawne dane."; } } */ </script></body></html>
Podgląd strony po tym kroku (koszty.html)
Etap 6: Oddanie pracy
Krok 52 · po tym etapie masz 40 z 40 kryteriów (pkt)
Krok 52: Plik przeglądarka.txt i nagranie płyty
ok. 5 min
Polecenie z arkusza
Po zakończeniu pracy utwórz 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 przeglądarka.txt wpisujesz nazwę przeglądarki, w której sprawdzasz strony.
W folderze z numerem zdającego muszą być: trzy strony HTML, style.css, kwerendy.txt, zrzuty import.png, kw1.png - kw4.png i kolor.png, grafika montaz_paneli.png i trzy przeskalowane zdjęcia paneli. Nagraj płytę, sprawdź jej odczyt i opisz ją numerem zdającego.
Symulacja ekranu w przeglądarce - w Android Studio / Visual Studio wygląd może się nieco różnić.
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: Bartosz Bryniarski. 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.