Ejemplo n.º 1
0
        private static void TestArithmetic()
        {
            do
            {
                Console.Clear();

                Console.Write("Введите арифметическое выражение: ");

                string expression = Console.ReadLine();

                string convertedExpression = PolishArithmetic.GetPolishNotation(expression);

                Console.WriteLine("\nВыражение в обратной польской нотации: {0}", convertedExpression);

                string result = PolishArithmetic.CalculatePolishExpression(convertedExpression);

                Console.Write("\nРезультат вычисления: ");
                if (!Char.IsLetter(result[0]))
                {
                    Console.Write(result);
                }
                Console.WriteLine();

                PolishArithmetic.SetVars();

                foreach (KeyValuePair <string, string> p in PolishArithmetic.Vars)
                {
                    Console.WriteLine(p.Key + " = " + p.Value);
                }

                PolishArithmetic.Vars.Clear();

                Console.WriteLine("\n(Нажмите ESC, чтобы выйти)");
            }while (Console.ReadKey().Key != ConsoleKey.Escape);
        }
        // Вычисляет выражение, переведенное в обратную польскую запись
        public static string CalculatePolishExpression(List <string> polishExpression)
        {
            // a 0 > 11 !F a a ~ = 16 !! a b 1 + = $
            int           currentPosition  = 0;
            List <string> expressionBuffer = new List <string>();

            string Result = "";

            while (currentPosition < polishExpression.Count)
            {
                if (polishExpression[currentPosition] == "$")
                {
                    if (expressionBuffer.Count != 0)
                    {
                        string arithmeticExpression = "";
                        foreach (string s in expressionBuffer)
                        {
                            arithmeticExpression += s + " ";
                        }
                        arithmeticExpression = arithmeticExpression.Remove(arithmeticExpression.Length - 1);

                        Result = PolishArithmetic.CalculatePolishExpression(arithmeticExpression);
                    }

                    break;
                }
                else if (polishExpression[currentPosition] == "!F")
                {
                    string transition = expressionBuffer[expressionBuffer.Count - 1];
                    expressionBuffer.RemoveAt(expressionBuffer.Count - 1);

                    string logicExpression = "";
                    foreach (string s in expressionBuffer)
                    {
                        logicExpression += s + " ";
                    }
                    logicExpression = logicExpression.Remove(logicExpression.Length - 1);

                    string logicResult = PolishArithmetic.CalculatePolishExpression(logicExpression, true);

                    expressionBuffer.Clear();

                    if (logicResult == "0")
                    {
                        currentPosition = Convert.ToInt32(transition);
                        continue;
                    }
                }
                else if (polishExpression[currentPosition] == "!!")
                {
                    string transition = expressionBuffer[expressionBuffer.Count - 1];
                    expressionBuffer.RemoveAt(expressionBuffer.Count - 1);

                    string arithmeticExpression = "";
                    foreach (string s in expressionBuffer)
                    {
                        arithmeticExpression += s + " ";
                    }
                    arithmeticExpression = arithmeticExpression.Remove(arithmeticExpression.Length - 1);

                    Result = PolishArithmetic.CalculatePolishExpression(arithmeticExpression);

                    currentPosition = Convert.ToInt32(transition);
                    expressionBuffer.Clear();
                    continue;
                }
                else
                {
                    expressionBuffer.Add(polishExpression[currentPosition]);
                }

                currentPosition++;
            }

            return(Result);
        }