Ir al contenido principal

Creación de una calculadora simple

Introducción

Ahora que hemos aprendido los conceptos fundamentales de Python, es momento de poner en práctica estos conocimientos en un proyecto real. La creación de una calculadora simple es un excelente primer proyecto porque integra varios conceptos importantes como funciones, entrada de usuario, operadores aritméticos y estructuras de control. En este artículo, desarrollaremos paso a paso una calculadora en la consola que podrá realizar operaciones básicas como suma, resta, multiplicación y división, además de algunas operaciones más avanzadas.

Planificación del proyecto

Antes de empezar a escribir código, es importante definir qué queremos conseguir. Nuestra calculadora deberá:

  1. Mostrar un menú con las operaciones disponibles
  2. Permitir al usuario elegir una operación
  3. Solicitar los números con los que operar
  4. Realizar el cálculo correspondiente
  5. Mostrar el resultado
  6. Preguntar si el usuario desea realizar otra operación

Creación de funciones para las operaciones básicas

Empezaremos definiendo funciones para cada operación matemática:

def sumar(a, b):
    """Suma dos números y devuelve el resultado"""
    return a + b

def restar(a, b):
    """Resta b de a y devuelve el resultado"""
    return a - b

def multiplicar(a, b):
    """Multiplica dos números y devuelve el resultado"""
    return a * b

def dividir(a, b):
    """Divide a entre b y devuelve el resultado"""
    if b == 0:
        return "Error: No es posible dividir entre cero"
    return a / b

Observa cómo hemos añadido una validación en la función dividir para evitar el error de división por cero.

Funciones para operaciones avanzadas

Añadamos algunas operaciones más avanzadas:

def potencia(a, b):
    """Calcula a elevado a b y devuelve el resultado"""
    return a ** b

def raiz_cuadrada(a):
    """Calcula la raíz cuadrada de a"""
    if a < 0:
        return "Error: No se puede calcular la raíz cuadrada de un número negativo"
    return a ** 0.5  # Equivalente a math.sqrt(a)

def modulo(a, b):
    """Calcula el resto de la división de a entre b"""
    if b == 0:
        return "Error: No es posible calcular el módulo cuando el divisor es cero"
    return a % b

Creación del menú de la calculadora

Ahora crearemos una función para mostrar el menú de operaciones disponibles:

def mostrar_menu():
    """Muestra el menú de operaciones disponibles"""
    print("\n==== CALCULADORA EN PYTHON ====")
    print("1. Suma")
    print("2. Resta")
    print("3. Multiplicación")
    print("4. División")
    print("5. Potencia")
    print("6. Raíz cuadrada")
    print("7. Módulo (resto de división)")
    print("8. Salir")
    print("==============================")

Función para obtener números válidos

Es importante asegurarnos de que el usuario introduzca números válidos:

def obtener_numero(mensaje):
    """Solicita un número al usuario y lo devuelve"""
    while True:
        try:
            return float(input(mensaje))
        except ValueError:
            print("Error: Introduce un número válido")

Esta función utiliza un bloque try-except para manejar posibles errores si el usuario introduce algo que no es un número.

Integrando todo en el programa principal

Ahora que tenemos todas las piezas, vamos a crear el programa principal que integrará todas las funciones:

def calculadora():
    """Función principal de la calculadora"""
    while True:
        # Mostrar el menú
        mostrar_menu()
        
        # Obtener la opción del usuario
        try:
            opcion = int(input("Selecciona una operación (1-8): "))
        except ValueError:
            print("Error: Debes introducir un número entero")
            continue
        
        # Salir del programa
        if opcion == 8:
            print("¡Gracias por usar la calculadora! Hasta pronto.")
            break
        
        # Verificar que la opción es válida
        if opcion < 1 or opcion > 8:
            print("Error: Opción no válida. Introduce un número del 1 al 8.")
            continue
        
        # Para la raíz cuadrada solo necesitamos un número
        if opcion == 6:
            num = obtener_numero("Introduce el número para calcular su raíz cuadrada: ")
            resultado = raiz_cuadrada(num)
            print(f"La raíz cuadrada de {num} es: {resultado}")
            continue
        
        # Para el resto de operaciones necesitamos dos números
        num1 = obtener_numero("Introduce el primer número: ")
        num2 = obtener_numero("Introduce el segundo número: ")
        
        # Realizar la operación según la opción elegida
        if opcion == 1:
            resultado = sumar(num1, num2)
            print(f"{num1} + {num2} = {resultado}")
        elif opcion == 2:
            resultado = restar(num1, num2)
            print(f"{num1} - {num2} = {resultado}")
        elif opcion == 3:
            resultado = multiplicar(num1, num2)
            print(f"{num1} × {num2} = {resultado}")
        elif opcion == 4:
            resultado = dividir(num1, num2)
            print(f"{num1} ÷ {num2} = {resultado}")
        elif opcion == 5:
            resultado = potencia(num1, num2)
            print(f"{num1} ^ {num2} = {resultado}")
        elif opcion == 7:
            resultado = modulo(num1, num2)
            print(f"{num1} % {num2} = {resultado}")

