18. ⭐ Temperature conversion program 🌡️

Obiettivi di apprendimento:

  • Conversioni tra scale di temperatura (Celsius, Fahrenheit, Kelvin)
  • Formule matematiche per conversioni
  • Validazione input e range di temperature
  • Interfaccia utente intuitiva

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:

  1. Aggiungi scale di temperatura esotiche (Rankine, Réaumur)
  2. Implementa un sistema di allerte temperature
  3. Crea un convertitore per temperature di cottura