Reputation: 129
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
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
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