EJERCICIO 4-CalculadoraBasicaPOO

 Calculadora Básica con POO en Python

📋 Objetivo

Desarrollar una calculadora básica en Python usando Programación Orientada a Objetos (POO) que:

  • Realice las 4 operaciones básicas: suma, resta, multiplicación y división.

  • Interprete expresiones matemáticas escritas por el usuario (ej: 5 + 3).

  • Mantenga un historial de operaciones.

  • Maneje errores como división por cero o entradas no válidas.

  • Permita al usuario salir o ver el historial mediante comandos.


🧩 Estructura del código propuesto

1. Clase Calculadora

  • Atributos protegidos: _numero1_numero2_historial.

  • Propiedades (getters/setters) para validar que numero1 y numero2 sean números.

  • Métodos para cada operación: sumarrestarmultiplicardividir.

  • Método privado _registrar_operacion para guardar en el historial.

  • Método ver_historial para mostrar las operaciones guardadas.

2. Función interpretar_expresion

  • Recibe un string como "5 + 3".

  • Detecta el operador (+-*/).

  • Separa y convierte los números a float.

  • Retorna num1, num2, operador.

3. Función main

  • Bucle infinito para interactuar con el usuario.

  • Comandos especiales: "salir" y "historial".

  • Manejo de errores con try-except.


🧠 Explicación de la solución

✅ Principios de POO aplicados

  • Encapsulación: Atributos protegidos y métodos públicos.

  • Abstracción: El usuario solo usa métodos como sumar() sin saber cómo se guarda el historial.

  • Métodos privados_registrar_operacion es interno.

✅ Manejo de errores

  • Validación de tipos en setters.

  • Captura de división por cero.

  • Expresiones mal formadas.


🔧 Código completo de la solución

python
class Calculadora:
    def __init__(self, numero1=0, numero2=0):
        self._numero1 = numero1
        self._numero2 = numero2
        self._historial = []

    # Propiedades (getters y setters)
    @property
    def numero1(self):
        return self._numero1

    @numero1.setter
    def numero1(self, nuevo_numero1):
        if type(nuevo_numero1) in (int, float):
            self._numero1 = nuevo_numero1
        else:
            raise ValueError("Debe ser un número")

    @property
    def numero2(self):
        return self._numero2

    @numero2.setter
    def numero2(self, nuevo_numero2):
        if type(nuevo_numero2) in (int, float):
            self._numero2 = nuevo_numero2
        else:
            raise ValueError("Debe ser un número")

    # Operaciones matemáticas
    def sumar(self):
        resultado = self._numero1 + self._numero2
        self._registrar_operacion('+', resultado)
        return resultado

    def restar(self):
        resultado = self._numero1 - self._numero2
        self._registrar_operacion('-', resultado)
        return resultado

    def multiplicar(self):
        resultado = self._numero1 * self._numero2
        self._registrar_operacion('*', resultado)
        return resultado

    def dividir(self):
        if self._numero2 == 0:
            raise ValueError("No se puede dividir entre cero")
        resultado = self._numero1 / self._numero2
        self._registrar_operacion('/', resultado)
        return resultado

    # Historial
    def _registrar_operacion(self, operador, resultado):
        self._historial.append({
            'operacion': f"{self._numero1} {operador} {self._numero2}",
            'resultado': resultado
        })

    def ver_historial(self):
        if not self._historial:
            print("No hay operaciones en el historial.")
            return
        print("\n--- Historial de Operaciones ---")
        for i, op in enumerate(self._historial, 1):
            print(f"{i}. {op['operacion']} = {op['resultado']}")


# Función para interpretar expresiones
def interpretar_expresion(expresion):
    for operador in ['+', '-', '*', '/']:
        if operador in expresion:
            partes = expresion.split(operador)
            if len(partes) == 2:
                try:
                    num1 = float(partes[0].strip())
                    num2 = float(partes[1].strip())
                    return num1, num2, operador
                except ValueError:
                    return None
    return None


# Programa principal
def main():
    calc = Calculadora()
    print("Calculadora Básica. Escribe 'salir' para terminar o 'historial' para ver operaciones.\n")

    while True:
        entrada = input("Ingresa la operación (ejemplo: 5 + 5): ")

        if entrada.strip().lower() == "salir":
            print("¡Hasta pronto!")
            break

        if entrada.strip().lower() == "historial":
            calc.ver_historial()
            continue

        resultado = interpretar_expresion(entrada)
        if not resultado:
            print("Expresión no válida. Usa el formato: número operador número (ej. 5 + 5)\n")
            continue

        num1, num2, operador = resultado
        calc.numero1 = num1
        calc.numero2 = num2

        try:
            if operador == '+':
                print("Resultado:", calc.sumar())
            elif operador == '-':
                print("Resultado:", calc.restar())
            elif operador == '*':
                print("Resultado:", calc.multiplicar())
            elif operador == '/':
                print("Resultado:", calc.dividir())
        except ValueError as e:
            print("Error:", e)

        print()


if __name__ == "__main__":
    main()

