Mini-projets algorithmique, corrigé TP KNN, news, notebooks IA

This commit is contained in:
2026-07-07 10:57:59 +02:00
parent 1647035df2
commit 5a6d602a91
51 changed files with 3614 additions and 33 deletions

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

View 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 ?