17. ⭐ Weight conversion program 🏋️

Obiettivi di apprendimento:

  • Conversioni tra diverse unità di peso
  • Gestione di sistemi di misura diversi
  • Interfaccia utente per selezione unità
  • Validazione e formattazione output

Contenuto teorico:

def convertitore_peso():
    print("⚖️ CONVERTITORE DI PESO ⚖️")

    # Fattori di conversione (tutto in grammi come base)
    unita_peso = {
        'mg': {'nome': 'Milligrammi', 'fattore': 0.001},
        'g': {'nome': 'Grammi', 'fattore': 1},
        'kg': {'nome': 'Chilogrammi', 'fattore': 1000},
        't': {'nome': 'Tonnellate', 'fattore': 1000000},
        'oz': {'nome': 'Once', 'fattore': 28.3495},
        'lb': {'nome': 'Libbre', 'fattore': 453.592},
        'st': {'nome': 'Stone', 'fattore': 6350.29},
        'ct': {'nome': 'Carati', 'fattore': 0.2}
    }

    def mostra_unita():
        print("\n📋 UNITÀ DISPONIBILI:")
        for codice, info in unita_peso.items():
            print(f"{codice.upper():<4} - {info['nome']}")

    def converti(valore, da_unita, a_unita):
        # Converti a grammi
        valore_grammi = valore * unita_peso[da_unita]['fattore']
        # Converti dall'unità base all'unità desiderata
        risultato = valore_grammi / unita_peso[a_unita]['fattore']
        return risultato

    cronologia = []

    while True:
        print(f"\n{'='*60}")
        print("CONVERTITORE DI PESO")
        print("="*60)
        print("Comandi: 'unita' (mostra unità), 'cronologia', 'clear', 'esci'")

        comando = input("Inserisci comando o procedi con conversione: ").strip().lower()

        if comando == 'esci':
            print("👋 Arrivederci!")
            break
        elif comando == 'unita':
            mostra_unita()
            continue
        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

        try:
            # Input valore
            valore = float(input("Valore da convertire: "))

            # Mostra unità disponibili
            mostra_unita()

            # Input unità di partenza
            while True:
                da_unita = input("Da quale unità (codice): ").strip().lower()
                if da_unita in unita_peso:
                    break
                print("❌ Unità non valida!")

            # Input unità di destinazione
            while True:
                a_unita = input("A quale unità (codice): ").strip().lower()
                if a_unita in unita_peso:
                    break
                print("❌ Unità non valida!")

            # Esegui conversione
            risultato = converti(valore, da_unita, a_unita)

            # Formatta output
            nome_da = unita_peso[da_unita]['nome']
            nome_a = unita_peso[a_unita]['nome']

            # Formato numerico intelligente
            if risultato < 0.001:
                risultato_str = f"{risultato:.2e}"
            elif risultato < 1:
                risultato_str = f"{risultato:.6f}".rstrip('0').rstrip('.')
            elif risultato < 1000:
                risultato_str = f"{risultato:.3f}".rstrip('0').rstrip('.')
            else:
                risultato_str = f"{risultato:,.2f}"

            output = f"{valore} {nome_da} = {risultato_str} {nome_a}"
            print(f"📊 {output}")

            # Aggiungi alla cronologia
            cronologia.append(output)

        except ValueError:
            print("❌ Inserisci un numero valido!")
        except Exception as e:
            print(f"❌ Errore: {e}")

convertitore_peso()

Convertitore peso avanzato con BMI:

