Przejdź do głównej treści
INF.03-06-25.01-SGStyczeń 2025 · 30 kroków · ok. 70 min · 40 kryteriów z klucza

Rozwiązanie krok po kroku: Serwis o systemach liczbowych (Nowoczesny kod (grid, osobny skrypt))

To drugi sposób rozwiązania tego samego arkusza. Wynik jest ten sam - baza szachy z czterema zapytaniami, grafika 2.png, animacja cyfry.gif i strona systemy.html z tabelą, słowniczkiem i kalkulatorem liczb binarnych - i tak samo spełnia każde kryterium klucza. Inna jest droga:

  • siatka CSS: trzy bloki w <main> z kolumnami 30% 30% 40% w grid-template-columns (klucz R.4.4 przyjmuje je wprost) zamiast float: left i clear: both, kolory z arkusza w zmiennych CSS,
  • skrypt w osobnym pliku skrypt.js z atrybutem defer i obsługą kliknięcia przez addEventListener - HTML nie zawiera kodu JavaScript,
  • sprawdzenie wpisanej liczby: puste pole, ułamek albo liczba ujemna dają komunikat zamiast złego wyniku (w wersji podstawowej liczba ujemna zawiesza kartę przeglądarki),
  • wbudowane toString(2) do zamiany i czytelna funkcja groupByFour() do podziału na grupy, a wynik budowany przez textContent i createElement zamiast innerHTML,
  • zapytania SQL z zakresem dat zamiast wzorca tekstowego na dacie.

