Łapka LogoŁapka Infa
🐍
Algorytmy

Python na Maturze: Czytanie, Przetwarzanie i Zapis Plików (Zadanie 4 CKE)

Kompletny przewodnik po Zadaniu 4 z informatyki: wczytywanie danych, operacje na stringach i liczbach, sito, NWD i wzorcowy zapis do wyniki4.txt.

Python na Maturze: Czytanie, Przetwarzanie i Zapis Plików (Zadanie 4 CKE)

W Części Praktycznej Matury z Informatyki (od 2023/2024 do 2027+) zadanie programistyczne (zwykle Zadanie 4) jest najwyżej punktowanym zadaniem w całym arkuszu – można za nie zdobyć od 10 do nawet 15 punktów!

Wraz z arkuszem otrzymujesz folder z plikami tekstowymi (np. liczby.txt, dane.txt, napisy.txt oraz ich wersje przykładowe przyklad.txt). Twoim celem jest napisanie programu, który przetworzy dane i wygeneruje plik odpowiedzi wyniki4.txt.


1. Złoty Rytuał Wczytywania Plików

Zawsze używamy konstrukcji with open(...). Gwarantuje ona automatyczne zamknięcie pliku, buforowanie i bezpieczeństwo pamięci.

# ZAWSZE podawaj encoding='utf-8' - zapobiega błędom kodowania na Windowsie!
with open("dane.txt", "r", encoding="utf-8") as plik:
    linie = [linia.strip() for linia in plik if linia.strip()]

Typowe formaty wejściowe na maturze:

A. Jedna liczba w wierszu:

with open("liczby.txt", "r") as f:
    liczby = [int(line.strip()) for line in f if line.strip()]

B. Kilka liczb w wierszu (oddzielone spacją):

with open("pary.txt", "r") as f:
    dane = []
    for line in f:
        if line.strip():
            # Rozbicie linii po spacjach i zamiana na int
            wiersz = list(map(int, line.split()))
            dane.append(wiersz)

C. Napisy i systemy liczbowe (np. liczby binarne):

with open("binarne.txt", "r") as f:
    # Pobieramy jako czyste stringi
    napisy_binarne = [line.strip() for line in f if line.strip()]

    # Gdy musisz potraktować napis binarny jako liczbę dziesiętną:
    wartosc_dziesietna = int(napisy_binarne[0], 2)

2. Podręczny Przybornik Algorytmiczny Matury CKE

Oto funkcje, które na 90% przydadzą Ci się w podpunktach zadania maturalnego:

1. Sprawdzanie czy liczba jest pierwsza

def czy_pierwsza(n: int) -> bool:
    if n < 2:
        return False
    if n in (2, 3):
        return True
    if n % 2 == 0 or n % 3 == 0:
        return False
    i = 5
    while i * i <= n:
        if n % i == 0 or n % (i + 2) == 0:
            return False
        i += 6
    return True

2. Suma cyfr liczby

def suma_cyfr(n: int) -> int:
    return sum(int(cyfra) for cyfra in str(n))

3. Rozkład na czynniki pierwsze

def czynniki_pierwsze(n: int) -> list[int]:
    czynniki = []
    k = 2
    while k * k <= n:
        while n % k == 0:
            czynniki.append(k)
            n //= k
        k += 1
    if n > 1:
        czynniki.append(n)
    return czynniki

4. Sprawdzanie palindromu (napis od tyłu jest taki sam)

def czy_palindrom(slowo: str) -> bool:
    return slowo == slowo[::-1]

5. Największy Wspólny Dzielnik (NWD)

Na maturze możesz bez przeszkód zaimportować moduł math:

import math
nwd = math.gcd(a, b)

3. Strategia Zdobywania Punktów (Jak Nie Stracić Czasu)

[!TIP] Zasada "Najpierw Przykład": CKE ZAWSZE dołącza mały plik przyklad.txt oraz w treści zadania podaje prawidłowe odpowiedzi dla przykładu. Nigdy nie uruchamiaj programu od razu na dane.txt!

  1. Odpal kod na przyklad.txt.
  2. Porównaj swój wynik z tym wydrukowanym w arkuszu maturalnym.
  3. Jeśli wyniki są w 100% identyczne – zmień w kodzie "przyklad.txt" na "dane.txt".
  4. Zapisz wyniki do wyniki4.txt. Masz pewność, że zdobywasz komplet punktów!

