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'}")
|
||||
Reference in New Issue
Block a user