Evaluador de expresiones matemáticas

Evaluar una expresión matemática como 2 + 6 * 3 puede ser fácil, pero una expresión pude ser mucho más compleja, como por ejemplo: (sin (35) ^ e-15) / tan (45), puede resultar más complicado, por lo que dedicaremos este tutorial al estudio del algoritmo que nos permitirá obtener el resultado de una operación aritmética como la mostrada.

Algoritmo para evaluar una expresión matemática

Primero debemos convertir nuestra expresión de Infijo a Postfijo, una expresión en notación infija es la forma habitual en la que escribimos, pero esta notación pude ser un poco difícil de evaluar por lo que es mejor trabajarla en notación postfija, la expresión 5 + 6 * 3 está en notación infija convertida a postfija seria 5 6 3 * +, esta expresión es más fácil de evaluar además la notación postfija no requiere de paréntesis por lo que es aún más simple.

Notación polaca inversa

La notación polaca inversa, notación de postfijo, o notación posfija, (en inglés, Reverse Polish notation, o RPN), es un método algebraico alternativo de introducción de datos. Su nombre viene por analogía con la relacionada notación polaca, una notación de prefijo introducida en 1920 por el matemático polaco Jan Łukasiewicz, en donde cada operador está antes de su operando.

En la notación polaca inversa es al revés, primero están los operando y después viene el operador que va a realizar los cálculos sobre ellos. Tanto la notación polaca como la notación polaca inversa no necesitan usar paréntesis para indicar el orden de las operaciones mientras la aridad del operador sea fija.

Convertir una expresión matemática de infija a postfija.

Necesitaremos una entrada la cual será una cadena de texto con la expresión a convertir, una pila para almacenar los operadores y una cadena de texto que contendrá la salida que representa la expresión en formato postfijo.

Resumen de los diferentes casos del algoritmo de análisis sintáctico de expresiones con precedencia de operadores, recorrer la entrada(expresión a evaluar) de izquierda a derecha, si encontramos un:

Operando: enviarlo a la salida.

Operador: des apilar todos los operadores hasta encontrar uno de menor precedencia o igual precedencia con asociatividad por la derecha. Apilar entonces el operador encontrado. Nota: Los operadores des apilados los enviamos a la salida.

Paréntesis: uno izquierdo lo enviamos a la pila, uno derecho des apilamos todos los operadores de la pila hasta encontrar un paréntesis izquierdo. Nota: No es necesario enviar los paréntesis a la salida.

Al final enviar a la salida todos los operadores que aún están en la pila.

Entrada: 5 ^ (6 * 8 / 23) – sin(45)

Salida: 5 6 8 * 23 / ^ 45 sin -

convertir expresión matemática de infija a postfija

Evaluar una expresión postfija

Una expresión postfija está formada por una serie de operandos y operadores la cual se evalúa utilizando una maquina postfija, de la siguiente forma: Recorremos la expresión de izquierda a derecha, si encontramos un:

Operando: lo enviamos a la pila.

Operador: sacamos de la pila los operando necesarios, ejecutamos la operación y el resultado lo enviamos a la pila.

Al final solo quedara en la pila un operando, este será nuestro resultado.

Nota: los operadores salen de la pila en orden inverso, el primer elemento des apilado se convierte en el parámetro derecho del operador y el segundo en el izquierdo.

evaluar una expresion aritmética

Evaluador de operaciones aritméticas

Con los conceptos anteriores ya podemos empezar a crear una calculadora desde una muy simple hasta la más compleja. A continuación se presenta la clase Evaluador que recibe como entrada una expresión infija, la convierte a postfija y la evalúa. El cuadro muestra las operaciones se soporta nuestra calculadora, aunque solo contamos con las funciones más básicas no es difícil agregar otras y hacer nuestra calculadora más completa.

Operadores
Operación
*
multiplicación
/
división
-
resta
^
potencia
%
modulo o resto de división
+
suma
Constantes
pi
e
Funciones
sin cos tan sinh cosh tanh sec csc cot sech csch coth ln log abs
Estas funciones se deben utilizar con los paréntesis ejemplo: sin(45) + 59
Las funciones trigonométricas las trabajamos en radianes.

Además podemos incluir x, y, z para crear una función de x, y, z, por ejemplo 25x + 5y – 3z al evaluarla debemos pasar como argumentos los valores de x, y, z o los que estemos utilizando, también es posible utilizar los paréntesis para agrupar operaciones.

Descargar código fuente .zip

Comentarios

  1. Hola, Espero que estés muy bien, una pregunta ¿No tienes en código en Java Netbeans? o como puedo ver este código para montarlo en Java NetBeans? Gracias ^^

    ResponderEliminar
    Respuestas
    1. Por el momento no he pensado en crear una implementación del algoritmo en java, c# y java son lenguajes parecidos por lo fácilmente se puede reescribir el código, anímate ha hacerlo.

      Eliminar
    2. Encontré un vídeo de un profesor que lo explica

      https://www.youtube.com/watch?v=xKhA9W1fUZU

      Eliminar
  2. Si tuvieras implementado el evaluador en SQL Transact de Sql Server seria excelente, o en visual Basic 6
    saludos.

    ResponderEliminar
  3. Hola necesito ayuda!!! no puedo descargar el codigo fuente, ademas me marca un error en 'Tipo', es el siguiente:

    No se puede encontrar el tipo o el nombre de espacio de nombres 'Tipo' (¿falta una directiva using o una referencia de ensamblado?)

    me puedes ayudar, es muy importante!!!

    ResponderEliminar
  4. Hola amigo, habrá que siempre depurar el software, gracias por tu ayuda. Te comento que me falló cuando expresé [-5^2] que me arrojó el siguiente resultado:

    expresion infija: -5^2
    expresion postfija: -1 5 2 ^ *
    resultado: -25

    Excel da 25 positivo en esa forma aunque si lo ingreso como [-(25^2)] sí me da 25 negativo. Al final Excel está tomando en cuenta los parentesis mas no este algoritmo, pero igual, si lo logro arreglar te aviso.

    Saludos cordiales.

    ResponderEliminar
  5. Hola para crear funciones de que forma pasamos los valores x,y, ..?
    saludos

    ResponderEliminar

Publicar un comentario

Temas relacionados

Entradas populares de este blog

tkinter Grid

tkinter Canvas

Histogramas OpenCV Python

Python Binance API