PROGRAMOWANIE I ALGORYTMY

Trwa nabór 2025/26
Kurs maturalny z informatyki

Więcej szczegółów

Matura z informatyki 14 maja 2025 — rozwiązania


Omówienie zadań maturalnych z informatyki — 14 maja 2025

Pobierz arkusz maturalny (PDF)
Pobierz pliki z danymi (ZIP)

Podgląd arkusza maturalnego:

Omówienie przygotował Marcin Kasprowicz — czynny egzaminator maturalny z informatyki oraz twórca serwisu algorytm.edu.pl.

Zapraszam — Marcin Kasprowicz

Odpowiedzi do zadań maturalnych z informatyki 2025


Zadanie 1. Funkcja rekurencyjna

Odpowiedź:
n Wynik działania funkcji przestaw Liczba wywołań funkcji przestaw
316498 134689 3
43657688 34566788 4
154005710 145007501 5
998877665544321 989786756453412 8
1.2
Odpowiedź:

Funkcja dzieli n przez 100 w każdej rekurencji, czyli przetwarza po dwie cyfry na raz.

Niech k będzie liczbą cyfr w n:

  • Gdy k parzyste: np. k = 6, to mamy 3 pary → 3 wywołania
  • Gdy k nieparzyste: np. k = 5, to 2 pary + 1 cyfra → 3 wywołania

W każdym przypadku potrzebujemy (k + 1) div 2 wywołań (czyli zaokrąglenie w górę z k / 2).

✅ Odpowiedzi na pytania z tabeli:

Nr Wyrażenie Czy prawdziwe? Uzasadnienie
1. k / 2 ❌ F Tylko dla parzystych k, ale nie ogólnie
2. (k + 1) div 2 ✅ P Poprawna liczba wywołań
3. {k / 2 (gdy parzyste), (k + 1) / 2 (gdy nieparzyste)} ✅ P To dokładnie to samo co (2), tylko rozpisane
4. (k + 1) / 2 ❌ F Działa tylko przy zaokrągleniu w górę, ale w językach bez dzielenia całkowitego może dawać float (niezgodne z div)

✅ Poprawne odpowiedzi:

  • 1: F
  • 2: P
  • 3: P
  • 4: F
1.3
Odpowiedź:

Iteracyjne rozwiązanie funkcji przestaw(n) (C++)


// Funkcja przestaw - iteracyjna wersja
long long przestaw(long long n)
{
    long long w = 0, mn = 1;
    while(n > 9)
    {
        int r = n % 100;
        w += mn * (r % 10 * 10 + r / 10); // odwracam cyfry
        mn *= 100;
        n /= 100;
    }
    if(n > 0)
        w += mn * n;
    return w;
}

Zadanie 2. Zapis symboliczny

Odpowiedź:

Rozwiązania zadań 2.1 – 2.4 (C++)


#include<bits/stdc++.h>
using namespace std;

bool czy_palindrom(string napis)
{
    int i = 0, j = napis.size() - 1;
    while(i < j)
    {
        if(napis[i] != napis[j]) return false;
        ++i; --j;
    }
    return true;
}

void zad_2_1(vector<string> tab)
{
    cout << "zadanie 2.1\n";
    for(string napis: tab)
        if(czy_palindrom(napis))
            cout << napis << endl;
}

void zad_2_2(vector<string> tab)
{
    cout << "zadanie 2.2\n";
    int zlicz = 0;
    vector<pair<int, int>> wyniki;
    for(int i = 0; i <= 2000 - 3; i++)
        for(int j = 0; j <= 12 - 3; j++)
        {
            set<char> znak;
            for(int w = i; w < i + 3; w++)
                for(int k = j; k < j + 3; k++)
                    znak.insert(tab[w][k]);
            if(znak.size() == 1)
            {
                wyniki.push_back({i + 2, j + 2});
                ++zlicz;
            }
        }
    cout << zlicz << " kwadraty\n";
    for(auto w: wyniki)
        cout << w.first << ' ' << w.second << endl;
}

void zad_2_3(vector<string> tab)
{
    cout << "zadanie 2.3\n";
    long long Max = 0;
    string str_Max;
    for(auto napis: tab)
    {
        long long liczba = 0;
        for(auto znak: napis)
        {
            int cyfra;
            if(znak == 'o') cyfra = 0;
            if(znak == '+') cyfra = 1;
            if(znak == '*') cyfra = 2;
            liczba = liczba * 3 + cyfra;
        }
        if(Max < liczba)
        {
            Max = liczba;
            str_Max = napis;
        }
    }
    cout << Max << ' ' << str_Max << endl;
}

