16. ⭐ Calculator program 🧮

Obiettivi di apprendimento:

  • Creare una calcolatrice funzionale completa
  • Gestire operazioni matematiche base e avanzate
  • Implementare validazione input e gestione errori
  • Creare un'interfaccia utente intuitiva

Contenuto teorico:

import math

def calcolatrice_base():
    print("🧮 CALCOLATRICE BASE 🧮")

    while True:
        print("\n" + "="*40)
        print("OPERAZIONI DISPONIBILI:")
        print("1. Addizione (+)")
        print("2. Sottrazione (-)")
        print("3. Moltiplicazione (*)")
        print("4. Divisione (/)")
        print("5. Potenza (**)")
        print("6. Radice quadrata (√)")
        print("7. Percentuale (%)")
        print("0. Esci")
        print("="*40)

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

        if scelta == '0':
            print("👋 Grazie per aver usato la calcolatrice!")
            break

        if scelta in ['1', '2', '3', '4', '5', '7']:
            try:
                num1 = float(input("Primo numero: "))
                num2 = float(input("Secondo numero: "))

                if scelta == '1':
                    risultato = num1 + num2
                    print(f"📊 {num1} + {num2} = {risultato}")

                elif scelta == '2':
                    risultato = num1 - num2
                    print(f"📊 {num1} - {num2} = {risultato}")

                elif scelta == '3':
                    risultato = num1 * num2
                    print(f"📊 {num1} × {num2} = {risultato}")

                elif scelta == '4':
                    if num2 != 0:
                        risultato = num1 / num2
                        print(f"📊 {num1} ÷ {num2} = {risultato}")
                    else:
                        print("❌ Errore: Divisione per zero!")

                elif scelta == '5':
                    risultato = num1 ** num2
                    print(f"📊 {num1}^{num2} = {risultato}")

                elif scelta == '7':
                    risultato = (num1 / num2) * 100
                    print(f"📊 {num1} è il {risultato:.2f}% di {num2}")

            except ValueError:
                print("❌ Errore: Inserisci numeri validi!")

        elif scelta == '6':
            try:
                num = float(input("Numero: "))
                if num >= 0:
                    risultato = math.sqrt(num)
                    print(f"📊 √{num} = {risultato}")
                else:
                    print("❌ Errore: Non si può calcolare la radice di un numero negativo!")
            except ValueError:
                print("❌ Errore: Inserisci un numero valido!")

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

calcolatrice_base()

Calcolatrice scientifica avanzata:

import math

def calcolatrice_scientifica():
    print("🔬 CALCOLATRICE SCIENTIFICA 🔬")

    # Cronologia calcoli
    cronologia = []

    while True:
        print("\n" + "="*50)
        print("CALCOLATRICE SCIENTIFICA")
        print("="*50)
        print("OPERAZIONI BASE:")
        print("1. Addizione      2. Sottrazione    3. Moltiplicazione")
        print("4. Divisione      5. Potenza        6. Radice quadrata")
        print("\nOPERAZIONI AVANZATE:")
        print("7. Sin            8. Cos            9. Tan")
        print("10. Log           11. Ln            12. Fattoriale")
        print("\nUTILITÀ:")
        print("13. Cronologia    14. Cancella cronologia    0. Esci")
        print("="*50)

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

        if scelta == '0':
            print("👋 Arrivederci!")
            break

        elif scelta == '13':
            if cronologia:
                print("\n📋 CRONOLOGIA CALCOLI:")
                for i, calcolo in enumerate(cronologia, 1):
                    print(f"{i}. {calcolo}")
            else:
                print("📋 Cronologia vuota")
            continue

        elif scelta == '14':
            cronologia.clear()
            print("🗑️ Cronologia cancellata!")
            continue

        # Operazioni con due numeri
        if scelta in ['1', '2', '3', '4', '5']:
            try:
                num1 = float(input("Primo numero: "))
                num2 = float(input("Secondo numero: "))

                if scelta == '1':
                    risultato = num1 + num2
                    operazione = f"{num1} + {num2} = {risultato}"
                elif scelta == '2':
                    risultato = num1 - num2
                    operazione = f"{num1} - {num2} = {risultato}"
                elif scelta == '3':
                    risultato = num1 * num2
                    operazione = f"{num1} × {num2} = {risultato}"
                elif scelta == '4':
                    if num2 != 0:
                        risultato = num1 / num2
                        operazione = f"{num1} ÷ {num2} = {risultato}"
                    else:
                        print("❌ Divisione per zero!")
                        continue
                elif scelta == '5':
                    risultato = num1 ** num2
                    operazione = f"{num1}^{num2} = {risultato}"

                print(f"📊 {operazione}")
                cronologia.append(operazione)

            except ValueError:
                print("❌ Inserisci numeri validi!")

        # Operazioni con un numero
        elif scelta in ['6', '7', '8', '9', '10', '11', '12']:
            try:
                num = float(input("Numero: "))

                if scelta == '6':
                    if num >= 0:
                        risultato = math.sqrt(num)
                        operazione = f"√{num} = {risultato}"
                    else:
                        print("❌ Numero negativo!")
                        continue

                elif scelta == '7':
                    risultato = math.sin(math.radians(num))
                    operazione = f"sin({num}°) = {risultato:.6f}"

                elif scelta == '8':
                    risultato = math.cos(math.radians(num))
                    operazione = f"cos({num}°) = {risultato:.6f}"

                elif scelta == '9':
                    risultato = math.tan(math.radians(num))
                    operazione = f"tan({num}°) = {risultato:.6f}"

                elif scelta == '10':
                    if num > 0:
                        risultato = math.log10(num)
                        operazione = f"log({num}) = {risultato:.6f}"
                    else:
                        print("❌ Logaritmo di numero non positivo!")
                        continue

                elif scelta == '11':
                    if num > 0:
                        risultato = math.log(num)
                        operazione = f"ln({num}) = {risultato:.6f}"
                    else:
                        print("❌ Logaritmo di numero non positivo!")
                        continue

                elif scelta == '12':
                    if num >= 0 and num == int(num):
                        risultato = math.factorial(int(num))
                        operazione = f"{int(num)}! = {risultato}"
                    else:
                        print("❌ Fattoriale solo per numeri interi non negativi!")
                        continue

                print(f"📊 {operazione}")
                cronologia.append(operazione)

            except ValueError:
                print("❌ Inserisci un numero valido!")
            except OverflowError:
                print("❌ Numero troppo grande!")

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

