Mini-projets algorithmique, corrigé TP KNN, news, notebooks IA
This commit is contained in:
109
algorithmes/mini-projets/07_meteo 2/starter.py
Normal file
109
algorithmes/mini-projets/07_meteo 2/starter.py
Normal 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'}")
|
||||
54
algorithmes/mini-projets/07_meteo 2/sujet.md
Normal file
54
algorithmes/mini-projets/07_meteo 2/sujet.md
Normal 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** ?
|
||||
Reference in New Issue
Block a user