elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  [ACTUALIZADO FUNCIONAL]Analizador de expresiones numéricas [SOURCE]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [ACTUALIZADO FUNCIONAL]Analizador de expresiones numéricas [SOURCE]  (Leído 8,570 veces)
Debci
Wiki

Desconectado Desconectado

Mensajes: 2.021


Actualizate o muere!


Ver Perfil WWW
[ACTUALIZADO FUNCIONAL]Analizador de expresiones numéricas [SOURCE]
« en: 30 Marzo 2010, 10:42 am »

Hola a todos, tengo ya casi acabado el analizador de expresiones numéricas, le introduces una expresion aritmetica con variables inclusive, la analiza y resuelve, pero aun tiene un error que no he conseguido solucionar, os dejo el codigo y el error:

Código
  1. package main;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.math.BigDecimal;
  7. import java.util.HashMap;
  8. import java.util.Map;
  9. import java.util.Vector;
  10.  
  11. import net.java.dev.eval.Expression;
  12.  
  13. public class principal {
  14. //Por cutre que parezca, si he metido el abecedario en una matriz para identificar incognitas...
  15. //xD
  16. public static char[] TokensVariables = {'a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', 'e', 'E', 'f', 'F', 'g', 'G', 'h', 'H', 'i', 'I', 'j', 'J', 'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N', 'o', 'O', 'p', 'P', 'q', 'Q', 'r', 'R', 's', 'S', 't', 'T', 'u', 'U', 'v', 'V', 'w', 'W', 'x', 'X', 'y', 'Y', 'z', 'Z'};
  17. public static int cuantasVariables = 0;
  18. public static Vector<Character> vectorOperandos = new Vector(10, 5);
  19. public static Vector<Character> vectorVariables = new Vector(10, 5);
  20.  
  21. public static void main(String args[])
  22. {
  23.  
  24.   String expresion = new String("2*x+b");
  25.  
  26.   System.out.println("\n"+Procesador(preProcesador(expresion), expresion)); //La recursividad es inutil aqui, o quizas lo soy yo...
  27.  
  28. }
  29. static int[] preProcesador(String argumento)
  30. {
  31. char[] TokensOperandos = {'+', '-', '*', '/', '^'};
  32.  
  33. char[] TokensVariables = {'a', 'A', 'b', 'B', 'c', 'C', 'd', 'D', 'e', 'E', 'f', 'F', 'g', 'G', 'h', 'H', 'i', 'I', 'j', 'J', 'k', 'K', 'l', 'L', 'm', 'M', 'n', 'N', 'o', 'O', 'p', 'P', 'q', 'Q', 'r', 'R', 's', 'S', 't', 'T', 'u', 'U', 'v', 'V', 'w', 'W', 'x', 'X', 'y', 'Y', 'z', 'Z'};
  34.  
  35. int countOperandos = 0;
  36. int countVariables = 0;
  37. /*BUCLE SEPARADOR DE OPERANDOS*/
  38.  
  39. /*-NOTA: ESTE ALGORITMO SE PUEDE MEJORAR, PUES EL BUCLE SOBRECARGA*/
  40. //                                        ^
  41. //                                        |
  42. //La pereza hace cosas muy malas...  -----|
  43. //Bucle que busca operandos y los distribuye en memoria
  44. for(int i = 0; i< argumento.length(); i++)
  45. {
  46. //Bucle para recorrer la matriz con los tokens
  47. for(int j = 0; j < TokensOperandos.length; j++)
  48. {
  49. char chVolatil = TokensOperandos[j]; //Un caprichito de programador idiota :P
  50. if(argumento.charAt(i) == chVolatil)
  51. {
  52. vectorOperandos.add(chVolatil);
  53. countOperandos++;
  54. }
  55. }
  56. }
  57. /*BUCLE PARA SEPARAR VARIABLES                                    */
  58. /*-NOTA: ESTE ALGORITMO SE PUEDE MEJORAR, PUES EL BUCLE SOBRECARGA*/
  59.    //                                        ^
  60. //                                        |
  61. //La pereza hace cosas muy malas...  -----|
  62. for(int i = 0; i < argumento.length(); i++)
  63. {
  64. //Bucle para recorrer la matriz con los tokens
  65. for(int j = 0; j < TokensVariables.length; j++)
  66. {
  67. char varVolatil = TokensVariables[j]; //Un caprichito de programador idiota :P
  68. if(argumento.charAt(i) == varVolatil)
  69. {
  70. vectorVariables.add(varVolatil);
  71. countVariables++;
  72. }
  73. }
  74. }//Que poco me gusta trabajar, y como se nota el copypaste de este fragmento...
  75. //Para que codearlo 2 veces? Es inutil hacerlo :P
  76. System.out.print("Estos son los " + vectorOperandos.size() + " operandos que hay en la expresion:\n" );
  77. System.out.print("[");
  78. for(int i=0; i<vectorOperandos.size(); i++){
  79. if(i == 0)
  80. {
  81.        System.out.print(vectorOperandos.elementAt(i));
  82. }else{
  83.    System.out.print(","+vectorOperandos.elementAt(i));
  84. }
  85.    }
  86. System.out.print("]\n");
  87.    System.out.println("/////////////////////////////////////////////////////////////////////////////// ");
  88.    System.out.println("############################################################################### ");
  89.    System.out.println("/////////////////////////////////////////////////////////////////////////////// ");
  90. System.out.print("Y aqui estan las " + vectorVariables.size() + " variables o incognitas de la expresion:\n");
  91. System.out.print("[");
  92. for(int i=0; i<vectorVariables.size(); i++){
  93. if(i == 0)
  94. {
  95.        System.out.print(vectorVariables.elementAt(i));
  96. }else{
  97.    System.out.print(","+vectorVariables.elementAt(i));
  98. }
  99.    }
  100. System.out.print("]");
  101. int[] salida = {countOperandos, countVariables};
  102. return salida;
  103. }
  104. static BigDecimal Procesador(int[] cuantos, String que)
  105. {
  106.  
  107. Expression exp = new Expression(que);
  108.     BufferedReader br = new BufferedReader(isr);
  109.  
  110. Map<String, BigDecimal> variables = new HashMap<String, BigDecimal>();
  111.  
  112. for(int j = 0; j < cuantos[1]; j++)
  113. {
  114. System.out.print("\nDame un valor para la variable " + vectorVariables.elementAt(j) + " :\n");
  115. try {
  116. String expresionVolatil = br.readLine();
  117.            variables.put(String.valueOf(vectorVariables.elementAt(j)), Procesador(preProcesador(expresionVolatil), expresionVolatil));
  118. } catch (IOException e) {
  119.           e.printStackTrace();
  120. }
  121. }
  122.     BigDecimal result = exp.eval(variables);
  123.  
  124. return result;
  125. }
  126. }
  127.  
  128.  
Y aqui la salida de la ejecucion del programita en cuestion:
OUT:

Ya depurado el programa hace su funcion especial solo tiene un pequeño fallo que no soy capaz de ver:
Citar
Estos son los 2 operandos que hay en la expresion:
[*,+]
///////////////////////////////////////////////////////////////////////////////
###############################################################################
///////////////////////////////////////////////////////////////////////////////
Y aqui estan las 2 variables o incognitas de la expresion:
[x,b]
Dame un valor para la variable x :
5*3
Estos son los 3 operandos que hay en la expresion:
[*,+,*]
///////////////////////////////////////////////////////////////////////////////
###############################################################################
///////////////////////////////////////////////////////////////////////////////
Y aqui estan las 2 variables o incognitas de la expresion:
[x,b]
Dame un valor para la variable b :
6*x
Estos son los 4 operandos que hay en la expresion:
[*,+,*,*]
///////////////////////////////////////////////////////////////////////////////
###############################################################################
///////////////////////////////////////////////////////////////////////////////
Y aqui estan las 3 variables o incognitas de la expresion:
[x,b,x]
Dame un valor para la variable x :
15
Estos son los 4 operandos que hay en la expresion:
[*,+,*,*]
///////////////////////////////////////////////////////////////////////////////
###############################################################################
///////////////////////////////////////////////////////////////////////////////
Y aqui estan las 3 variables o incognitas de la expresion:
[x,b,x]
120
Ese seria el desarrollo de la expresión 2*x+b

El problema es que cuando cuando un valor para una variable, si introduzco otra expresion que tenga otra variable y no es una de las que estaban en la principal no funciona, aqui os dejo para que lo veais con vuestros propios ojos:

Citar
Estos son los 2 operandos que hay en la expresion:
[*,+]
///////////////////////////////////////////////////////////////////////////////
###############################################################################
///////////////////////////////////////////////////////////////////////////////
Y aqui estan las 2 variables o incognitas de la expresion:
[x,b]
Dame un valor para la variable x :
5*x
Estos son los 3 operandos que hay en la expresion:
[*,+,*]
///////////////////////////////////////////////////////////////////////////////
###############################################################################
///////////////////////////////////////////////////////////////////////////////
Y aqui estan las 3 variables o incognitas de la expresion:
[x,b,x]
Dame un valor para la variable x :
7
Estos son los 3 operandos que hay en la expresion:
[*,+,*]
///////////////////////////////////////////////////////////////////////////////
###############################################################################
///////////////////////////////////////////////////////////////////////////////
Y aqui estan las 3 variables o incognitas de la expresion:
[x,b,x]
Dame un valor para la variable b :
6*d  <----- Aqui introduzco una nueva variable, que teoricamente tendria que analizar y pedir un valor para esta
Estos son los 4 operandos que hay en la expresion:
[*,+,*,*]
///////////////////////////////////////////////////////////////////////////////
###############################################################################
///////////////////////////////////////////////////////////////////////////////
Y aqui estan las 4 variables o incognitas de la expresion:
[x,b,x,d]
Dame un valor para la variable x :   <-------Sin embargo pide para X y no para d que es la que he pedido y como se aprecia abajo no tiene valor para d puesto que no ha pedido para esta, si no para X
1
Exception in thread "main" java.lang.RuntimeException: no value for variable "d"
   at net.java.dev.eval.Operation.evaluateOperand(Operation.java:128)
   at net.java.dev.eval.Operation.eval(Operation.java:107)
   at net.java.dev.eval.Expression.eval(Expression.java:161)
   at main.principal.Procesador(principal.java:123)
   at main.principal.Procesador(principal.java:118)
   at main.principal.main(principal.java:26)

Estos son los 4 operandos que hay en la expresion:
[*,+,*,*]
///////////////////////////////////////////////////////////////////////////////
###############################################################################
///////////////////////////////////////////////////////////////////////////////
Y aqui estan las 4 variables o incognitas de la expresion:
[x,b,x,d]

Haber si me pueden ayudar con este ultimo problema.
Saludos


« Última modificación: 31 Marzo 2010, 12:14 pm por ..::| D3Bć1 |::. » En línea

Blitzkrieg'


Desconectado Desconectado

Mensajes: 546


print('Hi there')


Ver Perfil WWW
Re: Analizador de expresiones numéricas [SOURCE]
« Respuesta #1 en: 30 Marzo 2010, 15:53 pm »

Excelente aporte, gracias  :rolleyes:


En línea



Debci
Wiki

Desconectado Desconectado

Mensajes: 2.021


Actualizate o muere!


Ver Perfil WWW
Re: Analizador de expresiones numéricas [SOURCE]
« Respuesta #2 en: 30 Marzo 2010, 20:24 pm »

Gracias, haber si alguien me ayuda con el error.

Saludos
En línea

Leyer


Desconectado Desconectado

Mensajes: 782


leyer@elhacker.net


Ver Perfil WWW
Re: Analizador de expresiones numéricas [SOURCE]
« Respuesta #3 en: 30 Marzo 2010, 20:33 pm »

no entendi,para que pides la variables ? y esto qui lo modifico y no salta error

new String("5*49/2*a");

y cuando pide variables es a,A,B

Un Saludo.
« Última modificación: 30 Marzo 2010, 20:35 pm por LEYER » En línea

Debci
Wiki

Desconectado Desconectado

Mensajes: 2.021


Actualizate o muere!


Ver Perfil WWW
Re: Analizador de expresiones numéricas [SOURCE]
« Respuesta #4 en: 30 Marzo 2010, 21:31 pm »

no entendi,para que pides la variables ? y esto qui lo modifico y no salta error

new String("5*49/2*a");

y cuando pide variables es a,A,B

Un Saludo.
Pido variables para poder completar la expresion.
Lo de las variables aab lo solucione haciendo saltos en el bucle de dos en dos envezde uno en uno.
El problema es que no se porque ese error, no le veo sentido.

Saludos
En línea

1mpuls0


Desconectado Desconectado

Mensajes: 1.186


Ver Perfil
Re: Analizador de expresiones numéricas [SOURCE]
« Respuesta #5 en: 30 Marzo 2010, 23:37 pm »

Estas en tiempo de clases o para que haces este code??

Amm yo hice un Evaluador de Expresiones Aritmeticas hace tiempo, bueno como un año, tiene su analizador lexico y gramatico y despues convertia las operaciones a lenguaje ensamblador.

Y te preguntaba si era un trabajo de la escuela me imagino que es para ayer  :xD pero si es por hacer algo puedes hacer tu propio Analizador Lexico y Gramatical

