Egzamin maturalny z informatyki z maja 2025 roku — poniżej znajdziesz rozwiązania wszystkich siedmiu zadań z arkusza CKE. Przy każdym podpunkcie jest treść zadania (screen z arkusza) oraz omówienie i kod.
Zadanie 1. Funkcja rekurencyjna

Wyjaśnienie
Dana jest funkcja rekurencyjna przestaw(n), która jako parametr przyjmuje nieujemną liczbę całkowitą. Zanim przejdziemy do rozwiązywania podpunktów, zastanówmy się, co tak naprawdę robi ten algorytm.
Algorytm w każdym kroku (wywołaniu):
- Wyciąga dwie ostatnie cyfry z liczby za pomocą operacji reszty z dzielenia: r ← n mod 100.
- Dzieli tę dwucyfrową końcówkę na cyfrę dziesiątek (a ← r div 10) oraz cyfrę jedności (b ← r mod 10).
- Odcieka te dwie cyfry od oryginalnej liczby: n ← n div 100.
- Jeżeli z liczby coś jeszcze zostało (n > 0), funkcja zamienia miejscami wyciągnięte cyfry (wyrażenie a + 10 · b) i dodaje do nich wynik wywołania rekurencyjnego pomnożony przez 100, aby „przesunąć” go na odpowiednie miejsce dziesiętne.
Mówiąc najprościej: algorytm idzie od końca liczby, bierze po dwie cyfry i zamienia je miejscami.
Zadanie 1.1: Analiza działania funkcji (0-3 pkt)

Wyjaśnienie
W tym zadaniu musimy uzupełnić tabelę, podając wynik działania funkcji oraz łączną liczbę jej wywołań. Arkusz podaje nam pierwszy przykład: dla n = 316498 wynikiem jest 134689, a wywołań jest 3. Dlaczego tak się dzieje?
- Wywołanie 1: Liczba 316498. Pobieramy 98, zamieniamy na 89. Zostaje 3164.
- Wywołanie 2: Liczba 3164. Pobieramy 64, zamieniamy na 46. Zostaje 31.
- Wywołanie 3: Liczba 31. Pobieramy 31, zamieniamy na 13. Zostaje 0. Koniec rekurencji.
Złapaliśmy schemat. Uzupełnijmy więc resztę tabeli!
Rozwiązanie
Dla liczby 43657688: Zmieniamy parami od prawej: 88 (bez zmian), 76 -> 67, 65 -> 56, 43 -> 34. Wynik to 34566788. Liczba ma 8 cyfr, więc potrzebujemy 4 wywołań (po 2 cyfry na wywołanie).
Dla liczby 154005710: Liczba ma 9 cyfr (nieparzystą długość). Zamieniamy parami od prawej: 10→01, 57→75, 00→00, 54→45; zostaje pojedyncza cyfra 1 z przodu (w pseudokodzie: n=1, r=1, a=0, b=1, wynik to b=1). Ostateczny wynik: 145007501. Liczba wywołań: ⌈ 9/2 ⌉ = 5.
Dla liczby 998877665544321: Składa się z 15 cyfr. Zamieniamy parami: 21→12, 43→34, 55→55, 66→66, 77→77, 88→88, 99→99; z przodu zostaje 9. Wynik: 989786756453412. Liczba wywołań: ⌈ 15/2 ⌉ = 8.
Odpowiedź
| n | Wynik działania funkcji przestaw | Liczba wywołań |
|---|---|---|
| 316498 | 134689 | 3 |
| 43657688 | 34566788 | 4 |
| 154005710 | 145007501 | 5 |
| 998877665544321 | 989786756453412 | 8 |
Zadanie 1.2: Prawda/Fałsz z liczbą wywołań (0-2 pkt)

Wyjaśnienie
Zadanie sprawdza, czy potrafimy wyznaczyć wzór na liczbę wywołań funkcji dla liczby k-cyfrowej. Z poprzedniego podpunktu wiemy, że funkcja w każdym kroku "zjada" 2 cyfry. Zatem dla liczby parzystej potrzebuje dokładnie k/2 wywołań, a dla nieparzystej (k+1)/2. Przeanalizujmy podane wzory:
- 1. k/2: Dla k=9 (nieparzysta) wychodzi 9/2 = 4,5 — liczba wywołań nie może być ułamkiem. FAŁSZ (F).
- 2. (k+1) div 2: Dzielenie całkowite. Dla k=8: 9 div 2 = 4. Dla k=9: 10 div 2 = 5. PRAWDA (P).
- 3. Układ równań (k/2 dla parzystych k, (k+1)/2 dla nieparzystych): dokładnie nasze rozumowanie z zad. 1.1. PRAWDA (P).
- 4. (k+1)/2: Zwykłe dzielenie (nie całkowite). Dla k=8: 9/2 = 4,5. FAŁSZ (F).
Rozwiązanie
Porównujemy każdy wzór z liczbą wywołań ⌈ k/2 ⌉ (po 2 cyfry na wywołanie).
Odpowiedź
Odpowiedzi to kolejno: F, P, P, F.
Zadanie 1.3: Implementacja iteracyjna (0-4 pkt)

