Technikum Klasa I 45 minut PP: II.1 + I.2b | s. 342-343

Lekcja 24: Implementacja algorytmow na tekstach

Szyfr Cezara, wyszukiwanie wzorca, operacje na lancuchach znakow

📋 Podstawa programowa: II.1+I.2b
Pythonalgorytmyimplementacjaszyfr Cezarawyszukiwaniewyszukiwanie wzorca
00:00
Wprowadzenie
5 min
00:05
Teoria
15 min
00:20
Cwiczenia
20 min
00:40
Podsumowanie
5 min
📚

Teoria

Operacje na lancuchach znakow w Pythonie

W Pythonie lancuchy znakow (str) to sekwencje znakow, po ktorych mozna iterowac. Kazdy znak ma swoj kod ASCII/Unicode.

# Kody znakow
print(ord('A'))    # 65
print(ord('a'))    # 97
print(ord('Z'))    # 90
print(chr(65))     # 'A'
print(chr(97))     # 'a'

# Przydatne metody
tekst = "Hello World"
print(tekst.upper())    # HELLO WORLD
print(tekst.lower())    # hello world
print(tekst.find("lo")) # 3 (indeks pierwszego wystapienia)
print(tekst.count("l")) # 3
print(tekst.replace("World", "Python"))  # Hello Python
Szyfr Cezara to jeden z najstarszych szyfrów - kazda litera zostaje przesunieta o stala liczbe pozycji w alfabecie. Np. przy przesunieciu 3: A→D, B→E, Z→C (zawijanie).

Szyfr Cezara - szyfrowanie

def szyfruj_cezar(tekst, klucz):
    """Szyfruje tekst szyfrem Cezara z podanym kluczem."""
    wynik = ""
    for znak in tekst:
        if znak.isalpha():
            # Okreslamy baze (wielka lub mala litera)
            baza = ord('A') if znak.isupper() else ord('a')
            # Przesuwamy i zawijamy w zakresie 26 liter
            nowy_kod = (ord(znak) - baza + klucz) % 26 + baza
            wynik += chr(nowy_kod)
        else:
            wynik += znak  # znaki niealfabetyczne bez zmian
    return wynik

# Deszyfrowanie - przesuniecie w odwrotnym kierunku
def deszyfruj_cezar(tekst, klucz):
    return szyfruj_cezar(tekst, -klucz)

zaszyfrowany = szyfruj_cezar("ATAK O SWICIE", 3)
print(zaszyfrowany)  # DWDN R VZLFH

odszyfrowany = deszyfruj_cezar(zaszyfrowany, 3)
print(odszyfrowany)  # ATAK O SWICIE

Wyszukiwanie wzorca w tekscie

Algorytm naiwny - porownywanie znak po znaku:

def szukaj_wzorca(tekst, wzorzec):
    """Wyszukuje wszystkie wystapienia wzorca w tekscie."""
    pozycje = []
    n = len(tekst)
    m = len(wzorzec)

    for i in range(n - m + 1):
        znaleziono = True
        for j in range(m):
            if tekst[i + j] != wzorzec[j]:
                znaleziono = False
                break
        if znaleziono:
            pozycje.append(i)
    return pozycje

tekst = "ala ma ala kota i ala ma psa"
print(szukaj_wzorca(tekst, "ala"))  # [0, 7, 18]

Palindrom

def czy_palindrom(tekst):
    """Sprawdza, czy tekst jest palindromem."""
    tekst = tekst.lower().replace(" ", "")
    return tekst == tekst[::-1]

print(czy_palindrom("kajak"))       # True
print(czy_palindrom("Kobyła ma mały bok".replace("ł","l").replace("ó","o")))
# True (po uproszczeniu)
✏️

Zadania

Latwe

Zadanie 1: Szyfr Cezara

Napisz program, ktory pyta uzytkownika o tekst i klucz (przesuniecie), a nastepnie wyswietla zaszyfrowany i odszyfrowany tekst. Przetestuj dla roznych kluczy.

