import java.math.*; import java.util.*; public final class Evaluate { public Evaluate() { } public final static float evaluate(String inString, float x, float y, float z, float p, float q, float r) { String string = new String(); //Remove spaces. for(int i = 0; i < inString.length(); i++) { if(inString.substring(i,i+1).equals(" ")) { } else { string += inString.substring(i,i+1); } } if(string.length() > 0) { try{ string = combo(string); //Substitute x, y, z with numbers. while(string.indexOf("x") > -1) { string = string.substring(0,string.indexOf("x"))+Float.toString(x)+string.substring(string.indexOf("x")+1,string.length()); } while(string.indexOf("y") > -1) { string = string.substring(0,string.indexOf("y"))+Float.toString(y)+string.substring(string.indexOf("y")+1,string.length()); } while(string.indexOf("z") > -1) { string = string.substring(0,string.indexOf("z"))+Float.toString(z)+string.substring(string.indexOf("z")+1,string.length()); } while(string.indexOf("p") > -1) { string = string.substring(0,string.indexOf("p"))+Float.toString(p)+string.substring(string.indexOf("p")+1,string.length()); } while(string.indexOf("q") > -1) { string = string.substring(0,string.indexOf("q"))+Float.toString(q)+string.substring(string.indexOf("q")+1,string.length()); } while(string.indexOf("r") > -1) { string = string.substring(0,string.indexOf("r"))+Float.toString(r)+string.substring(string.indexOf("r")+1,string.length()); } //Evaluate parantheses first. while(string.lastIndexOf("(") > -1) { int open = string.lastIndexOf("("); int close = string.indexOf(")", open); if(close > -1) { String temp = binary(string.substring(open+1, close)); String unary[] = {"abs","acos","asin","atan","cos","log","sin","tan"}; for(int i = 0; i < unary.length; i++) { if((open-unary[i].length() > -1) && string.substring(open-unary[i].length(),open).equals(unary[i])) { open -= unary[i].length(); float value = 0; switch(i) { case 0: value = Math.abs(Float.valueOf(temp).floatValue()); break; case 1: value = (float)Math.acos(Float.valueOf(temp).floatValue()); break; case 2: value = (float)Math.asin(Float.valueOf(temp).floatValue()); break; case 3: value = (float)Math.atan(Float.valueOf(temp).floatValue()); break; case 4: value = (float)Math.cos(Float.valueOf(temp).floatValue()); break; case 5: value = (float)Math.log(Float.valueOf(temp).floatValue()); break; case 6: value = (float)Math.sin(Float.valueOf(temp).floatValue()); break; case 7: value = (float)Math.tan(Float.valueOf(temp).floatValue()); break; default: break; } temp = Float.toString(value); break; } } string = string.substring(0,open)+temp+string.substring(close+1,string.length()); } else { System.out.println("Wrong0"); return 0; } } if(string.indexOf(")") > -1) { System.out.println("Missing Left (!"); return 0; } return Float.valueOf(binary(string)).floatValue(); } catch(Exception e) { System.out.println(""+e); return 0; } } else { System.out.println("Empty x, y or z!"); return 0; } } private final static String binary(String string) { string = combo(string); String binary[] = {"^","*","/","+","-"}; for(int i = 0; i < 3; i++) { while(string.indexOf(binary[i]) > 0) { int position = string.indexOf(binary[i]); int prePosition = 0; int postPosition = string.length(); int E; for(int j = i; j < binary.length; j++) { int tempPre = prePosition+string.substring(prePosition,position).lastIndexOf(binary[j]); if(tempPre > prePosition) { String tempPrem = string.substring(tempPre-1,tempPre); if(!(tempPrem.equals("*") | tempPrem.equals("/") | tempPrem.equals("E"))) { prePosition = tempPre; } } int tempPost = position+1+string.substring(position+1,postPosition).indexOf(binary[j]); if((tempPost > position+1) && tempPost < postPosition) { String tempPostm = string.substring(tempPost-1,tempPost); if(!(tempPostm.equals("^") | tempPostm.equals("*") | tempPostm.equals("/") | tempPostm.equals("+") | tempPostm.equals("-") | tempPostm.equals("E"))) { postPosition = tempPost; } } } String left; if(prePosition == 0) { left = string.substring(prePosition, position); } else { left = string.substring(prePosition+1, position); } String right = string.substring(position+1, postPosition); float value = 0; switch(i) { case 0: value = (float)Math.pow(Float.valueOf(left).floatValue(),Float.valueOf(right).floatValue()); break; case 1: value = Float.valueOf(left).floatValue()*Float.valueOf(right).floatValue(); break; case 2: value = Float.valueOf(left).floatValue()/Float.valueOf(right).floatValue(); break; default: break; } if(prePosition == 0) { string = Float.toString(value)+string.substring(postPosition,string.length()); } else { string = string.substring(0,prePosition+1)+Float.toString(value)+string.substring(postPosition,string.length()); } } } string = combo(string); float value = 0; int position = 0; int E = string.indexOf("E",0); int plus = string.indexOf("+",1); if(plus == E+1) { plus = string.indexOf("+",E+2); } int minus = string.indexOf("-",1); if(minus == E+1) { minus = string.indexOf("-",E+2); } while((plus > position) | (minus > position)) { if(plus > position && ((plus < minus) | (minus <= position))) { value += Float.valueOf(string.substring(position,plus)).floatValue(); position = plus; } else { value += Float.valueOf(string.substring(position,minus)).floatValue(); position = minus; } E = string.indexOf("E",position); plus = string.indexOf("+",position); if(plus == E+1) { plus = string.indexOf("+",E+2); } minus = string.indexOf("-",position); if(minus == E+1) { minus = string.indexOf("-",E+2); } } value += Float.valueOf(string.substring(position,string.length())).floatValue(); return Float.toString(value); } private final static String combo(String string) { String combo[] = {"++","--","-+","+-"}; for(int i = 0; i < combo.length; i++) { while(string.indexOf(combo[i]) > -1) { int position = string.indexOf(combo[i]); if(i < 2) { string = string.substring(0,position)+"+"+string.substring(position+2,string.length()); } else { string = string.substring(0,position)+"-"+string.substring(position+2,string.length()); } } } return string; } }