Wyjaśnienie
Ostatni podpunkt pierwszego zadania wymaga od nas zamiany algorytmu rekurencyjnego na iteracyjny (wykorzystujący pętlę). Ważne: specyfikacja wymaga, abyśmy operowali tylko na liczbach całkowitych. Niedopuszczalna jest konwersja na string (napis), zamiana znaków i ponowna konwersja na int!
Naszym zadaniem jest wyciąganie po dwie cyfry, zamienianie ich miejscami i dodawanie do zmiennej przechowującej wynik. Aby dodawane cyfry trafiały na odpowiednie pozycje w liczbie wynikowej, będziemy potrzebować zmiennej pomocniczej p (mnożnika), którą w każdym kroku pętli będziemy mnożyć przez 100.
Rozwiązanie
def przestaw2(n):
# Zmienna przechowująca ostateczny wynik
w = 0
# Mnożnik pozycji dziesiętnej
p = 1
while n > 0:
# Wyciągamy dwie ostatnie cyfry
r = n % 100
a = r // 10
b = r % 10
# Odcinamy je od naszej liczby wejściowej
n = n // 100
# Ustawiamy zamienione cyfry na odpowiednich pozycjach
if n > 0 or a > 0:
# a ląduje na miejscu jedności, b na miejscu dziesiątek
w = w + p * a + 10 * p * b
else:
# Jeżeli została nam tylko jedna, ostatnia cyfra (nieparzysta długość liczby)
w = w + p * b
# Zwiększamy mnożnik o dwa zera na potrzeby kolejnej pary cyfr
p = p * 100
return wOdpowiedź
Program przestaw2 zwraca te same wyniki co funkcja rekurencyjna z arkusza (np. przestaw2(316498) = 134689, przestaw2(43657688) = 34566788). Spełnia wymaganie pracy wyłącznie na liczbach całkowitych.
Zadanie 2. Zapis symboliczny

Drugie zadanie z arkusza to klasyczny problem programistyczny. Do dyspozycji mamy plik symbole.txt zawierający 2000 napisów. Każdy z nich składa się z dokładnie 12 znaków spośród trzech możliwych: o, +, *. Przejdźmy przez kolejne podpunkty, w których wykorzystamy podstawowe operacje na napisach, macierzach i systemach liczbowych.
Zadanie 2.1: Palindromy (0-2 pkt)

Wyjaśnienie
Zaczynamy od prostej rozgrzewki. Naszym celem jest znalezienie wszystkich napisów, które są palindromami – czyli czytane od lewej do prawej i od prawej do lewej wyglądają dokładnie tak samo. W języku Python to zadanie jest wyjątkowo proste dzięki możliwości odwracania stringów za pomocą wycinków (tzw. slicing [::-1]).
Rozwiązanie
def zadanie_2_1():
wyniki = []
with open('symbole.txt', 'r') as plik:
for linia in plik:
napis = linia.strip()
if napis == napis[::-1]:
wyniki.append(napis)
with open('wyniki2.txt', 'w', encoding='utf-8') as wynik:
wynik.write('2.1\n')
for w in wyniki:
wynik.write(w + '\n')
zadanie_2_1()Odpowiedź
Odpowiedź: W pliku znajduje się 6 takich napisów: ++o+o++o+o++ ++++++ +o++++o+ oooooo +++oo+++ +o++oooo++o+
Zadanie 2.2: Kwadraty z sąsiadów (0-4 pkt)


Wyjaśnienie
W tym podpunkcie musimy potraktować nasz plik tekstowy jako tablicę dwuwymiarową (macierz znaków) i odnaleźć w niej „kwadraty” 3 × 3, które składają się z identycznych symboli. Zadanie bada naszą umiejętność operowania na indeksach.
Najbezpieczniejszym sposobem jest przejście dwiema pętlami (odpowiadającymi za wiersze i kolumny), ignorując krawędzie macierzy (indeksy 0 oraz ostatnie), ponieważ środek kwadratu 3 × 3 nigdy nie znajdzie się na brzegu. Dla każdego badanego „środka” sprawdzamy, czy jego 8 sąsiadów posiada ten sam znak.
Rozwiązanie
def czy_jednolity_kwadrat(macierz, w, k):
znak = macierz[w][k]
for i in range(w - 1, w + 2):
for j in range(k - 1, k + 2):
if macierz[i][j] != znak:
return False
return True
def zadanie_2_2():
with open('symbole.txt', 'r') as plik:
macierz = [linia.strip() for linia in plik]
liczba_kwadratow = 0
srodki = []
for wiersz in range(1, len(macierz) - 1):
for kolumna in range(1, len(macierz[wiersz]) - 1):
if czy_jednolity_kwadrat(macierz, wiersz, kolumna):
liczba_kwadratow += 1
srodki.append((wiersz + 1, kolumna + 1))
with open('wyniki2.txt', 'a', encoding='utf-8') as wynik:
wynik.write(f'2.2: {liczba_kwadratow}\n')
for srodek in srodki:
wynik.write(f'{srodek[0]} {srodek[1]}\n')
zadanie_2_2()Odpowiedź
Odpowiedź: W pliku występują 3 takie kwadraty. Współrzędne ich środków (wiersz, kolumna) to: 399 5, 546 2 oraz 630 11.
Zadanie 2.3: Konwersja z systemu trójkowego (0-2 pkt)