🧪 Cómo probar la calculadora

  1. Guarda el código en calculadora_POO.py.

  2. Ejecuta en la terminal:

    bash
    python calculadora_POO.py
  3. Ejemplos de uso:

    text
    Ingresa la operación (ejemplo: 5 + 5): 10 / 2
    Resultado: 5.0
    
    Ingresa la operación (ejemplo: 5 + 5): historial
    --- Historial de Operaciones ---
    1. 10.0 / 2.0 = 5.0
    
    Ingresa la operación (ejemplo: 5 + 5): salir
    ¡Hasta pronto!

📌 Notas adicionales

  • ✅ Cumple con todos los criterios de la lista de cotejo.

  • ✅ Manejo de errores incluido.

  • ✅ Historial funcional.

  • ✅ Código modular y reusable.


***************************************************

Calculadora Básica con POO en Python

📋 Lo que vamos a hacer

Vamos a crear una calculadora que:

  • Haga sumas, restas, multiplicaciones y divisiones

  • Entienda cuando escribes "5 + 3"

  • Recuerde todas las operaciones que hagas

  • Te avise si cometes errores

  • Puedas salir cuando quieras


🧩 Partes del programa

1. La clase Calculadora (el cerebro)

python
class Calculadora:
    def __init__(self, numero1=0, numero2=0):
        # Estos son los números con los que trabajaremos
        self._numero1 = numero1
        self._numero2 = numero2
        # Aquí guardaremos el historial
        self._historial = []

2. Getters y Setters (para validar números)

python
    # Para obtener el primer número
    @property
    def numero1(self):
        return self._numero1

    # Para cambiar el primer número (con validación)
    @numero1.setter
    def numero1(self, nuevo_numero1):
        if type(nuevo_numero1) == int or type(nuevo_numero1) == float:
            self._numero1 = nuevo_numero1
        else:
            raise ValueError("Debe ser un número")

    # Lo mismo para el segundo número
    @property
    def numero2(self):
        return self._numero2

    @numero2.setter
    def numero2(self, nuevo_numero2):
        if type(nuevo_numero2) == int or type(nuevo_numero2) == float:
            self._numero2 = nuevo_numero2
        else:
            raise ValueError("Debe ser un número")

3. Las operaciones matemáticas

python
    def sumar(self):
        resultado = self._numero1 + self._numero2
        self._registrar_operacion('+', resultado)
        return resultado

    def restar(self):
        resultado = self._numero1 - self._numero2
        self._registrar_operacion('-', resultado)
        return resultado

    def multiplicar(self):
        resultado = self._numero1 * self._numero2
        self._registrar_operacion('*', resultado)
        return resultado

    def dividir(self):
        if self._numero2 == 0:
            raise ValueError("No se puede dividir entre cero")
        resultado = self._numero1 / self._numero2
        self._registrar_operacion('/', resultado)
        return resultado

4. El historial de operaciones

python
    def _registrar_operacion(self, operador, resultado):
        # Guardamos cada operación en el historial
        operacion_guardada = {
            'operacion': f"{self._numero1} {operador} {self._numero2}",
            'resultado': resultado
        }
        self._historial.append(operacion_guardada)

    def ver_historial(self):
        if len(self._historial) == 0:
            print("No hay operaciones en el historial.")
            return
        
        print("\n--- Historial de Operaciones ---")
        contador = 1
        for operacion in self._historial:
            print(f"{contador}. {operacion['operacion']} = {operacion['resultado']}")
            contador += 1

5. Función para entender lo que escribe el usuario

python
def interpretar_expresion(expresion):
    # Buscamos qué operador usa el usuario
    operadores = ['+', '-', '*', '/']
    
    for operador in operadores:
        if operador in expresion:
            # Dividimos la expresión en dos partes
            partes = expresion.split(operador)
            
            if len(partes) == 2:
                try:
                    # Convertimos a números
                    num1 = float(partes[0].strip())
                    num2 = float(partes[1].strip())
                    return num1, num2, operador
                except ValueError:
                    return None
    return None

6. El programa principal

python
def main():
    # Creamos nuestra calculadora
    calc = Calculadora()
    
    print("Calculadora Básica")
    print("Escribe 'salir' para terminar")
    print("Escribe 'historial' para ver operaciones")
    print("Ejemplo: 5 + 3")
    print()

    while True:
        # Pedimos al usuario que escriba
        entrada = input("Ingresa la operación (ejemplo: 5 + 5): ")

        # Si quiere salir
        if entrada.strip().lower() == "salir":
            print("¡Hasta pronto!")
            break

        # Si quiere ver el historial
        if entrada.strip().lower() == "historial":
            calc.ver_historial()
            print()
            continue

        # Intentamos entender lo que escribió
        resultado_interpretado = interpretar_expresion(entrada)
        
        if resultado_interpretado is None:
            print("Expresión no válida. Usa el formato: número operador número")
            print("Ejemplo: 5 + 5")
            print()
            continue

        # Separamos los resultados
        num1, num2, operador = resultado_interpretado
        
        # Actualizamos los números de la calculadora
        calc.numero1 = num1
        calc.numero2 = num2

        # Realizamos la operación correspondiente
        try:
            if operador == '+':
                resultado_final = calc.sumar()
                print("Resultado:", resultado_final)
            elif operador == '-':
                resultado_final = calc.restar()
                print("Resultado:", resultado_final)
            elif operador == '*':
                resultado_final = calc.multiplicar()
                print("Resultado:", resultado_final)
            elif operador == '/':
                resultado_final = calc.dividir()
                print("Resultado:", resultado_final)
        except ValueError as error:
            print("Error:", error)
        
        print()

