public void CalculateRPN(string postfix, decimal expectedresult)
 {
     decimal actualresult;
     RPNParser rpnparser = new RPNParser();
     actualresult = rpnparser.CalculateRPN(postfix);
     Assert.AreEqual(expectedresult, actualresult);
 }
Exemple #2
0
 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();
 }
Exemple #3
0
        /// <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);
        }
Exemple #4
0
        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);
                }
            }
        }