Wyjaśnienie
Kolejne zdanie wymaga zmiany podejścia – nasze ciągi symboli stają się nagle liczbami zapisanymi w systemie trójkowym, gdzie o to 0, + to 1, a * to 2. Musimy przekonwertować je na system dziesiętny i znaleźć wartość największą.
Dobrą praktyką jest napisanie dedykowanej funkcji, która najpierw mapuje znaki na cyfry, a potem korzysta ze standardowego algorytmu zamiany (lub wbudowanej funkcji int(napis, 3) – pamiętajmy jednak, by w zadaniach maturalnych pewnie czuć ręczne konwersje!).
Rozwiązanie
def na_dziesietny(symbole):
mapowanie = {'o': '0', '+': '1', '*': '2'}
napis_trojkowy = ''.join(mapowanie[znak] for znak in symbole)
return int(napis_trojkowy, 3)
def zadanie_2_3():
max_wartosc = -1
max_napis = ''
with open('symbole.txt', 'r') as plik:
for linia in plik:
napis = linia.strip()
wartosc_dziesietna = na_dziesietny(napis)
if wartosc_dziesietna > max_wartosc:
max_wartosc = wartosc_dziesietna
max_napis = napis
with open('wyniki2.txt', 'a', encoding='utf-8') as wynik:
wynik.write(f'2.3:\n{max_wartosc} {max_napis}\n')
zadanie_2_3()Odpowiedź
Odpowiedź: Największa liczba to w systemie dziesiętnym 531246, a jej zapis symboliczny to o++o.
Zadanie 2.4: Sumowanie w systemie trójkowym (0-3 pkt)

Wyjaśnienie
Ostatni krok to policzenie łącznej sumy wszystkich wygenerowanych liczb, a następnie odwrócenie procesu konwersji – musimy naszą dziesiętną sumę zamienić z powrotem na system trójkowy i zakodować oryginalnymi znakami.
Aby z systemu dziesiętnego wrócić na trójkowy, wykonujemy serię dzieleń z resztą (modulo 3). Otrzymane reszty (0, 1 lub 2) podmieniamy z powrotem na o, +, *.
Rozwiązanie
def na_symbole_trojkowe(liczba):
if liczba == 0:
return 'o'
odwrotne_mapowanie = {0: 'o', 1: '+', 2: '*'}
wynik = ''
while liczba > 0:
reszta = liczba % 3
wynik = odwrotne_mapowanie[reszta] + wynik
liczba //= 3
return wynik
def zadanie_2_4():
suma = 0
with open('symbole.txt', 'r') as plik:
for linia in plik:
suma += na_dziesietny(linia.strip())
suma_symbole = na_symbole_trojkowe(suma)
with open('wyniki2.txt', 'a', encoding='utf-8') as wynik:
wynik.write(f'2.4:\n{suma} {suma_symbole}\n')
zadanie_2_4()Odpowiedź
Odpowiedź: Suma wszystkich liczb to 527865439, co w zapisie symbolicznym odpowiada ciągowi ++oo+oo++oooo++.
Pełny kod rozwiązania zadania 2
def czy_palindrom(napis):
return napis == napis[::-1]
def czy_jednolity_kwadrat(macierz, w, k):
znak = macierz[w][k]
for i in range(w - 1, w + 2):
for j in range(k - 1, k + 2):
if macierz[i][j] != znak:
return False
return True
def na_dziesietny(symbole):
mapowanie = {'o': '0', '+': '1', '*': '2'}
return int(''.join(mapowanie[z] for z in symbole), 3)
def na_symbole_trojkowe(liczba):
if liczba == 0:
return 'o'
odw = {0: 'o', 1: '+', 2: '*'}
wynik = ''
while liczba > 0:
wynik = odw[liczba % 3] + wynik
liczba //= 3
return wynik
with open('symbole.txt', 'r', encoding='utf-8') as plik:
macierz = [linia.strip() for linia in plik]
with open('wyniki2.txt', 'w', encoding='utf-8') as wynik:
wynik.write('2.1\n')
for napis in macierz:
if czy_palindrom(napis):
wynik.write(napis + '\n')
kwadraty = []
for w in range(1, len(macierz) - 1):
for k in range(1, len(macierz[w]) - 1):
if czy_jednolity_kwadrat(macierz, w, k):
kwadraty.append((w + 1, k + 1))
wynik.write(f'\n2.2: {len(kwadraty)}\n')
for w, k in kwadraty:
wynik.write(f'{w} {k}\n')
max_wartosc, max_napis = -1, ''
for napis in macierz:
val = na_dziesietny(napis)
if val > max_wartosc:
max_wartosc, max_napis = val, napis
wynik.write(f'\n2.3:\n{max_wartosc} {max_napis}\n')
suma = sum(na_dziesietny(n) for n in macierz)
wynik.write(f'\n2.4:\n{suma} {na_symbole_trojkowe(suma)}\n')Zapis do pliku wyniki2.txt
Na egzaminie odpowiedzi muszą trafić do pliku wyniki2.txt z numerami podzadań — tak jak w kodzie poniżej. Uruchamiaj podzadania po kolei (2.1 tworzy plik, 2.2–2.4 dopisują wyniki).
Zadanie 3. Dron


