예제 #1
0
 static void Main(string[] args)
 {
     StringLikeArray sla = new StringLikeArray();
     Console.WriteLine("Введите формулу:");
     SpaceInserter si = new SpaceInserter(Console.ReadLine());
     si.InsertSpaces();
     ShuntingYard sy = new ShuntingYard(si.GetOutputString());
     sy.StringAnalys();
     Console.WriteLine("Обратная польская запись:");
     Console.WriteLine(sy.ReturnReversePolish());
     ReversePolish rp = new ReversePolish(sy.ReturnReversePolish());
     if (!rp.VariableCollect())
     {
         Console.WriteLine("Переменных не обнаружено");
     }
     else
     {
         Console.WriteLine("Введите значения переменных:");
     }
     for (int i = 0; i < rp.VariableSet.Count; i++)
     {
         Variable v = (Variable)(rp.VariableSet[i]);
         Console.Write(v.var + " = ");
         v.value = Convert.ToDouble(Console.ReadLine());
         rp.VariableSet[i] = v;
     }
     rp.Calculate();
     Console.WriteLine("Результат: " + rp.Result);
     Console.ReadLine();
 }
예제 #2
0
        public void StringAnalys()
        {
            SpaceInserter si = new SpaceInserter(InputString);
            si.InsertSpaces();
            InputString = si.GetOutputString(); // с пробелами разбираемся

            if (!(new CorrectFormula(InputString).IsCorrect())) { OutputString = ""; return; } // проверка на допустимость формулы
            if (InputString.Length == 0) { OutputString = ""; return; }

            StringLikeArray sla = new StringLikeArray();
            ArrayList tokenList = new ArrayList();
            tokenList = sla.CreateArray(InputString); // разбили строку на массив лексем
            for (int i = 0; i < tokenList.Count; i++)
            {
                if (ac.IsNumber((string)tokenList[i]) | ac.IsVariable((string)tokenList[i]))
                {
                    OutputString += tokenList[i] + " "; // если строка или переменная, то записали в выходную строку
                }
                Statement currentStatement = ac.IsStatement((string)tokenList[i]); // а вот если оператор...
                if (currentStatement != null)
                {
                    if (currentStatement.st == StateType.isOpen) // открывающую скобку сразу в стек
                    {
                        SYStack.Push(currentStatement.symbol);
                    }
                    if (currentStatement.st == StateType.isClose) // если закрывающая, то достаем все из стека в выходную строку
                    {
                        string str = SYStack.Pop(); while (ac.IsStatement(str).st != StateType.isOpen) { OutputString += str + " "; str = SYStack.Pop(); }
                    }
                    if ((currentStatement.st == StateType.isStatementLeft) | (currentStatement.st == StateType.isStatementRight))
                    {                       // если на вершине стека более крутая операция чем новая, то перенесли ее в выходную строку
                        bool doIt = true;   // если менее крутая, то текущую в стек скинули
                        while (doIt)
                        {
                            if (SYStack.Count == 0) { SYStack.Push(currentStatement.symbol); doIt = false; }
                            else
                            {
                                string top = SYStack.Peek();
                                if ((currentStatement.priority > ac.IsStatement(top).priority & currentStatement.st == StateType.isStatementLeft) |
                                    (currentStatement.priority >= ac.IsStatement(top).priority & currentStatement.st == StateType.isStatementRight))
                                {
                                    SYStack.Push(currentStatement.symbol);// текущую воткнули в стек
                                    doIt = false;
                                }
                                else
                                {
                                    OutputString += SYStack.Pop() + " ";
                                }
                            }
                        }
                    }
                }
            }
            while (SYStack.Count > 0) { OutputString += SYStack.Pop() + " "; }
            OutputString = OutputString.Trim();
        }