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

viernes, 1 de mayo de 2015

Breves comentarios sobre los libros que leí en Abril de 2015

Los siguientes comentarios son totalmente personales y para nada profesionales. Además, por su naturaleza, podrían contener spoilers.


Secretos por Sara Shepard (2007)

Este es el segundo de nosécuantos libros de esta saga. En comparación con el primero, este me pareció más atractivo. Quizás sea porque relata los sucesos ya de forma más diferente a como suceden en la serie de televisión.

Algo que me llama la atención es que las chicas no terminan de reunirse aún después de todos lo que ha ocurrido. Entiendo que su relación se deterioró por no haberse visto en muchos años, pero las circunstancias apremian para que actúen en equipo, mas apenas se confían algo. Es cierto que cada quién está ocupada con su secreto en particular, pero de eso a no preocuparse por las que antes eran sus mejores amigas (o que al menos se respeten) ya es mucho. Es como si de verdad todo hubiera sido un mundo alterno creado por Allison y ahora apenas se comienzan a conocer.

Por otro lado... ¡se murió Toby! Y no sólo eso, ¡se suicidó! O bueno, quizás sólo lo están haciendo parecer como así sucedió. No me sorprendería si en el siguiente libro «revive» o no era él. 

Por último, es de agradecer que Aria y Ezra no se hayan dirigido apenas la palabra. En la serie desde el principio pareciera que se pegaron con chicle y no se pudieran separar, aún a pesar de sus peleas constantes que desde ya se sabe que pasará (una versión no violenta del ciclo de la luna de miel). Al menos así parece más real su relación, no tan a la Disney.

A ver que tal sale el tercero.

El curioso incidente del perro a medianoche por Mark Haddon (2003)

Esta historia decidí leerla porque me llamó la atención el nombre; me gustan los libros con títulos curiosos. Por algún motivo sabía que no me decepcionaría, y efectivamente, no me decepcionó.

Leer este libro fue genial. Me impresionó la forma en que se desenvuelven las cosas a partir de la muerte de Wellington, la cual queda en una especie de segundo plano por todo lo que Christopher descubre mientras la hace de detective al intentar encontrar al asesino.

Es divertido que se incluyan guiños matemáticos, tanto en la narración como en la estructuración del libro. Junto a la forma de narrar la historia en primera persona, hacen de esta una novela muy particular. 

Lo que sí no me gustó fue que, por un error de su padre, de pronto Christopher lo odie y le tenga miedo. No es lógico puesto que su padre le demostró muchas veces que podía confiar en él, cuidándolo, dándole cariño y luchando él sólo para que no le faltara nada. Es más, juzguen por ustedes mismos la forma en que se explica:

Mira, a lo mejor no debería decirte esto, pero... quiero que sepas que puedes confiar en mí. Y... vale, a lo mejor no digo siempre la verdad. Dios sabe que lo intento, Christopher, Dios sabe que lo hago, pero... La vida es difícil, ya lo sabes. Joder, es durísimo decir la verdad todo el tiempo. A veces es imposible. Y quiero que sepas que lo estoy intentando, que de verdad lo estoy intentando. Y quizás éste no sea un buen momento para decirte esto, y sé que no va a gustarte, pero... Tienes que saber que a partir de ahora voy a decirte la verdad. Acerca de todo. Porque... si uno no dice la verdad ahora, entonces más tarde... más tarde duele todavía más. Así que...

Eso es amor. Al menos debió dudar antes de decidir que su padre era un hombre malo.

Sin embargo, a su madre no parece guardarle ningún resentimiento. Aún cuando fue ella quien engañó a su padre, los abandonó a ambos y sin más se desentendió con la excusa de que no podía con el paquete. No comprendo tal razonamiento por parte de Christopher, quién dice le agrada el sentido común. Fue algo superficial.

El curioso incidente del perro a medianoche fue mi libro favorito de abril. Si tienen oportunidad de leerlo, seguro que me darán la razón. También se está presentando en teatro, aunque lamentablemente no en mi ciudad. Ojalá algún día se me haga asistir.