Hace unos días, alguien me pidió por favor que le ayudara a realizar un programa en Python para dar con la solución al siguiente enunciado:
Supón que vas a desarrollar un programa de Python que actuará como una calculadora. La calculadora debe solicitar al usuario que introduzca dos números y una operación. La operación puede ser sumar, restar, multiplicar o dividir los dos números. El programa debe comprobar que el usuario no ha introducido el valor 0 para ninguno de los dos números. El programa también debe comprobar que el usuario ha entrado una de las 4 operaciones de valor (sumar, restar, multiplicar o dividir). El programa debe realizar el cálculo correspondiente y debe mostrar los resultados.
Me pareció por demás curioso, ya que es del tipo de problemas en el que puedes llegar a la solución desde muchos caminos. Y de entre todos esos caminos, intenté usar el más elegante posible. El resultado lo comparto a continuación.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Copyright (c) <2015> <Manuel Alejandro Jiménez Quintero>
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.
#
# Usar expresiones regulares es la mejor manera de verificar si una cadena cumple con
# las condiciones que se propongan. En este caso, los operadores aritméticos permitidos.
import re
# Se realiza la lectura de la operacion a realizar.
operacion = raw_input("Escribe una operación aritmética simple (+-*/). Ej. \"2+2\": ").replace(" ", "")
# Aquí se realiza la comprobación para ver si se escribió bien la operación. La expresión regular
# busca que si la cadena de texto comienza con algún número (^d+). Después verifica si a continuación
# se encuentra uno de los siguientes operadores: +, -, * o /. Por último, comprueba si la cadena finaliza
# con algún otro número.
operadores_permitidos = re.match(r'^\d+[\+\-\*\/]\d+$', operacion)
if operadores_permitidos:
# Si la operación tiene el formato correcto, entonces se evalua con la función eval() y se imprime.
# Pero antes hay que comprobar una última cosa, si se va a dividir por 0. Para esto se ocupa lanzar
# una excepción. Si no sabes qué es una excepción, la explicación sencilla es que es la manera
# en que nos anticipamos a los errores que podrían suceder y determinamos cuál será la forma en
# que los manejaremos. Lo que hay dentro de try se intentará realizar. Si algo sale mal, entonces
# lanzamos la excepción ZeroDivisionError, que será el error que estamos previendo que podría suceder.
# Al final envíamos un mensaje al usuario por si sucede esto.
try:
print eval(operacion)
except ZeroDivisionError, e:
print "Es imposible dividir por 0."
else:
# De lo contrario, se advierte al usuario de que la operación que ha querido realizar no sigue el
# formato adecuado.
print "La operación (" + operacion + ") no está en un formato legible para este programa."
Como dije, curioso. :)
No hay comentarios.:
Publicar un comentario