Liceum Klasa III 45 minut PP: II.1+II.2 | s. 343

Lekcja 18: Programowanie - projekt indywidualny (2): implementacja

Kodowanie projektu w Pythonie, budowa modulowa, funkcje

📋 Podstawa programowa: II.1+II.2
debugowanieimplementacjakodowanieprogramowanieprojekt indywidualny
00:00
Wprowadzenie
5 min
00:05
Teoria
10 min
00:15
Kodowanie
25 min
00:40
Podsumowanie
5 min
📚

Teoria

Od pseudokodu do kodu - implementacja projektu

Masz juz specyfikacje i pseudokod - teraz czas zamienic je w dzialajacy program. Kluczowa zasada: programuj modularnie - dziel kod na male, niezalezne funkcje.

Zasada KISS: Keep It Simple, Stupid! - Zaczynaj od najprostszej dzialjacej wersji programu, a potem stopniowo dodawaj kolejne funkcje.

1. Budowa modulowa programu

Dobrze zorganizowany program sklada sie z funkcji, z ktorych kazda odpowiada za jedno konkretne zadanie:

# Struktura modulowa programu - Quiz edukacyjny

def wczytaj_pytania(nazwa_pliku):
    """Wczytuje pytania z pliku CSV."""
    pytania = []
    with open(nazwa_pliku, "r", encoding="utf-8") as f:
        for linia in f:
            czesci = linia.strip().split(";")
            pytanie = {
                "tresc": czesci[0],
                "odpowiedzi": czesci[1:5],
                "poprawna": czesci[5]
            }
            pytania.append(pytanie)
    return pytania

def wyswietl_pytanie(pytanie, numer):
    """Wyswietla pytanie i opcje odpowiedzi."""
    print(f"\nPytanie {numer}: {pytanie['tresc']}")
    for i, odp in enumerate(pytanie['odpowiedzi']):
        print(f"  {chr(65+i)}) {odp}")

def sprawdz_odpowiedz(pytanie, odpowiedz):
    """Sprawdza, czy odpowiedz jest poprawna."""
    return odpowiedz.upper() == pytanie['poprawna'].upper()

def zapisz_wynik(imie, wynik, maksymalny):
    """Zapisuje wynik do pliku."""
    with open("wyniki.txt", "a", encoding="utf-8") as f:
        f.write(f"{imie}: {wynik}/{maksymalny}\n")

def main():
    """Glowna funkcja programu."""
    print("=== QUIZ EDUKACYJNY ===")
    imie = input("Podaj swoje imie: ")
    pytania = wczytaj_pytania("pytania.csv")

    import random
    random.shuffle(pytania)

    punkty = 0
    for i, pyt in enumerate(pytania, 1):
        wyswietl_pytanie(pyt, i)
        odp = input("Twoja odpowiedz (A/B/C/D): ")
        if sprawdz_odpowiedz(pyt, odp):
            print("Dobrze!")
            punkty += 1
        else:
            print(f"Zle! Poprawna: {pyt['poprawna']}")

    print(f"\nWynik: {punkty}/{len(pytania)}")
    zapisz_wynik(imie, punkty, len(pytania))

if __name__ == "__main__":
    main()

2. Dobre praktyki kodowania

  • Nazewnictwo - uzywaj opisowych nazw zmiennych i funkcji (np. liczba_punktow zamiast x)
  • Komentarze - komentuj "dlaczego", nie "co" (kod powinien byc czytelny sam w sobie)
  • Docstringi - opisuj kazda funkcje krotkim docstringiem
  • DRY - Don't Repeat Yourself - jesli powtarzasz kod, stworz funkcje
  • Obsluga bledow - uzywaj try/except dla operacji, ktore moga sie nie udac

3. Obsluga bledow

def wczytaj_pytania(nazwa_pliku):
    """Wczytuje pytania z pliku z obsluga bledow."""
    try:
        with open(nazwa_pliku, "r", encoding="utf-8") as f:
            pytania = []
            for nr, linia in enumerate(f, 1):
                czesci = linia.strip().split(";")
                if len(czesci) != 6:
                    print(f"Ostrzezenie: linia {nr} ma zly format")
                    continue
                pytania.append({
                    "tresc": czesci[0],
                    "odpowiedzi": czesci[1:5],
                    "poprawna": czesci[5]
                })
        return pytania
    except FileNotFoundError:
        print(f"Blad: Nie znaleziono pliku '{nazwa_pliku}'")
        return []
    except Exception as e:
        print(f"Blad: {e}")
        return []

4. Praca z plikami

Wiele projektow wymaga zapisu i odczytu danych z plikow. Pamietaj o uzywaniu encoding="utf-8" i instrukcji with:

# Zapis do pliku
with open("dane.txt", "w", encoding="utf-8") as f:
    f.write("Linia tekstu\n")

# Odczyt z pliku
with open("dane.txt", "r", encoding="utf-8") as f:
    zawartosc = f.read()

# Dopisywanie do pliku
with open("dane.txt", "a", encoding="utf-8") as f:
    f.write("Nowa linia\n")
Rada na dzis: Skup sie na napisaniu szkieletu programu - zdefiniuj wszystkie funkcje (nawet puste z pass) i polacz je w main(). Potem stopniowo wypelniaj kazda funkcje kodem.
✏️

Zadania

Latwe

Zadanie 1: Szkielet programu

Stworz plik Python ze szkieletem swojego projektu. Zdefiniuj wszystkie planowane funkcje (z docstringami) i pass w ciele. Napisz funkcje main(), ktora wywoluje je w odpowiedniej kolejnosci.

Srednie

Zadanie 2: Pierwsza dzialajaca funkcja

Zaimplementuj najwazniejsza funkcje swojego projektu (np. wczytywanie danych lub glowna logike). Przetestuj ja oddzielnie, upewniajac sie, ze dziala poprawnie.

Srednie

Zadanie 3: Implementacja rdzenia

Zaimplementuj co najmniej 3 funkcje swojego projektu i polacz je w dzialajacy program. Program powinien juz wykonywac swoje glowne zadanie, nawet jesli brakuje mu dodatkowych funkcji.

Trudne

Zadanie 4: Obsluga bledow i walidacja

Dodaj do swojego programu obsluge bledow: try/except dla operacji na plikach, walidacje danych wejsciowych od uzytkownika (np. sprawdzanie, czy podano liczbe, czy odpowiedz jest z dozwolonego zakresu).

🎥

Materialy wideo

Spring Data JPA + projekcje. Prosty sposób na szybsze zapytania. Część 1.
KM Programs Krzysztof Makowski
Implementacja listy jednokierunkowej w oparciu o inteligentne wskaźniki w C++ - Część 1.
KM Programs Krzysztof Makowski
🎧

Podcasty

✔️

Quiz - sprawdz sie!

📜

Podstawa programowa

← Lekcja 17: Projekt - analiza Lekcja 19: Projekt - testowanie →