Zadanie 3 charakteryzuje się dość długim poleceniem, ale rozwiązania poszczególnych podpunktów nie należą do najbardziej skomplikowanych. Otrzymujemy plik dron.txt, w którym zapisane są wektory przesunięć drona w poziomie i w pionie.
Zadanie 3.1: Największy Wspólny Dzielnik (NWD) (0-2 pkt)

Wyjaśnienie
Dla wielu maturzystów to mogło być zaskoczenie – NWD to jeden z najbardziej podstawowych algorytmów. Algorytm Euklidesa, bo o nim mowa, umożliwia efektywne obliczenie największej liczby całkowitej, która dzieli dwie wartości bez reszty. Opiera się on na wykonywaniu operacji modulo do momentu, aż reszta z dzielenia wyniesie 0. Pamiętajmy tylko, by zgodnie z uwagą w arkuszu operować na wartościach bezwzględnych!
Rozwiązanie
def nwd(a, b):
a = abs(a)
b = abs(b)
while b != 0:
a, b = b, a % b
return a
pary_z_nwd_wiekszym_od_1 = 0
with open('dron.txt', 'r') as plik:
for linia in plik:
a, b = map(int, linia.split())
if nwd(a, b) > 1:
pary_z_nwd_wiekszym_od_1 += 1
with open('wyniki3.txt', 'w', encoding='utf-8') as wynik:
wynik.write(f'3.1: {pary_z_nwd_wiekszym_od_1}\n')Odpowiedź
Odpowiedź: Liczba par z NWD większym od 1 to 40.
Zadanie 3.2: Dron w Kwadracie i Środki Odcinków (0-4 pkt)