void zad_2_4(vector<string> tab)
{
    cout << "zadanie 2.4\n";
    long long suma = 0;
    for(auto napis: tab)
    {
        long long liczba = 0;
        for(auto znak: napis)
        {
            int cyfra;
            if(znak == 'o') cyfra = 0;
            if(znak == '+') cyfra = 1;
            if(znak == '*') cyfra = 2;
            liczba = liczba * 3 + cyfra;
        }
        suma += liczba;
    }
    cout << suma << ' ';
    string wynik = "";
    while(suma)
    {
        int cyfra = suma % 3;
        if(cyfra == 0) wynik = 'o' + wynik;
        if(cyfra == 1) wynik = '+' + wynik;
        if(cyfra == 2) wynik = '*' + wynik;
        suma /= 3;
    }
    cout << wynik << endl;
}

int main()
{
    ifstream in("symbole.txt");
    vector<string> tab(2000);
    for(int i = 0; i < 2000; i++)
        in >> tab[i];

    zad_2_1(tab);
    zad_2_2(tab);
    zad_2_3(tab);
    zad_2_4(tab);

    return 0;
}

Wyniki działania programu:

zadanie 2.1
++o+o++o+o++
+*+**++**+*+
*+o++**++o+*
*oo*o**o*oo*
+*++*oo*++*+
+o++oooo++o+

zadanie 2.2
3 kwadraty
399 5
546 2
630 11

zadanie 2.3
531246 *******o+*+o

zadanie 2.4
527865439 ++oo*+oo*++ooo*o*++

Zadanie 3. Dron

Odpowiedź:

Zadania 3.1 – 3.2 (C++)


#include <bits/stdc++.h>
using namespace std;

void zad_3_1(vector<pair<int, int>> tab)
{
    cout << "Zadanie 3.1\n";
    int licz = 0;
    for(auto xy : tab)
        licz += __gcd(abs(xy.first), abs(xy.second)) > 1;
    cout << licz << endl;
}

void czy_srodek(pair<int, int> A, pair<int, int> B, pair<int, int> C)
{
    // sprawdzam, czy B jest środkiem odcinka AC
    if (A.first + C.first == B.first * 2 && A.second + C.second == B.second * 2)
    {
        cout << "(" << A.first << ", " << A.second << "), ";
        cout << "(" << B.first << ", " << B.second << "), ";
        cout << "(" << C.first << ", " << C.second << ")\n";
    }
}

void zad_3_2(vector<pair<int, int>> tab)
{
    cout << "Zadanie 3.2 a)\n";
    int licz = 0, x = 0, y = 0;
    for(auto &xy : tab)
    {
        x += xy.first;
        y += xy.second;
        licz += (x > 0 && x < 5000 && y > 0 && y < 5000);
        xy.first = x;
        xy.second = y;
    }
    cout << licz << endl;

    cout << "Zadanie 3.2 b)\n";

    for(int i = 0; i < 100; i++)
        for(int j = i + 1; j < 100; j++)
            for(int k = j + 1; k < 100; k++)
            {
                czy_srodek(tab[i], tab[j], tab[k]);
                czy_srodek(tab[j], tab[i], tab[k]);
                czy_srodek(tab[i], tab[k], tab[j]);
            }
}

int main()
{
    ifstream in("dron.txt");
    vector<pair<int, int>> tab(100);
    for(int i = 0; i < 100; i++)
        in >> tab[i].first >> tab[i].second;

    zad_3_1(tab);
    zad_3_2(tab);

    return 0;
}

Wyniki działania programu:

Zadanie 3.1
40
Zadanie 3.2 a)
24
Zadanie 3.2 b)
(5832, 1801), (7410, 1990), (8988, 2179)

Zadanie 4

Odpowiedź:
Zadanie 4. (0–1)
Dokończ zdanie. Zaznacz właściwą odpowiedź spośród podanych.

Program typu keylogger służy do:

  • A. szyfrowania informacji do postaci uniemożliwiającej jej odczytanie bez zdefiniowanego klucza.
  • B. przechowywania danych logowania, w tym haseł, w bezpiecznym miejscu na dysku użytkownika.
  • C. generowania kodu, który umożliwia użytkownikowi bankowości elektronicznej wykonanie operacji.
  • D. ✔️ przechwytywania i gromadzenia informacji o naciśniętych klawiszach.

Zadanie 5

Odpowiedź:
Zadanie 5. (0–2)
Poniżej sposobem pisemnym dodano dwie liczby podane w zapisie binarnym. Uzupełnij brakujące cyfry tak, aby działanie było wykonane poprawnie.
   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

Zadanie 6. Martianeum

Pobierz arkusz z rozwiązaniem zadania 6 (Excel)

Odpowiedź:
Zadanie 6.1 (0–2)

Podaj łączną masę ładunków drona oraz łączną masę martianeum wydobytego przez stację.

a) łączna masa ładunków: 41498,2 kg

