public void CalculateRPN(string postfix, decimal expectedresult) { decimal actualresult; RPNParser rpnparser = new RPNParser(); actualresult = rpnparser.CalculateRPN(postfix); Assert.AreEqual(expectedresult, actualresult); }
private void equalButton_Click(object sender, EventArgs e) { string exprn = string.Join(" ", expression.ToArray()); SYParser syp = new SYParser(); RPNParser rpn = new RPNParser(); syp.setExpr(exprn); rpnexpr = syp.getRPN(); result = rpn.CalculateRPN(rpnexpr); result1 = Convert.ToString(result); expression.Clear(); expression.Add(result1); UpdateDisplay(); }
/// <summary> /// Возвращает уже инициализированный парсер, в котором уже есть большинство стандартных функций, /// избавлят от необходимости инициализировать самостоятельно. /// </summary> /// <returns></returns> public static RPNParser Default() { var rpnParser = new RPNParser(); rpnParser.AddBinaryOperation(new BinaryOperationToken('-', (a, b) => a - b, 0, Associativity.Left)); rpnParser.AddBinaryOperation(new BinaryOperationToken('+', (a, b) => a + b, 0, Associativity.Left)); rpnParser.AddBinaryOperation(new BinaryOperationToken('*', (a, b) => a * b, 1, Associativity.Left)); rpnParser.AddBinaryOperation(new BinaryOperationToken('/', (a, b) => a / b, 1, Associativity.Left)); rpnParser.AddBinaryOperation(new BinaryOperationToken('%', (a, b) => a % b, 1, Associativity.Left)); rpnParser.AddBinaryOperation(new BinaryOperationToken('^', (a, b) => Math.Pow(a, b), 2, Associativity.Right)); rpnParser.AddFunction(new FunctionToken("!", (x) => { if (x < 0 || x - (int)x > Double.Epsilon) { throw new Exception("Факториал определен для целых положительных чисел"); } double result = 1; for (int i = 2; i != (int)x + 1; i++) { result *= i; } return(result); }, FunctionType.Postfix)); rpnParser.AddFunction(new FunctionToken("sin", (x) => Math.Sin(x), FunctionType.Prefix)); rpnParser.AddFunction(new FunctionToken("cos", (x) => Math.Cos(x), FunctionType.Prefix)); rpnParser.AddFunction(new FunctionToken("tan", (x) => Math.Tan(x), FunctionType.Prefix)); rpnParser.AddFunction(new FunctionToken("sqrt", (x) => Math.Sqrt(x), FunctionType.Prefix)); rpnParser.AddFunction(new FunctionToken("abs", (x) => Math.Abs(x), FunctionType.Prefix)); rpnParser.AddFunction(new FunctionToken("log", (x) => Math.Log(x), FunctionType.Prefix)); rpnParser.AddFunction(new FunctionToken("log10", (x) => Math.Log10(x), FunctionType.Prefix)); rpnParser.AddFunction(new FunctionToken("round", (x) => Math.Round(x), FunctionType.Prefix)); rpnParser.AddFunction(new FunctionToken("truncate", (x) => Math.Truncate(x), FunctionType.Prefix)); rpnParser.AddFunction(new FunctionToken("arccosine", (x) => Math.Acos(x), FunctionType.Prefix)); rpnParser.AddFunction(new FunctionToken("arcsine", (x) => Math.Asin(x), FunctionType.Prefix)); rpnParser.AddFunction(new FunctionToken("arctan", (x) => Math.Atan(x), FunctionType.Prefix)); return(rpnParser); }
static void Main(string[] args) { var rpnParser = RPNParser.Default(); while (true) { // Console.WriteLine("Введите выражение:"); var expression = Console.ReadLine(); try { var rpn = rpnParser.Parse(expression); var result = RPNCalculator.Calculate(rpn); Console.WriteLine(String.Format("={0:F10}", result)); } catch (FormatException e) { Console.WriteLine(e.Message); } } }