matura informatyka - ghdrako/doc_snipets GitHub Wiki


tags:

  • edukacja
  • nauka

Matura informatyka

Informatyka

Materiały

Arkusze

Teoria

Access i SQL

Excel

Python

C++

1. Programowanie python

def solve():
    input_path = "dane.txt"          # Zmień na dane_przyklad.txt podczas weryfikacji
    output_path = "wyniki.txt"

    with open(input_path, "r", encoding="utf-8") as fin:
        # Wczytanie z oczyszczeniem białych znaków
        lines = [line.strip() for line in fin if line.strip()]

    # Przykład: rozbicie na liczby całkowite
    # numbers = [int(line) for line in lines]

    # Przykład: wiersze zawierające pary wartości
    # data = [line.split() for line in lines]

    with open(output_path, "w", encoding="utf-8") as fout:
        # Formatowanie odpowiedzi pod wymogi CKE
        fout.write("Zadanie 1:\n")
        fout.write(f"Wynik: {42}\n")

if __name__ == "__main__":
    solve()

Kompendium Gotowych Algorytmów w Pythonie (Format Maturalny)

Python jest na maturze najszybszym narzędziem implementacyjnym pod warunkiem, że korzystasz z jego wbudowanych bibliotek standardowych (math, collections, itertools) oraz konstrukcji list comprehension.


Narzędzia Wbudowane (Zamiast pisać własne pętle)

Zanim napiszesz pętlę, sprawdź, czy Python nie ma tego wbudowanego w bibliotece standardowej:

import math
from collections import Counter

# 1. NWD i NWW (od Pythona 3.9 wspiera dowolną liczbę argumentów)
a, b = 120, 45
nwd = math.gcd(a, b)
nww = math.lcm(a, b)

## 2. Liczba jedynek w zapisie binarnym (częsty motyw CKE)
liczba = 255
ile_jedynek = bin(liczba).count("1")

# 3. Zliczanie częstości elementów / znajdowanie mody
ciag = ["arbuz", "banan", "arbuz", "jablko", "banan", "arbuz"]
liczniki = Counter(ciag)
najczestszy, ile_razy = liczniki.most_common(1)[0]  # ('arbuz', 3)

Liczby pierwsze: Test pojedynczy vs Sito Eratostenesa


import math

# Szybki test pojedynczej liczby: O(sqrt(N))
def is_prime(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
    # Sprawdzanie dzielników w postaci 6k ± 1
    for d in range(5, math.isqrt(n) + 1, 6):
        if n % d == 0 or n % (d + 2) == 0:
            return False
    return True

Sito Eratostenesa dla zakresu do N: O(N log log N)

def sieve(limit: int) -> list[bool]:
    primes = [True] * (limit + 1)
    primes[0] = primes[1] = False
    for p in range(2, math.isqrt(limit) + 1):
        if primes[p]:
            for multiple in range(p * p, limit + 1, p):
                primes[multiple] = False
    return primes
    # Użycie: is_p = sieve(1000000); if is_p[x]: ...

Rozkład liczby na czynniki pierwsze

Często pojawia się w zadaniach typu: „znajdź liczby mające dokładnie 3 różne czynniki pierwsze”.


import math

def prime_factors(n: int) -> list[int]:
    factors = []
    # Wyciąganie dwójek
    while n % 2 == 0:
        factors.append(2)
        n //= 2
    # Wyciąganie nieparzystych
    d = 3
    while d * d <= n:
        while n % d == 0:
            factors.append(d)
            n //= d
        d += 2
    if n > 1:
        factors.append(n)
    return factors

# Liczba unikalnych czynników pierwszych:
# len(set(prime_factors(liczba)))

Systemy liczbowe i operacje na cyfrach


# Suma cyfr liczby
def digit_sum(n: int) -> int:
    return sum(int(c) for c in str(abs(n)))

# Zamiana z systemu dziesiętnego na dowolny (podstawa 2..16)
def dec_to_base(n: int, base: int) -> str:
    if n == 0:
        return "0"
    digits = "0123456789ABCDEF"
    result = []
    while n > 0:
        result.append(digits[n % base])
        n //= base
    return "".join(reversed(result))

# Zamiana z DOWOLNEGO systemu na dziesiętny (wbudowane w Pythonie)
dziesietna = int("1A3F", 16)   # z szesnastkowego
dziesietna_bin = int("110101", 2) # z binarnego
dziesietna_8 = int("755", 8)      # z ósemkowego

Algorytmy na napisach (Stringi)


# Palindrom (odczyt wprost i wspak taki sam)
def is_palindrome(s: str) -> bool:
    return s == s[::-1]

# Anagram (dwa słowa złożone z tych samych liter)
def is_anagram(s1: str, s2: str) -> bool:
    return sorted(s1) == sorted(s2)
    # Alternatywnie dla długich stringów: Counter(s1) == Counter(s2)

# Najdłuższy spójny fragment złożony z tych samych znaków (częsty motyw CKE)
def max_identical_run(s: str) -> tuple[str, int]:
    if not s:
        return ("", 0)
    best_char, best_len = s[0], 1
    curr_char, curr_len = s[0], 1

    for c in s[1:]:
        if c == curr_char:
            curr_len += 1
        else:
            if curr_len > best_len:
                best_len = curr_len
                best_char = curr_char
            curr_char = c
            curr_len = 1

    if curr_len > best_len:
        best_len = curr_len
        best_char = curr_char

    return best_char, best_len

Wyszukiwanie binarne (Wartości i po wyniku)

Zamiast pisać własne, korzystaj z modułu bisect:


import bisect

arr = [10, 20, 30, 40, 50]

# Znajdź indeks pierwszego elementu >= 30:
idx = bisect.bisect_left(arr, 30)  # wynik: 2

# Sprawdzenie czy element istnieje w czasie O(log N):
def binary_search_exists(sorted_arr: list[int], val: int) -> bool:
    pos = bisect.bisect_left(sorted_arr, val)
    return pos < len(sorted_arr) and sorted_arr[pos] == val

Maturalny Idiom: Kompletny wzorzec rozwiązania zadania

Typowy format zadania CKE (trzy podpunkty, dane z pliku, wynik do pliku):


def solve():
    with open("dane.txt", "r", encoding="utf-8") as f:
        # Zakładamy wiersze z pojedynczymi liczbami
        data = [int(line.strip()) for line in f if line.strip()]

    # --- Zadanie 1 ---
    ans1 = sum(1 for x in data if is_prime(x))

    # --- Zadanie 2 ---
    ans2_list = [x for x in data if is_palindrome(str(x))]
    ans2_max = max(ans2_list) if ans2_list else "BRAK"

    # --- Zadanie 3 ---
    # np. znalezienie pary o największej różnicy
    ans3_min = min(data)
    ans3_max = max(data)
    ans3_diff = ans3_max - ans3_min

    # --- Zapis wyników pod klucz CKE ---
    with open("wyniki4.txt", "w", encoding="utf-8") as out:
        out.write("4.1.\n")
        out.write(f"Liczba liczb pierwszych: {ans1}\n\n")

        out.write("4.2.\n")
        out.write(f"Najwiekszy palindrom: {ans2_max}\n\n")

        out.write("4.3.\n")
        out.write(f"Roznica: {ans3_diff} (min: {ans3_min}, max: {ans3_max})\n")

if __name__ == "__main__":
    solve()

2. Bazy Danych (SQL / MS Access / Base)

2.1. Złota procedura importu (Zero błędów)

Ogląd surowego pliku: Zanim klikniesz „Importuj”, otwórz plik w Notatniku. Sprawdź:

  • Separator kolumn: tabulacja, średnik czy przecinek?
  • Separator dziesiętny: kropka czy przecinek?
  • Pierwszy wiersz: czy zawiera nazwy pól?

Kluczowa zasada typów danych:

  • Wszelkie identyfikatory, kody pocztowe, telefony i numery PESEL ustawiaj jako Krótki tekst (Text/Varchar). Zaimportowanie ich jako Liczba utnie wiodące zera (np. PESEL 03... zamieni się w 3...).

  • Daty: zweryfikuj format (RRRR-MM-DD vs DD.MM.RRRR).

    Relacje: Zawsze twórz relacje w widoku relacji przed tworzeniem kwerend. Włącz opcję Wymuszaj więzy spójności (Referential Integrity). Jeśli Access zgłasza błąd spójności – w danych występuje rekord potomny bez rodzica (sprawdź typy kluczy).

2.2. Żelazny zestaw konstrukcji SQL

A. Wyszukiwanie braków (Elementy, które nie wystąpiły w relacji)

Scenariusz: Znajdź klientów, którzy nie złożyli żadnego zamówienia.

SELECT Klienci.IdKlienta, Klienci.Nazwisko
FROM Klienci
LEFT JOIN Zamowienia ON Klienci.IdKlienta = Zamowienia.IdKlienta
WHERE Zamowienia.IdZamowienia IS NULL;

Filtrowanie agregatów (WHERE vs HAVING)

Scenariusz: Znajdź działy, w których średnia pensja pracowników zatrudnionych po 2020 roku przekracza 5000 zł.

SELECT Dzial, AVG(Pensja) AS SredniaPensja
FROM Pracownicy
WHERE RokZatrudnienia > 2020       -- Warunek na pojedyncze wiersze PRZED grupowaniem
GROUP BY Dzial
HAVING AVG(Pensja) > 5000;         -- Warunek na WYNIK agregacji PO grupowaniu

Wartości skrajne z remisami (Top N with ties)

Scenariusz: Wypisz 3 najlepiej zarabiających uczniów wraz z ewentualnymi remisami.

W MS Access:

    SELECT TOP 3 WITH TIES Imie, Nazwisko, Punkty
    FROM Uczniowie
    ORDER BY Punkty DESC;

W czystym SQL (podzapytanie uniwersalne):


    SELECT Imie, Nazwisko, Punkty
    FROM Uczniowie
    WHERE Punkty >= (
        SELECT MIN(Punkty) 
        FROM (SELECT DISTINCT TOP 3 Punkty FROM Uczniowie ORDER BY Punkty DESC)
    )
    ORDER BY Punkty DESC;

Na co uważać w dialekcie SQL Accessa? (Dziwactwa silnika ACE/Jet)

  • Nawiasy przy wielu złączeniach: Jeśli łączysz więcej niż dwie tabele, Access wymaga zagnieżdżania złączeń w nawiasach:
FROM (Klienci 
      INNER JOIN Zamowienia ON Klienci.IdKlienta = Zamowienia.IdKlienta)
      INNER JOIN Pozycje ON Zamowienia.IdZamowienia = Pozycje.IdZamowienia

(Dlatego złączenia wielotabelowe ZAWSZE lepiej wyklikać na siatce — Access sam postawi te nawiasy poprawnie).

  • Maski dat: Daty w warunkach SQL Accessa muszą być otoczone znakami hash #:
WHERE DataUrodzenia >= #2005-01-01#
  • Aliasy i kropki: Access czasami dodaje nawiasy kwadratowe wokół nazw kolumn i tabel (np. [Klienci].[Nazwisko]) — nie musisz ich usuwać, w niczym nie przeszkadzają.

edytorze graficznym

  • Złączenia tabel (JOIN): Przeciągasz myszką powiązania między kluczami (PK $\rightarrow$ FK). Access sam wygeneruje całą klauzulę FROM TabelaA INNER JOIN TabelaB ON ....
  • Wybór kolumn (SELECT): Dwuklik na polach, które mają trafić do wyniku.
  • Proste sortowanie (ORDER BY): Wybranie kierunku rosnąco/malejąco w wierszu „Sortuj”.
  • Podstawowe grupowanie (GROUP BY): Kliknięcie ikony $\Sigma$ (Sumy) i wybranie Grupuj według oraz funkcji agregujących (Policz, Suma, Średnia).

Widok sql

Podzapytania (Subqueries):

  • W kreatorze zagnieżdżenie kwerendy w kwerendzie wymaga tworzenia osobnego obiektu kwerendy pomocniczej.
  • W SQL dopisujesz :
WHERE Punkty > (SELECT AVG(Punkty) FROM Uczniowie)

Kwerendy na braki (LEFT JOIN ... IS NULL)

W SQL po prostu zmieniasz INNER JOIN na LEFT JOIN i dopisujesz na końcu WHERE Zamowienia.IdZamowienia IS NULL.

Precyzyjne warunki na agregaty (HAVING)

W SQL dopisujesz czytelną linijkę:

HAVING COUNT(*) >= 5 AND AVG(Cena) > 100

Wyciąganie czołówki z remisami (TOP N WITH TIES)

SELECT TOP 3 WITH TIES Imie, Nazwisko, Wynik
FROM Uczniowie
ORDER BY Wynik DESC;

3. Arkusz Kalkulacyjny (MS Excel / Calc)

Bezpieczna Ścieżka Importu (Krok po Kroku)

Zamiast klikać dwukrotnie w plik .csv / .txt:

  1. Otwórz nowy, pusty skoroszyt Excela.
  2. Przejdź do zakładki: Dane $\rightarrow$ Pobierz dane $\rightarrow$ Z pliku $\rightarrow$ Z pliku tekstowego/CSV (lub Dane $\rightarrow$ Z tekstu/CSV).
  3. W oknie podglądu danych:
    • Pochodzenie pliku (Kodowanie): Wybierz 65001: Unicode (UTF-8) lub 1250: Środkowoeuropejski (Windows), jeśli polskie znaki są uszkodzone.
    • Ogranicznik (Separator): Sprawdź, czy dane dzielą się poprawnie (Tabulacja, Średnik, Przecinek, Spacja).
  4. Kliknij przycisk Przekształć dane (Power Query) zamiast bezpośredniego „Załaduj”:
    • Kliknij nagłówek kolumny z identyfikatorami / kodami.
    • W sekcji Typ danych zmień z Liczba całkowita na Tekst (potwierdź: Zastąp bieżącą).
    • Jeśli liczby mają kropki: zaznacz kolumnę $\rightarrow$ Zmień typ $\rightarrow$ Użyj ustawień regionalnych... $\rightarrow$ Typ: Liczba dziesiętna, Ustawienia regionalne: Angielski (Stany Zjednoczone).
  5. Kliknij Zamknij i załaduj.

3. Szybkie Naprawianie Błędów na Zaimportowanym Arkuszu

Jeśli dane zostały już załadowane i pojawiły się problemy:

A. Naprawa kropki na przecinek w 5 sekund

  1. Zaznacz kolumny z liczbami.
  2. Wciśnij skrót Ctrl + H (Znajdź i zamień).
  3. W polu Znajdź wpisz: . (kropka).
  4. W polu Zamień na wpisz: , (przecinek).
  5. Kliknij Zamień wszystko. Wartości natychmiast wyrównają się do prawej strony jako właściwe liczby.

B. Wymuszenie konwersji tekstu na liczbę

Gdy liczby są sformatowane jako tekst (często z zielonym trójkącikiem w rogu):

  • Wpisz liczbę 1 do dowolnej pustej komórki i skopiuj ją (Ctrl + C).
  • Zaznacz komórki z „fałszywymi” liczbami.
  • Kliknij prawym przyciskiem myszy $\rightarrow$ Wklej specjalnie... $\rightarrow$ zaznacz operację Przemnóż $\rightarrow$ OK.

C. Narzędzie „Tekst jako kolumny”

Jeśli plik załadował się do jednej kolumny (np. wszystko w kolumnie A rozdzielone średnikami):

  1. Zaznacz kolumnę A.
  2. Przejdź do: Dane $\rightarrow$ Tekst jako kolumny.
  3. Wybierz: Rozdzielany $\rightarrow$ Dalej.
  4. Zaznacz odpowiedni ogranicznik (np. Średnik lub Tabulacja).
  5. W kroku 3/3 możesz od razu zaznaczyć kolumnę z identyfikatorami i ustawić jej format jako Tekst, a w przycisku Zaawansowane... wskazać kropkę jako separator dziesiętny.

3.1. Formuły, które trzeba znać na pamięć

Formuła Zastosowanie Składnia / Przykład
X.WYSZUKAJ Nowoczesne złączenie tabel (zastępuje WYSZUKAJ.PIONOWO) =X.WYSZUKAJ(szukana_wartosc; tablica_szukana; tablica_zwracana; "brak")
INDEKS + PODAJ.POZYCJĘ Uniwersalne złączenie (działa w każdym arkuszu, szuka też w lewo) =INDEKS(B$2:B$1000; PODAJ.POZYCJĘ(E2; A$2:A$1000; 0))
LICZ.WARUNKI Zliczanie elementów spełniających wiele kryteriów =LICZ.WARUNKI(A$2:A$1000; ">10"; B$2:B$1000; "K")
SUMA.WARUNKÓW Sumowanie warunkowe =SUMA.WARUNKÓW(C$2:C$1000; A$2:A$1000; ">10"; B$2:B$1000; "K")
ZAOKR.DO.TEKST / Format Kontrola precyzji zapisu (miejsca po przecinku) Ustawienie formatu komórki 0,00 lub formuła =ZAOKR(A1; 2)

3.2. Triki przyspieszające pracę

  • Blokowanie komórek (F4): Jeden klik klawisza F4 wstawia dolary $A$1 (blokada wiersza i kolumny). Dwa kliknięcia – $A1, trzy – A$1. Przy przeciąganiu formuł po tysiącach wierszy brak blokady zakresu to błąd numer jeden.
  • Podwójne kliknięcie w uchwyt autouzupełniania: Zamiast przeciągać kursor myszy przez 50 000 wierszy, kliknij dwukrotnie w mały czarny kwadracik w prawym dolnym rogu aktywnej komórki. Arkusz natychmiast uzupełni kolumnę do końca sąsiednich danych.
  • Tabela przestawna jako weryfikator: Każdą kwerendę SQL lub zadanie agregujące w arkuszu zweryfikujesz w 15 sekund Tabelą Przestawną (Pivot Table). Wrzucasz pole grupujące do Wierszy, a pole sumowane do Wartości.

Anatomia symulacji

Każda symulacja w Excelu sprowadza się do tego samego schematu matematycznego:$$Stan_{t} = f(Stan_{t-1}, Parametry, Zdarzenia_{t})$$

Cała trudność polega na rozbiciu długiego tekstu na cztery elementy:Warunki początkowe ($t=0$ lub wiersz

  1. Wartości wpisane „z palca” w pierwszym wierszu tabeli (np. początkowa prędkość, kapitał początkowy, stan populacji).
  2. Krok czasowy / Krok symulacji: Zwykle kolejna jednostka czasu (sekunda, dzień, miesiąc, runda). Wiersz w Excelu odpowiada jednemu stanowi w chwili $t$.Reguły przejścia ($t > 0$ lub wiersz 2 i kolejne): Formuły odwołujące się do wiersza wyżej (A2 odwołuje się do A1) oraz do komórek z globalnymi parametrami (zablokowanych za pomocą $).
  3. Warunki brzegowe i ograniczenia: Zmiana zachowania układu, gdy wartość przekroczy próg (np. „jeśli temperatura przekroczy 100°C, zawór się otwiera” $\rightarrow$ funkcja JEŻELI).
Wiersz 1-4:  [PARAMETRY GLOBALNE / STAŁE] - . Nigdy nie wpisuj liczb „na twardo” w formuły – zawsze odwołuj się do tych komórek z dolarem ($B$1).
Wiersz 6:    [NAGŁÓWKI KOLUMN - STANY I PRZYROSTY]
Wiersz 7:    [STAN POCZĄTKOWY - KROK t = 0]
Wiersz 8:    [PIERWSZY KROK SYMULACJI - KROK t = 1 (formuły właściwe)]
Wiersz 9+:   [AUTOUZUPEŁNIENIE DLA CAŁEGO HORYZONTU CZASOWEGO]

Przykład podziału kolumn:

  • Kolumna A (Krok / Czas): Identyfikator kroku ($t = 0, 1, 2, \dots$)
  • Kolumna B (Stan bazowy): Wartość główna na początku kroku
  • Kolumna C (Przyrost / Zmiana): Wielkość generowana w danym kroku (np. narodziny, odsetki, dopływ)
  • Kolumna D (Ubytek / Strata): Wielkość tracona w danym kroku (np. zgony, raty, odpływ)
  • Kolumna E (Stan końcowy / Ograniczony): Wartość po uwzględnieniu limitów fizycznych/biznesowych

4 Czesc teoretyczna

  • Ślad wykonania algorytmu (Tabelka kroków):
  • Drzewo wywołań rekurencyjnych:
    • Schemat: Rysujesz na brudnopisie proste drzewo binarne/gałęziowe wywołań w dół, aż do warunku stopu, a potem zwijasz wartości do góry.
  • Szacowanie złożoności obliczeniowej
    • Jedna pętla $\rightarrow O(N)$.
    • Zagnieżdżone pętle $\rightarrow O(N^2)$ (często suma ciągu arytmetycznego: $\frac{N(N-1)}{2}$).
    • Dzielenie problemu na pół w każdym kroku (np. $n = n \text{ div } 2$) $\rightarrow O(\log_2 N)$.
  • Reprezentacja liczb i systemy pozycyjne:
    • Konwersje między systemami (dwójkowy, ósemkowy, szesnastkowy).
    • Zapis liczb ujemnych w U2 (kod uzupełnień do dwóch).
    • Zapis zmiennoprzecinkowy (cecha, mantysa, znak) lub zjawisko nadmiaru/niedomiaru (overflow).
    • Schemat: Czysta arytmetyka szkolna według sztywnego wzoru z dzieleniem z resztą lub wagami potęg dwójki.