calcolatrice_scientifica()

Calcolatrice con espressioni:

def calcolatrice_espressioni():
    print("⚡ CALCOLATRICE ESPRESSIONI ⚡")
    print("Inserisci espressioni matematiche (es: 2+3*4, sqrt(16), sin(90))")

    import math
    import re

    # Funzioni matematiche disponibili
    funzioni_math = {
        'sqrt': math.sqrt,
        'sin': lambda x: math.sin(math.radians(x)),
        'cos': lambda x: math.cos(math.radians(x)),
        'tan': lambda x: math.tan(math.radians(x)),
        'log': math.log10,
        'ln': math.log,
        'abs': abs,
        'round': round,
        'pi': math.pi,
        'e': math.e
    }

    cronologia = []

    while True:
        print(f"\n{'='*50}")
        print("CALCOLATRICE ESPRESSIONI")
        print("Comandi: 'help', 'cronologia', 'clear', 'esci'")
        print("="*50)

        espressione = input(">>> ").strip()

        if espressione.lower() == 'esci':
            break
        elif espressione.lower() == 'help':
            print("""
📚 GUIDA RAPIDA:
• Operatori: +, -, *, /, **, ()
• Funzioni: sqrt(x), sin(x), cos(x), tan(x), log(x), ln(x)
• Costanti: pi, e
• Esempi: 
  - 2+3*4
  - sqrt(16) + 5
  - sin(45) * cos(45)
  - (2+3)*4**2
            """)
            continue
        elif espressione.lower() == 'cronologia':
            if cronologia:
                print("\n📋 CRONOLOGIA:")
                for i, calc in enumerate(cronologia, 1):
                    print(f"{i}. {calc}")
            else:
                print("📋 Cronologia vuota")
            continue
        elif espressione.lower() == 'clear':
            cronologia.clear()
            print("🗑️ Cronologia cancellata!")
            continue

        if not espressione:
            continue

        try:
            # Sostituisci le funzioni matematiche
            espressione_modificata = espressione
            for nome, funzione in funzioni_math.items():
                if callable(funzione):
                    pattern = f'{nome}\\(([^)]+)\\)'
                    matches = re.findall(pattern, espressione_modificata)
                    for match in matches:
                        try:
                            valore = eval(match)
                            risultato_funzione = funzione(valore)
                            espressione_modificata = espressione_modificata.replace(
                                f'{nome}({match})', str(risultato_funzione)
                            )
                        except:
                            pass
                else:
                    # Costanti
                    espressione_modificata = espressione_modificata.replace(nome, str(funzione))

            # Valuta l'espressione
            risultato = eval(espressione_modificata)

            output = f"{espressione} = {risultato}"
            print(f"📊 {output}")
            cronologia.append(output)

        except ZeroDivisionError:
            print("❌ Errore: Divisione per zero!")
        except ValueError as e:
            print(f"❌ Errore matematico: {e}")
        except SyntaxError:
            print("❌ Errore di sintassi nell'espressione!")
        except Exception as e:
            print(f"❌ Errore: {e}")

calcolatrice_espressioni()

Esercizi pratici:

  1. Aggiungi conversioni di unità alla calcolatrice
  2. Implementa una calcolatrice per matrici 2x2
  3. Crea una calcolatrice finanziaria (interessi, prestiti)