Evaluador de expresiones aritmeticas (Java)
Publicado por Juan Manuel Perez Toro (1 intervención) el 20/03/2016 13:27:17
Hola, tengo un código en Java, que evalua expresiones aritméticas de grado 3, ejemplos:
(2)+(2)=4
((-123)+(200))=77
Y tengo un método StringUtils.exprMainOperator que me separa los operadores por paréntesis equivalentes ejemplo:
int n = StringUtils.exprMainOperator("((-123)+(200))");
n = 8;
Me da solo 2 fallos en 2 expresiones aritméticas en el resto funciona bien:
El main, es aparte donde se proporcionan las expresiones, un dato importante, tengo que hacerlo por recursividad.
Sabiendo esto, aquí esta mi código:
}
Muchas gracias y espero vuestra ayuda para saber en que me puedo estar equivocando, gracias.
(2)+(2)=4
((-123)+(200))=77
Y tengo un método StringUtils.exprMainOperator que me separa los operadores por paréntesis equivalentes ejemplo:
int n = StringUtils.exprMainOperator("((-123)+(200))");
n = 8;
Me da solo 2 fallos en 2 expresiones aritméticas en el resto funciona bien:
1
2
3
4
("(((-123)+(200))*((2)+(1)))+(3)").
Se produce una excepción: (((-123)+(200))*((2)+(1)))+(3) java.lang.NumberFormatException: For input string: "+(3"
("((-123)+(200))*((2)+(1))").
Se produce una excepción: ((-123)+(200))*((2)+(1)) java.lang.NumberFormatException: For input string: "*((2)+(1"
El main, es aparte donde se proporcionan las expresiones, un dato importante, tengo que hacerlo por recursividad.
Sabiendo esto, aquí esta mi código:
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package es.ulpgc.eii.recursive;
import es.ulpgc.eii.strings.StringUtils;
/**
* @author: Juan Manuel Perez Toro
*
* Evaluador de expresiones aritmeticas
* @param cadena - Expresion aritmetica a evaluar
*/
public class MathUtils {
public static int auxEvaluate (String cadena, int result){
//Evaluo cuantos parentesis tiene la expresion aritmetica
if (cadena.charAt(0) == '(' && cadena.charAt(cadena.length()-1) == ')'){
return auxEvaluate(cadena.substring(1, cadena.length()-1), result);
}
//Hallo el valor del operador principal
int n = StringUtils.exprMainOperator(cadena);
if (n == cadena.length()) {
if (cadena.charAt(0) == '('){
cadena=cadena.substring(1, cadena.length());
return Integer.parseInt(cadena);
}else if(cadena.charAt(cadena.length()-1)==')'){
cadena=cadena.substring(0, cadena.length()-1);
return Integer.parseInt(cadena);
}else{
return Integer.parseInt(cadena);
}
}
String preop = cadena.substring (0, n);
String postop = cadena.substring(n+1);
char op = cadena.charAt(n);
//Dependiendo del operador elijo la operacion a realizar
if (op == '+') return auxEvaluate(preop, result) + auxEvaluate(postop, result);
if (op == '-') return auxEvaluate(preop, result) - auxEvaluate(postop, result);
if (op == '/') return auxEvaluate(preop, result) / auxEvaluate(postop, result);
if (op == '*') return auxEvaluate(preop, result) * auxEvaluate(postop, result);
return auxEvaluate (postop, result);
}
//Utilizo un metodo de inmersion
public static int evaluate (String cadena){
int result=0;
result=auxEvaluate(cadena, result);
return result;
}
}
Muchas gracias y espero vuestra ayuda para saber en que me puedo estar equivocando, gracias.
Valora esta pregunta


0