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

Lekcja 4: Programowanie algorytmow tekstowych - utrwalenie

Implementacja algorytmow przetwarzania tekstu w Pythonie

📋 Podstawa programowa: II.1+I.2b
Pythonalgorytmyimplementacjaprogramowanieregexstringutrwalenie
00:00
Wprowadzenie
5 min
00:05
Teoria
15 min
00:20
Cwiczenia
15 min
00:35
Podsumowanie
10 min
📚

Teoria

Operacje na lancuchach tekstowych

Lancuchy tekstowe (stringi) w Pythonie sa niemutowalne - kazda operacja tworzy nowy string. Przypomnijmy najwazniejsze metody:

tekst = "Informatyka jest super!"
print(tekst.upper())        # INFORMATYKA JEST SUPER!
print(tekst.lower())        # informatyka jest super!
print(tekst.find("jest"))   # 13 (indeks poczatku)
print(tekst.replace("super", "fajna"))  # Informatyka jest fajna!
print(tekst.split())        # ['Informatyka', 'jest', 'super!']
print(tekst[0:11])          # Informatyka
print(tekst[::-1])          # !repus tsej akytamrofnI

Szyfr Cezara

Szyfr Cezara polega na przesunieciu kazdej litery o ustalona liczbe pozycji w alfabecie:

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

def deszyfr_cezara(tekst, klucz):
    return szyfr_cezara(tekst, -klucz)

zaszyfrowany = szyfr_cezara("Python jest super", 3)
print(zaszyfrowany)  # Sbwkrq mhvw vxshu
print(deszyfr_cezara(zaszyfrowany, 3))  # Python jest super

Wyszukiwanie wzorca w tekscie

Algorytm naiwny przeszukuje tekst, sprawdzajac kazda mozliwa pozycje:

def wyszukaj_wzorzec(tekst, wzorzec):
    pozycje = []
    n = len(tekst)
    m = len(wzorzec)
    for i in range(n - m + 1):
        if tekst[i:i+m] == wzorzec:
            pozycje.append(i)
    return pozycje

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

Palindrom i anagram

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

def czy_anagram(s1, s2):
    return sorted(s1.lower().replace(" ", "")) == sorted(s2.lower().replace(" ", ""))

print(czy_palindrom("kajak"))      # True
print(czy_palindrom("Kobyła ma mały bok".replace("ł", "l")))  # True
print(czy_anagram("listen", "silent"))  # True
Kody ASCII i Unicode: Funkcja ord(znak) zwraca kod numeryczny znaku, a chr(kod) zwraca znak o danym kodzie. Np. ord('A') = 65, chr(97) = 'a'.
✏️

Zadania

Latwe

Zadanie 1: Statystyki tekstu

Napisz program, ktory dla podanego tekstu wyswietla: liczbe znakow, liczbe slow, liczbe zdan (koncza sie '.', '!', '?'), liczbe samoglosek i spolglosek, oraz najdluzsze slowo.

Pokaz przykladowe rozwiazanie
def statystyki(tekst):
    samogloski = "aeiouAEIOU"
    slowa = tekst.split()
    zdania = sum(1 for z in tekst if z in ".!?")
    sam = sum(1 for z in tekst if z in samogloski)
    spol = sum(1 for z in tekst if z.isalpha() and z not in samogloski)
    najdl = max(slowa, key=len)

    print(f"Znakow: {len(tekst)}")
    print(f"Slow: {len(slowa)}")
    print(f"Zdan: {zdania}")
    print(f"Samoglosek: {sam}")
    print(f"Spolglosek: {spol}")
    print(f"Najdluzsze slowo: {najdl}")

statystyki("Python jest super. Programowanie to swietna zabawa!")
Srednie

Zadanie 2: Lamanie szyfru Cezara

Napisz program, ktory probuje zlamac szyfr Cezara metoda brute force - wyswietla wszystkie 25 mozliwych odszyfrowanych wersji. Przetestuj na tekscie: "Mdyd Sbwkrq!" (klucz 3).

Pokaz przykladowe rozwiazanie
def lam_cezara(tekst):
    for klucz in range(1, 26):
        odszyfrowany = ""
        for znak in tekst:
            if znak.isalpha():
                baza = ord('A') if znak.isupper() else ord('a')
                odszyfrowany += chr((ord(znak) - baza - klucz) % 26 + baza)
            else:
                odszyfrowany += znak
        print(f"Klucz {klucz:2d}: {odszyfrowany}")

lam_cezara("Mdyd Sbwkrq!")
Srednie

Zadanie 3: Generator hasel

Napisz funkcje generujaca losowe haslo o podanej dlugosci, ktore zawiera co najmniej: 1 wielka litere, 1 mala litere, 1 cyfre i 1 znak specjalny. Uzyj modulu random i string.

Pokaz przykladowe rozwiazanie
import random
import string

def generuj_haslo(dlugosc=12):
    if dlugosc < 4:
        return "Haslo musi miec min. 4 znaki"

    haslo = [
        random.choice(string.ascii_uppercase),
        random.choice(string.ascii_lowercase),
        random.choice(string.digits),
        random.choice("!@#$%^&*")
    ]

    wszystkie = string.ascii_letters + string.digits + "!@#$%^&*"
    haslo += [random.choice(wszystkie) for _ in range(dlugosc - 4)]
    random.shuffle(haslo)
    return "".join(haslo)

for _ in range(5):
    print(generuj_haslo(16))
Trudne

Zadanie 4: Szyfr przestawieniowy

Zaimplementuj szyfr plotkowy (Rail Fence Cipher) z 3 szynami. W tym szyfrze tekst jest zapisywany zygzakiem na n wierszach, a nastepnie odczytywany wiersz po wierszu. Napisz funkcje szyfrujaca i deszyfrujaca.

🎥

Materialy wideo

Szyfr Cezara - implementacja w Pythonie
Pasja informatyki
Python String Methods - operacje na tekście
Corey Schafer
🎧

Podcasty

✔️

Quiz - sprawdz sie!

📜

Podstawa programowa

← Lekcja 3: Algorytmy sortowania Lekcja 5: Arkusz kalkulacyjny - zaawansowane →