Maj 2026

Matura Rozszerzona Informatyka 2026 Maj
Rozwiązania krok po kroku

Oficjalny arkusz CKE z informatyki na poziomie rozszerzonym. Egzamin sprawdza wiedzę z kluczowych dziedzin informatyki: od analizy algorytmów rekurencyjnych i programowania (przetwarzanie ciągów znaków, tablice wielowymiarowe, systemy liczbowe), przez teorię i architekturę komputerów (arytmetyka binarna, cyberbezpieczeństwo), aż po zaawansowaną analizę danych z wykorzystaniem arkuszy kalkulacyjnych oraz relacyjnych baz danych i języka SQL.

Czas: 210 min
📄 Pobierz Arkusz PDF

Matura Rozszerzona Informatyka Maj 2026

3 pkt
Zadanie 1.1.

Informacja do zadań 1.1. i 1.2. Dana jest zdefiniowana rekurencyjnie funkcja A(m,n)A(m, n), gdzie mm i nn są dodatnimi liczbami całkowitymi.

A(m,n)={mgdy n=1A(2m,n2)gdy n>1 oraz n jest podzielne przez 2A(2m,n12)+mgdy n>1 oraz n nie jest podzielne przez 2A(m, n) = \begin{cases} m & \text{gdy } n = 1 \\ A(2 \cdot m, \frac{n}{2}) & \text{gdy } n > 1 \text{ oraz } n \text{ jest podzielne przez 2} \\ A(2 \cdot m, \frac{n-1}{2}) + m & \text{gdy } n > 1 \text{ oraz } n \text{ nie jest podzielne przez 2} \end{cases}

Obliczenie wartości funkcji A(3,9)A(3, 9) wprost z definicji wymaga trzech wywołań rekurencyjnych: A(6,4)A(6, 4), A(12,2)A(12, 2), A(24,1)A(24, 1), ponieważ:

A(3,9)=A(6,4)+3=A(12,2)+3=A(24,1)+3=24+3=27A(3, 9) = A(6, 4) + 3 = A(12, 2) + 3 = A(24, 1) + 3 = 24 + 3 = 27

Uzupełnij poniższą tabelę. Podaj liczbę wywołań rekurencyjnych funkcji A oraz wypisz wywołania rekurencyjne wraz z ich argumentami (w ostatnim wierszu podaj tylko liczbę wywołań rekurencyjnych).

💡 Pokaż rozwiązanie krok po kroku
  • 1

    Krok 1: Analiza działania algorytmu

    Algorytm w każdym wywołaniu rekurencyjnym wykonuje dwie kluczowe operacje na argumentach:

    • Mnoży parametr mm przez 2.
    • Dzieli parametr nn przez 2 (odrzucając resztę w przypadku liczb nieparzystych, czyli dzieli całkowitoliczbowo).

    Rekurencja kończy się, gdy nn osiągnie wartość 1. Oznacza to, że liczba wywołań rekurencyjnych jest ściśle powiązana z tym, ile razy możemy podzielić nn przez 2, zanim otrzymamy 1. Matematycznie odpowiada to wartości log2n\lfloor \log_2 n \rfloor.

  • 2

    Krok 2: Wypełnienie drugiego wiersza

    Mamy m=25m = 2^5 (czyli 32) oraz n=25n = 2^5 (czyli 32). Śledzimy kolejne wywołania:

    1. m=26,n=24    A(26,24)m = 2^6, n = 2^4 \implies A(2^6, 2^4)
    2. m=27,n=23    A(27,23)m = 2^7, n = 2^3 \implies A(2^7, 2^3)
    3. m=28,n=22    A(28,22)m = 2^8, n = 2^2 \implies A(2^8, 2^2)
    4. m=29,n=21    A(29,21)m = 2^9, n = 2^1 \implies A(2^9, 2^1)
    5. m=210,n=1    A(210,1)m = 2^{10}, n = 1 \implies A(2^{10}, 1)

    Zatem liczba wywołań wynosi 5.

  • 3

    Krok 3: Wypełnienie trzeciego wiersza

    Mamy m=10m = 10 oraz n=15n = 15 (liczba nieparzysta). Śledzimy kolejne wywołania (pamiętając o podwajaniu mm i połowieniu nn w dół):

    1. m=20,n=7    A(20,7)m = 20, n = 7 \implies A(20, 7)
    2. m=40,n=3    A(40,3)m = 40, n = 3 \implies A(40, 3)
    3. m=80,n=1    A(80,1)m = 80, n = 1 \implies A(80, 1)

    Zatem liczba wywołań wynosi 3.

  • 4

    Krok 4: Wypełnienie czwartego wiersza

    W ostatnim wierszu mamy n=2100+1n = 2^{100} + 1. Zgodnie z poleceniem, interesuje nas tylko liczba wywołań. Zapisując tę liczbę w systemie binarnym, otrzymalibyśmy jedynkę, za nią 99 zer, a na końcu kolejną jedynkę (łącznie 101 bitów).



    Liczba wywołań to po prostu liczba dzieleń całkowitych przez 2 potrzebnych do zredukowania liczby do 1. Dla n=2100+1n = 2^{100} + 1 wynosi to dokładnie 100.

  • 5

    Odpowiedź (wypełniona tabela)

    mmnnliczba wywołań
    rekurencyjnych funkcji A
    wywołania rekurencyjne funkcji A
    33993A(6,4),A(12,2),A(24,1)A(6, 4), A(12, 2), A(24, 1)
    252^5252^55A(26,24),A(27,23),A(28,22),A(29,21),A(210,1)A(2^6, 2^4), A(2^7, 2^3), A(2^8, 2^2), A(2^9, 2^1), A(2^{10}, 1)
    101015153A(20,7),A(40,3),A(80,1)A(20, 7), A(40, 3), A(80, 1)
    112100+12^{100} + 1100

Matura Rozszerzona Informatyka Maj 2026

1 pkt
Zadanie 1.2.

Uzupełnij poniższą tabelę. Podaj wartości funkcji A(m,n)A(m, n) dla zadanych argumentów mm i nn:

mmnnA(m,n)A(m, n)
1777
21062 \cdot 10^6256106256 \cdot 10^6

Uwaga: W swoich odpowiedziach możesz zapisać wynik podobnie jak wartości w pierwszych dwóch kolumnach (z wykorzystaniem operatorów mnożenia i potęgowania).

💡 Pokaż rozwiązanie krok po kroku
  • 1

    Krok 1: Wnioski z poprzedniego zadania

    Jeśli przeanalizujemy wyniki z zadania 1.1., łatwo dostrzec, że zdefiniowana funkcja jest algorytmem wykonującym w sposób rekurencyjny mnożenie dwóch liczb naturalnych. Zatem zawsze prawdziwa jest równość:

    A(m,n)=mnA(m, n) = m \cdot n
  • 2

    Krok 2: Obliczenia do tabeli

    Korzystając z odkrytego wzoru, po prostu wymnażamy argumenty:

    Wiersz 1: A(1,777)=1777=777A(1, 777) = 1 \cdot 777 = 777

    Wiersz 2: A(2106,256106)=2256106106=5121012A(2 \cdot 10^6, 256 \cdot 10^6) = 2 \cdot 256 \cdot 10^6 \cdot 10^6 = 512 \cdot 10^{12}


    (Zgodnie z informacją w poleceniu, można zapisać ten wynik w postaci wykładniczej: 5121012512 \cdot 10^{12} lub 2910122^9 \cdot 10^{12}).

  • 3

    Odpowiedź (wypełniona tabela)

    mmnnA(m,n)A(m, n)
    1777777
    21062 \cdot 10^6256106256 \cdot 10^65121012512 \cdot 10^{12}

Matura Rozszerzona Informatyka Maj 2026

3 pkt
Zadanie 1.3.

Uzupełnij tabelę. W drugiej kolumnie podaj liczbę wywołań rekurencyjnych funkcji AA dla każdej wartości nn podanej w tabeli (drugiego argumentu wywołania funkcji, pierwszy jest nieistotny w tym zadaniu). W trzeciej kolumnie podaj wyrażenie, którego wartość jest równa drugiemu argumentowi funkcji w ii-tym wywołaniu rekurencyjnym dla wszystkich wartości ii większych bądź równych 1 i mniejszych bądź równych całkowitej liczbie wywołań.

n – drugi argument
wywołania funkcji
liczba wywołań
rekurencyjnych
wartość drugiego argumentu A w ii-tym
wywołaniu rekurencyjnym
8382i\frac{8}{2^i} (lub 23i2^{3-i})
2k2^k
2k12^k - 1

gdzie kk jest pewną liczbą całkowitą dodatnią większą od 2.

💡 Pokaż rozwiązanie krok po kroku
  • 1

    Krok 1: Analiza dla n = 2ᵏ

    Rozpatrujemy pierwszy przypadek, w którym wartość nn jest potęgą dwójki. Z poprzednich zadań wiemy, że funkcja w każdym wywołaniu rekurencyjnym dzieli nn przez 2.

    Liczba wywołań: Skoro dzielimy przez 2 aż do osiągnięcia wartości 1, to dla n=2kn = 2^k wykonamy dokładnie kk takich dzieleń (np. dla 8=238 = 2^3 wykonujemy 3 dzielenia). Liczba wywołań to po prostu kk.

    Wartość w i-tym wywołaniu: W każdym kolejnym kroku ii dzielimy początkową wartość przez kolejną potęgę dwójki (2i2^i). Wzór to zatem 2k2i\frac{2^k}{2^i}, co na podstawie działań na potęgach możemy zapisać jako 2ki2^{k-i}.

  • 2

    Krok 2: Analiza dla n = 2ᵏ - 1

    Drugi przypadek wydaje się trudniejszy, ale staje się bardzo prosty, gdy pomyślimy o systemie binarnym. Liczba postaci 2k12^k - 1 to w zapisie dwójkowym ciąg składający się z dokładnie kk jedynek (np. 231=7=11122^3 - 1 = 7 = 111_2).

    Liczba wywołań: Całkowitoliczbowe dzielenie przez 2 (n12\frac{n-1}{2}) odpowiada obcięciu ostatniej jedynki z prawej strony (tzw. przesunięcie bitowe w prawo). Skoro zaczynamy z kk jedynkami, a chcemy skończyć z jedną (wartość 1 kończąca rekurencję), musimy obciąć cyfrę k1k - 1 razy. Zatem liczba wywołań to k1k - 1.

    Wartość w i-tym wywołaniu: W każdym ii-tym wywołaniu nasza liczba ma o ii jedynek mniej niż na początku. Składa się więc z kik - i jedynek. Liczba binarna złożona z kik - i jedynek ma wartość dziesiętną równą 2ki12^{k-i} - 1.

  • 3

    Odpowiedź (wypełniona tabela)

    n – drugi argument
    wywołania funkcji
    liczba wywołań
    rekurencyjnych
    wartość drugiego argumentu A w ii-tym
    wywołaniu rekurencyjnym
    8382i\frac{8}{2^i} (lub 23i2^{3-i})
    2k2^kkk2ki2^{k-i}
    2k12^k - 1k1k - 12ki12^{k-i} - 1

Matura Rozszerzona Informatyka Maj 2026

1 pkt
Zadanie 2.1.

Zadanie 2. Dodawanie Rozważamy dodawanie pisemne dwóch liczb zapisanych w systemie dziesiętnym, zilustrowane na przykładzie.

Przeniesienie:111010
Liczba a:027732
Liczba b: +072619
100351

W tym przykładzie mamy 4 przeniesienia.

Dla danych dwóch liczb: aa i bb, podaj, ile razy pojawiają się przeniesienia podczas ich dodawania.

Liczba aLiczba bLiczba przeniesień
37932125283
8876511111
456789222222
💡 Pokaż rozwiązanie krok po kroku
  • 1

    Krok 1: Analiza drugiej pary liczb (88765 + 11111)

    Symulujemy działanie algorytmu dodawania pisemnego (od prawej do lewej), sprawdzając na każdym kroku, czy suma cyfr oraz ewentualnego przeniesienia z poprzedniej pozycji przekracza 9.

    5 + 1 = 6 (brak przeniesienia)
    6 + 1 = 7 (brak przeniesienia)
    7 + 1 = 8 (brak przeniesienia)
    8 + 1 = 9 (brak przeniesienia)
    8 + 1 = 9 (brak przeniesienia)

    Wszystkie sumy częściowe są cyframi jednocyfrowymi.


    Liczba przeniesień wynosi 0.

  • 2

    Krok 2: Analiza trzeciej pary liczb (456789 + 222222)

    Ponownie symulujemy dodawanie od prawej strony, pamiętając o uwzględnianiu przeniesienia w kolejnych rzędach:

    9 + 2 = 11 → zapisujemy 1, przeniesienie 1
    8 + 2 + 1 = 11 → zapisujemy 1, przeniesienie 1
    7 + 2 + 1 = 10 → zapisujemy 0, przeniesienie 1
    6 + 2 + 1 = 9 → zapisujemy 9, brak przeniesienia
    5 + 2 = 7 → zapisujemy 7, brak przeniesienia
    4 + 2 = 6 → zapisujemy 6, brak przeniesienia

    Zliczając wystąpienia "jedynki dalej", otrzymujemy dokładnie 3 takie sytuacje.


    Liczba przeniesień wynosi 3.

  • 3

    Odpowiedź (wypełniona tabela)

    Liczba aLiczba bLiczba przeniesień
    37932125283
    88765111110
    4567892222223

Matura Rozszerzona Informatyka Maj 2026

4 pkt
Zadanie 2.2.

Zapisz w pseudokodzie lub w wybranym języku programowania algorytm, który dla danych dwóch liczb całkowitych dodatnich aa i bb, o tej samej liczbie cyfr w zapisie dziesiętnym, obliczy liczbę przeniesień otrzymanych w trakcie ich dodawania pisemnego.



Przykład: dla liczb 27732 i 72619 wynik to 4.



Uwaga: Twój algorytm może operować wyłącznie na liczbach całkowitych i używać tylko zmiennych przechowujących pojedyncze liczby całkowite. W zapisie algorytmu możesz korzystać tylko z operatorów arytmetycznych: dodawania, odejmowania, mnożenia, dzielenia, dzielenia całkowitego i reszty z dzielenia; z operatorów logicznych, porównań, instrukcji sterujących, instrukcji przypisania lub samodzielnie napisanych funkcji i procedur wykorzystujących powyższe operacje. Zabronione jest używanie funkcji wbudowanych oraz operatorów innych niż wymienione, dostępnych w językach programowania, nie wolno zwłaszcza korzystać z tablic/list oraz żadnych funkcji zamiany z typu znakowego lub napisowego na liczbowy – i odwrotnie.



Specyfikacja:

Dane:
a,ba, b – dodatnie liczby całkowite o tej samej liczbie cyfr
Wynik:
pp – liczba przeniesień otrzymanych w trakcie dodawania pisemnego liczb aa i bb
💡 Pokaż rozwiązanie krok po kroku
  • 1

    Krok 1: Omówienie metody

    Z powodu restrykcyjnych ograniczeń (zakaz używania tablic i stringów), musimy symulować dodawanie pisemne, operując wyłącznie na matematyce. Aby "odciąć" ostatnią cyfrę z liczby, użyjemy operacji reszty z dzielenia przez 10 (często zapisywanej jako mod lub %). Z kolei aby usunąć przetworzoną cyfrę z liczby i przesunąć się w lewo, użyjemy dzielenia całkowitego przez 10 (div lub //).



    W każdej iteracji algorytmu:

    1. Wyciągniemy ostatnie cyfry z obu liczb.
    2. Zsumujemy je, dodając również ewentualne przeniesienie z poprzedniego kroku (na początku wynosi 0).
    3. Jeśli suma będzie większa lub równa 10, zwiększymy licznik wyników p i ustawimy przeniesienie na 1. W przeciwnym razie przeniesienie wynosi 0.
    4. Usuniemy ostatnie cyfry z obu liczb, dzieląc je całkowicie przez 10.

    Proces powtarzamy, dopóki liczby są większe od zera.

  • 2

    Krok 2: Rozwiązanie w postaci pseudokodu

    Poniżej znajduje się czytelny zapis algorytmiczny, który w pełni spełnia wszystkie wymagania maturalne:

    p0
    przeniesienie0

    dopóki a > 0 wykonuj:
    cyfra_a a mod 10
    cyfra_b b mod 10


    sumacyfra_a+cyfra_b+przeniesienie

    jeżeli suma >= 10 to:
    przeniesienie 1
    p p + 1
    w przeciwnym razie:
    przeniesienie 0


    // odrzucenie ostatnich cyfr
    a a div 10
    b b div 10

    wypisz p
  • 3

    Krok 3: Rozwiązanie w języku Python (alternatywnie)

    Poniżej ten sam algorytm zapisany w postaci funkcji w języku Python:

    def policz_przeniesienia(a, b):
        p = 0
        przeniesienie = 0
        
        while a > 0:
            cyfra_a = a % 10
            cyfra_b = b % 10
            
            suma = cyfra_a + cyfra_b + przeniesienie
            
            if suma >= 10:<p
                przeniesienie = 1
                p += 1
            else:
                przeniesienie = 0
                
            a = a // 10
            b = b // 10
            
        return p
    

Matura Rozszerzona Informatyka Maj 2026

2 pkt
Zadanie 3.1.

Zadanie 3. Pary słów W pliku tekstowym pary.txt znajduje się 500 par słów złożonych z liter alfabetu angielskiego a,b,,za, b, \dots, z. Każda para słów jest zapisana w osobnym wierszu. Słowa w wierszu są oddzielone pojedynczym odstępem, a długość każdego z nich nie przekracza 50 znaków.



Napisz program (lub kilka programów), który znajdzie i da odpowiedzi do podanych zadań. Odpowiedzi do poszczególnych zadań zapisz w pliku wyniki3.txt. Każdą odpowiedź poprzedź numerem oznaczającym zadanie.

Niech f(s)f(s) oznacza sumę kodów ASCII znaków występujących w słowie ss. Podaj parę słów s1,s2s_1, s_2 występujących w jednym wierszu pliku pary.txt, dla których wartość f(s1)f(s2)|f(s_1) - f(s_2)| (wartość bezwzględna różnicy sum kodów ASCII) jest największa, oraz podaj tę wartość. Jest tylko jedna taka para słów w pliku.



Przykład: Dla pary słów oko i pies, mamy następujące wartości:

f(oko) = 111 + 107 + 111 = 329f(pies) = 112 + 105 + 101 + 115 = 433|f(oko) - f(pies)| = 104

Dla pliku pary_przyklad.txt poprawną odpowiedzią jest: eddcd eededcddceeeecededcc 1403

💡 Pokaż rozwiązanie krok po kroku
  • 1

    Krok 1: Omówienie algorytmu

    Rozwiązanie tego zadania sprowadza się do wczytania pliku linia po linii, rozdzielenia każdego wiersza na dwa słowa (oddzielone spacją) i policzenia dla nich wartości funkcji f(s)f(s).

    • Aby policzyć kod ASCII danego znaku w Pythonie, korzystamy z wbudowanej funkcji ord(znak).
    • Moduł (wartość bezwzględną) obliczamy za pomocą funkcji abs().
    • W trakcie pętli zapamiętujemy największą dotychczas znalezioną różnicę oraz parę słów, która ją wygenerowała.
  • 2

    Krok 2: Kod rozwiązania (Python)

    Poniżej znajduje się gotowy skrypt rozwiązujący zadanie 3.1:

    def zadanie_3_1():
        max_diff = -1
        best_pair = ("", "")
    
        with open("pary.txt", "r") as file:
            for line in file:
                # Rozdzielenie wiersza na dwa słowa
                s1, s2 = line.strip().split()
                
                # Obliczenie sum kodów ASCII dla obu słów
                sum1 = sum(ord(char) for char in s1)
                sum2 = sum(ord(char) for char in s2)
                
                # Wartość bezwzględna różnicy
                diff = abs(sum1 - sum2)
                
                # Aktualizacja maksimum
                if diff > max_diff:
                    max_diff = diff
                    best_pair = (s1, s2)
                    
        print(f"3.1: {best_pair[0]} {best_pair[1]} {max_diff}")
    
    zadanie_3_1()
    

    Dla pliku pary.txt poprawną odpowiedzią jest: gpeeazeugmvsbzwsrxfplqdbakoxxe lhpbmoirdm 2206

Matura Rozszerzona Informatyka Maj 2026

3 pkt
Zadanie 3.2.

Wspólną liczbę wystąpień litery xx w słowach s1,s2s_1, s_2 oznaczymy przez W(x,s1,s2)W(x, s_1, s_2) i definiujemy jako

W(x,s1,s2)=min(d(x,s1),d(x,s2))W(x, s_1, s_2) = \min(d(x, s_1), d(x, s_2))

gdzie d(x,s)d(x, s) oznacza liczbę wystąpień litery xx w słowie ss.



Podaj parę słów występujących w jednym wierszu w pliku pary.txt, dla której suma wspólnych wystąpień wszystkich liter jest największa, oraz podaj tę sumę. Jest jedna taka para.

💡 Pokaż rozwiązanie krok po kroku
  • 1

    Krok 1: Omówienie algorytmu

    W tym zadaniu dla każdej pary słów musimy sprawdzić, ile razy dane litery powtarzają się w obu słowach.

    • Ponieważ szukamy minimum z liczby wystąpień w pierwszym i drugim słowie, wystarczy, że przeiterujemy się po unikalnych literach występujących w pierwszym słowie (używając zbioru set(s1)). Jeśli jakiejś litery nie ma w pierwszym słowie, to jej minimum i tak wyniesie 0.
    • Do zliczania wystąpień konkretnej litery w napisie użyjemy metody count().
    • Dla każdej litery wybieramy mniejszą z policzonych wartości min(count1, count2) i dodajemy ją do sumy dla danej pary.
    • Ponownie, podobnie jak w 3.1, śledzimy maksimum i zapisujemy zwycięską parę.
  • 2

    Krok 2: Kod rozwiązania (Python)

    Poniżej znajduje się gotowy skrypt rozwiązujący zadanie 3.2:

    def zadanie_3_2():
        max_shared_sum = -1
        best_pair = ("", "")
    
        with open("pary.txt", "r") as file:
            for line in file:
                s1, s2 = line.strip().split()
                
                shared_sum = 0
                # Tworzymy zbiór unikalnych liter z pierwszego słowa
                unique_chars = set(s1)
                
                for char in unique_chars:
                    count1 = s1.count(char)
                    count2 = s2.count(char)
                    
                    # Dodajemy mniejszą liczbę wystąpień (część wspólną)
                    shared_sum += min(count1, count2)
                    
                # Aktualizacja maksimum
                if shared_sum > max_shared_sum:
                    max_shared_sum = shared_sum
                    best_pair = (s1, s2)
                    
        print(f"3.2: {best_pair[0]} {best_pair[1]} {max_shared_sum}")
    
    zadanie_3_2()
    

    Dla pliku pary.txt poprawną odpowiedzią jest: aacbcccaacacbcabac cccccaaaacaccbabcba 18

Matura Rozszerzona Informatyka Maj 2026

4 pkt
Zadanie 3.3.

Zadanie 3.3. Prefiksosufiks Prefiksosufiksem pary słów s1,s2s_1, s_2 nazywamy słowo, które jest początkiem s1s_1 (czyli s1s_1 zaczyna się tym słowem) oraz końcem s2s_2 (czyli s2s_2 kończy się tym słowem) lub początkiem s2s_2 oraz końcem s1s_1.

Podaj wszystkie pary słów z pliku pary.txt, dla których najdłuższy prefiksosufiks ma co najmniej 5 liter. Dla każdej podanej w odpowiedzi pary słów podaj długość najdłuższego prefiksosufiksu tej pary.

Przykłady:

Dla pary aabbca caacaab najdłuższy prefiksosufiks to aab (długość 3) — para nie spełnia warunków.

Dla pary abbaabaa baabaabba najdłuższy prefiksosufiks to baabaa (długość 6) — para spełnia warunki.

Dla pliku pary_przyklad.txt poprawną odpowiedzią jest: ececdddeed dddeedd 6

💡 Pokaż rozwiązanie krok po kroku
  • 1

    Krok 1: Analiza problemu i projekt funkcji pomocniczej

    Zadanie wymaga zbadania dwóch niezależnych przypadków dla każdej pary słów s1s_1 i s2s_2:

    1. Słowo jest jednocześnie początkiem (prefiksem) s1s_1 i końcem (sufiksem) s2s_2.
    2. Słowo jest jednocześnie początkiem (prefiksem) s2s_2 i końcem (sufiksem) s1s_1.

    Najwygodniejszym podejściem jest napisanie funkcji pomocniczej, która sprawdza narastająco długości potencjalnych dopasowań ll od 1 do maksymalnej możliwej długości (czyli długości krótszego ze słów). Wykorzystujemy technikę wycinania napisów (slicing) w Pythonie: s1[:l] da nam prefiks, a s2[-l:] da nam sufiks.

  • 2

    Krok 2: Kod rozwiązania (Python)

    Poniższy program przetwarza cały plik wejściowy, filtruje pary według kryterium długości 5\ge 5 i wypisuje sformatowany wynik:

    def podaj_najdluzszy_prefiksosufiks(s1, s2):
        max_dlugosc = 0
        max_mozliwa = min(len(s1), len(s2))
        
        # Przypadek 1: prefiks s1 i sufiks s2
        for l in range(1, max_mozliwa + 1):
            if s1[:l] == s2[-l:]:
                if l > max_dlugosc:
                    max_dlugosc = l
                    
        # Przypadek 2: prefiks s2 i sufiks s1
        for l in range(1, max_mozliwa + 1):
            if s2[:l] == s1[-l:]:
                if l > max_dlugosc:
                    max_dlugosc = l
                    
        return max_dlugosc
    
    def zadanie_3_3():
        with open("pary.txt", "r") as file:
            for line in file:
                s1, s2 = line.strip().split()
                
                dlugosc = podaj_najdluzszy_prefiksosufiks(s1, s2)
                
                # Filtrujemy zgodnie z treścią zadania (minimum 5 liter)
                if dlugosc >= 5:
                    print(f"{s1} {s2} {dlugosc}")
    
    zadanie_3_3()
    

    Dla pliku pary.txt poprawną odpowiedzią jest: bbbbaabbababbaaaa baaaaabaaabbbabab 5
    aababbbababbbbbbaab bbbbaabbababababa 7
    aaaababaaaabbbb aabbbbbabbbaaaa 6
    bbbbabaaabbbabb aaababaabbbbbbba 5
    ccccabacbba acbbabcbcbcbaa 5
    caabbccabccc cabccccabbaac 6
    abaacabcccccabbbc abbbcbbbbbcabaca 5

Matura Rozszerzona Informatyka Maj 2026

1 pkt
Zadanie 4.1.

Zadanie 4. Korporacja W korporacji pracuje nn osób, które na potrzeby zadania ponumerujemy liczbami 1,2,,n1, 2, \dots, n. Pracownik numer 1 jest prezesem korporacji, a każdy z pozostałych pracowników ma dokładnie jednego bezpośredniego przełożonego. Numer bezpośredniego przełożonego pracownika xx jest zawsze mniejszy od numeru tego pracownika. Prezes korporacji nie ma żadnego przełożonego. Przełożonym pracownika jest jego bezpośredni przełożony i każdy przełożony tego bezpośredniego przełożonego. Jeśli xx jest (bezpośrednim) przełożonym yy, to powiemy, że yy jest (bezpośrednim) podwładnym xx. Prezes jest przełożonym każdego pracownika.

Dla każdego pracownika z przykładowej hierarchii w korporacji (Rysunek 1.) określ, ilu ma on bezpośrednich podwładnych oraz ilu ma wszystkich podwładnych.

Numer pracownikaLiczba bezpośrednich
podwładnych
Liczba wszystkich
podwładnych
1
234
3
4
5
6
7
800
💡 Pokaż rozwiązanie krok po kroku
  • 1

    Krok 1: Definicje i analiza struktury drzewiastej

    Przedstawiona hierarchia jest klasycznym drzewem skierowanym, w którym prezes (pracownik 1) stanowi korzeń.

    • Bezpośredni podwładni pracownika to wszystkie węzły, do których strzałka prowadzi bezpośrednio z danego pracownika (w terminologii drzew są to jego dzieci).
    • Wszyscy podwładni to pełne poddrzewo zakorzenione w danym pracowniku (dzieci, wnuki, prawnuki itd.).
  • 2

    Krok 2: Analiza pracowników z wyższych poziomów (1, 3, 4)

    Przeanalizujmy sytuację dla osób posiadających podwładnych na podstawie schematu graficznego:

    Pracownik 1 (Prezes): Strzałki wskazują na niego od pracowników 2 i 4 (2 bezpośrednich). Ponieważ jest prezesem całej korporacji, jego podwładnymi są wszyscy pozostali pracownicy w firmie (węzły od 2 do 8), co daje łącznie 7 osób.
    Pracownik 3: Strzałka wskazuje na niego bezpośrednio tylko od pracownika 7 (1 bezpośredni). Pracownik 7 nie ma już dalszych podwładnych, więc całkowita liczba podwładnych pracownika 3 to również 1.
    Pracownik 4: Strzałka wskazuje na niego bezpośrednio tylko od pracownika 8 (1 bezpośredni). On również nie ma dalszych rozgałęzień, więc wszystkich podwładnych wynosi 1.
  • 3

    Krok 3: Analiza liści struktury (5, 6, 7)

    Węzły, od których nie odchodzą w dół żadne inne strzałki, to tzw. liście. Nie posiadają one żadnych podwładnych.

    Pracownicy 5, 6 oraz 7 nie są przełożonymi dla nikogo, dlatego w obu kolumnach dla tych numerów wpisujemy wartość 0.
  • 4

    Odpowiedź (wypełniona tabela)

    Numer pracownikaLiczba bezpośrednich
    podwładnych
    Liczba wszystkich
    podwładnych
    127
    234
    311
    411
    500
    600
    700
    800

Matura Rozszerzona Informatyka Maj 2026

2 pkt
Zadanie 4.2.

Informacja do zadań 4.2.–4.4. Dany jest plik korpo.txt zawierający n=50 000n = 50\ 000 liczb, który opisuje strukturę korporacji. W pierwszym wierszu jest liczba 0 oznaczająca brak przełożonego dla prezesa korporacji, który ma numer 1. W ii-tym (2i50 0002 \le i \le 50\ 000) wierszu pliku jest numer pracownika, który jest bezpośrednim przełożonym pracownika ii.

Na podstawie danych zapisanych w pliku korpo.txt podaj, ilu pracowników nie jest przełożonym żadnego pracownika.



Dla pliku korpo_przyklad.txt poprawną odpowiedzią jest: 49 998

💡 Pokaż rozwiązanie krok po kroku
  • 1

    Krok 1: Analiza problemu

    Każda linia w pliku (oprócz pierwszej, która zawiera 0) reprezentuje numer bezpośredniego przełożonego dla kolejnych pracowników. Jeśli dany numer pracownika ani razu nie pojawia się w pliku jako przełożony, oznacza to, że ta osoba nie ma żadnych bezpośrednich podwładnych (jest tzw. "liściem" w strukturze drzewa).



    Algorytm polega na wczytaniu wszystkich numerów przełożonych, zapisaniu ich do zbioru unikalnych wartości (ang. set), a następnie odjęciu liczby unikalnych przełożonych od całkowitej liczby pracowników wynoszącej 50 000. Pamiętamy o pominięciu wartości 0, która oznacza brak przełożonego.

  • 2

    Krok 2: Kod rozwiązania w języku Python

    Poniższy skrypt wczytuje dane i oblicza liczbę osób bez podwładnych:

    def zadanie_4_2():
        bosses = set()
        
        with open("korpo.txt", "r") as file:
            for line in file:
                boss = int(line.strip())
                if boss != 0:
                    bosses.add(boss)
                
                # Łączna liczba pracowników to 50 000
                pracownicy_bez_podwladnych = 50000 - len(bosses)
                print(f"4.2: {pracownicy_bez_podwladnych}")
    
    zadanie_4_2()
    

    Dla pliku korpo.txt poprawną odpowiedzią jest: 25113

Matura Rozszerzona Informatyka Maj 2026

2 pkt
Zadanie 4.3.

Podaj, który pracownik spośród zapisanych w pliku korpo.txt ma najwięcej bezpośrednich podwładnych. Podaj numer tego pracownika oraz liczbę jego bezpośrednich podwładnych.



Dla pliku korpo_przyklad.txt poprawną odpowiedzią jest: 3 49 997

💡 Pokaż rozwiązanie krok po kroku
  • 1

    Krok 1: Analiza problemu

    Liczba bezpośrednich podwładnych danego pracownika jest dokładnie równa liczbie wystąpień jego numeru w pliku korpo.txt.



    Naszym zadaniem jest zliczenie, ile razy każdy numer przełożonego pojawia się w pliku, a następnie znalezienie tego, który pojawia się najczęściej. Do realizacji tego zadania idealnie sprawdzi się słownik (często nazywany mapą lub tablicą asocjacyjną) w którym kluczem jest numer pracownika, a wartością liczba jego podwładnych.

  • 2

    Krok 2: Kod rozwiązania w języku Python

    Poniższy skrypt zlicza wystąpienia każdego przełożonego i wyznacza lidera z największą liczbą bezpośrednich podwładnych:

    def zadanie_4_3():
        # Słownik do zliczania podwładnych dla każdego bossa
        podwladni_count = {}
        
        with open("korpo.txt", "r") as file:
            for line in file:
                boss = int(line.strip())
                if boss != 0:
                    podwladni_count[boss] = podwladni_count.get(boss, 0) + 1
        
        # Znalezienie bossa z maksymalną liczbą podwładnych
        najwiekszy_boss = max(podwladni_count, key=podwladni_count.get)
        liczba_podwladnych = podwladni_count[najwiekszy_boss]
        
        print(f"4.3: {najwiekszy_boss} {liczba_podwladnych}")
    
    zadanie_4_3()
    

    Dla pliku korpo.txt poprawną odpowiedzią jest: 2 19

Matura Rozszerzona Informatyka Maj 2026

3 pkt
Zadanie 4.4.

Policz, ilu najwięcej przełożonych ma jeden pracownik. Podaj tę liczbę oraz podaj, ilu pracowników ma taką liczbę przełożonych.



Dla danych z pliku korpo_przyklad.txt poprawną odpowiedzą jest: 2 49 997


(największa liczba przełożonych: 2, liczba pracowników, którzy mają 2 przełożonych: 49 997).

💡 Pokaż rozwiązanie krok po kroku
  • 1

    Krok 1: Analiza problemu (ścieżka do korzenia)

    Liczba wszystkich przełożonych danego pracownika to po prostu liczba kroków, jakie musimy wykonać, idąc od niego w górę hierarchii aż do samego prezesa (pracownika numer 1). W strukturach drzewiastych odpowiada to głębokości (poziomowi) danego węzła w drzewie.



    Kluczowa informacja z treści całego zadania mówi, że numer bezpośredniego przełożonego pracownika jest zawsze mniejszy od numeru samego pracownika. To potężne ułatwienie! Oznacza to, że przetwarzając pracowników po kolei od numeru 1 do 50 000, w momencie analizowania pracownika ii znamy już dokładną liczbę przełożonych jego szefa.



    Możemy zastosować proste podejście dynamiczne:

    • Prezes (numer 1) ma 0 przełożonych.

    • Każdy kolejny pracownik ma dokładnie o 1 przełożonego więcej niż jego bezpośredni przełożony.

  • 2

    Krok 2: Kod rozwiązania w języku Python

    Poniższy program wczytuje plik, wyznacza tablicę głębokości dla każdego pracownika, a następnie zlicza wystąpienia maksymalnej wartości:

    def zadanie_4_4():
        # Tablica przechowująca liczbę przełożonych dla każdego pracownika.
        # Indeks odpowiada numerowi pracownika. Pracowników jest 50 000 (indeksy 1-50000).
        # Tworzymy tablicę o rozmiarze 50001, wypełnioną zerami.
        liczba_przelozonych = [0] * 50001
        
        # Pracownik 1 (Prezes) ma 0 przełożonych, co już jest ustawione.
        
        current_worker = 2
        with open("korpo.txt", "r") as file:
            # Pomijamy pierwszą linię (zawierającą 0 dla prezesa)
            next(file)
            
            for line in file:
                direct_boss = int(line.strip())
                
                # Liczba przełożonych aktualnego pracownika to liczba przełożonych 
                # jego szefa powiększona o 1
                liczba_przelozonych[current_worker] = liczba_przelozonych[direct_boss] + 1
                current_worker += 1
        
        # Ignorujemy indeks 0, interesują nas tylko pracownicy 1-50000
        dane_pracownikow = liczba_przelozonych[1:50001]
        
        # Wyznaczamy maksymalną liczbę przełożonych
        max_przelozonych = max(dane_pracownikow)
        
        # Zliczamy, ilu pracowników osiągnęło ten maksymalny wynik
        liczba_pracownikow_z_max = dane_pracownikow.count(max_przelozonych)
        
        print(f"4.4: {max_przelozonych} {liczba_pracownikow_z_max}")
    
    zadanie_4_4()
    

    Dla pliku korpo.txt poprawną odpowiedzią jest: 22 2

Matura Rozszerzona Informatyka Maj 2026

2 pkt
Zadanie 5.

Poniżej zapisano wyrażenie matematyczne zawierające liczby zapisane w systemach: piątkowym, dziesiętnym i trójkowym. W miejsce kropek wpisz odpowiednie liczby (zapisane w systemie piątkowym i trójkowym), tak aby obie równości były prawdziwe.

14405+5=42710=311000231440_5 + \dots\dots\dots\dots_5 = 427_{10} = \dots\dots\dots\dots_3 - 110002_3
💡 Pokaż rozwiązanie krok po kroku
  • 1

    Krok 1: Wyznaczenie brakującej liczby w systemie piątkowym

    Zajmijmy się pierwszą równością: 14405+X5=427101440_5 + X_5 = 427_{10}. Na początku zamieńmy liczbę 144051440_5 na system dziesiętny:

    14405=153+452+451+0501440_5 = 1 \cdot 5^3 + 4 \cdot 5^2 + 4 \cdot 5^1 + 0 \cdot 5^0
    =125+100+20+0=24510= 125 + 100 + 20 + 0 = 245_{10}

    Teraz możemy obliczyć wartość XX w systemie dziesiętnym:

    24510+X10=42710    X10=427245=18210245_{10} + X_{10} = 427_{10} \quad \implies \quad X_{10} = 427 - 245 = 182_{10}

    Na koniec zamieniamy wynik 18210182_{10} na system piątkowy poprzez cykliczne dzielenie z resztą przez 5:

    182 : 5 = 36, reszta 2
    36 : 5 = 7, reszta 1
    7 : 5 = 1, reszta 2
    1 : 5 = 0, reszta 1

    Czytając reszty od dołu, otrzymujemy pierwszą szukaną wartość: 1212₅.

  • 2

    Krok 2: Wyznaczenie brakującej liczby w systemie trójkowym

    Przejdźmy do drugiej równości: 42710=Y31100023427_{10} = Y_3 - 110002_3. Najpierw przekształćmy odjemnik 1100023110002_3 na system dziesiętny:

    1100023=135+134+033+032+031+230110002_3 = 1 \cdot 3^5 + 1 \cdot 3^4 + 0 \cdot 3^3 + 0 \cdot 3^2 + 0 \cdot 3^1 + 2 \cdot 3^0
    =243+81+0+0+0+2=32610= 243 + 81 + 0 + 0 + 0 + 2 = 326_{10}

    Wyznaczamy wartość YY w układzie dziesiętnym:

    42710=Y1032610    Y10=427+326=75310427_{10} = Y_{10} - 326_{10} \quad \implies \quad Y_{10} = 427 + 326 = 753_{10}

    Zamieniamy liczbę 75310753_{10} na system trójkowy, dzieląc przez 3:

    753 : 3 = 251, reszta 0
    251 : 3 = 83, reszta 2
    83 : 3 = 27, reszta 2
    27 : 3 = 9, reszta 0
    9 : 3 = 3, reszta 0
    3 : 3 = 1, reszta 0
    1 : 3 = 0, reszta 1

    Czytając reszty od dołu, otrzymujemy drugą wartość: 1000220₃.

  • 3

    Odpowiedź

    Prawidłowo uzupełnione wyrażenie ma postać:

    14405+12125=42710=1000220311000231440_5 + 1212_5 = 427_{10} = 1000220_3 - 110002_3

Matura Rozszerzona Informatyka Maj 2026

1 pkt
Zadanie 6.

Uzupełnij zdania. Wpisz właściwe liczby bitów.



Adres IP w wersji 4 ma długość ................... bity.



Adres IP w wersji 6 ma długość ................... bitów.

💡 Pokaż rozwiązanie krok po kroku
  • 1

    Rozwiązanie i wyjaśnienie

    Zadanie weryfikuje znajomość podstawowych protokołów sieciowych warstwy sieciowej:

    IPv4 (Internet Protocol version 4): Adresy te zapisujemy najczęściej w notacji kropkowo-dziesiętnej (np. 192.168.1.1). Składają się one z 4 oktetów (bajtów). Ponieważ 1 bajt to 8 bitów, łączna długość adresu wynosi 32 bity (484 \cdot 8).

    IPv6 (Internet Protocol version 6): Został wprowadzony, aby rozwiązać problem wyczerpywania się adresów IPv4. Zapisywany jest w notacji szesnastkowej i składa się z 16 bajtów. Daje to łączną długość wynoszącą 128 bitów (16816 \cdot 8).

Matura Rozszerzona Informatyka Maj 2026

3 pkt
Zadanie 7.1.

Zadanie 7. Staw Pan Iksiński stał się właścicielem stawu o powierzchni całkowitej 10 000 m². Pierwszą rośliną, którą postanowił w nim umieść, jest rzęsa wodna...



W pliku staw.txt są zawarte następujące informacje, rozdzielone znakami tabulacji:

Data – data pomiaru
Temp – temperatura w danym dniu w °C, zaokrąglona do jednego miejsca po przecinku
Opady – wielkość opadu w mm, zaokrąglona do liczby całkowitej.

Plik zawiera dane z całego 2022 roku. Z wykorzystaniem danych zawartych w pliku oraz dostępnych narzędzi informatycznych wykonaj podane zadania. Wyniki zapisz w pliku tekstowym wyniki7.txt.

Utwórz zestawienie średnich miesięcznych temperatur w zaokrągleniu do jednego miejsca po przecinku. Na podstawie wykonanego zestawienia utwórz wykres kolumnowy, porównujący te wartości. Pamiętaj o czytelnym opisie wykresu (tytuł wykresu, opisy osi, oznaczenie miesięcy na osi X).

💡 Pokaż rozwiązanie krok po kroku
  • 1

    Rozwiązanie: Zestawienie danych

    Na podstawie wczytanych danych obliczamy średnie arytmetyczne temperatur dla każdego miesiąca. W programie Excel uzyskamy to błyskawicznie tworząc Tabelę Przestawną:

    MiesiącŚrednia temp. (°C)
    sty1,1
    lut4,1
    mar4,1
    kwi7,4
    maj15,9
    cze20,5
    lip20,4
    sie21,1
    wrz13,7
    paź12,5
    lis5,2
    gru1,6
  • 2

    Rozwiązanie: Wykres kolumnowy

    Oto wygenerowany wykres kolumnowy naśladujący standardowy wygląd z arkusza kalkulacyjnego Excel, uwzględniający wszystkie wymagane opisy osi i tytuł.

    Zestawienie średnich miesięcznych temperatur

    Temperatura

    25,020,015,010,05,00,0
    Suma
    stylutmarkwimajczelipsiewrzpaźlisgru

    Miesiąc

Matura Rozszerzona Informatyka Maj 2026

2 pkt
Zadanie 7.2.

Dla każdego miesiąca wyznacz długość najdłuższego ciągu kolejnych dni bez opadów w tym miesiącu (wartość opadów w tych dniach jest równa 0).

💡 Pokaż rozwiązanie krok po kroku
  • 1

    Krok 1: Logika algorytmu (Zliczanie sekwencji)

    Problem polega na znalezieniu najdłuższego pasma dni, w których wartość w kolumnie Opady wynosi dokładnie 00, z zastrzeżeniem, że analizujemy każdy miesiąc osobno.



    Przechodząc przez kolejne dni danego miesiąca:

    • Jeśli opad wynosi 0, zwiększamy licznik bieżącej serii o 1.
    • Jeśli opad jest większy od 0, bieżąca seria się urywa — porównujemy ją z dotychczasowym maksimum dla tego miesiąca (w razie potrzeby aktualizujemy maksimum), a licznik bieżący zerujemy.
    • Na koniec każdego miesiąca (lub przy zmianie miesiąca w pliku) musimy pamiętać o wykonaniu ostatecznego sprawdzenia serii, na wypadek gdyby najdłuższy ciąg bez opadów trwał do ostatniego dnia tego miesiąca.
  • 2

    Krok 2: *Kod rozwiązania w języku Python

    Poniższy program przetwarza dane dzień po dniu, samodzielnie pilnując granic miesięcy i resetując liczniki serii przy zmianie miesiąca:

    def zadanie_7_2():
        # Słownik na maksymalne ciągi bez opadów dla każdego miesiąca
        max_streaks = {f"{i:02d}": 0 for i in range(1, 12 + 1)}
        
        current_month = "01"
        current_streak = 0
        
        with open("staw.txt", "r") as file:
            next(file) # pominięcie nagłówka
            for line in file:
                parts = line.strip().split("\t")
                if len(parts) < 3:
                    continue
                data, _, opady_str = parts
                
                month = data.split("-")[1]
                opady = int(opady_str)
                
                # Jeśli zmienił się miesiąc, domykamy serię starego miesiąca i resetujemy
                if month != current_month:
                    if current_streak > max_streaks[current_month]:
                        max_streaks[current_month] = current_streak
                    current_month = month
                    current_streak = 0
                
                # Sprawdzamy warunek braku opadów
                if opady == 0:
                    current_streak += 1
                else:
                    if current_streak > max_streaks[month]:
                        max_streaks[month] = current_streak
                    current_streak = 0
                    
            # Ostateczne sprawdzenie dla ostatniego wiersza w pliku (grudzień)
            if current_streak > max_streaks[current_month]:
                max_streaks[current_month] = current_streak
    
        print("Zadanie 7.2 - Najdłuższe ciągi bez opadów:")
        for m, streak in max_streaks.items():
            print(f"Miesiąc {m}: {streak} dni")
    
    zadanie_7_2()
    

    Odpowiedź: Zestawienie danych

    Poniżej znajduje się zestawienie wyników dla poszczególnych miesięcy:

    MiesiącLiczba dni
    sty11
    lut7
    mar20
    kwi8
    maj20
    cze11
    lip10
    sie8
    wrz14
    paź15
    lis10
    gru11

Matura Rozszerzona Informatyka Maj 2026

2 pkt
Zadanie 7.3.

Informacja do zadań 7.3.–7.4. Na potrzeby zadania przyjmujemy, że w kolejnym roku przez 184 dni, od 1 marca 2023 do 31 sierpnia 2023, temperatury i opady utrzymywały się na stałym poziomie, co pozwalało na regularny wzrost rzęsy wodnej w tempie rozrostu 1,75% dziennie. Przyrost rzęsy następował w nocy, a pomiar zarośnięcia stawu – rano.



1 marca 2023 rano staw był zarośnięty rzęsą w 20%, tj. rzęsa wodna zajmowała 2000 m². W związku z tym, że staw nie powinien być zarośnięty w całości, właściciel postanowił pozbywać się jej nadmiaru. Do zbiornika wpuścił 80 amurów białych, z których każdy zjadał w ciągu dnia 0,25 m² rzęsy wodnej. Dodatkowo co piątek w ciągu dnia odławiał 60 m² rzęsy wodnej.



Uwaga: 30 kwietnia rano staw był zarośnięty w 25,79%.

Podaj, w którym dniu (licząc od 1 marca 2023) pomiar wykazał, że rzęsa wodna po raz pierwszy zajęła więcej niż 75% procent powierzchni stawu.

💡 Pokaż rozwiązanie krok po kroku
  • 1

    Krok 1: Modelowanie matematyczne w arkuszu kalkulacyjnym

    Aby rozwiązać to zadanie w programie Excel lub LibreOffice Calc, tworzymy tabelę o następującej strukturze kolumn dla każdego ze 184 dni:

    Kolumna A (Data): Wpisujemy daty od 2023-03-01 do 2023-08-31.
    Kolumna B (Numer dnia): Liczby od 1 do 184.
    Kolumna C (Stan rano): Dla pierwszego dnia wpisujemy 2000. Dla kolejnych dni będzie to wartość pobrana z kolumny G z poprzedniego wiersza.
    Kolumna D (Zjedzone przez amury): Stała wartość równa 20 (80 amurów × 0,25 m²).
    Kolumna E (Odłów w piątek): Wpisujemy formułę, która automatycznie wykryje piątek: =JEŻELI(DZIEŃ.TYG(A2;2)=5;60;0).
    Kolumna F (Stan po ubytkach): Formuła odejmująca ubytki od stanu porannego: =MAKS(0; C2 - D2 - E2).
    Kolumna G (Stan po nocy / wzrost): Uwzględniamy wzrost o 1,75%: =F2 * 1,0175.
  • 2

    Krok 2: Analiza wyników symulacji

    Szukamy pierwszego wiersza, w którym wartość w kolumnie Stan rano przekroczy 75% całkowitej powierzchni stawu, czyli:

    75% z 10 000 m² = 7500 m²

    Przeciągając formuły w dół, zauważymy, że wartość ta zostaje przekroczona w 167. dniu symulacji. Odpowiada to dokładnie dacie 14 sierpnia 2023 roku.



    Odpowiedź: Rzęsa przekroczy 75% powierzchni w 167. dniu (14 sierpnia).

Matura Rozszerzona Informatyka Maj 2026

2 pkt
Zadanie 7.4.

Podaj, jaka jest najmniejsza liczba amurów białych, jaką musi wpuścić właściciel, by rzęsa wodna w całym badanym okresie zajmowała maksymalnie 50% powierzchni stawu.

💡 Pokaż rozwiązanie krok po kroku
  • 1

    Krok 1: Strategia wyznaczenia nowej liczby amurów

    Chcemy, aby w żadnym ze 184 dni wartość w kolumnie Stan rano nie przekroczyła 50% powierzchni stawu, czyli 5000 m².



    W arkuszu kalkulacyjnym możemy użyć narzędzia Szukaj wyniku (Goal Seek) lub po prostu stworzyć komórkę z parametrem liczby amurów i zmieniać jej wartość, obserwując maksymalną wartość z kolumny porannych pomiarów wyznaczoną formułą =MAKS(C2:C185).

  • 2

    Krok 2: Weryfikacja za pomocą skryptu (Python)

    Poniższy prosty kod pozwala precyzyjnie sprawdzić zachowanie ekosystemu dla różnych liczb ryb i znaleźć szukaną wartość graniczną:

    def sprawdz_amury():
        # Sprawdzamy kolejne liczby ryb
        for liczba_amurów in range(80, 200):
            powierzchnia = 2000.0
            max_w_roku = powierzchnia
            
            # 1 marca 2023 to środa (w systemie Excela dzień tygodnia = 3)
            # Zatem piątek przypada na dzień o numerze 3, 10, 17 itd.
            for dzien in range(1, 185):
                if powierzchnia > max_w_roku:
                    max_w_roku = powierzchnia
                    
                # Działania w ciągu dnia
                powierzchnia -= (liczba_amurów * 0.25)
                if (dzien - 3) % 7 == 0:
                    powierzchnia -= 60.0
                    
                if powierzchnia < 0:
                    powierzchnia = 0.0
                    
                # Wzrost w nocy
                powierzchnia *= 1.0175
                
            # Szukamy pierwszej liczby ryb, dla której maks nie przekroczył 5000 m²
            if max_w_roku <= 5000.0:
                return liczba_amurów, max_w_roku
    
    ryby, max_pow = sprawdz_amury()
    print(f"Wynik: {ryby} amurów, maksymalna powierzchnia: {max_pow:.2f} m²")
    

    Uruchomienie algorytmu wskazuje, że dla 93 amurów powierzchnia minimalnie przekracza próg, natomiast dla 94 amurów maksymalny stan rano wynosi około 4916,74 m².



    Odpowiedź: Najmniejsza potrzebna liczba amurów białych to 94.

Matura Rozszerzona Informatyka Maj 2026

1 pkt
Zadanie 8.1.

Zadanie 8. Sieć sklepów W trzech plikach tekstowych o nazwach klienci.txt, transakcje.txt, opis_transakcji.txt zapisano dane o sprzedaży towarów w pewnej sieci sklepów... Pierwszy wiersz każdego z plików jest wierszem nagłówkowym, a dane w wierszach rozdzielono tabulatorami.



klienci.txt: IdKlienta, Imie, Nazwisko, Plec (K lub M).
transakcje.txt: IdTransakcji, DataTransakcji, IdKlienta, IdSklepu, IdSprzedawcy.
opis_transakcji.txt: IdTransakcji, IdProduktu, Cena, Liczba.

Podaj imię i nazwisko klienta, który dokonał łącznie najwięcej transakcji w całym analizowanym okresie.

💡 Pokaż rozwiązanie krok po kroku
  • 1

    Krok 1: Strategia i logika relacyjna

    Każdy wiersz w pliku transakcje.txt reprezentuje jedną unikalną transakcję dokonaną przez konkretnego klienta identyfikowanego przez IdKlienta. Aby znaleźć klienta z największą liczbą transakcji, musimy zliczyć wystąpienia każdego IdKlienta w tabeli transakcji, wybrać identyfikator występujący najczęściej, a następnie połączyć go z tabelą klientów w celu wyciągnięcia imienia i nazwiska.

  • 2

    Krok 2: Rozwiązanie w języku SQL

    Jeśli importujesz pliki do bazy danych (np. MS Access, MySQL), najszybszą metodą jest wykonanie zapytania z grupowaniem (GROUP BY), zliczaniem (COUNT) oraz sortowaniem malejącym z limitem do pierwszego rekordu:

    SELECT TOP 1 k.Imie, k.Nazwisko, COUNT(t.IdTransakcji) AS LiczbaTransakcji
    FROM klienci k 
    JOIN transakcje t ON k.IdKlienta = t.IdKlienta
    GROUP BY k.IdKlienta, k.Imie, k.Nazwisko
    ORDER BY COUNT(t.IdTransakcji) DESC;
    
  • 3

    Krok 3: Rozwiązanie w języku Python (Alternatywa)

    Zadanie można też łatwo rozwiązać skryptem przy użyciu wbudowanej klasy Counter do zliczania identyfikatorów:

    from collections import Counter
    
    def zadanie_8_1():
        # Zliczamy ile razy dany IdKlienta pojawia się w transakcjach
        with open("transakcje.txt", "r") as f:
            next(f) # pomijamy nagłówek
            id_klientow = [line.split("\t")[2] for line in f]
        
        licznik = Counter(id_klientow)
        najczestszy_id, _ = licznik.most_common(1)[0]
        
        # Szukamy danych tego klienta w pliku klienci.txt
        with open("klienci.txt", "r") as f:
            next(f)
            for line in f:
                id_k, imie, nazwisko, _ = line.strip().split("\t")
                if id_k == najczestszy_id:
                    print(f"8.1: {imie} {nazwisko}")
                    break
    
    zadanie_8_1()
    

    Odpowiedź: Marcelino Kruk

Matura Rozszerzona Informatyka Maj 2026

2 pkt
Zadanie 8.2.

Podaj, ile kobiet (K) oraz ilu mężczyzn (M) spośród klientów sieci sklepów nie kupiło niczego w całym analizowanym okresie.

💡 Pokaż rozwiązanie krok po kroku
  • 1

    Krok 1: Strategia i logika relacyjna

    Klient, który "nie kupił niczego", to taka osoba, której unikalny identyfikator IdKlienta zapisany w pliku klienci.txt ani razu nie pojawił się w pliku zawierającym rejestr zakupów transakcje.txt. Naszym celem jest wyodrębnienie tych brakujących identyfikatorów, a następnie zliczenie ich z podziałem na płeć (kolumna Plec).

  • 2

    Krok 2: Rozwiązanie w języku SQL

    W relacyjnych bazach danych odnajdywanie rekordów, które nie mają powiązań w drugiej tabeli, realizuje się najwygodniej za pomocą podzapytania z operatorem NOT IN lub poprzez LEFT JOIN z warunkiem sprawdzającym wartość IS NULL:

    SELECT Plec, COUNT(*) AS IluKlientow
    FROM klienci
    WHERE IdKlienta NOT IN (SELECT IdKlienta FROM transakcje)
    GROUP BY Plec;
    

    Zapytanie zwróci dwa wiersze: liczbę kobiet (K) oraz liczbę mężczyzn (M), którzy nie dokonali żadnych zakupów.

  • 3

    Krok 3: Rozwiązanie w języku Python (Alternatywa)

    W Pythonie idealnie sprawdzi się struktura zbioru (set), która pozwala na błyskawiczne wykonywanie operacji na członkostwie elementów:

    def zadanie_8_2():
        # Pobieramy ID wszystkich klientów, którzy dokonali przynajmniej jednej transakcji
        Klienci_z_transakcjami = set()
        with open("transakcje.txt", "r") as f:
            next(f)
            for line in f:
                Klienci_z_transakcjami.add(line.split("\t")[2])
                
        kobiety_brak = 0
        mezczyzni_brak = 0
        
        # Sprawdzamy każdego zarejestrowanego klienta
        with open("klienci.txt", "r") as f:
            next(f)
            for line in f:
                id_k, _, _, plec = line.strip().split("\t")
                if id_k not in klienci_z_transakcjami:
                    if plec == "K":
                        kobiety_brak += 1
                    elif plec == "M":
                        mezczyzni_brak += 1
                        
        print(f"8.2 Kobiety (K): {kobiety_brak}")
        print(f"8.2 Mężczyźni (M): {mezczyzni_brak}")
    
    zadanie_8_2()
    

    Odpowiedź:
    689 K
    651 M

Matura Rozszerzona Informatyka Maj 2026

2 pkt
Zadanie 8.3.

Podaj liczbę różnych sklepów, w których dokonano transakcji w kasach samoobsługowych, oraz podaj, ile zapłacono łącznie za zakupy w tych kasach.

💡 Pokaż rozwiązanie krok po kroku
  • 1

    Krok 1: Analiza logiczna i identyfikacja kas samoobsługowych

    Z treści głównej zadania wiemy, że jeśli klient korzystał z kasy samoobsługowej, to pole IdSprzedawcy w pliku transakcje.txt pozostało puste (brak danych).



    Musimy zatem przefiltrować transakcje, wybierając tylko te z pustym identyfikatorem sprzedawcy, zliczyć unikalne wartości z kolumny IdSklepu, a następnie zsumować wartość wszystkich zakupów (Cena * Liczba) przypisanych do tych konkretnych numerów transakcji w pliku opis_transakcji.txt.

  • 2

    Krok 2: Rozwiązanie w języku SQL

    W bazie danych łączymy obie tabele relacją i filtrujemy po pustej wartości sprzedawcy (IS NULL):

    SELECT COUNT(DISTINCT t.IdSklepu) AS LiczbaSklepow, 
           SUM(o.Cena * o.Liczba) AS LacznaSuma
    FROM transakcje t
    JOIN opis_transakcji o ON t.IdTransakcji = o.IdTransakcji
    WHERE t.IdSprzedawcy IS NULL;
    
  • 3

    Krok 3: Implementacja w języku Python (Alternatywa)

    def zadanie_8_3():
        samoobslugowe_transakcje = set()
        sklepy = set()
        
        with open("transakcje.txt", "r") as f:
            next(f)
            for line in f:
                parts = line.strip().split("\t")
                # Jeśli wiersz nie ma kolumny sprzedawcy lub jest ona pusta
                if len(parts) < 5 or parts[4] == "":
                    samoobslugowe_transakcje.add(parts[0]) # IdTransakcji
                    sklepy.add(parts[3]) # IdSklepu
                    
        laczna_kwota = 0.0
        with open("opis_transakcji.txt", "r") as f:
            next(f)
            for line in f:
                id_t, _, cena_str, liczba_str = line.strip().split("\t")
                if id_t in samoobslugowe_transakcje:
                    cena = float(cena_str.replace(",", "."))
                    liczba = int(liczba_str)
                    laczna_kwota += cena * liczba
                    
        print(f"8.3 Liczba sklepów: {len(sklepy)}, Łączna kwota: {laczna_kwota:.2f}")
    

    Odpowiedź:
    28 różnych sklepów
    Łącznie zapłacono 19443,29zł

Matura Rozszerzona Informatyka Maj 2026

2 pkt
Zadanie 8.4.

Niektórzy sprzedawcy pracowali w różnych sklepach sieci w ciągu miesiąca. Podaj IdSprzedawcy, który obsługiwał klientów w największej liczbie różnych sklepów w jednym miesiącu, oraz podaj ten miesiąc (nazwę lub numer).

💡 Pokaż rozwiązanie krok po kroku
  • 1

    Krok 1: Strategia grupowania danych

    W tym zadaniu kluczem jest unikalne połączenie sprzedawcy, miesiąca oraz sklepu. Musimy wyciągnąć numer miesiąca z daty transakcji (format dd.mm.rrrr, czyli interesują nas znaki na pozycjach od 4 do 5). Następnie dla każdej pary (IdSprzedawcy, Miesiac) wyznaczamy liczbę różnych (unikalnych) wartości IdSklepu i szukamy pary, która osiągnęła najwyższy wynik.

  • 2

    Krok 2: Implementacja w języku Python

    W Pythonie najwygodniej użyć słownika, w którym kluczem jest krotka (id_sprzedawcy, miesiac), a wartością zbiór (set) przechowujący unikalne identyfikatory sklepów:

    def zadanie_8_4():
        # Klucz: (IdSprzedawcy, Miesiac) -> Wartość: set(IdSklepu)
        rejestr = {}
        
        with open("transakcje.txt", "r") as f:
            next(f)
            for line in f:
                parts = line.strip().split("\t")
                if len(parts) < 5 or parts[4] == "":
                    continue # pomijamy kasy samoobsługowe
                    
                id_sprzedawcy = parts[4]
                data = parts[1] # dd.mm.rrrr
                id_sklepu = parts[3]
                
                miesiac = data.split(".")[1]
                klucz = (id_sprzedawcy, miesiac)
                
                if klucz not in rejestr:
                    rejestr[klucz] = set()
                rejestr[klucz].add(id_sklepu)
                
        # Szukanie pary z największą liczbą unikalnych sklepów
        max_sklepow = 0
        najlepszy_wynik = None
        
        for klucz, sklepy in rejestr.items():
            if len(sklepy) > max_sklepow:
                max_sklepow = len(sklepy)
                najlepszy_wynik = klucz
                
        print(f"8.4 Sprzedawca: {najlepszy_wynik[0]}, Miesiąc: {najlepszy_wynik[1]}")
    

    Odpowiedź:
    IdSprzedawcy Miesiac
    14                    styczeń

Matura Rozszerzona Informatyka Maj 2026

2 pkt
Zadanie 8.5.

Do bazy danych dodano dwie kolejne tabele: Kategorie (IdKategorii, NazwaKategorii) oraz Produkty (IdProduktu, IdKategorii, Nazwa, Opis).

Napisz w języku SQL zapytanie, w wyniku którego zostaną wypisane wszystkie zakupione produkty (IdProduktu i Nazwa) z kategorii (NazwaKategorii) „spożywcze” zawierające w opisie fragment: „do ekspresu kolbowego”.

💡 Pokaż rozwiązanie krok po kroku
  • 1

    Krok 1: Dobór relacji (Złączeń) i filtrów

    Aby zapytanie było poprawne i wyświetliło wyłącznie zakupione produkty, musimy uwzględnić tabelę łączącą, czyli opis_transakcji. Wykorzystamy złączenia typu INNER JOIN do powiązania tabel po kluczach obcych.



    Filtrowanie opisu zrealizujemy za pomocą operatora LIKE z użyciem znaków wieloznacznych % z obu stron szukanej frazy. Aby dany produkt nie wyświetlał się wielokrotnie (jeśli został zakupiony w wielu transakcjach), użyjemy klauzuli DISTINCT.

  • 2

    Krok 2: Gotowy kod zapytania SQL

    Poniższe zapytanie stanowi pełną, poprawną odpowiedź, którą należy zapisać w arkuszu:

    SELECT DISTINCT p.IdProduktu, p.Nazwa
    FROM opis_transakcji ot
    INNER JOIN Produkty p ON ot.IdProduktu = p.IdProduktu
    INNER JOIN Kategorie k ON p.IdKategorii = k.IdKategorii
    WHERE k.NazwaKategorii = 'spożywcze'
      AND p.Opis LIKE '%do ekspresu kolbowego%';
    

Problemy z algorytmem lub Excelem?

Arkusz to nie wszystko. Systematyzuj swoją wiedzę rozwiązując zadania i czytając opracowania maturalne z naszej bazy wiedzy.

Pytania o arkusz z Informatyki

Ile trwa Matura z Informatyki?

Egzamin maturalny z informatyki na poziomie rozszerzonym trwa 210 minut i odbywa się w całości przy stanowisku komputerowym.

Gdzie znaleźć kody źródłowe i rozwiązania do arkusza Matura Rozszerzona Informatyka 2026 Maj?

Pełne rozwiązania krok po kroku (w tym kody źródłowe w Python/C++, kwerendy SQL i formuły Excel) znajdują się na tej stronie powyżej. Każde zadanie jest szczegółowo omówione.

Czy mogę pobrać pliki (Dane.zip) i ten arkusz w formacie PDF?

Tak, linki do oficjalnego arkusza CKE w formacie PDF oraz paczki z plikami tekstowymi najczęściej znajdują się na górze tej strony.

ProKorepetycje © 2026

Wszystkie arkusze CKE