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