Obiettivi di apprendimento:
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: