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

1-Teclas

2-canvas

3-1-Personajes