private static string parse_Equation(char[] expr, int index) { CalculatorLogic cl = new CalculatorLogic(); string num = ""; if((int)expr[index]==83){ index += 4; if((int)expr[index]==32){ for(int i = index; i<= expr.Length-2;i++) num += expr [i].ToString(); } double srt_num = double.Parse (num); IUnaryOperator sqrt = new Sqrt (); return Convert.ToString(sqrt.perform (srt_num)); } if((int)expr[index]==82){ index += 10; if((int)expr[index]==32){ for(int i = index; i<= expr.Length-2;i++) num += expr [i].ToString(); } double srt_num = double.Parse (num); IUnaryOperator reci = new Reciprocal (); return Convert.ToString(reci.perform (srt_num)); } if((int)expr[index]==78){ index += 6; if((int)expr[index]==32){ for(int i = index; i<= expr.Length-2;i++) num += expr [i].ToString(); } double srt_num = double.Parse (num); IUnaryOperator neg = new Negate (); return Convert.ToString(neg.perform (srt_num)); } while (index != expr.Length - 1) { double x = getDouble (expr, ref index); char op = expr [index]; index++; if (op == '\r') { cl.AcceptNumber (x, null); string result = cl.Equals (); return result; } perform_op (x, op, cl); } return ""; //return value; }
// evaluator private void btnEq_Click(object sender, EventArgs e) { Expression expression; Double sndArgument = new Double(); if (textBoxRes.Text.Equals("x") || textBoxRes.Text.Equals("y") || textBoxRes.Text.Equals("z")) { using (var form = new CalculatorValueForVariables()) { var result = form.ShowDialog(); if (result == DialogResult.OK) { sndArgument = form.varValue; } } } else { sndArgument = Double.Parse(textBoxRes.Text); } switch (calcOperator) { case "sqrt": if (!(resultValue < 0)) { expression = new Sqrt(resultValue); finalValue = expression.Evaluate(); textBoxRes.Text = finalValue.ToString(); } else { textBoxRes.Text = "Can't calculate sqrt of a neg num!"; } break; case "neg": expression = new Opposite(resultValue); finalValue = expression.Evaluate(); textBoxRes.Text = finalValue.ToString(); break; case "cos": expression = new Cosinus(resultValue); finalValue = expression.Evaluate(); textBoxRes.Text = finalValue.ToString(); break; case "sin": expression = new Sinus(resultValue); finalValue = expression.Evaluate(); textBoxRes.Text = finalValue.ToString(); break; case "exp": expression = new Exponentation(resultValue); finalValue = expression.Evaluate(); textBoxRes.Text = finalValue.ToString(); break; case "abs": expression = new Abs(resultValue); finalValue = expression.Evaluate(); textBoxRes.Text = finalValue.ToString(); break; case "log": if (resultValue > 0) { expression = new Log(resultValue); finalValue = expression.Evaluate(); textBoxRes.Text = finalValue.ToString(); } else { textBoxRes.Text = "Can't calculate log of a neg num!"; } break; case "+": labelCurrentExpr.Text += sndArgument; expression = new Addition(resultValue, sndArgument); finalValue = expression.Evaluate(); textBoxRes.Text = finalValue.ToString(); break; case "-": labelCurrentExpr.Text += sndArgument; expression = new Subtraction(resultValue, sndArgument); finalValue = expression.Evaluate(); textBoxRes.Text = finalValue.ToString(); break; case "*": labelCurrentExpr.Text += sndArgument; expression = new Multiplication(resultValue, sndArgument); finalValue = expression.Evaluate(); textBoxRes.Text = finalValue.ToString(); break; case "/": labelCurrentExpr.Text += sndArgument; if (!sndArgument.Equals(0)) { expression = new Division(resultValue, sndArgument); finalValue = expression.Evaluate(); textBoxRes.Text = finalValue.ToString(); } else { textBoxRes.Text = "Can't divide by 0"; } break; case "^": labelCurrentExpr.Text += sndArgument; expression = new Power(resultValue, sndArgument); finalValue = expression.Evaluate(); textBoxRes.Text = finalValue.ToString(); break; case "%": labelCurrentExpr.Text += sndArgument; expression = new Modulo(resultValue, sndArgument); finalValue = expression.Evaluate(); textBoxRes.Text = finalValue.ToString(); break; } resultValue = 0; labelCurrentExpr.Text = ""; }
void CreateOperators() { // Only one of each operation Token needs to be created opAdd = new Add(workStack); opSubtract = new Subtract(workStack); opMultiply = new Multiply(workStack); opDivide = new Divide(workStack); opPower = new Power(workStack); opBracket = new Bracket(); opUnaryMinus = new UnaryMinus(workStack); opUnaryPlus = new UnaryPlus(); opSqrt = new Sqrt(workStack); opSin = new Sin(workStack); opCos = new Cos(workStack); opTan = new Tan(workStack); opLog = new Log(workStack); opAsin = new Asin(workStack); opAcos = new Acos(workStack); opAtan = new Atan(workStack); functions = new Dictionary<string, Function> { {"sqr", opSqrt }, {"sin", opSin }, {"cos", opCos }, {"tan", opTan }, {"log", opLog }, {"asin", opAsin }, {"acos", opAcos }, {"atan", opAtan } }; binaryOperators = new Dictionary<char, BinaryOperator> { {'+', opAdd }, {'-', opSubtract }, {'*', opMultiply }, {'/', opDivide }, {'^',opPower } }; }