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
numero1ynumero2sean números.Métodos para cada operación:
sumar,restar,multiplicar,dividir.Método privado
_registrar_operacionpara guardar en el historial.Método
ver_historialpara 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_operaciones 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
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
Guarda el código en
calculadora_POO.py.Ejecuta en la terminal:
python calculadora_POO.pyEjemplos de uso:
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)
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)
# 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
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 resultado4. El historial de operaciones
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 += 15. Función para entender lo que escribe el usuario
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 None6. El programa principal
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
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
Guarda el código en un archivo llamado
calculadora_POO.pyAbre la terminal y ve a la carpeta donde guardaste el archivo
Ejecuta con:
python calculadora_POO.pyPrueba con estos ejemplos:
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
Publicar un comentario