Foro de elhacker.net

Programación => Java => Mensaje iniciado por: Debci en 30 Marzo 2010, 10:42 am



Título: [ACTUALIZADO FUNCIONAL]Analizador de expresiones numéricas [SOURCE]
Publicado por: Debci 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


Título: Re: Analizador de expresiones numéricas [SOURCE]
Publicado por: Blitzkrieg' en 30 Marzo 2010, 15:53 pm
Excelente aporte, gracias  :rolleyes:


Título: Re: Analizador de expresiones numéricas [SOURCE]
Publicado por: Debci en 30 Marzo 2010, 20:24 pm
Gracias, haber si alguien me ayuda con el error.

Saludos


Título: Re: Analizador de expresiones numéricas [SOURCE]
Publicado por: Leyer 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.


Título: Re: Analizador de expresiones numéricas [SOURCE]
Publicado por: Debci 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


Título: Re: Analizador de expresiones numéricas [SOURCE]
Publicado por: 1mpuls0 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


Título: Re: Analizador de expresiones numéricas [SOURCE]
Publicado por: Blitzkrieg' 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?


Título: Re: Analizador de expresiones numéricas [SOURCE]
Publicado por: Debci 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


Título: Re: [ACTUALIZADO FUNCIONAL]Analizador de expresiones numéricas [SOURCE]
Publicado por: Debci en 31 Marzo 2010, 12:15 pm
Mejorado, solo queda un ultimo detalle.

Saludos


Título: Re: Analizador de expresiones numéricas [SOURCE]
Publicado por: 1mpuls0 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


Título: Re: [ACTUALIZADO FUNCIONAL]Analizador de expresiones numéricas [SOURCE]
Publicado por: Debci en 31 Marzo 2010, 16:49 pm
LO cierto es que lo solucioné sin necesidad de ayuda puesto que no entendi la respuesta del amigo LEYER.

Una cosa, que ando asustadillo, creeis que podria cursar carrera de informatica? me han dicho que es muy dificil y tal, pero poco a poco voy haciendo cosas para que luego no me cueste tanto.

Saludos


Título: Re: [ACTUALIZADO FUNCIONAL]Analizador de expresiones numéricas [SOURCE]
Publicado por: Blitzkrieg' en 31 Marzo 2010, 16:59 pm
LO cierto es que lo solucioné sin necesidad de ayuda puesto que no entendi la respuesta del amigo LEYER.

Una cosa, que ando asustadillo, creeis que podria cursar carrera de informatica? me han dicho que es muy dificil y tal, pero poco a poco voy haciendo cosas para que luego no me cueste tanto.

Saludos

Nada en la vida es facil, eso si, muchos piensan que en la carrera de informatica solo veran programación, debes tener en cuenta que esa carrera abarca mucho mas que programación.


Título: Re: [ACTUALIZADO FUNCIONAL]Analizador de expresiones numéricas [SOURCE]
Publicado por: 1mpuls0 en 31 Marzo 2010, 17:41 pm
LO cierto es que lo solucioné sin necesidad de ayuda puesto que no entendi la respuesta del amigo LEYER.

Una cosa, que ando asustadillo, creeis que podria cursar carrera de informatica? me han dicho que es muy dificil y tal, pero poco a poco voy haciendo cosas para que luego no me cueste tanto.

Saludos

Yo estoy seguro de que si, de donde eres?, hace algunas semanas hice una pregunta aquí en este mismo foro, creo que dependiendo del lugar la carrera tiene un enfoque diferente.

http://foro.elhacker.net/foro_libre/diferencia_entre_ing_en_sistemas_computacionales_y_lic_en_informaticaiquestiquest-t287252.0.html

Pero estoy seguro de que si puedes.  ::), mirate en donde estas y lo que has hecho,  tu gusto por hacer las cosas, y para no desviarme del tema supe que podias hacer mas que el programa pasado para resolver expresiones numéricas.

[of]En mi caso, estudio Ingenieria en Sistemas Computacionales y la mayor parte de las materias son de programación como matemáticas, deberias investigar primero en las universidades o en las propias paginas de las instituciones cuales son los enfoques de las carreras que te llama la atención, pensalo bien y decidir[/of]

Un saludo


Título: Re: [ACTUALIZADO FUNCIONAL]Analizador de expresiones numéricas [SOURCE]
Publicado por: Debci en 31 Marzo 2010, 20:33 pm
LO cierto es que lo solucioné sin necesidad de ayuda puesto que no entendi la respuesta del amigo LEYER.

Una cosa, que ando asustadillo, creeis que podria cursar carrera de informatica? me han dicho que es muy dificil y tal, pero poco a poco voy haciendo cosas para que luego no me cueste tanto.

Saludos

Yo estoy seguro de que si, de donde eres?, hace algunas semanas hice una pregunta aquí en este mismo foro, creo que dependiendo del lugar la carrera tiene un enfoque diferente.

http://foro.elhacker.net/foro_libre/diferencia_entre_ing_en_sistemas_computacionales_y_lic_en_informaticaiquestiquest-t287252.0.html

Pero estoy seguro de que si puedes.  ::), mirate en donde estas y lo que has hecho,  tu gusto por hacer las cosas, y para no desviarme del tema supe que podias hacer mas que el programa pasado para resolver expresiones numéricas.

[of]En mi caso, estudio Ingenieria en Sistemas Computacionales y la mayor parte de las materias son de programación como matemáticas, deberias investigar primero en las universidades o en las propias paginas de las instituciones cuales son los enfoques de las carreras que te llama la atención, pensalo bien y decidir[/of]

Un saludo
Si, se la temática, pero las cosas que hago deben ser minucias con lo que ayí se hace, y que conste que he tocado threads, sockets, bases de datos, apis de otras aplicaciones, JNI, y se algo de ensamblador xD

[tema real]
Tengo una hipotesis del porqué del fallo.
Saludos