//check if two string values are equal public bool isEqual(Token test) { if (test.sValue.Equals(this.sValue,StringComparison.OrdinalIgnoreCase) ) if (test.vType == this.vType) return true; return false; }
//get the numeric value the function at x public double evalFuncAt(double x) { if (funcToken == null) return 0; //make copy List<Token> ExprCopy = new List<Token>(); for (int i = 0; i < funcToken.Count; i++) { ExprCopy.Add(new Token(funcToken[i].vType, funcToken[i].sValue)); } //plug in value of x into copy for (int i = 0; i < ExprCopy.Count; i++) { if (ExprCopy[i].vType == ValType.VARIABLE) { ExprCopy[i] = new Token(x); } } //evaluate the copy return eval(ExprCopy); }
//get numeric value of expression // assume x is replaced by value private double eval(List<Token> ExprCopy) { //evaluate in order of: //methods //brackets //exponents //divisions //multiplications //additions //subtractions //eval methods for (int i = 0; i < ExprCopy.Count; i++) { //if its the start of a method if (ExprCopy[i].vType == ValType.LETTER) { //check if its a constant if(ExprCopy[i].ToString().Equals("PI")) { ExprCopy[i].dValue = Math.PI; ExprCopy[i].vType = ValType.NUMBER; } //find args of method int bracketDepth = 0; List<Token> arguments = new List<Token>(); //start args right after method for (int j = i+1; j < ExprCopy.Count; j++) { //check bracket depth if (ExprCopy[j].sValue.Equals("(")) bracketDepth++; else if (ExprCopy[j].sValue.Equals(")")) bracketDepth--; //put token into arguments and rmv from ExprCopy arguments.Add(ExprCopy[j]); ExprCopy.RemoveAt(j); j--; if (bracketDepth == 0) break; } //recursively evaluate arguments double dResult = eval(arguments); //replace method with numeric value dResult = mathFuncEval(ExprCopy[i].ToString(),dResult); ExprCopy[i] = new Token(dResult); }//end if }//end methods loop //eval brackets for (int i = 0; i < ExprCopy.Count; i++) { //if its the start of a bracket if (ExprCopy[i].vType == ValType.OPBRACKET) { //find args of method int bracketDepth = 0; List<Token> arguments = new List<Token>(); //start args right after method for (int j = i+1; j < ExprCopy.Count; j++) { //check bracket depth if (ExprCopy[j].sValue.Equals("(")) bracketDepth++; else if (ExprCopy[j].sValue.Equals(")")) bracketDepth--; //put token into arguments and rmv from ExprCopy arguments.Add(ExprCopy[j]); ExprCopy.RemoveAt(j); j--; if (bracketDepth == 0) break; } //recursively evaluate arguments double dResult = eval(arguments); //replace bracket with numeric value ExprCopy[i] = new Token(dResult); }//end if }//end brackets loop //exponents loop for (int i = 0; i < ExprCopy.Count; i++) { //if its the start of an exponent if (ExprCopy[i].ToString().Equals("^")) { //replace with value double x = ExprCopy[i-1].dValue; double y = ExprCopy[i+1].dValue; double expRes =System.Math.Pow(x,y); ExprCopy[i-1] = new Token(expRes); //remove operator and argument ExprCopy.RemoveAt(i); ExprCopy.RemoveAt(i); i--; i--; } }//end exponents loop //divisions loop for (int i = 0; i < ExprCopy.Count; i++) { if(ExprCopy[i].ToString().Equals("/")) { //get numeric value double d1 = ExprCopy[i-1].dValue; double d2 = ExprCopy[i+1].dValue; //replace with value ExprCopy[i-1] = new Token((d1/d2)); //remove operator and argument ExprCopy.RemoveAt(i); ExprCopy.RemoveAt(i); i--; i--; } }//end divisions loop //multiplications loop for (int i = 0; i < ExprCopy.Count; i++) { if(ExprCopy[i].ToString().Equals("*")) { //get numeric value double d1 = ExprCopy[i-1].dValue; double d2 = ExprCopy[i+1].dValue ; //replace with value ExprCopy[i-1] = new Token((d1*d2)); //remove operator and argument ExprCopy.RemoveAt(i); ExprCopy.RemoveAt(i); i--; i--; } }//end multiplications loop //additions loop for (int i = 0; i < ExprCopy.Count; i++) { if(ExprCopy[i].ToString().Equals("+")) { //get numeric value double d1 = ExprCopy[i - 1].dValue; double d2 = ExprCopy[i + 1].dValue; //replace with value ExprCopy[i - 1] = new Token((d1 + d2)); //remove operator and argument ExprCopy.RemoveAt(i); ExprCopy.RemoveAt(i); i--; i--; } }//end additions loop //subtractions loop for (int i = 0; i < ExprCopy.Count; i++) { if(ExprCopy[i].ToString().Equals("-")) { //get numeric value double d1 = ExprCopy[i - 1].dValue; double d2 = ExprCopy[i + 1].dValue; //replace with value ExprCopy[i - 1] = new Token((d1 - d2)); //remove operator and argument ExprCopy.RemoveAt(i); ExprCopy.RemoveAt(i); i--; i--; } }//end subtractions loop if (ExprCopy.Count != 1) { //throw exception } return ExprCopy[0].dValue; }