Podpunkt a)
Wyjaśnienie
Na bieżąco dodajemy wektory przesunięć do pozycji drona i sprawdzamy, czy punkt leży wewnątrz kwadratu (bez krawędzi): 0 < x < 5000 oraz 0 < y < 5000.
Rozwiązanie
def czy_wewnatrz_kwadratu(x, y):
return 0 < x < 5000 and 0 < y < 5000
pozycja_x = 0
pozycja_y = 0
punkty_wewnatrz = 0
with open('dron.txt', 'r') as plik:
for linia in plik:
dx, dy = map(int, linia.split())
pozycja_x += dx
pozycja_y += dy
if czy_wewnatrz_kwadratu(pozycja_x, pozycja_y):
punkty_wewnatrz += 1
with open('wyniki3.txt', 'a', encoding='utf-8') as wynik:
wynik.write(f'3.2 a): {punkty_wewnatrz}\n')Odpowiedź
Liczba punktów wewnątrz kwadratu: 24.
Podpunkt b)
Wyjaśnienie
Zapisujemy wszystkie punkty odwiedzone przez drona (łącznie z (0,0)), a następnie szukamy trójki, w której jeden punkt jest środkiem odcinka między dwoma pozostałymi: S_x = (x₁ + x₂)/2, S_y = (y₁ + y₂)/2.
Rozwiązanie
with open('dron.txt', 'r') as plik:
dane = [tuple(map(int, linia.split())) for linia in plik]
wszystkie_punkty = [(0, 0)]
pozycja_x, pozycja_y = 0, 0
for dx, dy in dane:
pozycja_x += dx
pozycja_y += dy
wszystkie_punkty.append((pozycja_x, pozycja_y))
punkty = set(wszystkie_punkty)
znaleziona_trojka = None
for punkt1 in wszystkie_punkty:
for punkt3 in wszystkie_punkty:
if punkt1 == punkt3:
continue
if (punkt1[0] + punkt3[0]) % 2 != 0 or (punkt1[1] + punkt3[1]) % 2 != 0:
continue
srodek = ((punkt1[0] + punkt3[0]) // 2, (punkt1[1] + punkt3[1]) // 2)
if srodek in punkty:
znaleziona_trojka = (punkt1, srodek, punkt3)
break
if znaleziona_trojka:
break
with open('wyniki3.txt', 'a', encoding='utf-8') as wynik:
wynik.write('3.2 b):\n')
for punkt in znaleziona_trojka:
wynik.write(f'{punkt[0]} {punkt[1]}\n')Odpowiedź
Trójka punktów: (5832, 1801), (7410, 1990), (8988, 2179).
Pełny kod rozwiązania zadania 3
def nwd(a, b):
a, b = abs(a), abs(b)
while b:
a, b = b, a % b
return a
with open('dron.txt', 'r') as plik:
dane = [tuple(map(int, linia.split())) for linia in plik]
# 3.1
liczba_nwd = sum(1 for a, b in dane if nwd(a, b) > 1)
# 3.2
punkty = [(0, 0)]
x = y = 0
wewnatrz = 0
for dx, dy in dane:
x += dx
y += dy
punkty.append((x, y))
if 0 < x < 5000 and 0 < y < 5000:
wewnatrz += 1
zbior = set(punkty)
trojka = None
for p1 in punkty:
for p3 in punkty:
if p1 == p3:
continue
if (p1[0] + p3[0]) % 2 or (p1[1] + p3[1]) % 2:
continue
srodek = ((p1[0] + p3[0]) // 2, (p1[1] + p3[1]) // 2)
if srodek in zbior:
trojka = (p1, srodek, p3)
break
if trojka:
break
with open('wyniki3.txt', 'w', encoding='utf-8') as w:
w.write(f'3.1: {liczba_nwd}\n')
w.write(f'3.2 a): {wewnatrz}\n3.2 b):\n')
for p in trojka:
w.write(f'{p[0]} {p[1]}\n')Zadanie 4. Czym jest Keylogger?

Wyjaśnienie
To zadanie wymagało jedynie podstawowej wiedzy teoretycznej, a wręcz domyślenia się odpowiedzi na podstawie samej nazwy oprogramowania. W nomenklaturze informatycznej słowo key odnosi się do klawiszy klawiatury (np. Enter key, Shift key), natomiast log oznacza logowanie, czyli rejestrowanie lub zapisywanie historii zdarzeń.
Rozwiązanie
Keylogger nie szyfruje danych, nie przechowuje haseł w menedżerze haseł i nie generuje kodów do bankowości — jego rolą jest rejestrowanie naciśnięć klawiszy.
Odpowiedź
Poprawna odpowiedź: D — przechwytywanie i gromadzenie informacji o naciśniętych klawiszach.
Zadanie 5. Dodawanie w systemie binarnym

Wyjaśnienie
Dodawanie pisemne w systemie binarnym działa tak samo jak w dziesiętnym — tylko przeniesienie pojawia się, gdy suma w kolumnie jest co najmniej równa 2 (bo podstawa systemu to 2).
- 0 + 0 = 0
- 0 + 1 = 1
- 1 + 0 = 1
- 1 + 1 = 0 oraz przeniesienie 1 do kolumny po lewej
- 1 + 1 + 1 = 1 oraz przeniesienie 1 (dwie jedynki i ewentualne przeniesienie z poprzedniej kolumny)
Rozwiązanie
Uzupełniamy luki kolumna po kolumnie, od prawej do lewej. W każdej kolumnie sumujemy cyfry obu składników oraz ewentualne przeniesienie z poprzedniego kroku. Jeśli suma wynosi 2 lub 3, zapisujemy resztę (0 lub 1) i przenosimy 1 w lewo.
- Kolumny od prawej: 1+1=10₂ (piszemy 0, przenosimy 1), potem 1+1+1=11₂ (piszemy 1, przenosimy 1) itd.
- W środkowych kolumnach łączymy znane cyfry z arkusza z przeniesieniami — np. tam gdzie w wyniku jest 0, suma musiała dać 10₂ lub 11₂.
- Po uzupełnieniu wszystkich luk sprawdzamy całe działanie od nowa kolumna po kolumnie.
Odpowiedź
1 1 0 0 1 0 1 1 0 1 1
+ 1 1 0 0 1 1 0 1 1 1
-----------------------------
1 0 0 1 1 0 0 1 0 0 1 0Sprawdzenie w systemie dziesiętnym: 11001011011₂ + 1100110111₂ = 100110010010₂, czyli 1627 + 823 = 2450.
Zadanie 6. Martianeum (Arkusz kalkulacyjny)

Kolejne zadanie to praca z arkuszem kalkulacyjnym, w którym przeprowadzimy analizę wydobycia fikcyjnego minerału – martianeum. Dane z pliku martianeum.txt wczytujemy standardowo do Excela, zwracając uwagę na poprawne formatowanie dat i ułamków dziesiętnych.
Zadanie 6.1: Obliczanie łącznej masy (0-2 pkt)

Wyjaśnienie
Na początku musimy uważać na dwie pułapki w treści zadania:
- Wartości procentowe: zawartość jest podana w %, a nie jako ułamek dziesiętny (np. 1 oznacza 1%, czyli 0,01 w obliczeniach).
- Próg wydobycia: tylko ładunki z zawartością ≥ 1% są brane pod uwagę do wydobycia.
Rozwiązanie
Zaczynamy od obliczenia łącznej masy przywiezionych ładunków, korzystając ze zwykłej funkcji =SUMA() na kolumnie z masą. Następnie dodajemy nową kolumnę „Wydobyte martianeum”. Używamy funkcji =JEŻELI(), aby sprawdzić, czy zawartość wynosi co najmniej 1. Jeśli tak, mnożymy masę przez zawartość podzieloną przez 100. Jeśli nie, wpisujemy 0.
Na końcu sumujemy wartości z naszej nowej kolumny, aby otrzymać łączną masę wydobytego minerału.
Odpowiedź
Łączna masa ładunków drona: 41498,2 kg. Łączna masa wydobytego martianeum: 3092,2943 kg.
Zadanie 6.2: Średnia masa wg obszarów (0-1 pkt)

Wyjaśnienie
Szukamy obszaru o najmniejszej średniej masie ładunków — najwygodniej zrobić to tabelą przestawną.
Rozwiązanie
To idealne miejsce na wykorzystanie tabeli przestawnej. Wstawiamy tabelę przestawną, do wierszy wrzucamy "nazwa_obszaru", a w wartościach ustawiamy średnią dla "masa [kg]". Następnie sortujemy wyniki od najmniejszego do największego i odczytujemy pierwszy z góry obszar.
Odpowiedź
Obszar o najmniejszej średniej masie ładunków: Thaumasia (średnia ok. 17,84 kg).
Zadanie 6.3: Okresy 7-dniowe (0-2 pkt)

Wyjaśnienie
Dzielimy czas pracy stacji na kolejne okresy 7-dniowe (pierwszy: 03.03.2033 – 09.03.2033) i szukamy okresu o największej łącznej masie ładunków.
Rozwiązanie
Rozwiązanie dzielimy na etapy. Najpierw dodajemy kolumnę, która pomoże nam śledzić 7-dniowe cykle. Tworzymy powtarzający się licznik dni (od 1 do 7).
W kolejnej kolumnie tworzymy "Sumę w okresie". Formuła jest prosta: jeżeli dzień okresu to 1, wartość równa się dzisiejszej masie (resetujemy sumę). Jeśli dzień jest większy od 1, dodajemy dzisiejszą masę do wczorajszego wyniku z naszej kolumny.
Po wyliczeniu sum, szukamy największej wartości funkcją =MAX(). Mając tę wartość, możemy znaleźć odpowiednią datę. Najlepiej i najbezpieczniej zrobić to formułą =PODAJ.POZYCJĘ(), aby znaleźć numer wiersza z rekordowym okresem, a potem za pomocą =INDEKS() wyciągnąć datę z tego wiersza, cofając się w górę o 6 komórek (bo szukamy pierwszego dnia okresu).
Odpowiedź
Największa łączna masa w 7-dniowym okresie: 174,5 kg. Początek okresu: 13.12.2035.
Zadanie 6.4: Wykres skumulowany kolumnowy (0-3 pkt)

Wyjaśnienie
Tworzymy zestawienie liczby przewozów z każdego obszaru w latach 2033–2038, a na jego podstawie — skumulowany wykres kolumnowy z tytułem, opisami osi i legendą.
Rozwiązanie
Do stworzenia poprawnego wykresu potrzebujemy tabeli podsumowującej. Najpierw, korzystając z nowej funkcji Excela =UNIKATOWE(), wyciągamy listę wszystkich unikalnych nazw obszarów. Dodajemy w naszych danych bazowych pomocniczą kolumnę "Rok" (wykorzystując funkcję =ROK(data)).
Następnie budujemy małą tabelkę krzyżową: w wierszach nazwy obszarów, w kolumnach lata (2033 - 2038). W środku używamy funkcji =LICZ.WARUNKI(), aby zliczyć wystąpienia konkretnego obszaru w konkretnym roku.
Mając tak przygotowane dane, wstawiamy "Skumulowany wykres kolumnowy". To nowość – CKE rzadko prosi o taki specyficzny typ wykresu. Finalnie dodajemy odpowiednie formatowanie: tytuł, opisy osi oraz legendę.
Odpowiedź
Przykładowe wiersze zestawienia (liczba przewozów wg obszaru i roku; pełna tabela ma 30 obszarów, suma końcowa 2072):
| Obszar | 2033 | 2034 | 2035 | 2036 | 2037 | 2038 | Suma |
|---|---|---|---|---|---|---|---|
| Iapygia | 47 | 51 | 67 | 53 | 51 | 33 | 302 |
| Tharsis | 29 | 40 | 38 | 41 | 46 | 39 | 233 |
| Coprates | 21 | 27 | 18 | 33 | 30 | 23 | 152 |
| Amazonis | 23 | 20 | 21 | 29 | 20 | 25 | 138 |
| Thaumasia | 2 | 2 | 4 | 1 | 2 | 3 | 14 |
Wykres: skumulowany wykres kolumnowy z tytułem w stylu „Skumulowana liczba przewozów ładunków z poszczególnych obszarów (2033–2038)” — zapisz go razem z tabelą do wyniki6.txt.
Zadanie 6.5: Symulacja pracy stacji (0-3 pkt)

Wyjaśnienie
Symulujemy magazyn stacji: gdy stan ≥ 100 kg, wysyłamy ładunek na orbitę (odejmujemy 100 kg). Zliczamy liczbę transportów oraz daty pierwszego i ostatniego.
Rozwiązanie
Ostatnie zadanie to budowa prostej symulacji magazynu. Zaczynamy od dwóch nowych kolumn: "Stan magazynu" oraz "Wysyłka?".
Logika kolumny magazynu jest następująca: jeśli wczoraj odbyła się wysyłka, to dzisiejszy stan = stan wczorajszy (minus 100 kg) plus martianeum wydobyte dzisiaj. Jeśli wczoraj wysyłki nie było, to dzisiejszy stan = stan wczorajszy plus dzisiejsze wydobycie. Kolumna "Wysyłka?" sprawdza po prostu, czy aktualny stan jest ≥ 100 (zwraca np. 1 lub 0).
Aby zliczyć wysyłki, wystarczy zsumować naszą kolumnę flagową (lub policzyć ile jest tam wartości PRAWDA). Żeby znaleźć pierwszy i ostatni transport, wprowadzamy kolumnę „Liczba wysłanych do tej pory”. W ten sposób wysyłki zostaną ponumerowane od 1 do 30. Datę pierwszej wysyłki znajdujemy szukając cyfry 1 za pomocą =PODAJ.POZYCJĘ(), a datę ostatniej – wyszukując w ten sam sposób liczbę 30.
Odpowiedź
Liczba transportów na orbitę: 30. Pierwszy transport: 29.05.2033. Ostatni transport: 01.09.2038.
Podsumowując – po wpisaniu odpowiedzi i zapisaniu obu wykresów oraz zestawień, wszystkie wyniki umieszczamy w pliku wyniki6.txt.
Zadanie 7. Poszukiwanie wody na Marsie (Bazy danych)


Siódme zadanie to klasyczna praca z relacyjną bazą danych (najczęściej rozwiązywana w programie Microsoft Access). Wcielamy się tu w rolę analityka danych z misji łazików marsjańskich. Podstawą sukcesu jest bezbłędny import trzech plików tekstowych: laziki.txt, obszary.txt oraz pomiary.txt.
Uwaga na format daty!
Podczas importu pliku pomiary.txt musisz zwrócić szczególną uwagę na kolumnę z datą. Domyślnie Access może próbować zinterpretować ją w układzie DMR (dzień-miesiąc-rok), co w przypadku tych konkretnych danych doprowadzi do błędów. Zadbaj o ręczne ustawienie układu na RMD (rok-miesiąc-dzień) podczas przechodzenia przez kroki kreatora importu.
Po zaimportowaniu tabel musimy połączyć je relacjami (jeden-do-wielu). Tabela laziki łączy się z pomiary po polu numeru łazika, a obszary z pomiary po kodzie obszaru.
Zadanie 7.1: Suma ilości wody wg obszarów (0-2 pkt)

Wyjaśnienie
Szukamy obszaru z największą sumą ilości wody we wszystkich pomiarach na głębokości do 100 m włącznie.
Rozwiązanie
Zaczynamy od prostej kwerendy wybierającej. Potrzebujemy zgrupować wyniki po nazwie obszaru i zsumować pole określające ilość wody. Kluczowy jest tu warunek dotyczący głębokości – interesują nas tylko pomiary z głębokością mniejszą lub równą 100.
Odpowiedź
Obszar z największą łączną ilością wody (głębokość ≤ 100 m): Mare Boreum.
Zadanie 7.2: Najdłużej pracujący łazik (0-2 pkt)

Wyjaśnienie
Porównujemy okres pracy każdego łazika — od daty pierwszego do ostatniego pomiaru.
Rozwiązanie
To zadanie najwygodniej podzielić na dwie kwerendy. W pierwszej, pomocniczej, dla każdego łazika wyciągamy datę pierwszego pomiaru (używając funkcji Minimum) oraz datę ostatniego pomiaru (używając funkcji Maksimum).
W drugiej kwerendzie, opartej na wynikach tej pierwszej, tworzymy pole obliczeniowe będące różnicą dat (Maksimum minus Minimum). Wyniki sortujemy malejąco po wyliczonej różnicy i ograniczamy widok tylko do pierwszego wiersza (opcja Zwróć: 1 w Accessie).
Odpowiedź
Łazik: Spirit 14. Pierwszy pomiar: 29.08.2066, ostatni: 25.07.2076 (okres ok. 3618 dni).
Zadanie 7.3: Szukanie niepasujących danych (0-2 pkt)

Wyjaśnienie
Szukamy obszarów, na których żaden łazik nie wykonał pomiaru w roku swojego wysłania z Ziemi.
Rozwiązanie
Kwerendy wyszukujące niepasujące dane to pewniak maturalny. Zadanie każe nam znaleźć obszary, na których żaden łazik NIE wykonał pomiaru w roku swojego startu. Podchodzimy do tego "na odwrót".
Krok 1: Kwerenda pomocnicza. Wypisujemy w niej obszary, na których jakiś łazik WYKONAŁ przynajmniej jeden pomiar w roku startu. Warunkiem będzie tu przyrównanie roku z daty pomiaru do roku wysłania.
Krok 2: Kwerenda wynikowa. Uruchamiamy "Kreator kwerend wyszukujących niepasujące dane". Naszą tabelą bazową są Obszary (bo stąd chcemy wyciągnąć wynik), a tabelą porównawczą nasza kwerenda pomocnicza z kroku 1. Łączymy je po kodzie obszaru i wyświetlamy tylko te, które nie mają odpowiednika.
Odpowiedź
Obszary: Amazonis, Arabia, Syrtis Major, Elysium, Sinus Sabaeus, Mare Tyrrhenum, Aeolis, Eridania.
Zadanie 7.4: Analiza półkul (0-2 pkt)

Wyjaśnienie
Szukamy łazików, które wylądowały na półkuli południowej, ale w pomiarach odwiedziły zarówno półkulę N, jak i S.
Rozwiązanie
Ten podpunkt był prawdopodobnie najtrudniejszy, ponieważ wymagał przemyślanego podzielenia logiki na kilka mniejszych kwerend. Cel: znaleźć łaziki, które wylądowały na południu, a badały obie półkule.
- Kwerenda 1: Wypisujemy łaziki lądujące na półkuli południowej. Wykorzystujemy kryterium
LIKE 'S'dla pola ze współrzędnymi lądowania. - Kwerenda 2: Tworzymy pole obliczeniowe z funkcją
IIF()(lubJEŻELI()). Jeśli współrzędna pomiaru zawiera literę 'N', zwracamy 'N', w przeciwnym razie 'S'. - Kwerenda 3: Na podstawie kwerendy drugiej zliczamy, ile unikalnych półkul (wartości N/S) odwiedził każdy łazik.
- Kwerenda wynikowa: Łączymy Kwerendę 1 (łaziki startujące z 'S') z Kwerendą 3 relacją po numerze łazika. Dodajemy warunek, że zliczona liczba półkul musi wynosić dokładnie 2.
Odpowiedź
Łaziki: Mariner 14, Mariner 15, Mariner 20, Phoenix 13, Phoenix 3, Rosetta 1, Rosetta 8, Spirit 12, Spirit 7, Viking 17.
Zadanie 7.5: Zapytanie SQL (0-2 pkt)
Do zaimportowanych tabel dołączamy tabelę Producent (pola: kod_producenta, nazwa, kraj) oraz pole kod_producenta w tabeli Laziki. Trzeba napisać zapytanie SQL zwracające unikalne nazwy producentów, których łaziki badały obszar Arcadia w roku 2060.
Wyjaśnienie
Łączymy cztery tabele: Producent → Laziki → Pomiary → Obszary. Filtrujemy po nazwie obszaru i roku pomiaru. DISTINCT usuwa powtarzające się nazwy producentów.
Rozwiązanie
W Accessie można użyć Year() lub Rok() dla daty pomiaru; warunek na rok 2060 można też zapisać przez LIKE "2060" na polu daty (jeśli data jest tekstem w zapytaniu).
Odpowiedź
SELECT DISTINCT Producent.nazwa
FROM Producent
INNER JOIN Laziki ON Producent.kod_producenta = Laziki.kod_producenta
INNER JOIN Pomiary ON Laziki.nr_lazika = Pomiary.nr_lazika
INNER JOIN Obszary ON Obszary.kod_obszaru = Pomiary.kod_obszaru
WHERE Obszary.nazwa_obszaru = "Arcadia"
AND Year(Pomiary.data_pomiaru) = 2060;Na egzaminie oceniane jest poprawne zapytanie SQL (łączenia, warunki, brak duplikatów). Po uruchomieniu w bazie z załącznika CKE otrzymujesz listę nazw producentów — wpisz ją do wyniki7.txt.
Podsumowanie matury z informatyki 2025
Arkusz z maja 2025 roku przyniósł kilka ciekawych odświeżeń formatu, nie odchodząc jednocześnie znacząco od ogólnego poziomu trudności znanego z lat ubiegłych.
Co było nowego na maturze w 2025?
- Tylko jedno obszerne zadanie algorytmiczne zamiast dwóch, do których przyzwyczaiło nas CKE w poprzednich latach.
- Pisemne dodawanie w systemie binarnym w formie graficznej łamigłówki (zadanie z lukami) to interesujące urozmaicenie klasycznych systemów liczbowych.
- Po raz pierwszy wymagano sporządzenia skumulowanego wykresu kolumnowego w arkuszu kalkulacyjnym.
- Zdecydowanie bardziej precyzyjne wytyczne dotyczące opisu wykresów – dokładne wskazówki co do formatowania tytułów, osi i legendy to zmiana na ogromny plus, ucinająca niedomówienia klucza odpowiedzi.
Kluczowe umiejętności
- Sprawna zamiana algorytmów z postaci rekurencyjnej na iteracyjną.
- Zrozumienie arytmetyki (a nie tylko konwersji) w innych systemach liczbowych.
- Operacje na dwuwymiarowych macierzach znaków oraz klasyczne algorytmy (NWD, palindromy).
- W Excelu: łączenie warunków, budowanie symulacji matematycznych oraz poprawne formatowanie wizualizacji danych.
- W Accessie: płynne korzystanie z kreatora kwerend wyszukujących niepasujące dane oraz tworzenie własnych pól obliczeniowych na bazie tekstowej.