4. Kompletne Rozwiązanie Realnego Zadania Maturalnego

Wyobraźmy sobie typowe zadanie maturalne z plikiem liczby.txt (1000 liczb całkowitych dodatnich):

  • Zadanie 4.1: Podaj, ile liczb z pliku ma sumę cyfr równą 11.
  • Zadanie 4.2: Znajdź najdłuższy spójny fragment liczb tworzący ciąg rosnący. Podaj jego długość, pierwszą liczbę i ostatnią.
  • Zadanie 4.3: Wypisz wszystkie liczby z pliku, które są pierwsze i których rewers (liczba zapisana od tyłu) również jest liczbą pierwszą (np. 13 i 31).

Oto wzorcowy, pełny kod maturalny:

import math

# --- FUNKCJE POMOCNICZE ---
def suma_cyfr(n: int) -> int:
    return sum(int(c) for c in str(n))

def czy_pierwsza(n: int) -> bool:
    if n < 2:
        return False
    d = 2
    while d * d <= n:
        if n % d == 0:
            return False
        d += 1
    return True

# --- 1. WCZYTANIE DANYCH ---
with open("liczby.txt", "r", encoding="utf-8") as f:
    liczby = [int(line.strip()) for line in f if line.strip()]

# --- ZADANIE 4.1 ---
licznik_11 = sum(1 for x in liczby if suma_cyfr(x) == 11)

# --- ZADANIE 4.2 (Najdłuższy spójny ciąg rosnący) ---
max_dlugosc = 1
max_start = liczby[0]
max_koniec = liczby[0]

akt_dlugosc = 1
akt_start = liczby[0]

for i in range(1, len(liczby)):
    if liczby[i] > liczby[i - 1]:
        akt_dlugosc += 1
    else:
        # Koniec bieżącego ciągu rosnącego - sprawdzamy rekord
        if akt_dlugosc > max_dlugosc:
            max_dlugosc = akt_dlugosc
            max_start = akt_start
            max_koniec = liczby[i - 1]
        akt_dlugosc = 1
        akt_start = liczby[i]

# Sprawdzenie po zakończeniu pętli (gdyby ciąg rósł do samego końca pliku!)
if akt_dlugosc > max_dlugosc:
    max_dlugosc = akt_dlugosc
    max_start = akt_start
    max_koniec = liczby[-1]

# --- ZADANIE 4.3 (Liczby pierwsze o pierwszym rewersie) ---
odwracalne_pierwsze = []
for x in liczby:
    if czy_pierwsza(x):
        rewers = int(str(x)[::-1])
        if czy_pierwsza(rewers):
            odwracalne_pierwsze.append(x)

# --- ZAPIS WYNIKÓW DO WYNIKI4.TXT ---
with open("wyniki4.txt", "w", encoding="utf-8") as out:
    out.write("=== ZADANIE 4.1 ===\n")
    out.write(f"Liczba liczb o sumie cyfr 11: {licznik_11}\n\n")

    out.write("=== ZADANIE 4.2 ===\n")
    out.write(f"Długość najdłuższego ciągu: {max_dlugosc}\n")
    out.write(f"Pierwsza liczba: {max_start}\n")
    out.write(f"Ostatnia liczba: {max_koniec}\n\n")

    out.write("=== ZADANIE 4.3 ===\n")
    out.write("Liczby pierwsze o pierwszym rewersie:\n")
    for lp in odwracalne_pierwsze:
        out.write(f"{lp}\n")

print("Zadanie 4 zakończone pomyślnie! Sprawdź plik wyniki4.txt.")

[!WARNING] Pamiętaj o ostatnim elemencie w pętli: W Zadaniu 4.2 bardzo częstym błędem maturzystów jest aktualizowanie rekordu max_dlugosc TYLKO w gałęzi else. Jeśli najdłuższy podciąg rośnie aż do ostatniej linijki pliku, else nigdy się nie wykona! Dlatego ZAWSZE dodajemy warunek sprawdzający tuż za pętlą for.


5. Zadania Treningowe z Rozwiązaniami