Pokaz przykladowe rozwiazanie
def szyfruj_cezar(tekst, klucz):
    wynik = ""
    for znak in tekst:
        if znak.isalpha():
            baza = ord('A') if znak.isupper() else ord('a')
            wynik += chr((ord(znak) - baza + klucz) % 26 + baza)
        else:
            wynik += znak
    return wynik

tekst = input("Podaj tekst: ")
klucz = int(input("Podaj klucz (przesuniecie): "))

zaszyfrowany = szyfruj_cezar(tekst, klucz)
odszyfrowany = szyfruj_cezar(zaszyfrowany, -klucz)

print(f"Zaszyfrowany: {zaszyfrowany}")
print(f"Odszyfrowany: {odszyfrowany}")
Latwe

Zadanie 2: Statystyka tekstu

Napisz program, ktory wczytuje tekst i wyswietla: liczbe znakow, slow, zdan (kończacych sie na . ? !), oraz najczesciej wystepujaca litere.

Pokaz przykladowe rozwiazanie
tekst = input("Podaj tekst: ")

znaki = len(tekst)
slowa = len(tekst.split())
zdania = tekst.count('.') + tekst.count('?') + tekst.count('!')

# Najczessza litera
licznik = {}
for znak in tekst.lower():
    if znak.isalpha():
        licznik[znak] = licznik.get(znak, 0) + 1

if licznik:
    najczestsza = max(licznik, key=licznik.get)
    print(f"Znakow: {znaki}")
    print(f"Slow: {slowa}")
    print(f"Zdan: {zdania}")
    print(f"Najczestsza litera: '{najczestsza}' ({licznik[najczestsza]} razy)")
Srednie

Zadanie 3: Wyszukiwanie wzorca

Napisz program z wlasna funkcja wyszukiwania wzorca (bez uzycia .find()). Program wyswietla wszystkie pozycje, na ktorych znaleziono wzorzec w tekscie.

Pokaz przykladowe rozwiazanie
def szukaj(tekst, wzorzec):
    pozycje = []
    for i in range(len(tekst) - len(wzorzec) + 1):
        pasuje = True
        for j in range(len(wzorzec)):
            if tekst[i + j] != wzorzec[j]:
                pasuje = False
                break
        if pasuje:
            pozycje.append(i)
    return pozycje

tekst = input("Podaj tekst: ")
wzorzec = input("Podaj wzorzec: ")

wyniki = szukaj(tekst, wzorzec)
if wyniki:
    print(f"Znaleziono '{wzorzec}' na pozycjach: {wyniki}")
    print(f"Liczba wystapien: {len(wyniki)}")
else:
    print("Wzorzec nie zostal znaleziony.")
Trudne

Zadanie 4: Lamanie szyfru Cezara

Napisz program, ktory probuje zlamac szyfr Cezara metoda brute-force - wyswietla odszyfrowany tekst dla wszystkich 25 mozliwych kluczy. Uzytkownik sam ocenia, ktory wynik jest poprawny.

Pokaz przykladowe rozwiazanie
def szyfruj_cezar(tekst, klucz):
    wynik = ""
    for znak in tekst:
        if znak.isalpha():
            baza = ord('A') if znak.isupper() else ord('a')
            wynik += chr((ord(znak) - baza + klucz) % 26 + baza)
        else:
            wynik += znak
    return wynik

zaszyfrowany = input("Podaj zaszyfrowany tekst: ")

print("\nProbowanie wszystkich kluczy:")
print("-" * 50)
for klucz in range(1, 26):
    odszyfrowany = szyfruj_cezar(zaszyfrowany, -klucz)
    print(f"Klucz {klucz:2}: {odszyfrowany}")
🎥

Materialy wideo

Jak zakodować szyfr cezara w Python
DooMx
Algorithms on texts - searching for a pattern in text
Dziwne... u mnie działa - (ScratchSPWZ)
🎧

Podcasty

✔️

Quiz - sprawdz sie!

📜

Podstawa programowa

← Lekcja 23: Algorytmy na liczbach Lekcja 25: Implementacja algorytmow sortowania →