# Ejecutar la calculadora
if __name__ == "__main__":
    calculadora()

Mejoras adicionales

Podemos mejorar nuestra calculadora añadiendo algunas características adicionales:

Historial de operaciones

Añadamos un historial que guarde las últimas operaciones:

def calculadora_con_historial():
    """Calculadora con historial de operaciones"""
    historial = []
    
    while True:
        mostrar_menu()
        
        # Añadir opción para ver el historial
        print("9. Ver historial de operaciones")
        
        try:
            opcion = int(input("Selecciona una operación (1-9): "))
        except ValueError:
            print("Error: Debes introducir un número entero")
            continue
        
        if opcion == 8:
            print("¡Gracias por usar la calculadora! Hasta pronto.")
            break
            
        if opcion == 9:
            print("\n==== HISTORIAL DE OPERACIONES ====")
            if not historial:
                print("El historial está vacío")
            else:
                for i, operacion in enumerate(historial, 1):
                    print(f"{i}. {operacion}")
            print("=================================")
            continue
        
        # Resto del código como antes...
        
        # Guardar la operación en el historial
        historial.append(f"{num1} {operador} {num2} = {resultado}")
        
        # Si el historial supera 10 elementos, eliminar el más antiguo
        if len(historial) > 10:
            historial.pop(0)

Interfaz mejorada con colores

Para hacer la calculadora más atractiva, podemos usar la biblioteca colorama para añadir colores:

# Primero instalar la biblioteca:
# pip install colorama

from colorama import init, Fore, Style

# Inicializar colorama
init()

def mostrar_menu_color():
    """Muestra el menú con colores"""
    print(f"\n{Fore.CYAN}==== CALCULADORA EN PYTHON ===={Style.RESET_ALL}")
    print(f"{Fore.GREEN}1. Suma{Style.RESET_ALL}")
    print(f"{Fore.GREEN}2. Resta{Style.RESET_ALL}")
    # ...

Versión completa de la calculadora

Aquí tienes el código completo de nuestra calculadora con todas las mejoras:

from colorama import init, Fore, Style

# Inicializar colorama
init()

# Funciones para operaciones
def sumar(a, b):
    return a + b

def restar(a, b):
    return a - b

def multiplicar(a, b):
    return a * b

def dividir(a, b):
    if b == 0:
        return f"{Fore.RED}Error: No es posible dividir entre cero{Style.RESET_ALL}"
    return a / b

def potencia(a, b):
    return a ** b

def raiz_cuadrada(a):
    if a < 0:
        return f"{Fore.RED}Error: No se puede calcular la raíz cuadrada de un número negativo{Style.RESET_ALL}"
    return a ** 0.5

def modulo(a, b):
    if b == 0:
        return f"{Fore.RED}Error: No es posible calcular el módulo cuando el divisor es cero{Style.RESET_ALL}"
    return a % b

# Menú con colores
def mostrar_menu():
    print(f"\n{Fore.CYAN}==== CALCULADORA EN PYTHON ===={Style.RESET_ALL}")
    print(f"{Fore.GREEN}1. Suma{Style.RESET_ALL}")
    print(f"{Fore.GREEN}2. Resta{Style.RESET_ALL}")
    print(f"{Fore.GREEN}3. Multiplicación{Style.RESET_ALL}")
    print(f"{Fore.GREEN}4. División{Style.RESET_ALL}")
    print(f"{Fore.GREEN}5. Potencia{Style.RESET_ALL}")
    print(f"{Fore.GREEN}6. Raíz cuadrada{Style.RESET_ALL}")
    print(f"{Fore.GREEN}7. Módulo (resto de división){Style.RESET_ALL}")
    print(f"{Fore.GREEN}8. Salir{Style.RESET_ALL}")
    print(f"{Fore.GREEN}9. Ver historial de operaciones{Style.RESET_ALL}")
    print(f"{Fore.CYAN}=============================={Style.RESET_ALL}")

# Obtener número con manejo de errores
def obtener_numero(mensaje):
    while True:
        try:
            return float(input(f"{Fore.YELLOW}{mensaje}{Style.RESET_ALL}"))
        except ValueError:
            print(f"{Fore.RED}Error: Introduce un número válido{Style.RESET_ALL}")

# Función principal
def calculadora():
    historial = []
    
    print(f"{Fore.MAGENTA}¡Bienvenido a la Calculadora en Python!{Style.RESET_ALL}")
    
    while True:
        mostrar_menu()
        
        try:
            opcion = int(input(f"{Fore.YELLOW}Selecciona una operación (1-9): {Style.RESET_ALL}"))
        except ValueError:
            print(f"{Fore.RED}Error: Debes introducir un número entero{Style.RESET_ALL}")
            continue
        
        # Salir del programa
        if opcion == 8:
            print(f"{Fore.MAGENTA}¡Gracias por usar la calculadora! Hasta pronto.{Style.RESET_ALL}")
            break
        
        # Ver historial
        if opcion == 9:
            print(f"\n{Fore.CYAN}==== HISTORIAL DE OPERACIONES ===={Style.RESET_ALL}")
            if not historial:
                print(f"{Fore.YELLOW}El historial está vacío{Style.RESET_ALL}")
            else:
                for i, operacion in enumerate(historial, 1):
                    print(f"{Fore.WHITE}{i}. {operacion}{Style.RESET_ALL}")
            print(f"{Fore.CYAN}================================={Style.RESET_ALL}")
            continue
        
        # Verificar que la opción es válida
        if opcion < 1 or opcion > 9:
            print(f"{Fore.RED}Error: Opción no válida. Introduce un número del 1 al 9.{Style.RESET_ALL}")
            continue
        
        # Para la raíz cuadrada solo necesitamos un número
        if opcion == 6:
            num = obtener_numero("Introduce el número para calcular su raíz cuadrada: ")
            resultado = raiz_cuadrada(num)
            
            if isinstance(resultado, str):  # Si es un mensaje de error
                print(resultado)
            else:
                print(f"{Fore.CYAN}La raíz cuadrada de {num} es: {resultado}{Style.RESET_ALL}")
                historial.append(f"√{num} = {resultado}")
            continue
        
        # Para el resto de operaciones necesitamos dos números
        num1 = obtener_numero("Introduce el primer número: ")
        num2 = obtener_numero("Introduce el segundo número: ")
        
        # Realizar la operación según la opción elegida
        if opcion == 1:
            resultado = sumar(num1, num2)
            operador = "+"
        elif opcion == 2:
            resultado = restar(num1, num2)
            operador = "-"
        elif opcion == 3:
            resultado = multiplicar(num1, num2)
            operador = "×"
        elif opcion == 4:
            resultado = dividir(num1, num2)
            operador = "÷"
        elif opcion == 5:
            resultado = potencia(num1, num2)
            operador = "^"
        elif opcion == 7:
            resultado = modulo(num1, num2)
            operador = "%"
        
        # Mostrar resultado y guardar en historial si no es un mensaje de error
        if isinstance(resultado, str):  # Si es un mensaje de error
            print(resultado)
        else:
            print(f"{Fore.CYAN}{num1} {operador} {num2} = {resultado}{Style.RESET_ALL}")
            historial.append(f"{num1} {operador} {num2} = {resultado}")
        
        # Si el historial supera 10 elementos, eliminar el más antiguo
        if len(historial) > 10:
            historial.pop(0)

# Ejecutar la calculadora
if __name__ == "__main__":
    calculadora()

Resumen

En este artículo hemos creado una calculadora simple pero funcional utilizando Python. Hemos aplicado conceptos como funciones, estructuras de control, manejo de excepciones y módulos externos. La calculadora permite realizar operaciones básicas como suma, resta, multiplicación y división, así como operaciones más avanzadas como potencias, raíces cuadradas y módulo.

Además, hemos implementado características adicionales como un historial de operaciones y una interfaz mejorada con colores. Este proyecto demuestra cómo se pueden integrar diferentes conceptos de Python para crear una aplicación práctica y útil.

En los próximos artículos, continuaremos desarrollando proyectos cada vez más complejos que nos permitirán aplicar y profundizar en nuestros conocimientos de Python.