Algorytm z arkusza (reszty z dzielenia przez 2) jest rozpisany krok po kroku w wersji podstawowej - tu jest objaśniony przy funkcji, która go zastępuje. Na końcu krótkie porównanie obu wersji. Baza i obrazy pochodzą z prawdziwego archiwum pliki14, zapytania zostały wykonane na tej bazie w MariaDB z XAMPP-a, a działanie skryptu sprawdzone w przeglądarce Chrome.

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

  1. Etap 1: Baza danych

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

    Krok 1: Baza danych szachy

    ok. 2 min
    Polecenie z arkusza

    Utwórz bazę danych o nazwie szachy, z zestawem polskich znaków (np. utf8_unicode_ci).

    Archiwum pliki14.7z rozpakuj hasłem Cyf3rki# do folderu z numerem zdającego: szachy.sql, szesnaście obrazów cyfr (0.png - F.png i 2a.png do przerobienia) oraz systemy.txt z tekstem słowniczka. W phpMyAdmin Nowa → szachy, porównywanie utf8_unicode_ci, albo:

    CREATE DATABASE szachy CHARACTER SET utf8 COLLATE utf8_unicode_ci;
    
  2. Krok 2: Import tabeli z pliku szachy.sql

    ok. 2 min
    Polecenie z arkusza

    Do utworzonej bazy zaimportuj tabele z pliku szachy.sql z rozpakowanego archiwum.

    Import → szachy.sql. Jedna tabela zawodnicy (94 wiersze): pseudonim, tytuł (dwuliterowy skrót, np. OM, albo pusty napis), data zdobycia tytułu w kolumnie typu DATE, ranking i klasa.

  3. Krok 3: Zrzut ekranu import.png

    Kryteria:

    R.1.1 Wykonany import tabeli do bazy danych szachy , 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.

    Cały ekran z paskiem zadań, zapis jako import.png - w tym arkuszu wszystkie zrzuty są w PNG.

    Typowe błędy

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

  4. Krok 4: Zapytanie 1: tytuły z lipca 2020

    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 pseudonimy zawodników, którzy zdobyli tytuł w lipcu 2020 roku. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT pseudonim FROM zawodnicy WHERE data_zdobycia LIKE "2020- 07%";(lub zakres dat ) oraz wynik działania udokumentowany zrzutem, na którym widoczne są dokładnie 3 rekordy z wartościami: Hiikar, BananD, WanHao

    ok. 2 min
    Polecenie z arkusza

    Zapytanie 1: wybierające jedynie pseudonimy zawodników, którzy zdobyli tytuł w lipcu 2020 roku.

    „Lipiec 2020” jako zakres dat: BETWEEN '2020-07-01' AND '2020-07-31' (obie granice włącznie). Klucz przyjmuje też LIKE "2020-07%", ale wzorzec tekstowy zamienia każdą datę na napis przed porównaniem - przy dużej tabeli baza nie użyje wtedy indeksu na kolumnie daty, a przy zakresie może. Napisy w SQL w apostrofach - to standard, cudzysłów działa tylko w MySQL i MariaDB.

    Wynik: Hiikar, BananD, WanHao - jak w kluczu. Zapytania zapisuj w kwerendy.txt, zrzut jako kw1.png.

    kwerendy.txt Tekst nowy plik
    -- Zapytanie 1
    SELECT pseudonim
    FROM zawodnicy
    WHERE data_zdobycia BETWEEN '2020-07-01' AND '2020-07-31';
    Podgląd strony po tym kroku
    Podgląd strony po kroku 4
  5. Krok 5: Zapytanie 2: klasa 3A z tytułem

    Kryteria:

    R.1.4 Wykonane zapytanie 2 wybierające jedynie pseudonimy i tytuły zawodników z klasy 3A oraz zdobyli dowolny, niepusty tytuł. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT pseudonim, tytul FROM zawodnicy WHERE klasa = "3A" AND tytul != ""; (NULL jest błędem ) oraz wynik działania udokumentowany zrzutem, na którym widoczne są dokładnie 4 rekordy z danymi: Botas Bross, KM; BananD, PM; DavNav, OM; JanNie, OM

    ok. 2 min
    Polecenie z arkusza

    Zapytanie 2: wybierające jedynie pseudonimy i tytuły zawodników z klasy 3A który zdobyli dowolny, niepusty tytuł.

    Dwa warunki łączy AND, każdy w osobnej linii. „Niepusty tytuł” to tytul <> '' (<> to standardowy zapis „różne od”, != też działa). W tej bazie brak tytułu to pusty napis, nie NULL (pustych napisów jest 64, wartości NULL - 0), dlatego klucz uznaje tytul IS NOT NULL za błąd. Wynik: Botas Bross KM, BananD PM, DavNav OM, JanNie OM. Zrzut: kw2.png.

    Typowe błędy

    tytul IS NOT NULL zwraca też zawodników bez tytułu - puste pole to tu '', nie NULL.

    kwerendy.txt Tekst zmienione: 6 linii
    -- Zapytanie 1
    SELECT pseudonim
    FROM zawodnicy
    WHERE data_zdobycia BETWEEN '2020-07-01' AND '2020-07-31';
    
    -- Zapytanie 2
    SELECT pseudonim, tytul
    FROM zawodnicy
    WHERE klasa = '3A'
      AND tytul <> '';
    Podgląd strony po tym kroku
    Podgląd strony po kroku 5
  6. Krok 6: Zapytanie 3: dziesięciu z najniższym rankingiem

    Kryteria:

    R.1.5 Wykonane zapytanie 3 wybierające jedynie pseudonim, klasę i ranking dla pierwszych 10 zawodników o najniższej pozycji w rankingu, posortowane malejąco lub rosnąco według rankingu. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT pseudonim, klasa, ranking FROM zawodnicy ORDER BY ranking LIMIT 10; (poprawnie ASC lub DESC ) oraz wynik działania udokumentowany zrzutem, na którym widocznych jest dokładnie 10 rekordów

    ok. 2 min
    Polecenie z arkusza

    Zapytanie 3: wybierające jedynie pseudonim, klasę i ranking dla pierwszych 10 zawodników o najniższej pozycji w rankingu, posortowane według rankingu.

    ORDER BY ranking ASC - kierunek zapisany jawnie, choć rosnący jest domyślny: czytający od razu widzi, że chodziło o najniższe wartości. LIMIT 10 działa na wynik już posortowany, więc stoi na końcu. Klucz przyjmuje sortowanie w obie strony - ważne, żeby wierszy było dokładnie 10. Zrzut: kw3.png.

    kwerendy.txt Tekst zmienione: 6 linii
    -- Zapytanie 1
    SELECT pseudonim
    FROM zawodnicy
    WHERE data_zdobycia BETWEEN '2020-07-01' AND '2020-07-31';
    
    -- Zapytanie 2
    SELECT pseudonim, tytul
    FROM zawodnicy
    WHERE klasa = '3A'
      AND tytul <> '';
    
    -- Zapytanie 3
    SELECT pseudonim, klasa, ranking
    FROM zawodnicy
    ORDER BY ranking ASC
    LIMIT 10;
    Podgląd strony po tym kroku
    Podgląd strony po kroku 6
  7. Krok 7: Zapytanie 4: ile dni od zdobycia tytułu

    Kryteria:

    R.1.6 Wykonane zapytanie 4 wybierające dla zawodników z niepustym tytułem jedynie pseudonim i datę zdobycia oraz obliczające ile minęło dni od daty zdobycia tytułu do dnia dzisiejszego. Obliczenie liczby dni jest zapisane pod nazwą kolumny (aliasem) „dni”. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT pseudonim, data_zdobycia, DATEDIFF(CURRENT_DATE(), data_zdobycia) AS dni FROM zawodnicy WHERE tytul != ''; (lub curdate(), now(), poprawne też bez AS ) oraz wynik działania udokumentowany zrzutem, na którym widoczny jest komunikat o wybranych dokładnie 30 rekordach, pierwszy rekord dla Hikar, 2020-07-12, <wartość różnicy dat>. Nie wszystkie rekordy muszą być widoczne

    ok. 3 min
    Polecenie z arkusza

    Zapytanie 4: wybierające dla zawodników z niepustym tytułem jedynie pseudonim i datę zdobycia oraz obliczające ile minęło dni od daty zdobycia tytułu do dnia dzisiejszego. Obliczona liczba dni powinna być zapisana pod nazwą kolumny (aliasem) „dni”.

    DATEDIFF(późniejsza, wcześniejsza) zwraca liczbę dni między datami, a CURDATE() daje dzisiejszą datę (tabela 3 arkusza). AS dni nadaje kolumnie nazwę. Wynik: 30 wierszy, pierwszy Hiikar, 2020-07-12; liczba dni zależy od dnia uruchomienia - przy zrzucie z 2026-10-02: 2273. Zrzut: kw4.png.

    Typowe błędy

    DATEDIFF(data_zdobycia, CURDATE()) daje liczby ujemne - pierwszym argumentem jest data późniejsza.

    kwerendy.txt Tekst zmienione: 6 linii
    -- Zapytanie 1
    SELECT pseudonim
    FROM zawodnicy
    WHERE data_zdobycia BETWEEN '2020-07-01' AND '2020-07-31';
    
    -- Zapytanie 2
    SELECT pseudonim, tytul
    FROM zawodnicy
    WHERE klasa = '3A'
      AND tytul <> '';
    
    -- Zapytanie 3
    SELECT pseudonim, klasa, ranking
    FROM zawodnicy
    ORDER BY ranking ASC
    LIMIT 10;
    
    -- Zapytanie 4
    SELECT pseudonim, data_zdobycia,
           DATEDIFF(CURDATE(), data_zdobycia) AS dni
    FROM zawodnicy
    WHERE tytul <> '';
    Podgląd strony po tym kroku
    Podgląd strony po kroku 7
  8. Etap 2: Grafika i animacja

    Kroki 8-9 · po tym etapie masz 8 z 40 kryteriów (pkt)

    Krok 8: Grafika 2.png: odbicie, kolor, przezroczystość

    Kryteria:

    R.2.2 Cyfra 2 z pliku 2.png jest koloru niebieskiego, odwrócona w poprawną stronę oraz zapisana z przezroczystym tłem

    ok. 5 min
    Polecenie z arkusza

    Przygotowanie grafiki 2.png: utworzona na bazie grafiki 2a.png, w ten sposób że jest jej lustrzanym odbiciem względem osi pionowej. Kolor czcionki, którą zapisano cyfrę „2”, niebieski (0000FF). Tło przezroczyste. Nazwa grafiki 2.png.

    Grafika jest taka sama w obu wersjach. 2a.png to czerwona, odwrócona dwójka na żółtym tle. W GIMP-ie:

    1. Obraz → Przekształć → Odbij poziomo - odbicie względem osi pionowej, cyfra staje się czytelna,
    2. Warstwa → Przezroczystość → Dodaj kanał alfa, potem Kolory → Kolor na alfę z żółtym - tło znika,
    3. Zaznaczenie → Według koloru na cyfrze i wypełnienie kolorem 0000FF,
    4. Eksportuj jako 2.png - PNG zachowuje przezroczystość (R.2.2).
    Typowe błędy

    Odbij pionowo odbija względem osi poziomej - cyfra stanie „do góry nogami”.

    Podgląd strony po tym kroku
    Podgląd strony po kroku 8
  9. Krok 9: Animacja cyfry.gif: 16 klatek po 750 ms

    Kryteria:

    R.2.1 Utworzony plik cyfry.gif o rozmiarze 200 x 200 px, z przezroczystością, zawierający animację złożoną z kolejnych cyfr szesnastkowych 0 - F, ustawiona jedna klatka na warstwę oraz ustawiony czas wyświetlenia obrazów na 750 ms co jest udokumentowane zrzutem parametry_animacji.png

    ok. 5 min
    Polecenie z arkusza

    Przygotowanie animacji o nazwie cyfry.gif: na animację składają się pliki, kolejno: 0.png, 1.png, 2.png, 3.png, 4.png, 5.png, 6.png, 7.png, 8.png, 9.png, A.png, B.png, C.png, D.png, E.png i F.png. Nie należy zmieniać właściwości grafik: przezroczystości i wymiarów 200 x 200 px. Każdy obraz jest pokazywany w animacji przez 750 ms, jedna klatka na warstwę. Udokumentuj ustawienie parametru za pomocą zrzutu ekranu o nazwie parametry_animacji.png. Zrzut musi obejmować cały obszar ekranu z widocznym paskiem zadań.

    Plik → Otwórz jako warstwy - szesnaście plików, z nowym 2.png zamiast 2a.png. Najniższa warstwa to pierwsza klatka: 0 na dole, F na górze (w razie potrzeby Warstwa → Stos → Odwróć kolejność warstw). Eksportuj jako cyfry.gif:

    • Jako animację, opóźnienie 750 ms, rozmieszczenie Jedna klatka na warstwę (zastąp),
    • zaznacz też „Użyj opóźnienia wprowadzonego powyżej dla wszystkich klatek” - wtedy czasu nie zmieni żadna nazwa warstwy z dopiskiem w milisekundach.

    Zrzut okna eksportu z całego ekranu: parametry_animacji.png (R.2.1).

    Typowe błędy

    Bez trybu „zastąp” klatki nakładają się na siebie - na przezroczystym tle widać wtedy wszystkie cyfry naraz.

    Podgląd strony po tym kroku
    Podgląd strony po kroku 9
  10. Etap 3: Strona HTML

    Kroki 10-17 · po tym etapie masz 21 z 40 kryteriów (pkt)

    Krok 10: Plik systemy.html: HTML5, język, kodowanie

    Kryteria:

    R.2.3 Witryna internetowa zapisana w pliku systemy.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 "Systemy liczbowe”. Strona zawiera sekcje head i body

    ok. 1 min
    Polecenie z arkusza

    Cechy witryny: Składa się ze strony o nazwie systemy.html. Zapisana w języku HTML5. Zadeklarowany polski język zawartości witryny. Jawnie zastosowany właściwy standard kodowania polskich znaków.

    Szkielet od razu z lang="pl" i <meta charset="UTF-8"> jako pierwszym elementem <head> (R.2.3). Strona działa w samej przeglądarce - skrypt też jest po stronie przeglądarki, więc serwer nie jest potrzebny.

    systemy.html HTML nowy plik
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (systemy.html)
  11. Krok 11: Tytuł strony i arkusz stylów

    Kryteria: ,

    R.2.3 Witryna internetowa zapisana w pliku systemy.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 "Systemy liczbowe”. Strona zawiera sekcje head i body

    R.3.2 Strona zawiera działające połączenie z zewnętrznym arkuszem stylów o nazwie styl.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

    Tytuł strony widoczny na karcie przeglądarki: „Systemy liczbowe”. Arkusz stylów w pliku o nazwie styl.css prawidłowo połączony z kodem strony.

    <title> (R.2.3), <link> do styl.css (R.3.2) i viewport dla telefonów.

    systemy.html HTML zmienione: 3 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Systemy liczbowe</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
    </body>
    </html>
    Podgląd strony po tym kroku (systemy.html)
  12. Krok 12: Bloki: nagłówek, trzy sekcje w main, stopka

    Kryteria:

    R.2.4 Zdefiniowany układ strony dzielący ją na bloki: nagłówkowy, lewy, środkowy, prawy 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 trzy bloki umieszczone obok siebie, 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>, trzy <section> i <footer> (R.2.4). Sekcje są opakowane w <main> - to główna treść strony, a przy okazji wspólny rodzic, w którym CSS ustawi siatkę trzech kolumn.

    Identyfikatory od treści, nie od położenia: digits (tabela cyfr), converter (kalkulator), glossary (słowniczek). Nazwa left przestałaby pasować, gdyby na telefonie sekcje stanęły jedna pod drugą.

    systemy.html HTML zmienione: 12 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Systemy liczbowe</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
        </header>
        <main>
            <section id="digits">
            </section>
            <section id="converter">
            </section>
            <section id="glossary">
            </section>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (systemy.html)
  13. Krok 13: Nagłówek: animacja i tytuł

    Kryteria: ,

    R.2.5 Umieszczone w bloku nagłówkowym <h1>: „Pozycyjne systemy liczbowe”, w bloku prawym <h2>: "Słowniczek" oraz w stopce paragraf z numerem zdającego

    R.2.9 W bloku nagłówkowym umieszczona animacja z tekstem alternatywnym "Cyfry szesnastkowe"

    ok. 1 min
    Polecenie z arkusza

    Zawartość bloku nagłówkowego: Animacja cyfry.gif z tekstem alternatywnym „Cyfry szesnastkowe”. Nagłówek pierwszego stopnia o treści „Pozycyjne systemy liczbowe”.

    Animowany GIF wstawia się jak zwykły obraz (R.2.9). Na razie ma 200 px - zmniejszy go styl.

    systemy.html HTML zmienione: 2 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Systemy liczbowe</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <img src="cyfry.gif" alt="Cyfry szesnastkowe">
            <h1>Pozycyjne systemy liczbowe</h1>
        </header>
        <main>
            <section id="digits">
            </section>
            <section id="converter">
            </section>
            <section id="glossary">
            </section>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (systemy.html)
  14. Krok 14: Blok lewy: tabela HEX - BIN - DEC

    Kryteria: ,

    R.2.6 W bloku lewym utworzona tabela o 3 kolumnach i 7 wierszach, wyświetlająca w kolumnach cyfry A ÷ F i ich odpowiedniki w kodzie binarnym oraz dziesiętnym. Zastosowane znaczniki <table>, <tr>, <td>

    R.2.7 Pierwszy wiersz tabeli zawiera komórki nagłówkowe, zastosowany znacznik <th>

    ok. 3 min
    Polecenie z arkusza

    Zawartość bloku lewego: Tabela o 3 kolumnach i 7 wierszach, której układ oraz zawartość przedstawia ilustracja 4. Pierwszy wiersz składa się z komórek nagłówkowych.

    Pierwszy wiersz to <th> (HEX, BIN, DEC), dalej sześć wierszy <td> z cyframi A - F: A = 1010₂ = 10, … F = 1111₂ = 15 (R.2.6, R.2.7). Klucz liczy dokładnie <table>, <tr>, <td> i <th> - bez <thead>, żeby nie zgubić prostoty siedmiu wierszy z ilustracji.

    systemy.html HTML zmienione: 37 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Systemy liczbowe</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <img src="cyfry.gif" alt="Cyfry szesnastkowe">
            <h1>Pozycyjne systemy liczbowe</h1>
        </header>
        <main>
            <section id="digits">
                <table>
                    <tr>
                        <th>HEX</th>
                        <th>BIN</th>
                        <th>DEC</th>
                    </tr>
                    <tr>
                        <td>A</td>
                        <td>1010</td>
                        <td>10</td>
                    </tr>
                    <tr>
                        <td>B</td>
                        <td>1011</td>
                        <td>11</td>
                    </tr>
                    <tr>
                        <td>C</td>
                        <td>1100</td>
                        <td>12</td>
                    </tr>
                    <tr>
                        <td>D</td>
                        <td>1101</td>
                        <td>13</td>
                    </tr>
                    <tr>
                        <td>E</td>
                        <td>1110</td>
                        <td>14</td>
                    </tr>
                    <tr>
                        <td>F</td>
                        <td>1111</td>
                        <td>15</td>
                    </tr>
                </table>
            </section>
            <section id="converter">
            </section>
            <section id="glossary">
            </section>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (systemy.html)
  15. Krok 15: Blok środkowy: pole, przycisk, akapit

    Kryteria: , ,

    R.2.10 W bloku środkowym umieszczone pole edycyjne oraz przycisk z napisem "Przelicz na binarny"

    R.3.4 Pole edycyjne jest typu numerycznego

    R.3.5 Dla pola edycyjnego zapisany atrybut placeholder= "Wpisz liczbę dziesiętną"

    ok. 3 min
    Polecenie z arkusza

    Zawartość bloku środkowego: Pole edycyjne przeznaczone do wpisywania liczb, z podpowiedzią: „Wpisz liczbę dziesiętną”. Przycisk o treści „Przelicz na binarny”, jego wciśnięcie uruchamia skrypt. Paragraf o treści: „Brak obliczeń”.

    • type="number" - pole na liczby (R.3.4), placeholder - szara podpowiedź (R.3.5); min="0" i step="1" mówią przeglądarce, że chodzi o liczby całkowite nieujemne (strzałki pola nie zejdą poniżej zera),
    • aria-label - pole nie ma widocznej etykiety, więc czytnik ekranu dostaje jej nazwę z atrybutu (podpowiedź znika po wpisaniu, więc etykietą nie jest),
    • przycisk z id="convert" i type="button" - zwykły przycisk, nie wysyła żadnego formularza; kliknięcie podłączy skrypt (R.2.10),
    • akapit result z aria-live="polite" - czytnik ekranu przeczyta nowy wynik, gdy skrypt go wpisze.

    Brak atrybutu onclick jest celowy: obsługę kliknięcia doda plik skrypt.js.

    systemy.html HTML zmienione: 3 linie
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Systemy liczbowe</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <img src="cyfry.gif" alt="Cyfry szesnastkowe">
            <h1>Pozycyjne systemy liczbowe</h1>
        </header>
        <main>
            <section id="digits">
                <table>
                    <tr>
                        <th>HEX</th>
                        <th>BIN</th>
                        <th>DEC</th>
                    </tr>
                    <tr>
                        <td>A</td>
                        <td>1010</td>
                        <td>10</td>
                    </tr>
                    <tr>
                        <td>B</td>
                        <td>1011</td>
                        <td>11</td>
                    </tr>
                    <tr>
                        <td>C</td>
                        <td>1100</td>
                        <td>12</td>
                    </tr>
                    <tr>
                        <td>D</td>
                        <td>1101</td>
                        <td>13</td>
                    </tr>
                    <tr>
                        <td>E</td>
                        <td>1110</td>
                        <td>14</td>
                    </tr>
                    <tr>
                        <td>F</td>
                        <td>1111</td>
                        <td>15</td>
                    </tr>
                </table>
            </section>
            <section id="converter">
                <input type="number" id="decimal" min="0" step="1" placeholder="Wpisz liczbę dziesiętną" aria-label="Liczba dziesiętna">
                <button type="button" id="convert">Przelicz na binarny</button>
                <p id="result" aria-live="polite">Brak obliczeń</p>
            </section>
            <section id="glossary">
            </section>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (systemy.html)
  16. Krok 16: Blok prawy: słowniczek jako lista definicji

    Kryteria: , ,

    R.2.5 Umieszczone w bloku nagłówkowym <h1>: „Pozycyjne systemy liczbowe”, w bloku prawym <h2>: "Słowniczek" oraz w stopce paragraf z numerem zdającego

    R.2.8 W bloku prawym umieszczona jedna lista definicji, zastosowany znacznik <dl>. Lista zawiera 3 terminy zapisane w znaczniku <dt>: "Binarny", "Decymalny" i "Heksadecymalny" oraz ich znaczenie w znaczniku <dd>

    R.3.3 Kliknięcie napisu " Heksadecymalny" inicjuje otwarcie strony https://szesnastkowy_system_liczbowy.pl

    ok. 3 min
    Polecenie z arkusza

    Zawartość bloku prawego: Nagłówek drugiego stopnia o treści „Słowniczek”. Lista definicji, zawierająca terminy i ich definicje. Tekst można skopiować z pliku systemy.txt. Termin „Heksadecymalny” w liście definicji jest odnośnikiem prowadzącym do strony internetowej https://szesnastkowy_system_liczbowy.pl.

    Lista definicji <dl>: termin w <dt>, objaśnienie w <dd> tuż pod nim. Tekst z systemy.txt. Termin „Heksadecymalny” owija odnośnik <a> wewnątrz <dt> - termin zostaje terminem, a jego treść jest klikalna (R.2.5, R.2.8, R.3.3).

    systemy.html HTML zmienione: 9 linii
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Systemy liczbowe</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <img src="cyfry.gif" alt="Cyfry szesnastkowe">
            <h1>Pozycyjne systemy liczbowe</h1>
        </header>
        <main>
            <section id="digits">
                <table>
                    <tr>
                        <th>HEX</th>
                        <th>BIN</th>
                        <th>DEC</th>
                    </tr>
                    <tr>
                        <td>A</td>
                        <td>1010</td>
                        <td>10</td>
                    </tr>
                    <tr>
                        <td>B</td>
                        <td>1011</td>
                        <td>11</td>
                    </tr>
                    <tr>
                        <td>C</td>
                        <td>1100</td>
                        <td>12</td>
                    </tr>
                    <tr>
                        <td>D</td>
                        <td>1101</td>
                        <td>13</td>
                    </tr>
                    <tr>
                        <td>E</td>
                        <td>1110</td>
                        <td>14</td>
                    </tr>
                    <tr>
                        <td>F</td>
                        <td>1111</td>
                        <td>15</td>
                    </tr>
                </table>
            </section>
            <section id="converter">
                <input type="number" id="decimal" min="0" step="1" placeholder="Wpisz liczbę dziesiętną" aria-label="Liczba dziesiętna">
                <button type="button" id="convert">Przelicz na binarny</button>
                <p id="result" aria-live="polite">Brak obliczeń</p>
            </section>
            <section id="glossary">
                <h2>Słowniczek</h2>
                <dl>
                    <dt>Binarny</dt>
                    <dd>pozycyjny system liczbowy, w którym podstawą jest liczba 2, a do zapisu liczb potrzebne są tylko dwie cyfry: 0 i 1.</dd>
                    <dt>Decymalny</dt>
                    <dd>pozycyjny system liczbowy, w którym podstawą jest liczba 10; do zapisu liczb stosuje się 10 cyfr: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.</dd>
                    <dt><a href="https://szesnastkowy_system_liczbowy.pl">Heksadecymalny</a></dt>
                    <dd>pozycyjny system liczbowy, w którym podstawą jest liczba 16. Do zapisu liczb w tym systemie potrzebne jest szesnaście znaków.</dd>
                </dl>
            </section>
        </main>
        <footer>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (systemy.html)
  17. Krok 17: Stopka z wyróżnionym autorem

    Kryteria: ,

    R.2.5 Umieszczone w bloku nagłówkowym <h1>: „Pozycyjne systemy liczbowe”, w bloku prawym <h2>: "Słowniczek" oraz w stopce paragraf z numerem zdającego

    R.3.7 Zastosowany znacznik <em> do zapisu numeru zdającego

    ok. 1 min
    Polecenie z arkusza

    Zawartość stopki: Paragraf o treści „Stronę opracował: ”, dalej numer zdającego. Numer jest formatowany semantycznym znacznikiem służącym do uwypuklenia tekstu, poprzez zapisanie go kursywą.

    Semantyczne uwypuklenie zapisywane kursywą to <em> (emphasis); <i> daje tylko kursywę bez znaczenia, a klucz wymaga <em> (R.3.7). Na egzaminie w <em> wpisujesz swój numer zdającego (PESEL).

    systemy.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Systemy liczbowe</title>
        <link rel="stylesheet" href="styl.css">
    </head>
    <body>
        <header>
            <img src="cyfry.gif" alt="Cyfry szesnastkowe">
            <h1>Pozycyjne systemy liczbowe</h1>
        </header>
        <main>
            <section id="digits">
                <table>
                    <tr>
                        <th>HEX</th>
                        <th>BIN</th>
                        <th>DEC</th>
                    </tr>
                    <tr>
                        <td>A</td>
                        <td>1010</td>
                        <td>10</td>
                    </tr>
                    <tr>
                        <td>B</td>
                        <td>1011</td>
                        <td>11</td>
                    </tr>
                    <tr>
                        <td>C</td>
                        <td>1100</td>
                        <td>12</td>
                    </tr>
                    <tr>
                        <td>D</td>
                        <td>1101</td>
                        <td>13</td>
                    </tr>
                    <tr>
                        <td>E</td>
                        <td>1110</td>
                        <td>14</td>
                    </tr>
                    <tr>
                        <td>F</td>
                        <td>1111</td>
                        <td>15</td>
                    </tr>
                </table>
            </section>
            <section id="converter">
                <input type="number" id="decimal" min="0" step="1" placeholder="Wpisz liczbę dziesiętną" aria-label="Liczba dziesiętna">
                <button type="button" id="convert">Przelicz na binarny</button>
                <p id="result" aria-live="polite">Brak obliczeń</p>
            </section>
            <section id="glossary">
                <h2>Słowniczek</h2>
                <dl>
                    <dt>Binarny</dt>
                    <dd>pozycyjny system liczbowy, w którym podstawą jest liczba 2, a do zapisu liczb potrzebne są tylko dwie cyfry: 0 i 1.</dd>
                    <dt>Decymalny</dt>
                    <dd>pozycyjny system liczbowy, w którym podstawą jest liczba 10; do zapisu liczb stosuje się 10 cyfr: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.</dd>
                    <dt><a href="https://szesnastkowy_system_liczbowy.pl">Heksadecymalny</a></dt>
                    <dd>pozycyjny system liczbowy, w którym podstawą jest liczba 16. Do zapisu liczb w tym systemie potrzebne jest szesnaście znaków.</dd>
                </dl>
            </section>
        </main>
        <footer>
            <p>Stronę opracował: <em>Bartosz Bryniarski</em></p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (systemy.html)
  18. Etap 4: Styl CSS

    Kroki 18-23 · po tym etapie masz 32 z 40 kryteriów (pkt)

    Krok 18: Plik styl.css: kolory w zmiennych, czcionka strony

    Kryteria:

    R.4.1 Ustawiony dla ciała strony lub kontenera całej strony krój czcionki Georgia oraz kolor czcionki biały

    ok. 2 min
    Polecenie z arkusza

    Dla ciała strony: krój czcionki Georgia, biały kolor czcionki.

    Trzy kolory tła z arkusza jako zmienne CSS w :root - śliwkowy #824555 wraca w nagłówku, stopce, bloku środkowym i ramkach tabeli. Dwa różowe różnią się tylko ostatnią cyfrą (…75 i …70), więc nazwy zmiennych chronią przed pomyłką przy przepisywaniu. Potem body: Georgia i biały tekst (R.4.1) - na razie niewidoczny na białym tle.

    styl.css CSS nowy plik
    :root {
        --plum: #824555;
        --rose: #A26475;
        --rose-light: #A26470;
    }
    
    body {
        font-family: Georgia;
        color: white;
    }
    Podgląd strony po tym kroku (systemy.html)
  19. Krok 19: Nagłówek i stopka

    Kryteria: , ,

    R.4.2 Ustawiony kolor tła dla bloku nagłówkowego i stopki #824555, dla bloku lewego #A26475, dla środkowego #824555 oraz dla prawego #A26470

    R.4.5 Ustawione marginesy wewnętrzne (padding) 20px dla bloków nagłówkowego i stopki, 5px dla komórki i komórki nagłówkowej tabeli, oraz jedynie górny margines wewnętrzny 20px dla terminu listy definicji

    R.4.9 Ustawione wyrównanie tekstu do środka dla bloków nagłówkowego i stopki

    ok. 1 min
    Polecenie z arkusza

    Wspólne dla bloków nagłówkowego i stopki: kolor tła #824555, wyrównanie tekstu do środka, marginesy wewnętrzne 20 px.

    Jedna reguła dla dwóch selektorów, każdy w osobnej linii (R.4.2, R.4.5, R.4.9).

    styl.css CSS zmienione: 7 linii
    :root {
        --plum: #824555;
        --rose: #A26475;
        --rose-light: #A26470;
    }
    
    body {
        font-family: Georgia;
        color: white;
    }
    
    header,
    footer {
        background-color: var(--plum);
        text-align: center;
        padding: 20px;
    }
    Podgląd strony po tym kroku (systemy.html)
  20. Krok 20: Bloki lewy i środkowy: siatka trzech kolumn

    Kryteria: , , ,

    R.3.1 Układ bloków po uruchomieniu strony w przeglądarce jest zgodny z ilustracją 3 w arkuszu egzaminacyjnym (prawidłowo zastosowano właściwości CSS decydujące o układzie strony, np. float i clear albo display flex albo grid albo position )

    R.4.2 Ustawiony kolor tła dla bloku nagłówkowego i stopki #824555, dla bloku lewego #A26475, dla środkowego #824555 oraz dla prawego #A26470

    R.4.3 Ustawiona wysokość bloku lewego, środkowego i prawego 350px

    R.4.4 Ustawiona szerokość bloku lewego i środkowego 30%, prawego 40% (width lub grid- template-columns lub flex) oraz dla obrazu 50px

    ok. 3 min
    Polecenie z arkusza

    Wspólne bloków lewego i środkowego: szerokość 30%, wysokość 350 px. Dodatkowo kolor tła dla bloku lewego #A26475, dla bloku środkowego #824555.

    Blok główny staje się siatką o trzech kolumnach: grid-template-columns: 30% 30% 40% to szerokości bloków lewego, środkowego i prawego naraz - klucz R.4.4 przyjmuje je zapisane właśnie tu. Sekcje wpadają do kolumn w kolejności z HTML-u, obok siebie, bez float i bez clear w stopce (R.3.1).

    Wysokość 350 px dla wszystkich sekcji w main (main section) - arkusz podaje ją dla lewego i środkowego, a w następnym kroku tę samą dla prawego (R.4.3). Kolory tła z dwóch zmiennych (R.4.2).

    Typowe błędy

    width: 30% dopisane do sekcji w siatce 30% 30% 40% zwęża je do 9% strony - procent szerokości elementu siatki liczy się od jego kolumny.

    styl.css CSS zmienione: 17 linii
    :root {
        --plum: #824555;
        --rose: #A26475;
        --rose-light: #A26470;
    }
    
    body {
        font-family: Georgia;
        color: white;
    }
    
    header,
    footer {
        background-color: var(--plum);
        text-align: center;
        padding: 20px;
    }
    
    main {
        display: grid;
        grid-template-columns: 30% 30% 40%;
    }
    
    main section {
        height: 350px;
    }
    
    #digits {
        background-color: var(--rose);
    }
    
    #converter {
        background-color: var(--plum);
    }
    Podgląd strony po tym kroku (systemy.html)
  21. Krok 21: Blok prawy: paski tylko w razie potrzeby

    Kryteria: , , ,

    R.4.2 Ustawiony kolor tła dla bloku nagłówkowego i stopki #824555, dla bloku lewego #A26475, dla środkowego #824555 oraz dla prawego #A26470

    R.4.3 Ustawiona wysokość bloku lewego, środkowego i prawego 350px

    R.4.4 Ustawiona szerokość bloku lewego i środkowego 30%, prawego 40% (width lub grid- template-columns lub flex) oraz dla obrazu 50px

    R.4.10 Ustawione paski przewijania na auto dla bloku prawego

    ok. 1 min
    Polecenie z arkusza

    Dla bloku prawego: kolor tła #A26470, szerokość 40%, wysokość 350 px, paski przewijania widoczne jedynie, gdy treść nie mieści się w bloku.

    „Tylko gdy treść się nie mieści” to overflow: auto (R.4.10) - słowniczek jest dłuższy niż 350 px, więc pasek się pojawi. Szerokość 40% stoi w trzeciej kolumnie siatki, a wysokość 350 px w regule main section (R.4.2, R.4.3, R.4.4).

    styl.css CSS zmienione: 5 linii
    :root {
        --plum: #824555;
        --rose: #A26475;
        --rose-light: #A26470;
    }
    
    body {
        font-family: Georgia;
        color: white;
    }
    
    header,
    footer {
        background-color: var(--plum);
        text-align: center;
        padding: 20px;
    }
    
    main {
        display: grid;
        grid-template-columns: 30% 30% 40%;
    }
    
    main section {
        height: 350px;
    }
    
    #digits {
        background-color: var(--rose);
    }
    
    #converter {
        background-color: var(--plum);
    }
    
    #glossary {
        background-color: var(--rose-light);
        overflow: auto;
    }
    Podgląd strony po tym kroku (systemy.html)
  22. Krok 22: Obraz: mały, po lewej

    Kryteria: ,

    R.4.4 Ustawiona szerokość bloku lewego i środkowego 30%, prawego 40% (width lub grid- template-columns lub flex) oraz dla obrazu 50px

    R.4.7 Ustawione dla obrazu opływanie tekstem z prawej strony (float: left;)

    ok. 1 min
    Polecenie z arkusza

    Dla obrazu: oblewanie tekstem z prawej strony (obraz po lewej stronie), szerokość 50 px.

    Tu siatka nie zastąpi float: klucz R.4.7 ocenia wprost float: left - i to jest właściwe narzędzie, bo chodzi o oblewanie tekstem (tytuł opływa animację z prawej), do czego float powstał (R.4.4, R.4.7).

    styl.css CSS zmienione: 5 linii
    :root {
        --plum: #824555;
        --rose: #A26475;
        --rose-light: #A26470;
    }
    
    body {
        font-family: Georgia;
        color: white;
    }
    
    header,
    footer {
        background-color: var(--plum);
        text-align: center;
        padding: 20px;
    }
    
    main {
        display: grid;
        grid-template-columns: 30% 30% 40%;
    }
    
    main section {
        height: 350px;
    }
    
    #digits {
        background-color: var(--rose);
    }
    
    #converter {
        background-color: var(--plum);
    }
    
    #glossary {
        background-color: var(--rose-light);
        overflow: auto;
    }
    
    img {
        float: left;
        width: 50px;
    }
    Podgląd strony po tym kroku (systemy.html)
  23. Krok 23: Marginesy, termin listy i komórki tabeli

    Kryteria: , ,

    R.4.5 Ustawione marginesy wewnętrzne (padding) 20px dla bloków nagłówkowego i stopki, 5px dla komórki i komórki nagłówkowej tabeli, oraz jedynie górny margines wewnętrzny 20px dla terminu listy definicji

    R.4.6 Ustawione marginesy zewnętrzne (margin) 10px dla selektorów table, p oraz dt

    R.4.8 Ustawione obramowanie dla komórki i komórki nagłówkowej tabeli na wartość 3px solid #824555

    ok. 2 min
    Polecenie z arkusza

    Wspólne dla selektorów tabeli, paragrafu oraz terminu listy definicji: marginesy zewnętrzne 10 px. Dodatkowo dla terminu listy definicji: górny margines wewnętrzny 20 px. Wspólne dla komórki i komórki nagłówkowej tabeli: obramowanie linią ciągłą o grubości 3 px, koloru #824555, margines wewnętrzny 5 px.

    Selektory znaczników table, p, dt - uwaga arkusza wymaga ich dla tych trzech elementów (R.4.6). Ramka komórek w śliwkowym kolorze nagłówka z tej samej zmiennej (R.4.5, R.4.8).

    styl.css CSS zmienione: 16 linii
    :root {
        --plum: #824555;
        --rose: #A26475;
        --rose-light: #A26470;
    }
    
    body {
        font-family: Georgia;
        color: white;
    }
    
    header,
    footer {
        background-color: var(--plum);
        text-align: center;
        padding: 20px;
    }
    
    main {
        display: grid;
        grid-template-columns: 30% 30% 40%;
    }
    
    main section {
        height: 350px;
    }
    
    #digits {
        background-color: var(--rose);
    }
    
    #converter {
        background-color: var(--plum);
    }
    
    #glossary {
        background-color: var(--rose-light);
        overflow: auto;
    }
    
    img {
        float: left;
        width: 50px;
    }
    
    table,
    p,
    dt {
        margin: 10px;
    }
    
    dt {
        padding-top: 20px;
    }
    
    td,
    th {
        border: 3px solid var(--plum);
        padding: 5px;
    }
    Podgląd strony po tym kroku (systemy.html)
  24. Etap 5: Skrypt JavaScript

    Kroki 24-28 · po tym etapie masz 40 z 40 kryteriów (pkt)

    Krok 24: Plik skrypt.js, odczyt pola i kliknięcie przycisku

    Kryteria: , , ,

    R.3.6 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.5.1 Skrypt jest napisany w języku JavaScript i zawiera on przynajmniej jedną poprawną składniowo instrukcję wynikającą z treści zadania

    R.5.2 Skrypt pobiera dane z pola edycyjnego, np. funkcja document.getElementById z parametrem, który zdefiniowany jest w kontrolce jako id

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

    Wykonywany po stronie przeglądarki. Należy stosować znaczące nazewnictwo zmiennych i funkcji w języku polskim lub angielskim.

    Skrypt w osobnym pliku skrypt.js, dołączony w <head> z atrybutem defer: przeglądarka pobiera go równolegle ze stroną, a uruchamia dopiero po zbudowaniu całego HTML-u - dlatego getElementById znajdzie pole i przycisk, choć skrypt stoi wyżej niż one (R.5.1).

    • const - elementy strony nie zmienią się, więc stałe zamiast let,
    • valueAsNumber - wartość pola od razu jako liczba (puste pole daje NaN, a nie zero jak Number("")) (R.5.2),
    • addEventListener('click', convert) - kliknięcie uruchamia funkcję convert; klucz R.3.6 przyjmuje obsługę zdarzenia zapisaną w skrypcie tak samo jak onclick w HTML-u (R.3.6).

    Nazwy po angielsku mówią, co przechowują (R.5.7). Funkcja na razie tylko odczytuje liczbę.

    skrypt.js JavaScript nowy plik
    const decimalInput = document.getElementById('decimal');
    const result = document.getElementById('result');
    
    function convert() {
        const value = decimalInput.valueAsNumber;
    }
    
    document.getElementById('convert').addEventListener('click', convert);
    systemy.html HTML zmienione: 1 linia
    <!DOCTYPE html>
    <html lang="pl">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>Systemy liczbowe</title>
        <link rel="stylesheet" href="styl.css">
        <script src="skrypt.js" defer></script>
    </head>
    <body>
        <header>
            <img src="cyfry.gif" alt="Cyfry szesnastkowe">
            <h1>Pozycyjne systemy liczbowe</h1>
        </header>
        <main>
            <section id="digits">
                <table>
                    <tr>
                        <th>HEX</th>
                        <th>BIN</th>
                        <th>DEC</th>
                    </tr>
                    <tr>
                        <td>A</td>
                        <td>1010</td>
                        <td>10</td>
                    </tr>
                    <tr>
                        <td>B</td>
                        <td>1011</td>
                        <td>11</td>
                    </tr>
                    <tr>
                        <td>C</td>
                        <td>1100</td>
                        <td>12</td>
                    </tr>
                    <tr>
                        <td>D</td>
                        <td>1101</td>
                        <td>13</td>
                    </tr>
                    <tr>
                        <td>E</td>
                        <td>1110</td>
                        <td>14</td>
                    </tr>
                    <tr>
                        <td>F</td>
                        <td>1111</td>
                        <td>15</td>
                    </tr>
                </table>
            </section>
            <section id="converter">
                <input type="number" id="decimal" min="0" step="1" placeholder="Wpisz liczbę dziesiętną" aria-label="Liczba dziesiętna">
                <button type="button" id="convert">Przelicz na binarny</button>
                <p id="result" aria-live="polite">Brak obliczeń</p>
            </section>
            <section id="glossary">
                <h2>Słowniczek</h2>
                <dl>
                    <dt>Binarny</dt>
                    <dd>pozycyjny system liczbowy, w którym podstawą jest liczba 2, a do zapisu liczb potrzebne są tylko dwie cyfry: 0 i 1.</dd>
                    <dt>Decymalny</dt>
                    <dd>pozycyjny system liczbowy, w którym podstawą jest liczba 10; do zapisu liczb stosuje się 10 cyfr: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.</dd>
                    <dt><a href="https://szesnastkowy_system_liczbowy.pl">Heksadecymalny</a></dt>
                    <dd>pozycyjny system liczbowy, w którym podstawą jest liczba 16. Do zapisu liczb w tym systemie potrzebne jest szesnaście znaków.</dd>
                </dl>
            </section>
        </main>
        <footer>
            <p>Stronę opracował: <em>Bartosz Bryniarski</em></p>
        </footer>
    </body>
    </html>
    Podgląd strony po tym kroku (systemy.html)
  25. Krok 25: Sprawdzenie wpisanej liczby

    ok. 2 min
    Polecenie z arkusza

    Wartość, w postaci liczby dziesiętnej, pobraną z pola edycyjnego, przekształca na system binarny.

    Zanim cokolwiek się przeliczy, skrypt sprawdza, czy ma co przeliczać. Number.isSafeInteger(value) odrzuca NaN (puste pole), ułamki i liczby większe niż 2⁵³ - 1, przy których JavaScript traci dokładność; value < 0 odrzuca liczby ujemne. Wtedy komunikat w akapicie i return kończy funkcję.

    To nie jest ozdoba: w wersji podstawowej liczba ujemna zawiesza kartę przeglądarki (Math.floor(-1 / 2) daje -1, więc pętla nigdy nie dochodzi do zera), a puste pole daje wynik „0”.

    skrypt.js JavaScript zmienione: 5 linii
    const decimalInput = document.getElementById('decimal');
    const result = document.getElementById('result');
    
    function convert() {
        const value = decimalInput.valueAsNumber;
    
        if (!Number.isSafeInteger(value) || value < 0) {
            result.textContent = 'Wpisz liczbę całkowitą nieujemną.';
            return;
        }
    }
    
    document.getElementById('convert').addEventListener('click', convert);
    Podgląd strony po tym kroku (systemy.html)
  26. Krok 26: Zamiana na system binarny: toString(2)

    Kryteria:

    R.5.3 Skrypt przelicza liczbę dziesiętną na binarną

    ok. 2 min
    Polecenie z arkusza

    Wartość, w postaci liczby dziesiętnej, pobraną z pola edycyjnego, przekształca na system binarny.

    value.toString(2) zapisuje liczbę w systemie o podstawie 2 - argument to podstawa (16 dałoby zapis szesnastkowy). Robi dokładnie to, co algorytm K1 - K6 z arkusza: dzieli przez 2, zbiera reszty i odwraca ich kolejność. Dla 537: reszty 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, po odwróceniu 1000011001 (R.5.3).

    Klucz ocenia, czy skrypt przelicza liczbę, a nie którą metodą - algorytm w arkuszu jest podpisany „Przykład algorytmu”. Kto woli pokazać go na egzaminie, ma go rozpisanego w wersji podstawowej.

    skrypt.js JavaScript zmienione: 2 linie
    const decimalInput = document.getElementById('decimal');
    const result = document.getElementById('result');
    
    function convert() {
        const value = decimalInput.valueAsNumber;
    
        if (!Number.isSafeInteger(value) || value < 0) {
            result.textContent = 'Wpisz liczbę całkowitą nieujemną.';
            return;
        }
    
        const binary = value.toString(2);
    }
    
    document.getElementById('convert').addEventListener('click', convert);
    Podgląd strony po tym kroku (systemy.html)
  27. Krok 27: Grupy po cztery cyfry od prawej

    Kryteria:

    R.5.5 Liczba binarna wyświetlana jest w 4-cyfrowych blokach oddzielonych spacją, począwszy od prawej strony

    ok. 3 min
    Polecenie z arkusza

    Liczba binarna jest rozdzielona spacją na części (co cztery cyfry począwszy od prawej strony).

    Funkcja groupByFour(digits) tnie napis od końca: end zaczyna się na długości napisu i co obrót cofa się o 4, a slice(Math.max(0, end - 4), end) wycina ostatnie cztery cyfry (albo resztę z lewej, gdy zostało ich mniej). unshift wstawia każdą grupę na początek tablicy, więc kolejność zostaje właściwa, a join(' ') skleja grupy spacjami: 1000011001 → 10 0001 1001 (R.5.5).

    Osobna funkcja z nazwą mówiącą, co robi, da się sprawdzić niezależnie od strony - np. w konsoli przeglądarki: groupByFour('11111111') daje 1111 1111.

    Typowe błędy

    Grupowanie od lewej daje 1000 0110 01 - klucz wymaga podziału od prawej strony.

    skrypt.js JavaScript zmienione: 8 linii
    const decimalInput = document.getElementById('decimal');
    const result = document.getElementById('result');
    
    function groupByFour(digits) {
        const groups = [];
        for (let end = digits.length; end > 0; end -= 4) {
            groups.unshift(digits.slice(Math.max(0, end - 4), end));
        }
        return groups.join(' ');
    }
    
    function convert() {
        const value = decimalInput.valueAsNumber;
    
        if (!Number.isSafeInteger(value) || value < 0) {
            result.textContent = 'Wpisz liczbę całkowitą nieujemną.';
            return;
        }
    
        const binary = value.toString(2);
    }
    
    document.getElementById('convert').addEventListener('click', convert);
    Podgląd strony po tym kroku (systemy.html)
  28. Krok 28: Wynik z indeksem dolnym (2)

    Kryteria: ,

    R.5.4 Skrypt wyświetla obliczony wynik pod przyciskiem w paragrafie

    R.5.6 Na końcu liczby binarnej, w indeksie dolnym, wypisywane jest: "(2)"

    ok. 3 min
    Polecenie z arkusza

    Wyświetla w paragrafie pod przyciskiem obliczoną liczbę binarną. Liczba binarna jest zakończona oznaczeniem kodu w postaci tekstu „(2)”, zapisanym w indeksie dolnym.

    Indeks dolny to znacznik <sub> - skrypt tworzy go przez document.createElement('sub') i wpisuje mu tekst (2) przez textContent. Potem result.replaceChildren(...) zastępuje całą zawartość akapitu dwoma elementami: tekstem z grupami i indeksem (R.5.4, R.5.6).

    Bez innerHTML żaden tekst nie jest czytany jako HTML - tu dane pochodzą z pola liczbowego, więc ryzyka nie ma, ale nawyk chroni tam, gdzie tekst wpisuje użytkownik. Sprawdzone w Chrome: 537 → „10 0001 1001₍₂₎” jak na ilustracji 5, 0 → „0₍₂₎”, 255 → „1111 1111₍₂₎”, a puste pole, -5 i 2.5 → komunikat. Wpisz liczbę w podglądzie i kliknij przycisk.

    skrypt.js JavaScript zmienione: 3 linie
    const decimalInput = document.getElementById('decimal');
    const result = document.getElementById('result');
    
    function groupByFour(digits) {
        const groups = [];
        for (let end = digits.length; end > 0; end -= 4) {
            groups.unshift(digits.slice(Math.max(0, end - 4), end));
        }
        return groups.join(' ');
    }
    
    function convert() {
        const value = decimalInput.valueAsNumber;
    
        if (!Number.isSafeInteger(value) || value < 0) {
            result.textContent = 'Wpisz liczbę całkowitą nieujemną.';
            return;
        }
    
        const binary = value.toString(2);
        const base = document.createElement('sub');
        base.textContent = '(2)';
        result.replaceChildren(groupByFour(binary), base);
    }
    
    document.getElementById('convert').addEventListener('click', convert);
    Podgląd strony po tym kroku (systemy.html)
  29. Etap 6: Porównanie z wersją podstawową

    Krok 29 · po tym etapie masz 40 z 40 kryteriów (pkt)

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

    ok. 2 min

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

    wersja podstawowawersja nowoczesna
    układfloat: left w sekcjach + clear: both w stopce<main> z siatką 30% 30% 40%
    kolorywpisane w każdej regulezmienne CSS w :root
    skrypt<script> na końcu <body>, onclick w przyciskuskrypt.js z defer, addEventListener
    zamianaalgorytm K1 - K6: pętla z resztą z dzielenia i odwrócenie napisutoString(2)
    grupypętla z warunkiem na liczbę cyfr po prawejfunkcja groupByFour() tnąca od końca
    wynikinnerHTML z <sub> w napisiecreateElement + replaceChildren
    złe dane-5 zawiesza kartę, puste pole daje „0”komunikat

    Na egzaminie wersja podstawowa pokazuje egzaminatorowi algorytm z arkusza krok po kroku - jeśli skrypt nie zadziała, kryteria R.5.x ocenia się w kodzie, a pętla z resztą z dzielenia jest wtedy czytelna. Nowoczesna jest krótsza i odporna na złe dane, ale wymaga pewności, że toString(2), valueAsNumber i replaceChildren się pamięta.

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

  30. Etap 7: Oddanie pracy

    Krok 30 · po tym etapie masz 40 z 40 kryteriów (pkt)

    Krok 30: 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. Umieść go w folderze z numerem zdającego. Nagraj płytę z rezultatami pracy. W folderze z numerem zdającego, powinny znajdować się pliki: 2.png, cyfry.gif, import.png, kw1.png, kw2.png, kw3.png, kw4.png, kwerendy.txt, parametry_animacji.png, przeglądarka.txt, styl.css, systemy.html, ewentualnie inne przygotowane pliki.

    Do listy z arkusza dochodzi skrypt.js - bez niego kalkulator nie działa („ewentualnie inne przygotowane pliki”). W przeglądarka.txt wpisz nazwę przeglądarki, nagraj płytę i sprawdź jej odczyt.

    Typowe błędy

    Płyta bez skrypt.js - strona się otworzy, ale przycisk nic nie zrobi, a kryteria R.5.x egzaminator oceni tylko w kodzie, którego nie ma.

    przeglądarka.txt Tekst nowy plik
    Google Chrome

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

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.