110 lines
3.4 KiB
Python
110 lines
3.4 KiB
Python
# 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'}")
|