Java - Evaluador de expresiones aritmeticas (Java)

   
Vista:

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:
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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder