Esempio n. 1
0
 //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;
 }
Esempio n. 2
0
        //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);
        }
Esempio n. 3
0
        //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;
        }