b) łączna masa martianeum: 3092,2943 kg

Zadanie 6.2 (0–1)

Podaj nazwę obszaru, dla którego średnia masa przywiezionych ładunków jest najmniejsza.

Obszar: Thaumasia

Średnia masa: 17,83571429 kg

Zadanie 6.3 (0–2)

Czas pracy stacji dzielimy na kolejne 7-dniowe okresy (pierwszy: 03.03.2033 – 09.03.2033).

Podaj największą łączną masę ładunków przywiezionych w którymkolwiek 7-dniowym okresie oraz datę początku tego okresu.

Największa łączna masa: 174,5 kg

Początek okresu: 13.12.2035

Zadanie 6.4 (0–3)

Wykonaj zestawienie, w którym dla każdego obszaru podasz, ile razy dron przewoził ładunek z tego obszaru w poszczególnych latach. Na jego podstawie sporządź wykres skumulowany kolumnowy.

Obszar 203320342035203620372038 Suma
końcowa
Aeolis5711213543
Amazonis232021292025138
Amenthes105912101056
Arabia91015810759
Arcadia7711145953
Argyre443310731
Casius6107137750
Cebrenia45111113
Coprates212718333023152
Diacria23233215
Elysium69548739
Eridania81923202216108
Hellas14213415
Iapygia475167535133302
Ismenius Lacus645391340
Lunae Palus111191010354
Mare Acidalium814108141064
Mare Australe23232214
Mare Boreum1419813141280
Mare Tyrrhenum2532214
Margaritifer Sinus45522725
Memnonia112423191413104
Noachis13111125171491
Oxia Palus3314213
Phaethontis17245423
Phoenicis Lacus252225221518127
Sinus Sabaeus1412191312676
Syrtis Major62546326
Tharsis294038414639233
Thaumasia22412314
Suma końcowa3043653653663653072072
Skumulowana liczba przewozów ładunków przez drona – wykres kolumnowy
Rys. 1. Skumulowana liczba przewozów ładunków z poszczególnych obszarów (2033-2038)
Zadanie 6.5 (0–3)

Uwzględnij zasady działania stacji opisane na początku zadania i podaj:

  • ile razy stacja wysyłała ładunek na orbitę,
  • datę pierwszego transportu ładunku na orbitę,
  • datę ostatniego transportu ładunku na orbitę.

a) liczba transportów: 30

b) pierwsza data: 29.05.2033

c) ostatnia data: 01.09.2038

Zadanie 7. Poszukiwanie wody na Marsie

Pobierz bazę danych (Access) – zadanie 7

Odpowiedź:
Zadanie 7.1 (0–2)

Podaj nazwę obszaru, na którym znaleziono łącznie (we wszystkich pomiarach) najwięcej m3 wody na głębokości do 100 m włącznie. (Jest jeden taki obszar).

Obszar: Mare Boreum

Zadanie 7.2 (0–2)

Podaj nazwę łazika, który wykonywał pomiary w najdłuższym okresie, licząc od pierwszego (najwcześniejszego) do ostatniego (najpóźniejszego) pomiaru. Podaj też datę pierwszego i ostatniego pomiaru.

Nazwa łazikaPoczątekKoniecOkres (dni)
Spirit 14 29.08.2066 25.07.2076 3618
Zadanie 7.3 (0–2)

Podaj nazwy obszarów na Marsie, na których żaden z łazików nie wykonał ani jednego pomiaru w tym samym roku, w którym został wysłany z Ziemi.

  • Amazonis
  • Arabia
  • Syrtis Major
  • Elysium
  • Sinus Sabaeus
  • Mare Tyrrhenum
  • Aeolis
  • Eridania
Zadanie 7.4 (0–2)

Podaj nazwy łazików, które wylądowały na półkuli południowej, ale wykonywały pomiary na obu półkulach: północnej (N) i południowej (S).

  • Mariner 14
  • Mariner 15
  • Mariner 20
  • Phoenix 13
  • Phoenix 3
  • Rosetta 1
  • Rosetta 8
  • Spirit 12
  • Spirit 7
  • Viking 17
Zadanie 7.5 (0–2)

Do tabel utworzonych na podstawie opisanych wcześniej plików dołączamy kolejną – o nazwie Producent, w której zapisano informacje o producentach poszczególnych modeli łazików. Tabela Producent zawiera następujące pola:

kod_producenta – unikatowy kod producenta
nazwa – nazwa producenta
kraj – kraj producenta
Do tabeli Laziki dodano pole kod_producenta. Napisz w języku SQL zapytanie, w wyniku którego otrzymasz listę nazw producentów, których łaziki badały obszar Marsa o nazwie Arcadia w roku 2060. Nazwy producentów nie mogą się powtarzać.

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;