Matura

Rozwiązania Matury z Informatyki 2025 (Maj) - Krok po kroku

KI

KursInformatyka

Eksperci od przygotowania do matury z informatyki

40 min
Obraz główny artykułu: Rozwiązania Matury z Informatyki 2025 (Maj) - Krok po kroku

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

Zadanie 1 – funkcja rekurencyjna przestaw(n)
Treść zadania z arkusza CKE

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)

Zadanie 1.1 – tabela wyników przestaw(n)
Treść zadania z arkusza CKE

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ź

nWynik działania funkcji przestawLiczba wywołań
3164981346893
43657688345667884
1540057101450075015
9988776655443219897867564534128

Zadanie 1.2: Prawda/Fałsz z liczbą wywołań (0-2 pkt)

Zadanie 1.2 – wzory na liczbę wywołań
Treść zadania z arkusza CKE

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)

Zadanie 1.3 – funkcja przestaw2
Treść zadania z arkusza CKE

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 w

Odpowiedź

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

Zadanie 2 – plik symbole.txt
Treść zadania z arkusza CKE

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)

Zadanie 2.1 – palindromy
Treść zadania z arkusza CKE

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()
python

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)

Zadanie 2.2 – kwadraty 3×3
Treść zadania z arkusza CKE
Zadanie 2.2 – przykład z pliku symbole_przyklad.txt
Treść zadania z arkusza CKE

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()
python

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)

Informacja do zadań 2.3 i 2.4 – system trójkowy
Treść zadania z arkusza CKE
Zadanie 2.3 – największa liczba
Treść zadania z arkusza CKE

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()
python

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)

Zadanie 2.4 – suma liczb trójkowych
Treść zadania z arkusza CKE

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()
python

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 – dron, plik dron.txt
Treść zadania z arkusza CKE
Zadanie 3 – informacja o pliku dron_przyklad.txt
Treść zadania z arkusza CKE

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)

Zadanie 3.1 – NWD par przesunięć
Treść zadania z arkusza CKE

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')
python

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)

Zadanie 3.2 – kwadrat i trójka punktów
Treść zadania z arkusza CKE

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')
python

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')
python

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?

Zadanie 4 – keylogger (test teoretyczny)
Treść zadania z arkusza CKE

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

Zadanie 5 – dodawanie binarne z lukami
Treść zadania z arkusza CKE

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.

  1. Kolumny od prawej: 1+1=10₂ (piszemy 0, przenosimy 1), potem 1+1+1=11₂ (piszemy 1, przenosimy 1) itd.
  2. W środkowych kolumnach łączymy znane cyfry z arkusza z przeniesieniami — np. tam gdzie w wyniku jest 0, suma musiała dać 10₂ lub 11₂.
  3. 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 0
text

Sprawdzenie w systemie dziesiętnym: 11001011011₂ + 1100110111₂ = 100110010010₂, czyli 1627 + 823 = 2450.

Zadanie 6. Martianeum (Arkusz kalkulacyjny)

Zadanie 6 – martianeum, plik martianeum.txt
Treść zadania z arkusza CKE

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)

Zadanie 6.1 – masa ładunków i wydobycia
Treść zadania z arkusza CKE

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)

Zadanie 6.2 – średnia masa ładunków
Treść zadania z arkusza CKE

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)

Zadanie 6.3 – okresy 7-dniowe
Treść zadania z arkusza CKE

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)

Zadanie 6.4 – zestawienie i wykres skumulowany
Treść zadania z arkusza CKE

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):

Obszar203320342035203620372038Suma
Iapygia475167535133302
Tharsis294038414639233
Coprates212718333023152
Amazonis232021292025138
Thaumasia22412314

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)

Zadanie 6.5 – transporty na orbitę
Treść zadania z arkusza CKE

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)

Zadanie 7 – pliki laziki.txt, obszary.txt, pomiary.txt
Treść zadania z arkusza CKE
Zadanie 7 – przykład danych i plik wyniki7.txt
Treść zadania z arkusza CKE

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)

Zadanie 7.1 – obszar z największą ilością wody
Treść zadania z arkusza CKE

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)

Zadanie 7.2 – łazik z najdłuższym okresem pomiarów
Treść zadania z arkusza CKE

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)

Zadanie 7.3 – obszary bez pomiaru w roku startu
Treść zadania z arkusza CKE

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)

Zadanie 7.4 – łaziki na obu półkulach
Treść zadania z arkusza CKE

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.

  1. Kwerenda 1: Wypisujemy łaziki lądujące na półkuli południowej. Wykorzystujemy kryterium LIKE 'S' dla pola ze współrzędnymi lądowania.
  2. Kwerenda 2: Tworzymy pole obliczeniowe z funkcją IIF() (lub JEŻELI()). Jeśli współrzędna pomiaru zawiera literę 'N', zwracamy 'N', w przeciwnym razie 'S'.
  3. Kwerenda 3: Na podstawie kwerendy drugiej zliczamy, ile unikalnych półkul (wartości N/S) odwiedził każdy łazik.
  4. 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;
sql

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.

Tagi:

matura 2025
informatyka
cke
rekurencja
python
algorytmy
excel
access
sql
bazy danych
system trójkowy

Udostępnij artykuł:

KI

O autorze: KursInformatyka

Zespół ekspertów specjalizujących się w przygotowaniu do matury z informatyki. Pomagamy uczniom osiągnąć wymarzony wynik na egzaminie.

Zobacz wszystkie artykuły

Bądź na bieżąco

Zapisz się do newslettera i otrzymuj najnowsze artykuły, porady i materiały prosto na swoją skrzynkę.

Twoje dane są bezpieczne. Możesz wypisać się w każdej chwili.