def convertitore_peso_avanzato():
    print("💪 CONVERTITORE PESO + CALCOLATORE BMI 💪")

    # Unità di peso
    unita_peso = {
        'kg': {'nome': 'Chilogrammi', 'fattore': 1},
        'g': {'nome': 'Grammi', 'fattore': 0.001},
        'lb': {'nome': 'Libbre', 'fattore': 0.453592},
        'st': {'nome': 'Stone', 'fattore': 6.35029},
        'oz': {'nome': 'Once', 'fattore': 0.0283495}
    }

    # Unità di altezza
    unita_altezza = {
        'm': {'nome': 'Metri', 'fattore': 1},
        'cm': {'nome': 'Centimetri', 'fattore': 0.01},
        'ft': {'nome': 'Piedi', 'fattore': 0.3048},
        'in': {'nome': 'Pollici', 'fattore': 0.0254}
    }

    def calcola_bmi(peso_kg, altezza_m):
        bmi = peso_kg / (altezza_m ** 2)

        if bmi < 18.5:
            categoria = "Sottopeso"
            emoji = "⚠️"
        elif bmi < 25:
            categoria = "Normale"
            emoji = "✅"
        elif bmi < 30:
            categoria = "Sovrappeso"
            emoji = "⚠️"
        else:
            categoria = "Obeso"
            emoji = "❌"

        return bmi, categoria, emoji

    def peso_ideale_range(altezza_m):
        # Range BMI normale: 18.5 - 24.9
        peso_min = 18.5 * (altezza_m ** 2)
        peso_max = 24.9 * (altezza_m ** 2)
        return peso_min, peso_max

    while True:
        print(f"\n{'='*60}")
        print("CONVERTITORE PESO + BMI CALCULATOR")
        print("="*60)
        print("1. Conversione peso")
        print("2. Calcolo BMI")
        print("3. Peso ideale")
        print("0. Esci")

        scelta = input("Seleziona opzione: ").strip()

        if scelta == '0':
            break

        elif scelta == '1':
            try:
                print("\n🔄 CONVERSIONE PESO")
                valore = float(input("Valore: "))

                print("\nUnità disponibili:")
                for codice, info in unita_peso.items():
                    print(f"{codice.upper()} - {info['nome']}")

                da_unita = input("Da: ").lower()
                a_unita = input("A: ").lower()

                if da_unita in unita_peso and a_unita in unita_peso:
                    # Converti tutto in kg come base
                    valore_kg = valore * unita_peso[da_unita]['fattore']
                    risultato = valore_kg / unita_peso[a_unita]['fattore']

                    print(f"📊 {valore} {unita_peso[da_unita]['nome']} = {risultato:.4f} {unita_peso[a_unita]['nome']}")
                else:
                    print("❌ Unità non valida!")

            except ValueError:
                print("❌ Valore non valido!")

        elif scelta == '2':
            try:
                print("\n📏 CALCOLO BMI")

                # Input peso
                peso = float(input("Peso: "))
                print("Unità peso disponibili:")
                for codice, info in unita_peso.items():
                    print(f"{codice.upper()} - {info['nome']}")
                unita_p = input("Unità peso: ").lower()

                # Input altezza
                altezza = float(input("Altezza: "))
                print("Unità altezza disponibili:")
                for codice, info in unita_altezza.items():
                    print(f"{codice.upper()} - {info['nome']}")
                unita_a = input("Unità altezza: ").lower()

                if unita_p in unita_peso and unita_a in unita_altezza:
                    # Converti in kg e metri
                    peso_kg = peso * unita_peso[unita_p]['fattore']
                    altezza_m = altezza * unita_altezza[unita_a]['fattore']

                    bmi, categoria, emoji = calcola_bmi(peso_kg, altezza_m)

                    print(f"\n📊 RISULTATI BMI:")
                    print(f"Peso: {peso_kg:.1f} kg")
                    print(f"Altezza: {altezza_m:.2f} m")
                    print(f"BMI: {bmi:.1f}")
                    print(f"Categoria: {categoria} {emoji}")

                    # Tabella di riferimento
                    print(f"\n📋 TABELLA DI RIFERIMENTO:")
                    print("< 18.5  - Sottopeso")
                    print("18.5-25 - Normale")
                    print("25-30   - Sovrappeso")
                    print("> 30    - Obeso")

                else:
                    print("❌ Unità non valida!")

            except ValueError:
                print("❌ Valori non validi!")

        elif scelta == '3':
            try:
                print("\n🎯 CALCOLO PESO IDEALE")

                altezza = float(input("Altezza: "))
                print("Unità altezza disponibili:")
                for codice, info in unita_altezza.items():
                    print(f"{codice.upper()} - {info['nome']}")
                unita_a = input("Unità altezza: ").lower()

                if unita_a in unita_altezza:
                    altezza_m = altezza * unita_altezza[unita_a]['fattore']
                    peso_min, peso_max = peso_ideale_range(altezza_m)

                    print(f"\n🎯 PESO IDEALE PER {altezza} {unita_altezza[unita_a]['nome']}:")
                    print(f"Range salutare: {peso_min:.1f} - {peso_max:.1f} kg")
                    print(f"Range salutare: {peso_min*2.20462:.1f} - {peso_max*2.20462:.1f} lb")

                else:
                    print("❌ Unità non valida!")

            except ValueError:
                print("❌ Valore non valido!")

        else:
            print("❌ Scelta non valida!")

