INF.03-01-25.01-SGStyczeń 2025 · 47 kroków · ok. 88 min · 40 kryteriów z klucza
Rozwiązanie krok po kroku: Witryna firmy szkoleniowej (Wersja podstawowa)
Rozwiązanie buduje stronę firmy szkoleniowej z kursami programowania: baza obuwie (tak, w tym arkuszu baza dotyczy butów, a strona kursów - te części są od siebie niezależne) i cztery zapytania - warunek, złączenie tabel, utworzenie kontaCREATE USER i nadanie uprawnieńGRANT, potem baner wycięty ze zdjęcia klawiatury z napisem, dwie strony HTML - index.html z tabelą kursów i adresem oraz raty.html z kalkulatorem rat - i style w style.css. PHP tu nie ma: skrypt działa w przeglądarce, w JavaScripcie - sprawdza zaznaczone kursy, dzieli kwotę przez liczbę rat i wypisuje zdanie z miastem.
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 liczby rat, zaokrąglenie do groszy 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, tabela z częścią nagłówkową, kalkulator ułożony siatką CSS zamiast <br> i skrypt w osobnym pliku z nasłuchiwaczem zdarzenia, sprawdzeniem danych i kwotami w polskim formacie od pierwszej linii - obie wersje są zgodne z kluczem.
Baza i zdjęcie pochodzą z prawdziwego archiwum pliki10 (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ę - zaznacz kursy, wpisz liczbę rat i kliknij „Oblicz”.
Jak liczą się punkty. Klucz ma 40 kryteriów (R.1.1 - R.5.8), 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 obuwie
Kryteria:
R.1.1 Wykonany import tabel do bazy danych obuwie , co jest udokumentowane w pliku import w formacie JPEG
ok. 2 min
Polecenie z arkusza
Utwórz bazę danych o nazwie obuwie, z zestawem polskich znaków (np. utf8_unicode_ci).
Rozpakuj pliki10.7z z pulpitu (hasło KuRsyKompuTerow3&) do folderu z numerem zdającego: baza.sql i klawiatura.jpg. W phpMyAdmin: Nowa, nazwa obuwie, porównywanie z polskimi znakami, np. utf8_unicode_ci albo utf8mb4_polish_ci - w bazie są słowa „PÓŁBUTY” i „brązowy”.
Krok 2: Import tabel z pliku baza.sql
Kryteria:
R.1.1 Wykonany import tabel do bazy danych obuwie , co jest udokumentowane w pliku import w formacie JPEG
ok. 2 min
Polecenie z arkusza
Do utworzonej bazy zaimportuj tabele z pliku baza.sql z rozpakowanego archiwum.
Wybierz bazę obuwie w lewym drzewie, potem Import → baza.sql → Wykonaj. Powstają trzy tabele z ilustracji 1: kategorie (4 kategorie obuwia), buty (model, kategoria, nazwa, cena) i produkt (kolor, materiał, wysokość buta). Relacje: buty.id_kat → kategorie.id_kat i produkt.model → buty.model.
Typowe błędy
Import bez zaznaczonej bazy obuwie kończy się błędem „Nie wybrano bazy danych” - plik nie zawiera polecenia USE.
Krok 3: Zrzut ekranu import.jpg
Kryteria:
R.1.1 Wykonany import tabel do bazy danych obuwie , co jest udokumentowane w pliku import w formacie JPEG
ok. 2 min
Polecenie z arkusza
Wykonaj zrzut ekranu po imporcie. Zapisz zrzut w formacie JPEG 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, wklejasz do edytora grafiki i zapisujesz jako import.jpg - import w JPEG, a zrzuty zapytań w PNG. Na zrzucie widać komunikat o udanym imporcie i trzy 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: kolor i materiał wysokich butów
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 kolor i materiał produktów, których wysokość buta jest większa niż 10. W pliku z kwerendami lub na zrzucie istnieje zapis np. SELECT kolor, material FROM produkt WHERE wysokosc_buta > 10; oraz wynik działania udokumentowany zrzutem, na którym widoczne są dokładnie 2 wiersze dla koloru brązowego i szarego
ok. 2 min
Polecenie z arkusza
Zapytanie 1: wybierające jedynie kolor i materiał produktów, których wysokość buta jest większa niż 10.
Każdą część zdania z arkusza tłumaczysz na jedną klauzulę:
SELECT kolor, material - „jedynie kolor i materiał”, więc dwie kolumny, nie *,
FROM produkt - te pola są w tabeli produkt,
WHERE wysokosc_buta > 10 - „większa niż 10”, czyli ostrzej niż >=.
Wynik: dwa wiersze - brązowy (skóra naturalna - zamsz, 12,5) i szary (skóra ekologiczna, 11,0), jak w kluczu. Zapytanie zapisujesz w kwerendy.txt, zrzut wyniku jako kw1.png.
kwerendy.txtTekstnowy plik
-- Zapytanie 1SELECT kolor, material FROM produkt WHERE wysokosc_buta > 10;
Podgląd strony po tym kroku
Krok 5: Zapytanie 2: buty z nazwą kategorii
Kryteria:
R.1.4 Wykonane zapytanie 2 wybierające jedynie nazwę i cenę buta oraz odpowiadającą im nazwę kategorii. W pliku z kwerendami lub na zrzucie istnieje zapis np. SELECT nazwa, cena, nazwa_kat FROM buty JOIN kategorie USING(id_kat); (możliwe też porównanie kluczy po ON lub WHERE ) oraz wynik działania udokumentowany zrzutem, na którym widoczne są dokładnie 4 rekordy dla nazw kategorii Półbuty, Trzewiki, Trampki, Obuwie sportowe
ok. 3 min
Polecenie z arkusza
Zapytanie 2: wybierające jedynie nazwę i cenę buta oraz odpowiadającą im nazwę kategorii. Należy posłużyć się relacją.
Nazwa i cena są w buty, a nazwa kategorii w kategorie - łączysz tabele po polu, które je wiąże:
SELECT nazwa, cena, nazwa_kat - trzy kolumny z obu tabel,
FROM buty JOIN kategorie - złączenie dwóch tabel,
USING(id_kat) - warunek złączenia: pole id_kat ma tę samą nazwę w obu tabelach, więc wystarczy ją podać raz. Równoważnie: ON buty.id_kat = kategorie.id_kat.
Wynik: cztery wiersze, po jednym dla kategorii Półbuty, Trzewiki, Trampki i Obuwie sportowe - jak w kluczu. Zrzut: kw2.png.
Typowe błędy
SELECT ... FROM buty, kategorie bez warunku złączenia daje iloczyn kartezjański: 16 wierszy zamiast 4, każdy but z każdą kategorią.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT kolor, material FROM produkt WHERE wysokosc_buta > 10;-- Zapytanie 2SELECT nazwa, cena, nazwa_kat FROM buty JOIN kategorie USING(id_kat);
Podgląd strony po tym kroku
Krok 6: Zapytanie 3: konto Marek
Kryteria:
R.1.5 Wykonane zapytanie 3 tworzące konto użytkownika Marek na localhost z hasłem M@reK W pliku z kwerendami lub na zrzucie istnieje zapis np. CREATE USER 'Marek'@'localhost' IDENTIFIED BY 'M@reK'; oraz wynik działania udokumentowany zrzutem, na którym jest widoczny komunikat o poprawnie wykonanym zapytaniu, dopuszczalny jest błąd informujący o niewybraniu bazy
ok. 2 min
Polecenie z arkusza
Zapytanie 3: tworzące konto użytkownika Marek na localhost z hasłem M@reK.
Konto w MySQL to para nazwa i host: 'Marek'@'localhost' może łączyć się tylko z tego samego komputera. Hasło podajesz po IDENTIFIED BY, w apostrofach i z zachowaniem wielkości liter: M@reK. Wynik to komunikat o poprawnie wykonanym zapytaniu - klucz dopuszcza też błąd o niewybranej bazie, bo konto nie należy do żadnej bazy. Zrzut: kw3.png.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT kolor, material FROM produkt WHERE wysokosc_buta > 10;-- Zapytanie 2SELECT nazwa, cena, nazwa_kat FROM buty JOIN kategorie USING(id_kat);-- Zapytanie 3CREATE USER 'Marek'@'localhost' IDENTIFIED BY 'M@reK';
Podgląd strony po tym kroku
Krok 7: Zapytanie 4: przeglądanie i aktualizacja tabeli produkt
Kryteria:
R.1.6 Wykonane zapytanie 4 nadające dla konta Marek prawa jedynie do przeglądania i aktualizacji danych jedynie w bazie danych obuwie, w tabeli produkt. W pliku z kwerendami lub na zrzucie istnieje zapis np. GRANT SELECT, UPDATE ON obuwie.produkt TO 'Marek'@'localhost'; oraz wynik działania udokumentowany zrzutem, na którym jest widoczny komunikat o poprawnie wykonanym zapytaniu
ok. 2 min
Polecenie z arkusza
Zapytanie 4: nadające kontu Marek prawa jedynie do przeglądania i aktualizacji danych jedynie w bazie danych obuwie, w tabeli produkt.
GRANT SELECT, UPDATE - „przeglądanie” to SELECT, „aktualizacja” to UPDATE; nic więcej (bez INSERT, DELETE, ALL),
ON obuwie.produkt - „jedynie w bazie obuwie, w tabeli produkt”: baza i tabela po kropce. obuwie.* dałoby prawa do wszystkich tabel bazy,
TO 'Marek'@'localhost' - to samo konto, co w zapytaniu 3, z tym samym hostem.
Zrzut z komunikatem o poprawnym wykonaniu: kw4.png.
Typowe błędy
TO Marek bez hosta tworzy w MariaDB odwołanie do konta Marek@% - innego niż utworzone w zapytaniu 3 - i kończy się błędem.
kwerendy.txtTekstzmienione: 3 linie
-- Zapytanie 1SELECT kolor, material FROM produkt WHERE wysokosc_buta > 10;-- Zapytanie 2SELECT nazwa, cena, nazwa_kat FROM buty JOIN kategorie USING(id_kat);-- Zapytanie 3CREATE USER 'Marek'@'localhost' IDENTIFIED BY 'M@reK';-- Zapytanie 4GRANT SELECT, UPDATE ON obuwie.produkt TO 'Marek'@'localhost';
Podgląd strony po tym kroku
Etap 2: Grafika i strony HTML
Kroki 8-29 · po tym etapie masz 21 z 40 kryteriów (pkt)
Krok 8: Kadr klawiatura.jpg: 1000 × 100 px
Kryteria:
R.2.1 Grafika baner.png ma szerokość 1000 px i wysokość 100 px, jest skadrowana tak, że po lewej stronie klawiatury nie widać cyfry 8, a po prawej stronie widać jedynie klawisze Insert i Delete
ok. 4 min
Polecenie z arkusza
Na potrzeby witryny internetowej należy przygotować grafikę baner.png utworzoną na podstawie pliku klawiatura.jpg, który należy wykadrować do szerokości 1000 px i wysokości 100 px, zgodnie z kadrem przedstawionym na ilustracji 2.
Zdjęcie ma 1500 × 300 px. W GIMP-ie wybierasz narzędzie Zaznaczenie prostokątne, w opcjach narzędzia wpisujesz rozmiar 1000 × 100, a położenie dobierasz tak, jak na ilustracji 2: kadr zaczyna się mniej więcej 37 px od lewej i 51 px od góry. Potem Obraz → Przytnij do zaznaczenia. Klucz sprawdza kadr po klawiszach: z lewej nie może być widać cyfry 8, a z prawej mają być widoczne tylko klawisze Insert i Delete (R.2.1).
Typowe błędy
Skalowanie zamiast kadrowania (Obraz → Skaluj) daje 1000 × 100, ale ze ściśniętym zdjęciem i całą klawiaturą w kadrze - kryterium R.2.1 nie jest spełnione.
Podgląd strony po tym kroku
Krok 9: Napis „Kursy komputerowe” i zapis baner.png
Kryteria:
R.2.2 W grafice jest widoczny napis "Kursy komputerowe" zapisany czcionką bezszeryfową, pochyloną, wypełnioną kolorem białym
ok. 4 min
Polecenie z arkusza
Na środku umieszczony napis "Kursy komputerowe" czcionką Arial pochyloną i pogrubioną, o rozmiarze 60, wypełnioną kolorem białym.
Narzędzie Tekst: czcionka Arial Bold Italic (pogrubiona i pochylona), rozmiar 60 px, kolor biały (ffffff). Kliknij na obrazie, wpisz napis, a potem wyrównaj warstwę tekstu do środka obrazu narzędziem Wyrównanie (względem obrazu, środek w poziomie i w pionie). Na koniec Plik → Eksportuj jakobaner.png - format PNG, nie zapis .xcf (R.2.2).
Podgląd strony po tym kroku
Krok 10: Plik index.html w HTML5
Kryteria:
R.2.3 Witryna internetowa zapisana w plikach index.html i raty.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 "Kursy komputerowe". Strona zawiera sekcje head i body
ok. 2 min
Polecenie z arkusza
Cechy witryny: Składa się z podstron o nazwach index.html, raty.html. Cechy wspólne dla stron: Zapisane w języku HTML5.
Zbuduj całą stronę index.html, a raty.html powstanie z jej kopii - różnią się tylko blokiem głównym. <!DOCTYPE html> mówi przeglądarce, że to HTML5.
R.2.3 Witryna internetowa zapisana w plikach index.html i raty.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 "Kursy komputerowe". Strona zawiera sekcje head i body
R.2.3 Witryna internetowa zapisana w plikach index.html i raty.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 "Kursy komputerowe". 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.3 Witryna internetowa zapisana w plikach index.html i raty.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 "Kursy komputerowe". Strona zawiera sekcje head i body
ok. 1 min
Polecenie z arkusza
Tytuł strony widoczny na karcie przeglądarki: „Kursy komputerowe”.
<title> w <head> - to napis na karcie przeglądarki, nie na stronie.
R.3.6 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.
Uwaga na nazwę: w tym arkuszu style.css, z „e” na końcu (w wielu innych jest styl.css).
Typowe błędy
styl.css zamiast style.css odcina wszystkie style - kryterium R.3.6, a rezultat R.4 jest wtedy oceniany tylko z kodu.
R.2.4 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.
Każdy blok dostaje znacznik, który mówi, czym jest: <header> - nagłówek strony, <nav> - menu z odnośnikami, <main> - treść główna, <footer> - stopka. Klucz wymaga semantycznych znaczników, w tym wprost header i footer (R.2.4). Bloki stoją jeden pod drugim, więc nie potrzebują żadnego pozycjonowania.
R.2.6 W bloku nagłówkowym umieszczony obraz z pliku baner.png z tekstem alternatywnym "kursy komputerowe"
ok. 1 min
Polecenie z arkusza
Zawartość bloku nagłówkowego: obraz baner.png z tekstem alternatywnym „kursy komputerowe”.
<img> z przygotowanym banerem i tekstem alternatywnym z arkusza - małymi literami (R.2.6). Na razie obraz ma swoje 1000 px szerokości; dopasuje go styl.
Zawartość menu: Odnośnik o treści „Strona główna” prowadzący do strony index.html. Odnośnik o treści „Koszt rat” prowadzący do strony raty.html. Odnośnik o treści „Nasz partner” prowadzący do strony https://moje-szkolenia.pl/.
Trzy znaczniki <a>. Do własnych podstron prowadzi ścieżka względna - sama nazwa pliku z tego samego folderu, a do serwisu partnera pełny adres z https:// (R.3.2). W podglądzie kliknięcia są zablokowane.
Typowe błędy
Adres partnera bez https:// (href="moje-szkolenia.pl") przeglądarka traktuje jak plik w bieżącym folderze - odnośnik prowadzi donikąd.
R.2.5 W bloku głównym umieszczony przynajmniej jeden <h3>: "Kursy komputerowe - programowanie" lub "Adres do korespondencji" (główna), lub "Oblicz miesięczną ratę" (raty); w stopce umieszczony paragraf z numerem zdającego
ok. 1 min
Polecenie z arkusza
Zawartość stopki: paragraf o treści „Autor strony: ”, dalej wstawiony numer zdającego.
Akapit <p> w <footer>. Na egzaminie po dwukropku wpisujesz swój numer zdającego (PESEL) - tutaj stoi imię i nazwisko autora rozwiązania.
R.2.5 W bloku głównym umieszczony przynajmniej jeden <h3>: "Kursy komputerowe - programowanie" lub "Adres do korespondencji" (główna), lub "Oblicz miesięczną ratę" (raty); w stopce umieszczony paragraf z numerem zdającego
ok. 1 min
Polecenie z arkusza
Zawartość bloku głównego strony index.html: Nagłówek trzeciego stopnia o treści „Kursy komputerowe - programowanie”.
R.2.7 Na stronie głównej w bloku głównym umieszczona tabela o 3 kolumnach i 3 wierszach, pierwszy wiersz zawiera komórki nagłówkowe, zastosowane znaczniki <table>, <tr>, <td>, <th>
ok. 3 min
Polecenie z arkusza
Tabela składająca się z 3 kolumn i 3 wierszy przedstawiona na ilustracji 4, pierwszy wiersz zawiera komórki nagłówkowe.
Każdy wiersz to <tr>. W pierwszym są komórki nagłówkowe <th> (Nazwa, Liczba godzin, Cena), w dwóch kolejnych zwykłe <td> z danymi z ilustracji 4 (R.2.7). Zapamiętaj ceny - 5000 za React.js i 3000 za JavaScript - skrypt na stronie rat będzie z nich liczył.
R.2.5 W bloku głównym umieszczony przynajmniej jeden <h3>: "Kursy komputerowe - programowanie" lub "Adres do korespondencji" (główna), lub "Oblicz miesięczną ratę" (raty); w stopce umieszczony paragraf z numerem zdającego
ok. 1 min
Polecenie z arkusza
Nagłówek trzeciego stopnia o treści „Adres do korespondencji”.
R.2.8 Na stronie głównej w bloku głównym umieszczona jedna lista punktowana z trzema elementami, zastosowane znaczniki <ul> i <li>
R.3.3 Na stronie umieszczony odnośnik pocztowy „skontaktuj się” połączony z adresem mailto:[email protected]
ok. 2 min
Polecenie z arkusza
Lista punktowana (nieuporządkowana) wypełniona zawartością: „Adres: Katowice, ul. Mariacka 5”, „Telefon: 32 888 88 88” oraz odnośnik pocztowy o treści „skontaktuj się” prowadzący do adresu [email protected].
Lista nieuporządkowana to <ul>, a każdy punkt <li> (R.2.8). Odnośnik pocztowy ma w href przedrostek mailto: - kliknięcie otwiera program pocztowy z wpisanym adresatem (R.3.3).
Typowe błędy
href="[email protected]" bez mailto: przeglądarka traktuje jak nazwę pliku - to nie jest odnośnik pocztowy.
R.2.3 Witryna internetowa zapisana w plikach index.html i raty.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 "Kursy komputerowe". Strona zawiera sekcje head i body
R.2.5 W bloku głównym umieszczony przynajmniej jeden <h3>: "Kursy komputerowe - programowanie" lub "Adres do korespondencji" (główna), lub "Oblicz miesięczną ratę" (raty); w stopce umieszczony paragraf z numerem zdającego
ok. 2 min
Polecenie z arkusza
Zawartość bloku głównego strony raty.html: Nagłówek trzeciego stopnia o treści „Oblicz miesięczną ratę”.
Zapisz index.html jako raty.html - nagłówek, menu i stopka zostają takie same - i w bloku <main> zostaw tylko nowy nagłówek <h3>.
R.2.9 Na stronie z ratami w bloku głównym umieszczone dwa pola wyboru (checkbox), pole edycyjne i przycisk, przynajmniej z jednym polem powiązana etykieta <label>
R.3.5 Na stronie z ratami klasa kontrolki jest przypisana do przynajmniej jednej kontrolki
ok. 2 min
Polecenie z arkusza
Pole wyboru z etykietą „Kurs React.js”.
Pole wyboru to <input type="checkbox">. Etykieta <label for="react"> jest powiązana z polem przez jego id - kliknięcie napisu też zaznacza pole (R.2.9). Klasa kontrolki od razu, bo arkusz przypisuje ją wszystkim kontrolkom tej strony (R.3.5). <br> przenosi następną kontrolkę do nowego wiersza, jak na ilustracji 5.
R.2.9 Na stronie z ratami w bloku głównym umieszczone dwa pola wyboru (checkbox), pole edycyjne i przycisk, przynajmniej z jednym polem powiązana etykieta <label>
R.3.5 Na stronie z ratami klasa kontrolki jest przypisana do przynajmniej jednej kontrolki
ok. 1 min
Polecenie z arkusza
Pole wyboru z etykietą „Kurs JavaScript”.
Drugie pole wyboru z własnym id - skrypt będzie sprawdzał każde pole osobno.
R.2.9 Na stronie z ratami w bloku głównym umieszczone dwa pola wyboru (checkbox), pole edycyjne i przycisk, przynajmniej z jednym polem powiązana etykieta <label>
R.3.4 Na stronie z ratami pole edycyjne jest typu number oraz jest zdefiniowane dla przycisku zdarzenie związane z jego wciśnięciem, które uruchamia funkcję skryptu (obsługa zdarzenia zdefiniowana w HTML np. onClick lub w skrypcie np.addEventListener zmienna.onClick = …)
R.3.5 Na stronie z ratami klasa kontrolki jest przypisana do przynajmniej jednej kontrolki
ok. 1 min
Polecenie z arkusza
Pole edycyjne typu numerycznego poprzedzone etykietą: „Liczba rat: ”.
Tym razem etykieta stoi przed polem. type="number" - pole numeryczne: przyjmie tylko liczbę i dostanie strzałki (R.3.4). Identyfikator installments (raty).
R.2.9 Na stronie z ratami w bloku głównym umieszczone dwa pola wyboru (checkbox), pole edycyjne i przycisk, przynajmniej z jednym polem powiązana etykieta <label>
R.3.4 Na stronie z ratami pole edycyjne jest typu number oraz jest zdefiniowane dla przycisku zdarzenie związane z jego wciśnięciem, które uruchamia funkcję skryptu (obsługa zdarzenia zdefiniowana w HTML np. onClick lub w skrypcie np.addEventListener zmienna.onClick = …)
R.3.5 Na stronie z ratami klasa kontrolki jest przypisana do przynajmniej jednej kontrolki
ok. 1 min
Polecenie z arkusza
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.4). Na razie kliknięcie kończy się błędem w konsoli przeglądarki - funkcji jeszcze nie ma.
Rozmieszczenie kontrolek zgodnie z ilustracją 5. Pusty paragraf do wyświetla wyniku działania skryptu.
Pusty <p id="result"> pod przyciskiem - skrypt wpisze tu zdanie z wynikiem. Rozmieszczenie jak na ilustracji 5: oba pola wyboru, pole liczby rat, lista i przycisk - każde w osobnym wierszu dzięki <br>.
R.4.2 Ustawiony kolor tła #EAEAEA dla selektora body oraz #625B5B dla bloków menu i stopki
R.4.3 Ustawiony biały kolor czcionki dla bloków menu i stopki
R.4.6 Ustawione marginesy wewnętrzne (padding) 20px dla bloków menu i stopki oraz margines zewnętrzny lewy (margin-left) 40px dla listy punktowanej oraz tabeli
R.4.7 Ustawione wyrównanie tekstu do środka dla bloków menu, stopki i tabeli oraz obramowanie tabeli: 1px dashed #625B5B
ok. 2 min
Polecenie z arkusza
Wspólne dla bloków menu i stopki: kolor tła #625B5B, biały kolor czcionki, marginesy wewnętrzne 20 px, wyrównanie tekstu do środka.
Jedna reguła dla dwóch selektorów oddzielonych przecinkiem: nav, footer.
R.4.5 Ustawiony typ punktora circle dla selektora ul
R.4.6 Ustawione marginesy wewnętrzne (padding) 20px dla bloków menu i stopki oraz margines zewnętrzny lewy (margin-left) 40px dla listy punktowanej oraz tabeli
ok. 1 min
Polecenie z arkusza
Dla selektora listy punktowanej: margines zewnętrzny lewy 40 px, typ punktora okrąg.
Punktor „okrąg” to circle - puste kółko zamiast domyślnego pełnego disc (R.4.5, R.4.6).
R.4.9 Dla odsyłaczy jedynie w bloku menu: czcionka pogrubiona, kolor tła #EAEAEA, kolor czcionki #625B5B, marginesy wewnętrzne 10px, marginesy zewnętrzne 50px, zaokrąglenie rogów 20px
ok. 2 min
Polecenie z arkusza
Dla odsyłaczy jedynie w bloku menu: czcionka pogrubiona, kolor tła #EAEAEA, kolor czcionki #625B5B, marginesy wewnętrzne 10 px, marginesy zewnętrzne 50 px, zaokrąglenie rogów 20 px.
„Jedynie w bloku menu” to selektor potomka nav a - odnośnik pocztowy w bloku głównym zostaje zwykły, niebieski. border-radius: 20px zaokrągla rogi tła, więc odnośniki wyglądają jak przyciski z ilustracji 3 (R.4.9).
Typowe błędy
Sam selektor a zmieni też odnośnik „skontaktuj się” - kryterium R.4.9 mówi „jedynie w bloku menu”.
R.4.10 Gdy kursor myszy znajdzie się na odsyłaczu w menu, jego kolor tła zmienia się na #625B5B, czcionki na #EAEAEA oraz pojawia się obramowanie 1px solid #EAEAEA
ok. 2 min
Polecenie z arkusza
Gdy kursor myszy znajdzie się na odsyłaczu w menu jego kolor tła zmienia się na #625B5B, czcionki na #EAEAEA oraz pojawia się obramowanie linią ciągłą o szerokości 1 px i kolorze #EAEAEA.
Pseudoklasa :hover działa, dopóki kursor jest nad elementem: kolory się odwracają, a ramka 1px solid obrysowuje zaokrąglony przycisk (R.4.10). Najedź na odnośnik w podglądzie.
R.4.4 Ustawiona szerokość 100% dla selektora img oraz 60% dla selektora table
R.4.6 Ustawione marginesy wewnętrzne (padding) 20px dla bloków menu i stopki oraz margines zewnętrzny lewy (margin-left) 40px dla listy punktowanej oraz tabeli
R.4.7 Ustawione wyrównanie tekstu do środka dla bloków menu, stopki i tabeli oraz obramowanie tabeli: 1px dashed #625B5B
ok. 2 min
Polecenie z arkusza
Dla selektora tabeli: obramowanie linią kreskową o grubości 1 px i kolorze #625B5B, szerokość 60%, margines zewnętrzny lewy 40 px, wyrównanie tekstu do środka.
Linia kreskowa to dashed (kropkowa byłaby dotted). Ramka dotyczy samej tabeli, więc - jak na ilustracji 4 - kreski biegną tylko dookoła, bez linii między komórkami (R.4.4, R.4.6, R.4.7).
R.4.8 Zdefiniowana klasa kontrolki o cechach: marginesy zewnętrzne 5px
ok. 1 min
Polecenie z arkusza
Dla klasy o nazwie kontrolki: marginesy zewnętrzne 5 px. Klasa jest przypisana do wszystkich kontrolek na stronie raty.html (pól wyboru, pola edycyjnego, listy rozwijalnej i przycisku).
Selektor klasy zaczyna się kropką: .kontrolki (R.4.8). Klasa została już przypisana wszystkim kontrolkom przy budowie strony - teraz rozsuwają się o 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, obrazu, listy i 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. Bloki stoją jeden pod drugim - tak układa je przeglądarka bez żadnego float czy flex, więc układ jest zgodny z ilustracją 3 (R.3.1). A zgodnie z uwagą arkusza style body, img, ul i table są zapisane selektorami znaczników, bez klas i identyfikatorów - klucz uznaje R.4.2, R.4.4 i R.4.5 tylko w tej postaci.
Typowe błędy
Styl tabeli zapisany jako klasa .tabela albo identyfikator #tabela wygląda tak samo, ale klucz go nie uznaje (uwaga przy R.4).
Podgląd strony po tym kroku (index.html)
Etap 4: Skrypt JavaScript
Kroki 40-45 · po tym etapie masz 40 z 40 kryteriów (pkt)
Krok 40: Funkcja calculate wywoływana przyciskiem
Kryteria:
R.5.1 Skrypt jest napisany w języku JavaScript i zawiera on przynajmniej jedną poprawną składniowo instrukcję wynikającą z treści zadania
ok. 2 min
Polecenie z arkusza
Wykonywany po stronie klienta, na stronie raty.html po kliknięciu przycisku „Oblicz”.
Skrypt piszesz w <script> na końcu <body> strony raty.html - wykonuje się w przeglądarce, bez serwera. Funkcja ma tę samą nazwę, co w onclick przycisku: calculate (oblicz). Na razie jest pusta - kliknięcie „Oblicz” nie powoduje już błędu, ale niczego nie robi.
R.5.2 Skrypt pobiera dane z przynajmniej jednej kontrolki, np. funkcja document.getElementById z parametrem, który zdefiniowany jest w kontrolce jako id
ok. 2 min
Polecenie z arkusza
Pobiera dane z kontrolek. Ustala całkowitą kwotę za wybrane kursy na podstawie cen z tabeli z ilustracji 4.
Zmienna total (suma) zaczyna od zera. document.getElementById("react") znajduje pole wyboru, a jego właściwość checked ma wartość true, gdy pole jest zaznaczone. Wtedy doliczasz cenę z tabeli: 5000 (R.5.2).
R.5.3 Skrypt ustala koszt wszystkich zaznaczonych w polu wyboru kursów np. poprzez sprawdzenie warunku zaznaczenia danego kursu (pole checked == true). Ceny: React.js - 5000, JavaScript 3000
ok. 2 min
Polecenie z arkusza
Ustala całkowitą kwotę za wybrane kursy na podstawie cen z tabeli z ilustracji 4.
Drugi warunek, niezależny od pierwszego (osobny if, nie else if): zaznaczone oba kursy dają 5000 + 3000 = 8000, jeden - jego cenę, żaden - 0 (R.5.3).
Typowe błędy
else if zamiast drugiego if liczy tylko pierwszy zaznaczony kurs - przy obu zaznaczonych wynik to 5000 zamiast 8000.
R.5.4 Skrypt pobiera wpisaną w pole edycyjne liczbę rat i oblicza koszt jednej raty dzieląc koszt kursów przez liczbę rat
ok. 2 min
Polecenie z arkusza
Oblicza koszt jednej raty na podstawie kwoty całkowitej. Dla uproszczenia kwota całkowita jest dzielona przez podaną liczbę rat.
.value pola liczbowego to wpisana liczba (jako tekst, np. „10”). Operator / w JavaScripcie sam zamienia ją na liczbę, więc total / installments od razu daje wysokość raty: 8000 / 10 = 800 (R.5.4).
R.5.5 Pod przyciskiem jest wyświetlany efekt działania skryptu, którego fragment dotyczący miasta zawiera nazwę miasta pobraną z listy rozwijalnej (wystarczy sprawdzić dwa razy dla różnych miast)
ok. 1 min
Polecenie z arkusza
<miasto> oznacza wybór z listy rozwijalnej.
.value listy rozwijanej to wartość wybranej opcji - w tym rozwiązaniu tekst opcji, czyli nazwa miasta.
R.5.5 Pod przyciskiem jest wyświetlany efekt działania skryptu, którego fragment dotyczący miasta zawiera nazwę miasta pobraną z listy rozwijalnej (wystarczy sprawdzić dwa razy dla różnych miast)
R.5.6 Pod przyciskiem jest wyświetlany efekt działania skryptu: obliczony w skrypcie koszt całkowity
R.5.7 Pod przyciskiem jest wyświetlany efekt działania skryptu: liczba rat oraz koszt jednej raty (sprawdzić dla dwóch różnych liczb )
R.5.8 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. 3 min
Polecenie z arkusza
Wyświetla pod przyciskiem w paragrafie treść: „Kurs odbędzie się w <miasto>. Koszt całkowity: <kwota> zł. Płacisz <liczba> rat po <rata> zł”, gdzie <kwota> oznacza obliczoną kwotę całkowitą, <liczba> oznacza podaną liczbę rat, a <rata> oznacza wyliczoną ratę.
Zdanie sklejasz operatorem + ze stałych napisów i czterech zmiennych, a gotowe wpisujesz do pustego akapitu result przez innerHTML (tabela 1). Spacje i kropki są w napisach - po złożeniu nie może zabraknąć odstępu przed liczbą. Zaznacz w podglądzie oba kursy, wpisz 10, wybierz Katowice i kliknij „Oblicz”: „Kurs odbędzie się w Katowice. Koszt całkowity: 8000 zł. Płacisz 10 rat po 800 zł” - jak na ilustracji 5. Sprawdź też inne miasto i inną liczbę rat, tak jak zrobi to egzaminator (R.5.5 - R.5.7). Nazwy zmiennych i funkcji są po angielsku i mówią, co przechowują (R.5.8).
raty.htmlHTMLzmienione: 2 linie
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Kursy komputerowe</title> <linkrel="stylesheet"href="style.css"></head><body> <header> <imgsrc="baner.png"alt="kursy komputerowe"> </header> <nav> <ahref="index.html">Strona główna</a> <ahref="raty.html">Koszt rat</a> <ahref="https://moje-szkolenia.pl/">Nasz partner</a> </nav> <main> <h3>Oblicz miesięczną ratę</h3> <inputtype="checkbox"id="react"class="kontrolki"> <labelfor="react">Kurs React.js</label><br> <inputtype="checkbox"id="javascript"class="kontrolki"> <labelfor="javascript">Kurs JavaScript</label><br> <labelfor="installments">Liczba rat: </label> <inputtype="number"id="installments"class="kontrolki"><br> <selectid="city"class="kontrolki"> <option>Warszawa</option> <option>Katowice</option> <option>Gdańsk</option> </select><br> <buttonclass="kontrolki"onclick="calculate()">Oblicz</button> <pid="result"></p> </main> <footer> <p>Autor strony: Bartosz Bryniarski</p> </footer> <script>function calculate() {let total = 0;if (document.getElementById("react").checked) { total = total + 5000; }if (document.getElementById("javascript").checked) { total = total + 3000; }let installments = document.getElementById("installments").value;let rate = total / installments;let city = document.getElementById("city").value;document.getElementById("result").innerHTML = "Kurs odbędzie się w " + city + ". Koszt całkowity: " + total + " zł. Płacisz " + installments + " rat po " + rate + " zł"; } </script></body></html>
Podgląd strony po tym kroku (raty.html)
Etap 5: Dobre praktyki (poza kluczem)
Krok 46 · po tym etapie masz 40 z 40 kryteriów (pkt)
Krok 46: Słuchacz zdarzenia, sprawdzenie liczby rat, grosze
ok. 4 min
Polecenie z arkusza
Przycisk o treści „Oblicz”, którego wybranie uruchamia skrypt.
Cztery poprawki z prawdziwych projektów:
addEventListener("click", calculate) zamiast atrybutu onclick w HTML: zachowanie przycisku jest w skrypcie, a HTML opisuje tylko treść. Przycisk dostaje identyfikator calculate.
Sprawdzenie liczby rat: puste pole dawało „rat po Infinity zł”, a 0 lub liczba ujemna - bzdurną ratę. Number() zamienia tekst na liczbę, a Number.isInteger z warunkiem >= 1 przepuszcza tylko sensowną liczbę rat.
toFixed(2) - rata w złotych i groszach: 8000 / 3 to 2666.67, a nie 2666.6666666666665.
textContent zamiast innerHTML - wpisujesz zwykły tekst, więc nic nie zostanie zinterpretowane jako HTML.
Stare linie zostają w komentarzach. Na egzaminie wystarczy wersja wcześniejsza - klucz przyjmuje onclick (R.3.4), a zaokrąglenia i sprawdzania nie wymaga.
raty.htmlHTMLzmienione: 13 linii
<!DOCTYPE html><htmllang="pl"><head> <metacharset="UTF-8"> <title>Kursy komputerowe</title> <linkrel="stylesheet"href="style.css"></head><body> <header> <imgsrc="baner.png"alt="kursy komputerowe"> </header> <nav> <ahref="index.html">Strona główna</a> <ahref="raty.html">Koszt rat</a> <ahref="https://moje-szkolenia.pl/">Nasz partner</a> </nav> <main> <h3>Oblicz miesięczną ratę</h3> <inputtype="checkbox"id="react"class="kontrolki"> <labelfor="react">Kurs React.js</label><br> <inputtype="checkbox"id="javascript"class="kontrolki"> <labelfor="javascript">Kurs JavaScript</label><br> <labelfor="installments">Liczba rat: </label> <inputtype="number"id="installments"class="kontrolki"><br> <selectid="city"class="kontrolki"> <option>Warszawa</option> <option>Katowice</option> <option>Gdańsk</option> </select><br> <buttonclass="kontrolki"id="calculate">Oblicz</button> <pid="result"></p> </main> <footer> <p>Autor strony: Bartosz Bryniarski</p> </footer> <script>function calculate() {let total = 0;if (document.getElementById("react").checked) { total = total + 5000; }if (document.getElementById("javascript").checked) { total = total + 3000; }let installments = Number(document.getElementById("installments").value);let result = document.getElementById("result");if (!Number.isInteger(installments) || installments < 1) { result.textContent = "Podaj liczbę rat - liczbę całkowitą większą od zera.";return; }let rate = (total / installments).toFixed(2);// let rate = total / installments;let city = document.getElementById("city").value; result.textContent = "Kurs odbędzie się w " + city + ". Koszt całkowity: " + total + " zł. Płacisz " + installments + " rat po " + rate + " zł";// document.getElementById("result").innerHTML = ... }document.getElementById("calculate").addEventListener("click", calculate); </script></body></html>
Podgląd strony po tym kroku (raty.html)
Etap 6: Oddanie pracy
Krok 47 · po tym etapie masz 40 z 40 kryteriów (pkt)
Krok 47: 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 folderze z numerem zdającego powinny znajdować się pliki: baner.png, import.jpg, index.html, kw1.png, kw2.png, kw3.png, kw4.png, kwerendy.txt, raty.html, przeglądarka.txt, style.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.
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.