Esempio n. 1
0
        public string Result(Cell cell, string input)
        {
            Transform_to_RPN(cell, input);
            List <string> stack_   = new List <string>();
            Regex         rx_opers = new Regex(@"[-,+,/,*,mod,div,or,and,=,>,<,not]");
            Regex         rx_fl    = new Regex(@"[0-9]+,[0-9]+");
            int           i        = 0;

            if (lenght == 0)
            {
                return("");
            }
            try
            {
                while (i < lenght)
                {
                    if (!rx_opers.IsMatch(RPN_[i]) || RPN_[i] == "True" || RPN_[i] == "False")
                    {
                        stack_.Insert(0, RPN_[i]);
                    }
                    if (rx_fl.IsMatch(RPN_[i]))
                    {
                        stack_.Insert(0, RPN_[i]);
                    }
                    if (rx_opers.IsMatch(RPN_[i]))
                    {
                        double result;
                        bool   result0;
                        if (RPN_[i] == "+")
                        {
                            double b = Convert.ToDouble(stack_[0]);
                            double a = Convert.ToDouble(stack_[1]);
                            stack_.RemoveRange(0, 2);
                            result = a + b;
                            stack_.Insert(0, result.ToString());
                        }
                        if (RPN_[i] == "-")
                        {
                            double b = Convert.ToDouble(stack_[0]);
                            double a = Convert.ToDouble(stack_[1]);
                            stack_.RemoveRange(0, 2);
                            result = a - b;
                            stack_.Insert(0, result.ToString());
                        }
                        if (RPN_[i] == "*")
                        {
                            double b = Convert.ToDouble(stack_[0]);
                            double a = Convert.ToDouble(stack_[1]);
                            stack_.RemoveRange(0, 2);
                            result = a * b;
                            stack_.Insert(0, result.ToString());
                        }
                        if (RPN_[i] == "/")
                        {
                            double b = Convert.ToDouble(stack_[0]);
                            double a = Convert.ToDouble(stack_[1]);
                            stack_.RemoveRange(0, 2);
                            result = a / b;
                            stack_.Insert(0, result.ToString());
                        }
                        if (RPN_[i] == "mod")
                        {
                            double b = Convert.ToDouble(stack_[0]);
                            double a = Convert.ToDouble(stack_[1]);
                            stack_.RemoveRange(0, 2);
                            result = a % b;
                            stack_.Insert(0, result.ToString());
                        }
                        if (RPN_[i] == "div")
                        {
                            double b = Convert.ToDouble(stack_[0]);
                            double a = Convert.ToDouble(stack_[1]);
                            stack_.RemoveRange(0, 2);
                            result = a / b - (a - (a % b)) / b;
                            stack_.Insert(0, result.ToString());
                        }
                        if (RPN_[i] == ">")
                        {
                            double b = Convert.ToDouble(stack_[0]);
                            double a = Convert.ToDouble(stack_[1]);
                            stack_.RemoveRange(0, 2);
                            result0 = a > b;
                            stack_.Insert(0, result0.ToString());
                        }
                        if (RPN_[i] == "<")
                        {
                            double b = Convert.ToDouble(stack_[0]);
                            double a = Convert.ToDouble(stack_[1]);
                            stack_.RemoveRange(0, 2);
                            result0 = a < b;
                            stack_.Insert(0, result0.ToString());
                        }
                        if (RPN_[i] == "=")
                        {
                            double b = Convert.ToDouble(stack_[0]);
                            double a = Convert.ToDouble(stack_[1]);
                            stack_.RemoveRange(0, 2);
                            result0 = a == b;
                            stack_.Insert(0, result0.ToString());
                        }
                        if (RPN_[i] == "or")
                        {
                            bool b = Convert.ToBoolean(stack_[0]);
                            bool a = Convert.ToBoolean(stack_[1]);
                            stack_.RemoveRange(0, 2);
                            result0 = a | b;
                            stack_.Insert(0, result0.ToString());
                        }
                        if (RPN_[i] == "and")
                        {
                            bool b = Convert.ToBoolean(stack_[0]);
                            bool a = Convert.ToBoolean(stack_[1]);
                            stack_.RemoveRange(0, 2);
                            result0 = a & b;
                            stack_.Insert(0, result0.ToString());
                        }
                        if (RPN_[i] == "not")
                        {
                            bool a = Convert.ToBoolean(stack_[0]);
                            stack_.Remove(stack_[0]);
                            result0 = !a;
                            stack_.Insert(0, result0.ToString());
                        }
                    }
                    ++i;
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("вітаю! у вас помилка!");
                MessageBox.Show(e.Message);
                return("error!!!!!");
            }
            if (stack_.Count != 0)
            {
                return(stack_[0]);
            }
            return("");
        }
Esempio n. 2
0
        public void Transform_to_RPN(Cell cell_, string input)
        {
            lenght = 0;
            Regex         rx_numbers     = new Regex(@"[0-9]+");
            Regex         rx_neg_numbers = new Regex(@"-[0-9]+");
            Regex         rx_cells       = new Regex(@"R[0-9]+A[0-9]+");
            Regex         rx_opers       = new Regex(@"[-,+,/,*,mod,div,or,and,=,>,<]");
            List <string> stack_         = new List <string>();
            int           i = 0;

            try
            {
                cell_.CellRef = new List <Cell>();
                foreach (string c in Split_(input))
                {
                    if (rx_numbers.IsMatch(c) && !rx_cells.IsMatch(c) && !rx_neg_numbers.IsMatch(c))
                    {
                        RPN_.Add(c);
                        ++lenght;
                    }
                    if (rx_neg_numbers.IsMatch(c))
                    {
                        string c1 = "";
                        foreach (char b in c)
                        {
                            if (b != '-')
                            {
                                c1 += b;
                            }
                        }
                        RPN_.Add("0");
                        RPN_.Add(c1);
                        RPN_.Add("-");
                        lenght += 3;
                    }
                    if (rx_cells.IsMatch(c))
                    {
                        Cell cell = CellManager.Instance.GetCell(c);
                        if (!cell_.CellRef.Contains(cell))
                        {
                            cell_.CellRef.Add(cell);
                        }
                        string c1 = "";
                        if (rx_neg_numbers.IsMatch(cell.Value))
                        {
                            foreach (char b in cell.Value)
                            {
                                if (b != '-')
                                {
                                    c1 += b;
                                }
                            }
                            RPN_.Add("0");
                            RPN_.Add(c1);
                            RPN_.Add("-");
                            lenght += 3;
                        }
                        else
                        {
                            RPN_.Add(cell.Value);
                            ++lenght;
                        }
                    }
                    if (c == "not")
                    {
                        ++i;
                        stack_.Insert(0, c);
                    }

                    if (c == "(")
                    {
                        ++i;
                        stack_.Insert(0, c);
                    }
                    if (c == ")")
                    {
                        while (i != 0 && stack_[0] != "(")
                        {
                            RPN_.Add(stack_[0]);
                            ++lenght;
                            stack_.Remove(stack_[0]);
                            --i;
                        }
                        stack_.Remove("(");
                        --i;
                    }
                    if (rx_opers.IsMatch(c) && c != "not")
                    {
                        if (i > 0)
                        {
                            while (i > 0 && (stack_[0] == "not" || GetPriority(stack_[0]) <= GetPriority(c)))
                            {
                                RPN_.Add(stack_[0]);
                                ++lenght;
                                stack_.Remove(stack_[0]);
                                --i;
                            }
                        }
                        stack_.Insert(0, c);
                        ++i;
                    }
                }

                for (int e = 0; e < i && stack_.Count != 0; e++)
                {
                    RPN_.Add(stack_[e]);
                    ++lenght;
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("вітаю! у вас помилка!");
                MessageBox.Show(e.Message);
            }
        }