Vicarious
Vicarious

Reputation: 129

evaluating an expression in string form containing variables in Java

I have used EvalEx (https://github.com/uklimaschewski/EvalEx) and modified it to make a calculator without packages like math . so now it can get an input in string form from the user and print out the result.

like this :

Enter an Expression: ADD(DIV(SIN(FACT(3)),CEIL(TAN(MUL(1.5,FIB(4))))),GCD(2,10)) 
The Result is: 1.94    

now the user will enter expressions that contain variables instead of constants

ADD(DIV(SIN(FACT(X1)),CEIL(TAN(MUL(1.5,FIB(X2))))),GCD(Y,10))    

and the overall code should work like below when run :

Enter an Expression: ADD(DIV(SIN(FACT(X1)),CEIL(TAN(MUL(1.5,FIB(X2))))),GCD(Y,10))     
Enter Variables: X1,X2,Y    
Enter values for X1, X2 and Y by this order(separate the values by space): 3 4 2    
The Result is: 1.94        

note that the user first enters the expression then will tell the machine what are the variables (as in " enter variables : x1,x2,y" ) also I have to use objective programming concepts ( so each function of the expression and its constants or variables should be kept as an object )

so how can I change the existing code from EvalEx to make the program to identify the variables ?

Upvotes: 0

Views: 1430

Answers (2)

Udo Klimaschewski
Udo Klimaschewski

Reputation: 5325

If you want to find out what variables are used in an expression, then EvalEx already has two methods in the Expression class, that can help you:

 /**
   * Returns all variables that are used i the expression, excluding the constants like e.g. <code>
   * PI</code> or <code>TRUE</code> and <code>FALSE</code>.
   *
   * @return All used variables excluding constants.
   * @throws ParseException If there were problems while parsing the expression.
   */
  public Set<String> getUsedVariables() throws ParseException

and

 /**
   * Returns all variables that are used in the expression, but have no value assigned.
   *
   * @return All variables that have no value assigned.
   * @throws ParseException If there were problems while parsing the expression.
   */
  public Set<String> getUndefinedVariables() throws ParseException {

so this

Expression expression = new Expression("ADD(DIV(SIN(FACT(X1)),CEIL(TAN(MUL(1.5,FIB(X2))))),GCD(Y,10))");
System.out.println(expression.getUsedVariables());

should print [X1, X2, Y]

Upvotes: 0

Paul Boddington
Paul Boddington

Reputation: 37665

You can set up a Map<String, Double> that associates variable names to values, like this:

Map<String, Double> values = new HashMap<String, Double>();
values.put("X", 13.5);
values.put("Y", -3);

Then you can replace all of the variables in the expression by their corresponding values, like this:

for (Map.Entry<String, Double> entry : values.entrySet())
    expression = expression.replace(entry.getKey(), entry.getValue().toString());

Then you can just apply the method you've already written to expression.

This approach is simple, but not very robust. For example, if one of your variable names names is "C" you will mess up the function "CEIL". For this reason, you could insist that all variables begin with "_" or something similar.

Upvotes: 1

Related Questions