Aqui el Analizador de Expresiones Aritmeticas que hice sin librerias mas que el substance  :P

Y de tu code aun no he revisado nada, mas tarde me doy una vuelta

http://laquetegustaati.com.mx/D929/Analizador.rar

Saludos
En línea

abc
Blitzkrieg'


Desconectado Desconectado

Mensajes: 546


print('Hi there')


Ver Perfil WWW
Re: Analizador de expresiones numéricas [SOURCE]
« Respuesta #6 en: 31 Marzo 2010, 04:55 am »

Estas en tiempo de clases o para que haces este code??

Amm yo hice un Evaluador de Expresiones Aritmeticas hace tiempo, bueno como un año, tiene su analizador lexico y gramatico y despues convertia las operaciones a lenguaje ensamblador.

Y te preguntaba si era un trabajo de la escuela me imagino que es para ayer  :xD pero si es por hacer algo puedes hacer tu propio Analizador Lexico y Gramatical

Aqui el Analizador de Expresiones Aritmeticas que hice sin librerias mas que el substance  :P

Y de tu code aun no he revisado nada, mas tarde me doy una vuelta

http://laquetegustaati.com.mx/D929/Analizador.rar

Saludos

Esta super, no nos podrias regalar el code?
En línea



Debci
Wiki

Desconectado Desconectado

Mensajes: 2.021


Actualizate o muere!


Ver Perfil WWW
Re: Analizador de expresiones numéricas [SOURCE]
« Respuesta #7 en: 31 Marzo 2010, 08:13 am »

Estas en tiempo de clases o para que haces este code??

Amm yo hice un Evaluador de Expresiones Aritmeticas hace tiempo, bueno como un año, tiene su analizador lexico y gramatico y despues convertia las operaciones a lenguaje ensamblador.

Y te preguntaba si era un trabajo de la escuela me imagino que es para ayer  :xD pero si es por hacer algo puedes hacer tu propio Analizador Lexico y Gramatical

Aqui el Analizador de Expresiones Aritmeticas que hice sin librerias mas que el substance  :P

Y de tu code aun no he revisado nada, mas tarde me doy una vuelta

http://laquetegustaati.com.mx/D929/Analizador.rar

Saludos
LO hago por placer si no he cumplido los 16 aun xD
PD:Solucionado, ocurre porque abc lo detecta como una variable y no como 3 factores (menuda empanada mental la mia xD)

Saludos
En línea

Debci
Wiki

Desconectado Desconectado

Mensajes: 2.021


Actualizate o muere!


Ver Perfil WWW
Re: [ACTUALIZADO FUNCIONAL]Analizador de expresiones numéricas [SOURCE]
« Respuesta #8 en: 31 Marzo 2010, 12:15 pm »

Mejorado, solo queda un ultimo detalle.

Saludos
En línea

1mpuls0


Desconectado Desconectado

Mensajes: 1.186


Ver Perfil
Re: Analizador de expresiones numéricas [SOURCE]
« Respuesta #9 en: 31 Marzo 2010, 16:40 pm »


LO hago por placer si no he cumplido los 16 aun xD
PD:Solucionado, ocurre porque abc lo detecta como una variable y no como 3 factores (menuda empanada mental la mia xD)

Saludos

Ok, que bueno que lo hagas por gusto, de esos programadores se necesitan  ;D
Bueno no creo que sea lo mas correcto regalarles el código y no es porque no quiero, tal vez pueda mostrarles cómo se hace, asi aprenden, esto lo hice en una materia que se llama Compiladores.

Saludos y para tú otro problema ya te dijeron como se hace.

Saludos
« Última modificación: 3 Septiembre 2015, 18:52 pm por 1mpuls0 » En línea

abc
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Combinaciones numericas « 1 2 3 »
Hacking Básico
Touring 25 20,949 Último mensaje 17 Febrero 2012, 00:35 am
por hcalderon11
Lectura de cantidades númericas en Vb6
Programación Visual Basic
freddyjose00 9 5,420 Último mensaje 17 Febrero 2010, 17:02 pm
por Hasseds
Calculo de algoritmos en series numéricas
Foro Libre
seriesnumericas 7 9,087 Último mensaje 4 Febrero 2011, 16:48 pm
por flony
Buscador de combinaciones numéricas
Dudas Generales
hcalderon11 0 2,601 Último mensaje 16 Febrero 2012, 21:49 pm
por hcalderon11
Series numericas en c++
Programación C/C++
Exorcista12 7 18,192 Último mensaje 15 Noviembre 2013, 06:39 am
por Exorcista12
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines