Obiettivi di apprendimento:
Contenuto teorico:
def convertitore_temperatura():
print("🌡️ CONVERTITORE DI TEMPERATURA 🌡️")
def celsius_to_fahrenheit(celsius):
return (celsius * 9/5) + 32
def celsius_to_kelvin(celsius):
return celsius + 273.15
def fahrenheit_to_celsius(fahrenheit):
return (fahrenheit - 32) * 5/9
def fahrenheit_to_kelvin(fahrenheit):
celsius = fahrenheit_to_celsius(fahrenheit)
return celsius_to_kelvin(celsius)
def kelvin_to_celsius(kelvin):
return kelvin - 273.15
def kelvin_to_fahrenheit(kelvin):
celsius = kelvin_to_celsius(kelvin)
return celsius_to_fahrenheit(celsius)
def valida_temperatura(temp, scala):
# Controlli di validità fisica
if scala.lower() == 'k' and temp < 0:
return False, "La temperatura in Kelvin non può essere negativa!"
elif scala.lower() == 'c' and temp < -273.15:
return False, "La temperatura non può essere inferiore allo zero assoluto (-273.15°C)!"
elif scala.lower() == 'f' and temp < -459.67:
return False, "La temperatura non può essere inferiore allo zero assoluto (-459.67°F)!"
return True, ""
def ottieni_descrizione_temperatura(celsius):
if celsius < -40:
return "🧊 Estremamente freddo (congelamento istantaneo)"
elif celsius < 0:
return "❄️ Molto freddo (sotto il congelamento)"
elif celsius < 10:
return "🥶 Freddo"
elif celsius < 20:
return "😐 Fresco"
elif celsius < 30:
return "😊 Piacevole"
elif celsius < 40:
return "🌞 Caldo"
elif celsius < 50:
return "🔥 Molto caldo"
else:
return "🌋 Estremamente caldo"
cronologia = []
while True:
print(f"\n{'='*60}")
print("CONVERTITORE DI TEMPERATURA")
print("="*60)
print("Scale disponibili:")
print("C - Celsius (°C)")
print("F - Fahrenheit (°F)")
print("K - Kelvin (K)")
print("\nComandi: 'cronologia', 'clear', 'info', 'esci'")
comando = input("Inserisci comando o procedi: ").strip().lower()
if comando == 'esci':
print("👋 Arrivederci!")
break
elif comando == 'cronologia':
if cronologia:
print("\n📋 CRONOLOGIA CONVERSIONI:")
for i, conv in enumerate(cronologia, 1):
print(f"{i}. {conv}")
else:
print("📋 Nessuna conversione nella cronologia")
continue
elif comando == 'clear':
cronologia.clear()
print("🗑️ Cronologia cancellata!")
continue
elif comando == 'info':
print("""
📚 INFORMAZIONI TEMPERATURE:
• Zero assoluto: -273.15°C = -459.67°F = 0K
• Congelamento acqua: 0°C = 32°F = 273.15K
• Ebollizione acqua: 100°C = 212°F = 373.15K
• Temperatura corpo umano: ~37°C = ~98.6°F = ~310K
• Temperatura ambiente: ~20°C = ~68°F = ~293K
""")
continue
try:
# Input temperatura
temperatura = float(input("Temperatura: "))
# Input scala di partenza
while True:
scala_da = input("Scala di partenza (C/F/K): ").strip().upper()
if scala_da in ['C', 'F', 'K']:
break
print("❌ Scala non valida! Usa C, F o K")
# Validazione temperatura
valida, messaggio = valida_temperatura(temperatura, scala_da)
if not valida:
print(f"❌ {messaggio}")
continue
# Input scala di destinazione
while True:
scala_a = input("Scala di destinazione (C/F/K): ").strip().upper()
if scala_a in ['C', 'F', 'K']:
break
print("❌ Scala non valida! Usa C, F o K")
if scala_da == scala_a:
print(f"📊 {temperatura}°{scala_da} = {temperatura}°{scala_a} (stessa scala)")
continue
# Conversioni
risultato = None
if scala_da == 'C':
if scala_a == 'F':
risultato = celsius_to_fahrenheit(temperatura)
elif scala_a == 'K':
risultato = celsius_to_kelvin(temperatura)
elif scala_da == 'F':
if scala_a == 'C':
risultato = fahrenheit_to_celsius(temperatura)
elif scala_a == 'K':
risultato = fahrenheit_to_kelvin(temperatura)
elif scala_da == 'K':
if scala_a == 'C':
risultato = kelvin_to_celsius(temperatura)
elif scala_a == 'F':
risultato = kelvin_to_fahrenheit(temperatura)
# Simboli delle unità
simboli = {'C': '°C', 'F': '°F', 'K': 'K'}
# Output risultato
output = f"{temperatura}{simboli[scala_da]} = {risultato:.2f}{simboli[scala_a]}"
print(f"📊 {output}")
# Aggiungi descrizione se abbiamo Celsius
if scala_a == 'C':
celsius_per_desc = risultato
elif scala_da == 'C':
celsius_per_desc = temperatura
else:
# Converti in Celsius per la descrizione
if scala_da == 'F':
celsius_per_desc = fahrenheit_to_celsius(temperatura)
else: # K
celsius_per_desc = kelvin_to_celsius(temperatura)
descrizione = ottieni_descrizione_temperatura(celsius_per_desc)
print(f"📝 {descrizione}")
# Aggiungi alla cronologia
cronologia.append(f"{output} - {descrizione}")
except ValueError:
print("❌ Inserisci un numero valido!")
except Exception as e:
print(f"❌ Errore: {e}")
convertitore_temperatura()
Stazione meteorologica virtuale:
import random
import datetime
def stazione_meteorologica():
print("🌤️ STAZIONE METEOROLOGICA VIRTUALE 🌤️")
def genera_dati_meteo():
# Simula dati meteorologici realistici
stagione = (datetime.datetime.now().month % 12) // 3
# Temperature base per stagione (Celsius)
temp_base = [5, 15, 25, 15][stagione] # Inverno, Primavera, Estate, Autunno
temperatura_c = temp_base + random.uniform(-10, 10)
umidita = random.randint(30, 90)
pressione = random.uniform(990, 1030)
vento_kmh = random.uniform(0, 30)
condizioni = ['Sereno', 'Parzialmente nuvoloso', 'Nuvoloso', 'Pioggia leggera',
'Pioggia', 'Temporale', 'Nebbia']
condizione = random.choice(condizioni)
return {
'temperatura_c': temperatura_c,
'umidita': umidita,
'pressione': pressione,
'vento_kmh': vento_kmh,
'condizione': condizione
}
def calcola_heat_index(temp_c, umidita):
# Calcola l'indice di calore (sensazione termica)
temp_f = (temp_c * 9/5) + 32
if temp_f < 80:
return temp_c # Non applicabile sotto 27°C
# Formula semplificata dell'indice di calore
hi = (-42.379 + 2.04901523*temp_f + 10.14333127*umidita
- 0.22475541*temp_f*umidita - 6.83783e-3*temp_f**2
- 5.481717e-2*umidita**2 + 1.22874e-3*temp_f**2*umidita
+ 8.5282e-4*temp_f*umidita**2 - 1.99e-6*temp_f**2*umidita**2)
return (hi - 32) * 5/9 # Converti in Celsius
def calcola_wind_chill(temp_c, vento_kmh):
# Calcola la sensazione termica da vento
if temp_c > 10 or vento_kmh < 4.8:
return temp_c # Non applicabile
# Formula del wind chill
wc = (13.12 + 0.6215*temp_c - 11.37*(vento_kmh**0.16)
+ 0.3965*temp_c*(vento_kmh**0.16))
return wc
def ottieni_emoji_meteo(condizione):
emoji_map = {
'Sereno': '☀️',
'Parzialmente nuvoloso': '⛅',
'Nuvoloso': '☁️',
'Pioggia leggera': '🌦️',
'Pioggia': '🌧️',
'Temporale': '⛈️',
'Nebbia': '🌫️'
}
return emoji_map.get(condizione, '🌤️')
def mostra_report_completo(dati):
temp_c = dati['temperatura_c']
temp_f = (temp_c * 9/5) + 32
temp_k = temp_c + 273.15
print(f"\n{'='*60}")
print(f"📊 REPORT METEOROLOGICO - {datetime.datetime.now().strftime('%d/%m/%Y %H:%M')}")
print("="*60)
# Temperature
print(f"🌡️ TEMPERATURA:")
print(f" {temp_c:.1f}°C | {temp_f:.1f}°F | {temp_k:.1f}K")
# Sensazione termica
heat_index = calcola_heat_index(temp_c, dati['umidita'])
wind_chill = calcola_wind_chill(temp_c, dati['vento_kmh'])
if heat_index != temp_c:
print(f"🔥 Sensazione termica (calore): {heat_index:.1f}°C")
elif wind_chill != temp_c:
print(f"❄️ Sensazione termica (vento): {wind_chill:.1f}°C")
else:
print(f"😊 Sensazione termica: {temp_c:.1f}°C")
# Altri parametri
emoji = ottieni_emoji_meteo(dati['condizione'])
print(f"☁️ Condizioni: {dati['condizione']} {emoji}")
print(f"💧 Umidità: {dati['umidita']}%")
print(f"📊 Pressione: {dati['pressione']:.1f} hPa")
print(f"💨 Vento: {dati['vento_kmh']:.1f} km/h ({dati['vento_kmh']/3.6:.1f} m/s)")
# Consigli
print(f"\n💡 CONSIGLI:")
if temp_c < 0:
print(" 🧥 Indossa abiti pesanti e copriti bene!")
elif temp_c < 10:
print(" 🧥 Porta una giacca!")
elif temp_c < 20:
print(" 👕 Abbigliamento leggero con una felpa")
elif temp_c < 30:
print(" 👕 Perfetto per attività all'aperto!")
else:
print(" 🩱 Cerca l'ombra e bevi molta acqua!")
if dati['umidita'] > 70:
print(" 💧 Alta umidità - potresti sentirti più caldo")
if dati['vento_kmh'] > 20:
print(" 💨 Vento forte - attenzione agli oggetti leggeri!")
def confronta_temperature():
print("\n🔄 CONFRONTO TEMPERATURE MONDIALI")
citta = {
'Roma': random.uniform(15, 25),
'Londra': random.uniform(8, 18),
'New York': random.uniform(10, 22),
'Tokyo': random.uniform(12, 24),
'Sydney': random.uniform(18, 28),
'Mosca': random.uniform(-5, 15),
'Dubai': random.uniform(25, 40),
'Reykjavik': random.uniform(-2, 8)
}
print(f"{'Città':<12} {'Celsius':<10} {'Fahrenheit':<12} {'Kelvin':<10}")
print("-" * 50)
for nome, temp_c in citta.items():
temp_f = (temp_c * 9/5) + 32
temp_k = temp_c + 273.15
print(f"{nome:<12} {temp_c:>6.1f}°C {temp_f:>8.1f}°F {temp_k:>7.1f}K")
while True:
print(f"\n{'='*60}")
print("STAZIONE METEOROLOGICA VIRTUALE")
print("="*60)
print("1. Report meteo attuale")
print("2. Convertitore temperature")
print("3. Confronto temperature mondiali")
print("4. Calcolo sensazione termica")
print("5. Storico temperature")
print("0. Esci")
scelta = input("Seleziona opzione: ").strip()
if scelta == '0':
print("👋 Grazie per aver utilizzato la stazione meteo!")
break
elif scelta == '1':
dati = genera_dati_meteo()
mostra_report_completo(dati)
elif scelta == '2':
try:
temp = float(input("Temperatura: "))
scala = input("Scala (C/F/K): ").upper()
if scala == 'C':
f = (temp * 9/5) + 32
k = temp + 273.15
print(f"📊 {temp}°C = {f:.2f}°F = {k:.2f}K")
elif scala == 'F':
c = (temp - 32) * 5/9
k = c + 273.15
print(f"📊 {temp}°F = {c:.2f}°C = {k:.2f}K")
elif scala == 'K':
c = temp - 273.15
f = (c * 9/5) + 32
print(f"📊 {temp}K = {c:.2f}°C = {f:.2f}°F")
else:
print("❌ Scala non valida!")
except ValueError:
print("❌ Temperatura non valida!")
elif scelta == '3':
confronta_temperature()
elif scelta == '4':
try:
temp = float(input("Temperatura (°C): "))
umidita = float(input("Umidità (%): "))
vento = float(input("Velocità vento (km/h): "))
heat_index = calcola_heat_index(temp, umidita)
wind_chill = calcola_wind_chill(temp, vento)
print(f"\n📊 SENSAZIONE TERMICA:")
print(f"Temperatura reale: {temp:.1f}°C")
if heat_index != temp:
print(f"Indice di calore: {heat_index:.1f}°C")
if wind_chill != temp:
print(f"Effetto vento: {wind_chill:.1f}°C")
except ValueError:
print("❌ Valori non validi!")
elif scelta == '5':
print("\n📈 STORICO TEMPERATURE (Ultimi 7 giorni)")
print(f"{'Giorno':<12} {'Min':<8} {'Max':<8} {'Media':<8}")
print("-" * 40)
for i in range(7):
data = datetime.date.today() - datetime.timedelta(days=6-i)
temp_min = random.uniform(5, 15)
temp_max = temp_min + random.uniform(5, 15)
temp_media = (temp_min + temp_max) / 2
giorno = data.strftime("%d/%m")
print(f"{giorno:<12} {temp_min:>5.1f}°C {temp_max:>5.1f}°C {temp_media:>5.1f}°C")
else:
print("❌ Scelta non valida!")
stazione_meteorologica()
Esercizi pratici: