Files
1ereNSI/algorithmes/mini-projets/06_bibliotheque/starter.py

94 lines
3.6 KiB
Python
Raw Normal View History

# 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)