Vamos a comenzar a tratar la verdadera función de nuestro i. Para ello hemos creado un método llamada “interprete”, en el que introducimos una línea limpia de código y que devuelve un String con el resultado. Primero vamos a sacar cada uno de los operandos de la línea usando un Tokenizer con los elementos “+-*/()”. En caso de que no podamos convertir el token en un entero lanzaremos la excepción y dejaremos de ejecutar acciones para esta línea, pues se trata de un error ortográfico. Una vez acabado, vamos a continuar guardando las operaciones a realizar con los operandos anteriores. Para ello convertimos la línea de entrada en un array de caracteres y de ese modo podremos operar con total comodidad.

Este algoritmos será un poco más complicado, tendremos dos listas, que crecerán a la par. En una de ellas guardaremos las operaciones y en otra guardaremos la prioridad con la que deben ser solucionadas. Examinaremos elemento a elemento el array, y cuando encontremos los símbolos: ‘+’, ‘-’, ‘*’ ó ‘/’ guardaremos en una entrada de la lista el símbolo y la prioridad que tenga en ese momento ese símbolo. Si encontramos el símbolo ‘(’ aumentamos la prioridad y si por el contrario encontramos ‘)’ disminuiremos la prioridad. De este modo podemos conservar la prioridad de cada operación a la hora de los usos de paréntesis.

Una vez acabado esto, es hora de los cálculos. Entraremos en un bucle que se repetirá tantas veces como la máxima prioridad que hayamos detectado. Y solucionaremos ahora todas las divisiones, multiplicaciones, sumas, y restas (en este orden) que coincidan con la prioridad actual. Una vez que hayamos resuelto todas las operaciones de una determinada prioridad, decreceremos la prioridad, y volveremos a realizar todas las operaciones. El proceso acabará cuando la prioridad sea -1. En ese momento solo deberemos tomar el valor guardado en la lista de los operandos en la posición ‘0’ y ese será el resultado de las operaciones.

Ni que decir tiene que si en el caso de que nos encontremos con que el número de operaciones es 0, la solución será directamente el valor guardado en la primera posición de la lista. De este sencillo modo habremos resuelto todos los apartados excepto el del operador unario. Este es mi espinita clavada. No se me ocurre como puedo solucionarlo y me trae por la calle de la amargura, pues la solución se ha de adaptar a la solución actual, ya que de 5 requisitos tenemos resueltos 4.

Se han realizado distintos cambios sencillos que no requieren mucha explicación en el código actual con respecto al anterior publica, además los comentarios del actual están basados en un i que no reconoce el operador unario ‘-’, por lo que debe detectar el símbolo ‘-’ como una operación. Esto será cambiado en el momento en el que se le cambie el comportamiento, pues mi idea principal es que una resta, se convierta en una suma en el que el segundo operando es un número negativo, pero seguimos encontrando problemas que no se me ocurre como abordar. Seguiré pensando en ello y lo publicaré cuando me ponga manos la obra.

Saludos,
Lázarus Surazal.

Descarga:
[Enlace eliminado]

Entradas relacionadas

Perfil
prLázarus logo info
Carlos J. Peláez Rivas (Lázarus Surazal)
Graduado y Máster en Ingeniería Informática por la Universidad de Málaga. Actualmente trabajando como desarrollador de aplicaciones en Java usando Vaadin.
Apasionado de los videojuegos, la música y alguna que otra tecnología, siempre buscando cosas nuevas que aprender y hacer.
Más sobre mi...
Contacto
Notificaciones