# Iniciamos el programa
if __name__ == "__main__":
    main()

🔧 Código completo para copiar y pegar

python
class Calculadora:
    def __init__(self, numero1=0, numero2=0):
        self._numero1 = numero1
        self._numero2 = numero2
        self._historial = []

    @property
    def numero1(self):
        return self._numero1

    @numero1.setter
    def numero1(self, nuevo_numero1):
        if type(nuevo_numero1) == int or type(nuevo_numero1) == float:
            self._numero1 = nuevo_numero1
        else:
            raise ValueError("Debe ser un número")

    @property
    def numero2(self):
        return self._numero2

    @numero2.setter
    def numero2(self, nuevo_numero2):
        if type(nuevo_numero2) == int or type(nuevo_numero2) == float:
            self._numero2 = nuevo_numero2
        else:
            raise ValueError("Debe ser un número")

    def sumar(self):
        resultado = self._numero1 + self._numero2
        self._registrar_operacion('+', resultado)
        return resultado

    def restar(self):
        resultado = self._numero1 - self._numero2
        self._registrar_operacion('-', resultado)
        return resultado

    def multiplicar(self):
        resultado = self._numero1 * self._numero2
        self._registrar_operacion('*', resultado)
        return resultado

    def dividir(self):
        if self._numero2 == 0:
            raise ValueError("No se puede dividir entre cero")
        resultado = self._numero1 / self._numero2
        self._registrar_operacion('/', resultado)
        return resultado

    def _registrar_operacion(self, operador, resultado):
        operacion_guardada = {
            'operacion': f"{self._numero1} {operador} {self._numero2}",
            'resultado': resultado
        }
        self._historial.append(operacion_guardada)

    def ver_historial(self):
        if len(self._historial) == 0:
            print("No hay operaciones en el historial.")
            return
        
        print("\n--- Historial de Operaciones ---")
        contador = 1
        for operacion in self._historial:
            print(f"{contador}. {operacion['operacion']} = {operacion['resultado']}")
            contador += 1


def interpretar_expresion(expresion):
    operadores = ['+', '-', '*', '/']
    
    for operador in operadores:
        if operador in expresion:
            partes = expresion.split(operador)
            
            if len(partes) == 2:
                try:
                    num1 = float(partes[0].strip())
                    num2 = float(partes[1].strip())
                    return num1, num2, operador
                except ValueError:
                    return None
    return None


def main():
    calc = Calculadora()
    
    print("Calculadora Básica")
    print("Escribe 'salir' para terminar")
    print("Escribe 'historial' para ver operaciones")
    print("Ejemplo: 5 + 3")
    print()

    while True:
        entrada = input("Ingresa la operación (ejemplo: 5 + 5): ")

        if entrada.strip().lower() == "salir":
            print("¡Hasta pronto!")
            break

        if entrada.strip().lower() == "historial":
            calc.ver_historial()
            print()
            continue

        resultado_interpretado = interpretar_expresion(entrada)
        
        if resultado_interpretado is None:
            print("Expresión no válida. Usa el formato: número operador número")
            print("Ejemplo: 5 + 5")
            print()
            continue

        num1, num2, operador = resultado_interpretado
        
        calc.numero1 = num1
        calc.numero2 = num2

        try:
            if operador == '+':
                resultado_final = calc.sumar()
                print("Resultado:", resultado_final)
            elif operador == '-':
                resultado_final = calc.restar()
                print("Resultado:", resultado_final)
            elif operador == '*':
                resultado_final = calc.multiplicar()
                print("Resultado:", resultado_final)
            elif operador == '/':
                resultado_final = calc.dividir()
                print("Resultado:", resultado_final)
        except ValueError as error:
            print("Error:", error)
        
        print()


if __name__ == "__main__":
    main()

🧪 Cómo usar la calculadora

  1. Guarda el código en un archivo llamado calculadora_POO.py

  2. Abre la terminal y ve a la carpeta donde guardaste el archivo

  3. Ejecuta con: python calculadora_POO.py

  4. Prueba con estos ejemplos:

    text
    Ingresa: 10 + 5
    Resultado: 15.0
    
    Ingresa: 8 * 3
    Resultado: 24.0
    
    Ingresa: historial
    (Te mostrará todas las operaciones)
    
    Ingresa: salir
    (El programa termina)

✅ Lo que aprendiste

  • Clases y objetos: La calculadora es un objeto

  • Encapsulación: Los números están protegidos

  • Métodos: Cada operación es un método

  • Historial: Cómo guardar y mostrar información

  • Manejo de errores: Cómo evitar que el programa se caiga

Comentarios

Entradas populares de este blog

¿Qué es un Closure?

Calculadora de edad

Funciones en Python: con y sin paréntesis