Mini-projets algorithmique, corrigé TP KNN, news, notebooks IA
This commit is contained in:
93
algorithmes/mini-projets/06_bibliotheque/starter.py
Normal file
93
algorithmes/mini-projets/06_bibliotheque/starter.py
Normal file
@@ -0,0 +1,93 @@
|
||||
# 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)
|
||||
45
algorithmes/mini-projets/06_bibliotheque/sujet.md
Normal file
45
algorithmes/mini-projets/06_bibliotheque/sujet.md
Normal file
@@ -0,0 +1,45 @@
|
||||
# 06 — La Bibliothèque
|
||||
|
||||
**Algorithmes :** Tri par sélection + Recherche dichotomique
|
||||
**Difficulté :** Moyen
|
||||
**Durée estimée :** 1h — 1h15
|
||||
|
||||
---
|
||||
|
||||
## Contexte
|
||||
|
||||
Vous gérez le catalogue d'une bibliothèque. Les livres doivent être triés par **titre alphabétique** pour qu'on puisse les retrouver rapidement. Vous utiliserez le tri par sélection pour trier, et la dichotomie pour chercher.
|
||||
|
||||
---
|
||||
|
||||
## Étapes
|
||||
|
||||
### Étape 1 — Trier par titre
|
||||
Implémentez `tri_selection_livres(livres)` qui trie par `"titre"` (ordre alphabétique).
|
||||
|
||||
> **Rappel** : en Python, `"Alice" < "Zorro"` → `True`. Vous pouvez comparer des chaînes directement.
|
||||
|
||||
### Étape 2 — Recherche dichotomique
|
||||
Implémentez `rechercher_titre(livres_tries, titre)` qui retourne le livre si trouvé, `None` sinon.
|
||||
|
||||
> **Attention** : la comparaison doit être exacte (majuscules comprises). Pour simplifier, tout est déjà en minuscules dans les données.
|
||||
|
||||
### Étape 3 — Affichage enrichi
|
||||
Implémentez `afficher_fiche(livre)` qui affiche toutes les informations d'un livre de façon lisible (titre, auteur, année, genre, pages).
|
||||
|
||||
### Étape 4 — Statistiques
|
||||
Ajoutez une fonction `statistiques(livres)` qui affiche :
|
||||
- Le nombre de livres
|
||||
- Le livre le plus court et le plus long (en pages)
|
||||
- La moyenne de pages
|
||||
|
||||
> **Indication** : une fois la liste triée par titre, vous pouvez utiliser une boucle simple pour les stats. Ou bien trier une copie par pages avec votre tri !
|
||||
|
||||
### Étape 5 — Extension (si vous avez le temps)
|
||||
Ajoutez la possibilité de trier aussi par **année** ou par **nombre de pages**, et de rechercher tous les livres d'un **même auteur** (recherche linéaire cette fois — pourquoi ne peut-on pas utiliser la dichotomie ici ?).
|
||||
|
||||
---
|
||||
|
||||
## Ce que vous devez rendre
|
||||
- Le programme fonctionnel
|
||||
- Réponse : pour chercher tous les livres d'un auteur, pourquoi la dichotomie est-elle inadaptée ?
|
||||
Reference in New Issue
Block a user