94 lines
3.6 KiB
Python
94 lines
3.6 KiB
Python
# Projet 06 — La Bibliothèque
|
|
# Algorithmes : Tri par sélection + Recherche dichotomique
|
|
|
|
livres = [
|
|
{"titre": "le seigneur des anneaux", "auteur": "tolkien", "annee": 1954, "genre": "Fantasy", "pages": 1200},
|
|
{"titre": "1984", "auteur": "orwell", "annee": 1949, "genre": "Dystopie", "pages": 328},
|
|
{"titre": "dune", "auteur": "herbert", "annee": 1965, "genre": "SF", "pages": 688},
|
|
{"titre": "le petit prince", "auteur": "exupery", "annee": 1943, "genre": "Conte", "pages": 96},
|
|
{"titre": "fondation", "auteur": "asimov", "annee": 1951, "genre": "SF", "pages": 255},
|
|
{"titre": "harry potter t1", "auteur": "rowling", "annee": 1997, "genre": "Fantasy", "pages": 309},
|
|
{"titre": "fahrenheit 451", "auteur": "bradbury", "annee": 1953, "genre": "Dystopie", "pages": 158},
|
|
{"titre": "l'etranger", "auteur": "camus", "annee": 1942, "genre": "Littérature","pages": 123},
|
|
{"titre": "neuromancien", "auteur": "gibson", "annee": 1984, "genre": "SF", "pages": 271},
|
|
{"titre": "brave new world", "auteur": "huxley", "annee": 1932, "genre": "Dystopie", "pages": 311},
|
|
]
|
|
|
|
def afficher_catalogue(livres):
|
|
"""Affiche le catalogue sous forme de liste numérotée."""
|
|
print(f"\n {'Titre':<30} {'Auteur':<12} {'Année':>5} {'Pages':>6}")
|
|
print(" " + "-" * 58)
|
|
for i, l in enumerate(livres, 1):
|
|
print(f" {i:>2}. {l['titre']:<30} {l['auteur']:<12} {l['annee']:>5} {l['pages']:>6} p.")
|
|
print()
|
|
|
|
def afficher_fiche(livre):
|
|
"""Affiche la fiche complète d'un livre."""
|
|
# TODO : afficher toutes les informations du livre de façon lisible
|
|
pass
|
|
|
|
def tri_selection_livres(livres):
|
|
"""Trie les livres par titre alphabétique (tri par sélection)."""
|
|
n = len(livres)
|
|
for i in range(n):
|
|
mini = i
|
|
for j in range(i + 1, n):
|
|
# TODO : comparer les titres
|
|
if ...:
|
|
mini = j
|
|
livres[i], livres[mini] = livres[mini], livres[i]
|
|
return livres
|
|
|
|
def rechercher_titre(livres_tries, titre):
|
|
"""
|
|
Recherche dichotomique par titre exact (en minuscules).
|
|
Retourne le livre si trouvé, None sinon.
|
|
"""
|
|
a = 0
|
|
b = len(livres_tries) - 1
|
|
while a <= b:
|
|
m = (a + b) // 2
|
|
titre_m = livres_tries[m]["titre"]
|
|
if titre_m == titre:
|
|
return livres_tries[m]
|
|
elif titre_m < titre:
|
|
# TODO
|
|
pass
|
|
else:
|
|
# TODO
|
|
pass
|
|
return None
|
|
|
|
def statistiques(livres):
|
|
"""Affiche des statistiques sur le catalogue."""
|
|
n = len(livres)
|
|
total_pages = sum(l["pages"] for l in livres)
|
|
# TODO : trouver le livre avec le moins de pages et le plus de pages
|
|
# Indice : utilise ton tri par sélection sur une copie triée par pages !
|
|
print(f"\nStatistiques du catalogue ({n} livres) :")
|
|
print(f" Moyenne de pages : {total_pages // n} pages")
|
|
# TODO : afficher le plus court et le plus long
|
|
|
|
|
|
# --- Programme principal ---
|
|
print("=== Catalogue de la Bibliothèque ===")
|
|
print("\nAvant tri :")
|
|
afficher_catalogue(livres)
|
|
|
|
tri_selection_livres(livres)
|
|
|
|
print("Après tri alphabétique :")
|
|
afficher_catalogue(livres)
|
|
|
|
# Tests de recherche
|
|
print("Recherches :")
|
|
for titre in ["1984", "dune", "le comte de monte cristo"]:
|
|
resultat = rechercher_titre(livres, titre)
|
|
if resultat:
|
|
print(f" '{titre}' → trouvé !")
|
|
afficher_fiche(resultat)
|
|
else:
|
|
print(f" '{titre}' → absent du catalogue")
|
|
|
|
statistiques(livres)
|