2026. június 26., péntek

Könyvtárkezelő alkalmazás

Ez a komplex példaprogram egy olyan parancssoros könyvtárkezelő alkalmazást mutat be, amely ötvözi az objektumorientált programozást (OOP), a fájlkezelést (JSON formátum) és a modern típusannotációkat.A kód tartalmazza a hibakezelést, a dinamikus keresést, a szűrést és az objektumok kezelését.

------------
import json
import os
from typing import List, Optional

# 1. Osztály (OOP)
class Konyv:
    def __init__(self, cim: str, szerzo: str, ev: int, mufaj: str):
        self.cim = cim
        self.szerzo = szerzo
        self.ev = ev
        self.mufaj = mufaj
        self.kolcsonozve = False

    def __str__(self) -> str:
        allapot = "Kölcsönözhető" if not self.kolcsonozve else "Kölcsönzés alatt"
        return f"{self.cim} - {self.szerzo} ({self.ev}) [{self.mufaj}] | Státusz: {allapot}"

    def to_dict(self) -> dict:
        return self.__dict__

# 2. Üzleti logika osztály
class Konyvtar:
    def __init__(self, fajl_nev: str = "konyvtar.json"):
        self.fajl_nev = fajl_nev
        self.konyvek: List[Konyv] = []
        self.betoltes()

    def hozzaad(self, konyv: Konyv) -> None:
        self.konyvek.append(konyv)
        self.mentes()
        print(f"'{konyv.cim}' sikeresen hozzáadva a könyvtárhoz.")

    def kereses(self, kulcsszo: str) -> List[Konyv]:
        kulcsszo = kulcsszo.lower()
        talalatok = []
        for k in self.konyvek:
            if kulcsszo in k.cim.lower() or kulcsszo in k.szerzo.lower():
                talalatok.append(k)
        return talalatok

    def kolcsonzes(self, cim: str) -> None:
        for k in self.konyvek:
            if k.cim.lower() == cim.lower():
                if k.kolcsonozve:
                    print(f"Hiba: A(z) '{cim}' már ki van kölcsönözve.")
                else:
                    k.kolcsonozve = True
                    self.mentes()
                    print(f"Sikeres kölcsönzés: '{cim}'.")
                return
        print("Hiba: A könyv nem található.")

    def mentes(self) -> None:
        with open(self.fajl_nev, 'w', encoding='utf-8') as f:
            json.dump([k.to_dict() for k in self.konyvek], f, ensure_ascii=False, indent=4)

    def betoltes(self) -> None:
        if os.path.exists(self.fajl_nev):
            try:
                with open(self.fajl_nev, 'r', encoding='utf-8') as f:
                    adatok = json.load(f)
                    self.konyvek = [Konyv(**k) for k in adatok]
            except json.JSONDecodeError:
                print("Hiba a mentett fájl olvasásakor, új lista létrehozva.")
                self.konyvek = []

# 3. Főprogram (CLI)
def main():
    konyvtar = Konyvtar()
    
    while True:
        print("\n--- KÖNYVTÁR MENÜ ---")
        print("1. Új könyv hozzáadása")
        print("2. Összes könyv listázása")
        print("3. Keresés (cím vagy szerző alapján)")
        print("4. Könyv kölcsönzése")
        print("5. Kilépés")
        
        valasztas = input("Válasszon egy opciót (1-5): ").strip()
        
        if valasztas == '1':
            cim = input("Cím: ")
            szerzo = input("Szerző: ")
            try:
                ev = int(input("Kiadási év: "))
                mufaj = input("Műfaj: ")
                uj_konyv = Konyv(cim, szerzo, ev, mufaj)
                konyvtar.hozzaad(uj_konyv)
            except ValueError:
                print("Hiba: Az évszámnak számnak kell lennie!")
                
        elif valasztas == '2':
            if not konyvtar.konyvek:
                print("A könyvtár üres.")
            else:
                for idx, konyv in enumerate(konyvtar.konyvek, 1):
                    print(f"{idx}. {konyv}")
                    
        elif valasztas == '3':
            kulcsszo = input("Keresőkifejezés: ")
            talalatok = konyvtar.kereses(kulcsszo)
            if talalatok:
                for konyv in talalatok:
                    print(konyv)
            else:
                print("Nincs találat.")
                
        elif valasztas == '4':
            cim = input("A kikölcsönözni kívánt könyv címe: ")
            konyvtar.kolcsonzes(cim)
            
        elif valasztas == '5':
            print("Viszontlátás!")
            break
        else:
            print("Érvénytelen választás. Kérjük, adjon meg egy számot 1 és 5 között.")

if __name__ == "__main__":
    main()
-------------------
--- KÖNYVTÁR MENÜ ---
1. Új könyv hozzáadása
2. Összes könyv listázása
3. Keresés (cím vagy szerző alapján)
4. Könyv kölcsönzése
5. Kilépés
Válasszon egy opciót (1-5): 

Nincsenek megjegyzések:

Megjegyzés küldése