INF.03-07-26.06-SGCzerwiec 2026 · 39 kroków · ok. 66 min · 34 kryteria z klucza
Rozwiązanie krok po kroku: Plansza kółko i krzyżyk (Nowoczesny kod (grid, data-*))
To drugi sposób rozwiązania tego samego arkusza. Wynik jest ten sam - baza gryTowarzyskie z czterema zapytaniami i strona gra.html z planszą 3 × 3, na której kółko i krzyżyk grają na zmianę - i tak samo spełnia każde kryterium klucza. Inna jest droga:
siatka CSS: trzy sekcje w grid-template-columns: 20% 60% 20% zamiast display: flex z szerokościami bloków,
stan gry w jednym miejscu: skrypt zapisuje, kto gra, w atrybucie data-player bloku głównego, a to, która sekcja jest widoczna, wynika z reguł CSS - skrypt nie ustawia stylów,
skrypt w osobnym plikugra.js z atrybutem defer: querySelectorAll i addEventListener zamiast dziewięciu atrybutów onclick, zajęte pole kończy funkcję od razu (return), nazwa obrazu powstaje z gracza, a tekst alternatywny mówi, co stoi w polu.
Na końcu krótkie porównanie z wersją podstawową (zakładka obok). Baza i obrazy pochodzą z prawdziwego archiwum pliki8, zapytania zostały wykonane na tej bazie w MariaDB, a plansza sprawdzona w prawdziwej przeglądarce: przebieg z ilustracji 4 i klik w zajęte pole. Plansza w podglądzie działa - od kroków ze skryptem można w nią klikać.
Jak liczą się punkty. Klucz ma 34 kryteria (R.1.1 - R.5.7), każde za 1 punkt. Próg zdania to 75%, czyli 26 punktów. Przy każdym kroku jest napisane, które kryteria spełnia.
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 34 kryteriów (pkt)
Krok 1: Baza danych gryTowarzyskie
ok. 2 min
Polecenie z arkusza
Utwórz bazę danych o nazwie gryTowarzyskie, z zestawem polskich znaków (np. utf8_polish_ci).
Archiwum pliki8.7z rozpakuj hasłem KoLko+KrzyZyk (wielkość liter ma znaczenie). W phpMyAdmin Nowa → gryTowarzyskie, porównywanie utf8_polish_ci:
CREATE DATABASE gryTowarzyskie CHARACTER SET utf8 COLLATE utf8_polish_ci;
MariaDB na Windows pokaże nazwę małymi literami (grytowarzyskie) - to ustawienie serwera, nie błąd.
Krok 2: Import tabeli z pliku
ok. 2 min
Polecenie z arkusza
Do utworzonej bazy zaimportuj tabelę z pliku gryTowarzyskie.sql.
Import → plik z archiwum (w archiwum nazwa jest małymi literami: grytowarzyskie.sql). Jedna tabela z 12 grami.
Krok 3: Zrzut ekranu import.png
Kryteria:
R.1.1 Wykonany import tabel do bazy danych gryTowarzyskie - plik 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.
Typowe błędy
Wykadrowany zrzut nie jest oceniany.
Krok 4: Zapytanie 1: gry dla więcej niż 4 graczy
Kryteria: ,
R.1.2 W pliku kwerendy.txt zapisane co najmniej jedno zapytanie SQL, wynikające z treści zadania
R.1.3 Wykonane zapytanie 1 wybierające jedynie nazwy i potrzebne materiały do gier przeznaczonych dla więcej niż 4 graczy. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT nazwa, potrzebne FROM grytowarzyskie WHERE liczbaGraczy > 4; oraz na zrzucie są dokładnie 2 rekordy z nazwami: Państwa - miasta i Kalambury
ok. 2 min
Polecenie z arkusza
Zapytanie 1: wybierające jedynie nazwy i potrzebne materiały do gier przeznaczonych dla więcej niż 4 graczy.
„Więcej niż 4” to ostro > 4. Każda klauzula w osobnej linii. Wynik: Państwa - miasta i Kalambury. Zapytanie do kwerendy.txt, zrzut kw1.png.
Krok 5: Zapytanie 2: średni czas gier dla dwóch osób
Kryteria:
R.1.4 Wykonane zapytanie 2 liczące średnią arytmetyczną czasu trwania gier, które są przeznaczone jedynie dla dwóch graczy, nazwa kolumny (alias) „średnia w minutach”. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT AVG(czasRozgrywki) AS "średnia w minutach" FROM grytowarzyskie WHERE liczbaGraczy = 2; oraz na zrzucie jest widoczna wartość 12.7500 z dowolnym zaokrągleniem
ok. 2 min
Polecenie z arkusza
Zapytanie 2: liczące średnią arytmetyczną czasu trwania gier, które są przeznaczone jedynie dla dwóch graczy, nazwa kolumny (alias) „średnia w minutach”.
AVG(czasRozgrywki) z aliasem w odwrotnych apostrofach - to w MySQL i MariaDB właściwy znak dla nazw (kolumn, tabel, aliasów); cudzysłów "..." też tu zadziała, ale w trybie ANSI oznacza co innego niż napis w apostrofach, a odwrotne apostrofy zawsze znaczą nazwę. Spacje w aliasie wymagają jednego z tych zapisów. Wynik: (10 + 1 + 20 + 20) / 4 = 12.7500. Zrzut kw2.png.
Typowe błędy
Alias ze spacją bez cudzysłowu ani odwrotnych apostrofów kończy się błędem składni.
kwerendy.txtTekstzmienione: 5 linii
-- Zapytanie 1SELECT nazwa, potrzebneFROM grytowarzyskieWHERE liczbaGraczy > 4;-- Zapytanie 2SELECT AVG(czasRozgrywki) AS `średnia w minutach`FROM grytowarzyskieWHERE liczbaGraczy = 2;
Podgląd strony po tym kroku
Krok 6: Zapytanie 3: gry o najdłuższym czasie rozgrywki
Kryteria:
R.1.5 Wykonane zapytanie 3 wybierające jedynie nazwy gier o najdłuższym czasie rozgrywki. Należy posłużyć się kwerendą zagnieżdżoną. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT nazwa FROM grytowarzyskie WHERE czasRozgrywki = (SELECT MAX(czasRozgrywki) FROM grytowarzyskie); (sortowanie i LIMIT 1 jest błędem) oraz na zrzucie są dokładnie 2 rekordy: Państwa - miasta i Kalambury
ok. 3 min
Polecenie z arkusza
Zapytanie 3: wybierające jedynie nazwy gier o najdłuższym czasie rozgrywki. Jeśli kilka gier ma ten sam, najdłuższy czas rozgrywki to wszystkie ich nazwy powinny być wybrane. Należy posłużyć się kwerendą zagnieżdżoną.
Zapytanie wewnętrzne we wcięciu, w osobnych liniach - od razu widać, że zwraca jedną liczbę (najdłuższy czas, 30 minut), a zewnętrzne wybiera wszystkie gry z tym czasem. Wynik: Państwa - miasta i Kalambury. Zrzut kw3.png.
Typowe błędy
ORDER BY czasRozgrywki DESC LIMIT 1 zwraca jedną grę - klucz wprost uznaje to za błąd.
Krok 7: Zapytanie 4: gry karciane dla mniej niż 4 graczy
Kryteria:
R.1.6 Wykonane zapytanie 4 wybierające jedynie nazwy gier karcianych (pole potrzebne zawiera cząstkę „karty”) przeznaczonych dla mniej niż 4 graczy. W pliku z kwerendami lub na zrzucie istnieje zapis np.: SELECT nazwa FROM grytowarzyskie WHERE potrzebne LIKE "%karty%" AND liczbaGraczy < 4; lub "karty%" oraz na zrzucie są dokładnie 3 rekordy: Piotruś Pan, Pasjans, Tysiąc
ok. 2 min
Polecenie z arkusza
Zapytanie 4: wybierające jedynie nazwy gier karcianych (pole potrzebne zawiera cząstkę „karty”) przeznaczonych dla mniej niż 4 graczy.
LIKE '%karty%' - % z obu stron szuka cząstki w dowolnym miejscu; porównywanie _ci nie rozróżnia wielkości liter, więc znajduje też „Karty”. Wynik: Piotruś Pan, Pasjans, Tysiąc. Zrzut kw4.png.
kwerendy.txtTekstzmienione: 6 linii
-- Zapytanie 1SELECT nazwa, potrzebneFROM grytowarzyskieWHERE liczbaGraczy > 4;-- Zapytanie 2SELECT AVG(czasRozgrywki) AS `średnia w minutach`FROM grytowarzyskieWHERE liczbaGraczy = 2;-- Zapytanie 3SELECT nazwaFROM grytowarzyskieWHERE czasRozgrywki = ( SELECT MAX(czasRozgrywki) FROM grytowarzyskie);-- Zapytanie 4SELECT nazwaFROM grytowarzyskieWHERE potrzebne LIKE '%karty%' AND liczbaGraczy < 4;
Podgląd strony po tym kroku
Etap 2: Strona HTML
Kroki 8-20 · po tym etapie masz 15 z 34 kryteriów (pkt)
Krok 8: Plik gra.html w HTML5
ok. 1 min
Polecenie z arkusza
Nazwa pliku gra.html. Zapisana w języku HTML5.
<!DOCTYPE html> i szkielet. Plik gra.html w folderze zdającego, obok trzech obrazów z archiwum.
Krok 13: Bloki: nagłówek, blok główny z trzema sekcjami, stopka
Kryteria:
R.2.3 W sekcji body zdefiniowany jest podział na bloki za pomocą semantycznych znaczników HTML5: header, main -> section + section + section, footer (dopuszcza się stosowanie bloków pomocniczych)
ok. 2 min
Polecenie z arkusza
Podział strony na bloki: nagłówkowy, główny, stopka. Blok główny zawiera trzy bloki sekcji. Podział zrealizowany za pomocą semantycznych znaczników języka HTML5 tak, aby po uruchomieniu w przeglądarce układ bloków był zgodny z ilustracją 3.
header, main z trzema section, footer (R.2.3). Identyfikatory po angielsku: left, middle, right.
R.2.6 Na stronie znajduje się przynajmniej jeden obraz nic.png
R.2.7 Wszystkie komórki tabeli są wypełnione obrazami
ok. 2 min
Polecenie z arkusza
Każda komórka tabeli jest wypełniona obrazem nic.png.
W każdej komórce <img src="nic.png" alt="puste pole"> - bez onclick: obsługę kliknięć przypnie skrypt jednym poleceniem dla wszystkich dziewięciu obrazów.
R.3.3 Kliknięcie odnośnika „Zagraj w statki” powoduje otwarcie strony https://pl.battleship-game.org/ w nowym oknie przeglądarki
ok. 1 min
Polecenie z arkusza
Zawartość bloku stopki: Odnośnik do strony https://pl.battleship-game.org/ o treści „Zagraj w statki”. Odnośnik otwiera się w nowym oknie.
target="_blank" otwiera stronę w nowej karcie. rel="noopener" odcina nowej karcie dostęp do tej strony przez window.opener - zwyczaj przy odnośnikach do obcych serwisów (współczesne przeglądarki robią to już same).
R.2.4 W bloku nagłówkowym znajduje się <h1>: "Zagraj w kółko i krzyżyk", w bloku sekcji lewej <h2>: "Gra kółko", prawej <h2>: "Gra krzyżyk" (może być ukryty ), w stopce <p> z numerem zdającego
ok. 1 min
Polecenie z arkusza
Paragraf o treści „Grę opracował: ”, dalej wstawiony numer zdającego.
Na egzaminie wpisujesz swój numer zdającego (PESEL) - tutaj stoi imię i nazwisko autora rozwiązania. Zamyka komplet R.2.4.
Kroki 21-31 · po tym etapie masz 26 z 34 kryteriów (pkt)
Krok 21: Zmienna z kolorem i krój czcionki
Kryteria:
R.4.1 domyślne formatowanie selektorów (*): krój czcionki "Lucida Console" - jako pierwszy, monospace - jako ostatni
ok. 2 min
Polecenie z arkusza
Domyślnie, dla wszystkich selektorów: krój czcionki Lucida Console, w przypadku braku monospace.
SeaGreen występuje w arkuszu dwa razy (ramki komórek i tło klikniętej komórki) - trafia do zmiennej CSS--green. Potem * z krojem i rodziną zapasową monospace (R.4.1).
Krok 24: Siatka trzech sekcji zgodna z ilustracją 3
Kryteria:
R.3.1 Układ bloków po uruchomieniu strony w przeglądarce jest zgodny z ilustracją 3 w arkuszu egzaminacyjnym (prawidłowo zastosowane właściwości CSS decydujące o układzie bloków na stronie, np. float i clear albo display flex albo grid albo position; żaden blok nie zachodzi na inne bloki - sprawdzić w inspektorze)
ok. 2 min
Polecenie z arkusza
Podział zrealizowany za pomocą semantycznych znaczników języka HTML5 tak, aby po uruchomieniu w przeglądarce układ bloków był zgodny z ilustracją 3.
Blok główny to siatka z kolumnami 20%, 60% i 20% - szerokości sekcji z arkusza w jednym miejscu (klucz R.4.3 dopuszcza grid-template-columns). Sekcje trafiają do kolumn w kolejności z kodu. align-items: start przyciąga je do góry: bez tego siatka rozciąga każdą sekcję na wysokość najwyższej (tabeli), a na ilustracji 2 zielony blok „Gra kółko” jest niski. Stopka stoi pod siatką bez clear (R.3.1).
R.4.4 styl bloków sekcji lewej i prawej: zaokrąglenie rogów (border-radius) - 40px styl bloku sekcji środkowej: cień bloku box-shadow: 0 0 10px DarkGreen;
ok. 1 min
Polecenie z arkusza
Dla bloku sekcji środkowej: szerokość 60%, cień bloku bez przesunięcia o rozmyciu 10 px i kolorze DarkGreen.
Szerokość 60% to środkowa kolumna siatki. box-shadow: 0 0 10px DarkGreen - przesunięcia 0 i 0, rozmycie 10 px (R.4.4 razem z zaokrągleniem sekcji bocznych).
Krok 29: Tabela: szerokość, marginesy, połączone obramowania
Kryteria: ,
R.4.3 szerokość: bloki sekcji lewej i prawej - 20%, środkowej - 60% (width lub grid-template- columns lub flex ), selektor img - 80%, selektor table - 90%
R.4.6 marginesy wewnętrzne (padding ): blok nagłówkowy, stopka - 20px, bloki sekcji lewej i prawej - górny i dolny - 80px, boczne - 0 lub nieustawione marginesy zewnętrzne (margin ): obraz i tabela - 10px
ok. 1 min
Polecenie z arkusza
Dla selektora tabeli: szerokość 90%, marginesy zewnętrzne 10 px, obramowanie tabeli i komórek połączone.
border-collapse: collapse łączy obramowania komórek w jedną linię. Domyka kryteria szerokości (R.4.3) i marginesów (R.4.6).
Kroki 32-37 · po tym etapie masz 34 z 34 kryteriów (pkt)
Krok 32: Plik gra.js: kliknięcie każdego obrazu uruchamia funkcję
Kryteria: ,
R.3.4 Dla przynajmniej jednego obrazu lub komórki tabeli zostało zdefiniowane zdarzenie kliknięcia, które uruchamia funkcję skryptu
R.5.1 Skrypt w języku JavaScript zawiera przynajmniej jedną poprawną składniowo instrukcję wynikającą z treści zadania
ok. 3 min
Polecenie z arkusza
Dla każdego obrazu, gdy zostanie kliknięty, uruchamia się skrypt.
Skrypt w osobnym pliku gra.js, podpięty w <head> z defer - wykona się po wczytaniu całego HTML-u, więc elementy <img> są już w drzewie dokumentu (same pliki obrazów mogą się jeszcze pobierać).
document.querySelector('main') - blok główny; w nim skrypt będzie zapisywał, kto gra,
document.querySelectorAll('td img') - wszystkie dziewięć obrazów z komórek,
fields.forEach(...) - dla każdego obrazu addEventListener('click', ...); funkcja strzałkowa przekazuje do makeMove właśnie kliknięty obraz.
Funkcja makeMove(image) na razie jest pusta. Obsługę kliknięcia ma każdy obraz (R.3.4), a HTML nie ma ani jednego onclick.
Typowe błędy
field.addEventListener('click', makeMove(field)) bez funkcji strzałkowej wywołujemakeMove od razu przy wczytaniu strony, zamiast przy kliknięciu.
R.5.2 Zastosowana przynajmniej jedna zmienna lub funkcja oraz nazewnictwo jest w języku polskim lub angielskim i odzwierciedla cel zastosowania
R.5.3 Gra rozpoczyna się od kółka (np. ustawiona wartość początkowa zmiennej)
ok. 1 min
Polecenie z arkusza
Stan początkowy: aktualny gracz to kółko.
let currentPlayer = 'o' poza funkcją - pamięta kolejkę między kliknięciami; let, bo wartość będzie się zmieniać. Grę zaczyna kółko (R.5.3), nazwa mówi, co przechowuje (R.5.2).
Typowe błędy
Zmienna zadeklarowana wewnątrz funkcji startuje od nowa przy każdym kliknięciu - zawsze grałoby kółko.
Gdy gracz kółko kliknie w komórkę tabeli z obrazem nic.png: w komórce jest podmieniany obraz na o.png. Gdy gracz krzyżyk kliknie w komórkę tabeli z obrazem nic.png: w komórce jest podmieniany obraz na x.png
Nazwa pliku powstaje z gracza: szablon tekstowy`${currentPlayer}.png` daje o.png albo x.png. Jedna linia obsługuje oba przypadki z arkusza („o.png” dla kółka, „x.png” dla krzyżyka) - nie ma dwóch gałęzi, w których można poprawić jedną i zapomnieć o drugiej. Kliknij pole w podglądzie: pojawia się kółko.
R.5.4 Uczestnicy grają naprzemiennie: raz kółko, raz krzyżyk (wystarczy np. warunek sprawdzający, kto aktualnie gra, oraz zmiana tej wartości na inną lub przeciwną )
ok. 2 min
Polecenie z arkusza
Aktualny gracz jest zmieniany na krzyżyk. Aktualny gracz jest zmieniany na kółko.
Operator warunkowywarunek ? a : b: jeśli grało kółko, teraz gra krzyżyk, i odwrotnie - sprawdzenie, kto gra, i zmiana na przeciwnego w jednej linii (R.5.4). Porównanie ścisłe === (bez zamiany typów). Przy okazji tekst alternatywny: czytnik ekranu mówi „kółko” albo „krzyżyk” zamiast „puste pole”.
R.5.5 Kiedy ruch należy do kółka, wyświetlony jest blok sekcji lewej, a ukryty prawej. Kiedy ruch należy do krzyżyka wyświetlony jest blok sekcji prawej, a ukryty lewej (dopuszcza się również zastosowanie display= "none")
R.5.6 Po kliknięciu komórki tabeli lub obrazu nic.png, kiedy ruch należy do kółka, wyświetlany jest tam obraz o.png, a kiedy ruch należy do krzyżyka - obraz x.png
ok. 4 min
Polecenie z arkusza
Blok sekcji lewej staje się ukryty. Blok sekcji prawej staje się widoczny.
Skrypt nie ustawia stylów - zapisuje tylko stan: board.dataset.player = currentPlayer tworzy w <main> atrybut data-player="x" albo "o" (atrybuty data-* są w HTML5 przeznaczone na dane dla skryptu i stylów). O wyglądzie decydują dwie reguły CSS z selektorem atrybutu: gdy gra krzyżyk, lewa sekcja jest ukryta, a prawa widoczna. Po ruchu krzyżyka (data-player="o") reguły nie pasują i działa styl początkowy: prawa ukryta, lewa widoczna.
Stan jest w jednym miejscu, a wygląd w styl.css - nie da się ukryć obu sekcji naraz ani pokazać złej. Zagraj w podglądzie cztery ruchy z ilustracji 4 (R.5.5, R.5.6).
Typowe błędy
Reguły z data-player muszą stać po regule #right { visibility: hidden; } albo mieć silniejszy selektor - tu mają oba: main[data-player="x"] #right jest bardziej szczegółowy niż samo #right.
R.5.7 Jeżeli w komórce tabeli znaduje się obraz kółka lub krzyżyka, ponowne kliknięcie w komórkę tabeli lub w obraz nie powoduje zmian obrazu
ok. 2 min
Polecenie z arkusza
Gdy dowolny gracz kliknie komórkę tabeli z obrazem kółka lub krzyżyka – brak akcji.
Na początku funkcji wczesny powrót: jeśli w polu nie ma już nic.png, return kończy funkcję i nic się nie zmienia (R.5.7). Reszta kodu nie musi stać we wcięciu warunku.
getAttribute('src') zwraca dokładnie to, co jest zapisane w atrybucie (nic.png), a właściwość image.src - pełny adres (http://.../nic.png), więc porównanie z samą nazwą by się nie udało.
Typowe błędy
if (image.src !== 'nic.png') return; kończy funkcję przy każdym kliknięciu - plansza przestaje reagować.
Krok 38 · po tym etapie masz 34 z 34 kryteriów (pkt)
Krok 38: Co jest inaczej i którą wersję wybrać na egzaminie
ok. 2 min
Obie wersje dają komplet 34 punktów. Różnice:
wersja podstawowa
wersja nowoczesna
układ
display: flex + szerokości bloków
grid-template-columns: 20% 60% 20%
skrypt
<script> w HTML, 9 × onclick="makeMove(this)"
gra.js z defer, forEach + addEventListener
gałęzie
if dla kółka i else dla krzyżyka
jedna ścieżka: ${currentPlayer}.png, operator ? :
widoczność sekcji
style.visibility ze skryptu, cztery linie
data-player w <main> + dwie reguły CSS
zajęte pole
cała treść funkcji we wcięciu if
wczesny return
Na egzaminie wersja podstawowa trzyma się dosłownie tabeli 1 arkusza (onclick, getElementById, style), więc łatwiej ją sprawdzić krok po kroku. Nowoczesna jest krótsza i odporna na niespójność: kolejka i wygląd nie mogą się rozjechać. Kolejny krok rozbudowy to delegacja zdarzeń - jeden nasłuchiwacz na tabeli zamiast dziewięciu i event.target jako kliknięte pole; na egzaminie bezpieczniej przypiąć zdarzenie bezpośrednio do obrazów, bo tak brzmi R.3.4. Wersja podstawowa pokazuje też, jak dopisać sprawdzanie wygranej.
Krok 39 · po tym etapie masz 34 z 34 kryteriów (pkt)
Krok 39: 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: gra.html, gra.js, styl.css, kwerendy.txt, import.png, kw1.png … kw4.png, nic.png, o.png, x.png, przeglądarka.txt. Bez gra.js plansza nie reaguje na kliknięcia. Płytę sprawdź po nagraniu.
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.