lunes, 18 de mayo de 2015

Calculadora escrita en Python para resolver operaciones aritméticas simples

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.: