I have written a Java program which evaluates a mathematical expression from left to right (no precedence, just left to right). However, I’m not getting the desired output.
import java.util.*;
public class Evaluation {
//private static final char[] validOperators = {'/','*','+','-'};
private Evaluation()
{
/* Using a private contructor to prevent instantiation
Using class as a simple static utility class
*/
}
private static int evaluate(String leftSide, char oper, String rightSide)
throws IllegalArgumentException
{
System.out.println("Evaluating: " + leftSide + " (" + oper + ") " + rightSide);
int total = 0;
int leftResult = 0;
int rightResult = 0;
String originalString =leftSide;
int operatorLoc = findOperatorLocation(leftSide);
leftSide = leftSide.substring(0,operatorLoc);
rightSide = originalString.substring(operatorLoc+1,operatorLoc+2);
String remainingString = originalString.substring(operatorLoc+2,originalString.length());
System.out.println("leftSide -->"+leftSide);
System.out.println("rightSide -->"+rightSide);
System.out.println("remainingString --->"+remainingString);
try {
leftResult = Integer.parseInt(leftSide);
} catch(Exception e) {
throw new IllegalArgumentException(
"Invalid value found in portion of equation: "
+ leftSide);
}
try {
rightResult = Integer.parseInt(rightSide);
} catch(Exception e) {
throw new IllegalArgumentException(
"Invalid value found in portion of equation: "
+ rightSide);
}
System.out.println("Getting result of: " + leftResult + " " + oper + " " + rightResult);
switch(oper)
{
case '/':
total = leftResult / rightResult; break;
case '*':
total = leftResult * rightResult; break;
case '+':
total = leftResult + rightResult; break;
case '-':
total = leftResult - rightResult; break;
default:
throw new IllegalArgumentException("Unknown operator.");
}
System.out.println("Returning a result of: " + total);
String totally = String.valueOf(total)+remainingString;
return evaluate(totally,findCharacter(totally),remainingString);
}
private static int findOperatorLocation(String string) {
int index = -1;
index = string.indexOf(string.substring(1,2));
if(index >= 0) {
return index;
}
return index;
}
private static char findCharacter(String string) {
char c='\u0000';
int index = -1;
index = string.indexOf(string.substring(1,2));
if(index >= 0){
c = string.charAt(index);
return c;
}
return c;
}
public static int processEquation(String equation)
throws IllegalArgumentException
{
return evaluate(equation,'+',"0");
}
public static void main(String[] args)
{
//String usage = "Usage: java MathParser equation\nWhere equation is a series"
// + " of integers separated by valid operators (+,-,/,*)";
//if(args.length < 1 || args[0].length() == 0)
// System.out.println(usage);
Scanner input = new Scanner(System.in);
System.out.print("Enter the equation to be evaluated ");
String equation = (String)input.next();
int result = Evaluation.processEquation(equation);
System.out.println("The result of your equation ("
+ equation + ") is: " + result);
//catch(IllegalArgumentException iae)
//{
// System.out.println(iae.getMessage() + "\n" + usage);
//}
}
}
Here is the input I’m trying to use, and what I expect:
3+5*2-5
=>8*2-5
=>16-5
=>Expected Output :11
But I’m getting this output:
Enter the equation to be evaluated 3+5*2-5
Evaluating: 3+5*2-5 (+) 0
leftSide –>3
rightSide –>5
remainingString —>*2-5
Getting result of: 3 + 5
Returning a result of: 8
Evaluating: 8*2-5 (*) *2-5
leftSide –>8
rightSide –>2
remainingString —>-5
Getting result of: 8 * 2
Returning a result of: 16
Evaluating: 16-5 (6) -5
leftSide –>1
rightSide –>-
remainingString —>5
Exception in thread “main” java.lang.IllegalArgumentException: Invalid value found in portion of equation: –
at Evaluation.evaluate(Evaluation.java:49)
at Evaluation.evaluate(Evaluation.java:70)
at Evaluation.evaluate(Evaluation.java:70)
at Evaluation.processEquation(Evaluation.java:98)
at Evaluation.main(Evaluation.java:112)
I’m unable to make my program generic for any equation entered.
I appreciate any help you can provide.
Please note this is not a homework question.
Your findOperatorLoc is incorrect.
It automatically assumes that the operator is the second character.
EDIT — A cleaner implementation of this might be like so. split your equation based on operators and then based on operands. You will be left with 2 arrays , one with all the operators and one with all operands.
This is pseudocode only .. I will leave you to implement the applyOperator method