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(""); }
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); } }