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 True2. 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 czynniki4. 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.txtoraz w treści zadania podaje prawidłowe odpowiedzi dla przykładu. Nigdy nie uruchamiaj programu od razu nadane.txt!
- Odpal kod na
przyklad.txt.- Porównaj swój wynik z tym wydrukowanym w arkuszu maturalnym.
- Jeśli wyniki są w 100% identyczne – zmień w kodzie
"przyklad.txt"na"dane.txt".- 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_dlugoscTYLKO w gałęzielse. Jeśli najdłuższy podciąg rośnie aż do ostatniej linijki pliku,elsenigdy się nie wykona! Dlatego ZAWSZE dodajemy warunek sprawdzający tuż za pętląfor.
