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,109 @@
# Projet 07 — La Météo
# Algorithmes : Tri par insertion + Recherche dichotomique
# Relevés du mois de mars : (numéro du jour, température en °C)
releves = [
(1, 12.3), (2, 8.7), (3, 14.1), (4, 11.5), (5, 9.2),
(6, 7.8), (7, 13.4), (8, 15.6), (9, 10.1), (10, 6.5),
(11, 5.2), (12, 9.8), (13, 12.7),(14, 16.3),(15, 18.1),
(16, 14.5),(17, 11.2),(18, 8.9), (19, 7.3), (20, 10.5),
(21, 13.8),(22, 17.2),(23, 19.4),(24, 15.1),(25, 12.0),
(26, 9.5), (27, 11.8),(28, 14.2),(29, 16.7),(30, 18.9),
(31, 13.3),
]
def afficher_releves(releves, nb=10):
"""Affiche les nb premiers relevés."""
print(f"\n {'Jour':>5} {'Température':>12}")
print(" " + "-" * 20)
for jour, temp in releves[:nb]:
print(f" Jour {jour:>2} {temp:>8.1f} °C")
if len(releves) > nb:
print(f" ... ({len(releves) - nb} relevés supplémentaires)")
print()
def tri_insertion_temperatures(tab):
"""
Trie les relevés par température croissante (tri par insertion).
Chaque élément est un tuple (jour, temperature).
On trie selon le deuxième élément du tuple.
"""
for i in range(1, len(tab)):
x = tab[i]
j = i
# TODO : comparer tab[j-1][1] et x[1]
while j > 0 and ...:
tab[j] = tab[j - 1]
j -= 1
tab[j] = x
return tab
def statistiques(tab_trie):
"""Affiche les statistiques à partir des relevés triés."""
n = len(tab_trie)
min_releve = tab_trie[0]
max_releve = tab_trie[n - 1]
mediane = tab_trie[n // 2]
print("Statistiques du mois :")
print(f" Minimum : {min_releve[1]:.1f} °C (jour {min_releve[0]})")
print(f" Maximum : {max_releve[1]:.1f} °C (jour {max_releve[0]})")
print(f" Médiane : {mediane[1]:.1f} °C (jour {mediane[0]})")
# TODO : ajouter la moyenne
print()
def temperature_atteinte(tab_trie, t):
"""
Recherche dichotomique : retourne True si la température t
a été relevée au cours du mois (comparaison exacte).
"""
a = 0
b = len(tab_trie) - 1
while a <= b:
m = (a + b) // 2
temp_m = tab_trie[m][1]
if temp_m == t:
return True
elif temp_m < t:
# TODO
pass
else:
# TODO
pass
return False
def histogramme(tab_trie):
"""Affiche un histogramme horizontal des températures (arrondi à l'entier)."""
# Compter les occurrences par degré entier
compteur = {}
for _, temp in tab_trie:
degre = int(temp)
compteur[degre] = compteur.get(degre, 0) + 1
print("Histogramme des températures :")
for degre in sorted(compteur):
barre = "" * compteur[degre]
print(f" {degre:>3}°C | {barre} ({compteur[degre]})")
print()
# --- Programme principal ---
print("=== Analyse Météo — Mars ===")
print("\nRelevés originaux (10 premiers) :")
afficher_releves(releves, nb=5)
# Trier une copie pour ne pas perdre l'ordre chronologique
releves_tries = releves[:]
tri_insertion_temperatures(releves_tries)
print("Relevés triés par température :")
afficher_releves(releves_tries, nb=5)
statistiques(releves_tries)
histogramme(releves_tries)
# Tests de recherche
print("Recherches :")
for t in [5.2, 15.0, 19.4, 20.0]:
present = temperature_atteinte(releves_tries, t)
print(f" {t}°C relevé ce mois-ci ? {'Oui' if present else 'Non'}")

View File

@@ -0,0 +1,54 @@
# 07 — La Météo
**Algorithmes :** Tri par insertion + Recherche dichotomique
**Difficulté :** Moyen
**Durée estimée :** 1h — 1h15
---
## Contexte
Vous analysez les relevés de température d'un mois complet. Vous voulez les trier, calculer des statistiques, et savoir rapidement si une température précise a été atteinte ce mois-ci.
---
## Étapes
### Étape 1 — Trier les températures
Implémentez `tri_insertion_temperatures(tab)` qui trie la liste de relevés par **température croissante**.
Chaque relevé est un tuple `(jour, temperature)`. On trie selon la température (le deuxième élément).
> **Indication** : comparez `tab[j-1][1]` et `x[1]` (le deuxième élément du tuple).
### Étape 2 — Statistiques de base
Implémentez `statistiques(tab_trie)` qui affiche :
- La température **minimale** et le jour où elle a été relevée
- La température **maximale** et le jour où elle a été relevée
- La **médiane** (la valeur au milieu une fois triée)
> Rappel : la médiane d'une liste triée de taille n est à l'indice `n // 2`.
### Étape 3 — Recherche dichotomique
Implémentez `temperature_atteinte(tab_trie, t)` : retourne `True` si la température `t` a été relevée, `False` sinon.
> **Attention** : les relevés sont triés par température. La dichotomie doit comparer `tab[m][1]` (la valeur) avec `t`.
### Étape 4 — Visualisation ASCII
Implémentez `histogramme(tab_trie)` qui affiche un histogramme horizontal des températures.
```
5°C | ##
10°C | #####
15°C | ########
...
```
### Étape 5 — Extension (si vous avez le temps)
Ajoutez une fonction qui regroupe les relevés par **tranche de 5°C** et compte combien de jours tombent dans chaque tranche.
---
## Ce que vous devez rendre
- Le programme complet avec statistiques et recherche
- Réponse : pourquoi le tri par insertion est-il particulièrement efficace si les données sont **déjà presque triées** ?