convertitore_peso_avanzato()

Sistema di monitoraggio peso:

import datetime
import json
import os

def sistema_monitoraggio_peso():
    print("📈 SISTEMA MONITORAGGIO PESO 📈")

    # File per salvare i dati
    file_dati = "peso_data.json"

    def carica_dati():
        if os.path.exists(file_dati):
            with open(file_dati, 'r') as f:
                return json.load(f)
        return {}

    def salva_dati(dati):
        with open(file_dati, 'w') as f:
            json.dump(dati, f, indent=2)

    def aggiungi_misurazione(dati, peso, unita='kg'):
        oggi = datetime.date.today().isoformat()

        if 'misurazioni' not in dati:
            dati['misurazioni'] = []

        # Converti sempre in kg per consistenza
        fattori = {'kg': 1, 'lb': 0.453592, 'st': 6.35029}
        peso_kg = peso * fattori.get(unita, 1)

        # Rimuovi misurazione esistente per oggi (se presente)
        dati['misurazioni'] = [m for m in dati['misurazioni'] if m['data'] != oggi]

        # Aggiungi nuova misurazione
        dati['misurazioni'].append({
            'data': oggi,
            'peso_kg': peso_kg,
            'peso_originale': peso,
            'unita': unita
        })

        # Ordina per data
        dati['misurazioni'].sort(key=lambda x: x['data'])

        return dati

    def mostra_statistiche(dati):
        if 'misurazioni' not in dati or not dati['misurazioni']:
            print("📊 Nessuna misurazione disponibile")
            return

        misurazioni = dati['misurazioni']
        pesi = [m['peso_kg'] for m in misurazioni]

        peso_attuale = pesi[-1]
        peso_iniziale = pesi[0]
        peso_min = min(pesi)
        peso_max = max(pesi)
        peso_medio = sum(pesi) / len(pesi)

        variazione = peso_attuale - peso_iniziale
        variazione_perc = (variazione / peso_iniziale) * 100

        print(f"\n📊 STATISTICHE PESO:")
        print("="*40)
        print(f"Peso attuale:    {peso_attuale:.1f} kg")
        print(f"Peso iniziale:   {peso_iniziale:.1f} kg")
        print(f"Peso minimo:     {peso_min:.1f} kg")
        print(f"Peso massimo:    {peso_max:.1f} kg")
        print(f"Peso medio:      {peso_medio:.1f} kg")
        print(f"Variazione:      {variazione:+.1f} kg ({variazione_perc:+.1f}%)")
        print(f"Misurazioni:     {len(misurazioni)}")

        # Trend ultimi 7 giorni
        if len(misurazioni) >= 2:
            ultimi_7 = misurazioni[-7:] if len(misurazioni) >= 7 else misurazioni
            if len(ultimi_7) >= 2:
                trend = ultimi_7[-1]['peso_kg'] - ultimi_7[0]['peso_kg']
                giorni = len(ultimi_7) - 1
                print(f"Trend ({giorni} giorni): {trend:+.1f} kg")

    def mostra_grafico_semplice(dati):
        if 'misurazioni' not in dati or len(dati['misurazioni']) < 2:
            print("📈 Servono almeno 2 misurazioni per il grafico")
            return

        misurazioni = dati['misurazioni'][-10:]  # Ultimi 10
        pesi = [m['peso_kg'] for m in misurazioni]
        date = [m['data'][-5:] for m in misurazioni]  # Solo MM-DD

        peso_min = min(pesi)
        peso_max = max(pesi)
        range_peso = peso_max - peso_min

        print(f"\n📈 GRAFICO PESO (Ultimi {len(misurazioni)} giorni):")
        print("="*50)

        # Scala del grafico (10 livelli)
        for i in range(10, -1, -1):
            livello = peso_min + (range_peso * i / 10)
            print(f"{livello:5.1f} kg |", end="")

            for peso in pesi:
                if abs(peso - livello) <= range_peso / 20:
                    print(" ●", end="")
                else:
                    print("  ", end="")
            print()

        print("         |" + "".join(["--" for _ in pesi]))
        print("          ", end="")
        for data in date:
            print(f"{data}", end="")
        print()

    # Carica dati esistenti
    dati = carica_dati()

    while True:
        print(f"\n{'='*50}")
        print("SISTEMA MONITORAGGIO PESO")
        print("="*50)
        print("1. Aggiungi misurazione")
        print("2. Visualizza statistiche")
        print("3. Mostra grafico")
        print("4. Lista misurazioni")
        print("5. Imposta obiettivo")
        print("0. Esci")

        scelta = input("Seleziona opzione: ").strip()

        if scelta == '0':
            print("👋 Dati salvati automaticamente!")
            break

        elif scelta == '1':
            try:
                peso = float(input("Peso: "))
                unita = input("Unità (kg/lb/st) [kg]: ").lower() or 'kg'

                if unita in ['kg', 'lb', 'st']:
                    dati = aggiungi_misurazione(dati, peso, unita)
                    salva_dati(dati)
                    print(f"✅ Misurazione aggiunta: {peso} {unita}")
                else:
                    print("❌ Unità non valida!")
            except ValueError:
                print("❌ Peso non valido!")

        elif scelta == '2':
            mostra_statistiche(dati)

        elif scelta == '3':
            mostra_grafico_semplice(dati)

        elif scelta == '4':
            if 'misurazioni' in dati and dati['misurazioni']:
                print(f"\n📋 LISTA MISURAZIONI:")
                for m in dati['misurazioni'][-10:]:  # Ultime 10
                    data_obj = datetime.datetime.fromisoformat(m['data'])
                    data_formattata = data_obj.strftime("%d/%m/%Y")
                    print(f"{data_formattata}: {m['peso_kg']:.1f} kg ({m['peso_originale']:.1f} {m['unita']})")
            else:
                print("📋 Nessuna misurazione disponibile")

        elif scelta == '5':
            try:
                obiettivo = float(input("Peso obiettivo (kg): "))
                dati['obiettivo'] = obiettivo
                salva_dati(dati)
                print(f"🎯 Obiettivo impostato: {obiettivo} kg")

                if 'misurazioni' in dati and dati['misurazioni']:
                    peso_attuale = dati['misurazioni'][-1]['peso_kg']
                    differenza = obiettivo - peso_attuale
                    print(f"Differenza: {differenza:+.1f} kg")
            except ValueError:
                print("❌ Peso non valido!")

        else:
            print("❌ Scelta non valida!")

sistema_monitoraggio_peso()

Esercizi pratici:

  1. Aggiungi conversioni per unità antiche (talenti, libbre troy)
  2. Implementa un sistema di allerte per variazioni di peso
  3. Crea un convertitore per animali (con scale appropriate)