Можно ли написать код, который будет сам решать любое выражение? - C#
Формулировка задачи:
Можно ли написать код, который будет сам решать любое выражение? Выражения типа 54+(45-67)/(4*9)... Я имею ввиду выражения с четырьмя действиями и со скобками, выражение представлено в виде строки. Есть возможность так сделать?
Решение задачи: «Можно ли написать код, который будет сам решать любое выражение?»
textual
Листинг программы
- using System;
- using System.Collections.Generic;
- using System.Windows.Forms;
- namespace PostfixNotation
- {
- public class PostfixNotationExpression
- {
- public PostfixNotationExpression()
- {
- operators = new List<string>(standart_operators);
- }
- private List<string> operators;
- private List<string> standart_operators =
- new List<string>(new string[] { "(", ")", "+", "-", "*", "/", "^" });
- private IEnumerable<string> Separate(string input)
- {
- int pos = 0;
- while (pos < input.Length)
- {
- string s = string.Empty + input[pos];
- if (!standart_operators.Contains(input[pos].ToString()))
- {
- if (Char.IsDigit(input[pos]))
- for (int i = pos + 1; i < input.Length &&
- (Char.IsDigit(input[i]) || input[i] == ',' || input[i] == '.'); i++)
- s += input[i];
- else if (Char.IsLetter(input[pos]))
- for (int i = pos + 1; i < input.Length &&
- (Char.IsLetter(input[i]) || Char.IsDigit(input[i])); i++)
- s += input[i];
- }
- yield return s;
- pos += s.Length;
- }
- }
- private byte GetPriority(string s)
- {
- switch (s)
- {
- case "(":
- case ")":
- return 0;
- case "+":
- case "-":
- return 1;
- case "*":
- case "/":
- return 2;
- case "^":
- return 3;
- default:
- return 4;
- }
- }
- public string[] ConvertToPostfixNotation(string input)
- {
- List<string> outputSeparated = new List<string>();
- Stack<string> stack = new Stack<string>();
- foreach (string c in Separate(input))
- {
- if (operators.Contains(c))
- {
- if (stack.Count > 0 && !c.Equals("("))
- {
- if (c.Equals(")"))
- {
- string s = stack.Pop();
- while (s != "(")
- {
- outputSeparated.Add(s);
- s = stack.Pop();
- }
- }
- else if (GetPriority(c) > GetPriority(stack.Peek()))
- stack.Push(c);
- else
- {
- while (stack.Count > 0 && GetPriority(c) <= GetPriority(stack.Peek()))
- outputSeparated.Add(stack.Pop());
- stack.Push(c);
- }
- }
- else
- stack.Push(c);
- }
- else
- outputSeparated.Add(c);
- }
- if (stack.Count > 0)
- foreach (string c in stack)
- outputSeparated.Add(c);
- return outputSeparated.ToArray();
- }
- public decimal result(string input)
- {
- Stack<string> stack = new Stack<string>();
- Queue<string> queue = new Queue<string>(ConvertToPostfixNotation(input));
- string str = queue.Dequeue();
- while (queue.Count >= 0)
- {
- if (!operators.Contains(str))
- {
- stack.Push(str);
- str = queue.Dequeue();
- }
- else
- {
- decimal summ = 0;
- try
- {
- switch (str)
- {
- case "+":
- {
- decimal a = Convert.ToDecimal(stack.Pop());
- decimal b = Convert.ToDecimal(stack.Pop());
- summ = a + b;
- break;
- }
- case "-":
- {
- decimal a = Convert.ToDecimal(stack.Pop());
- decimal b = Convert.ToDecimal(stack.Pop());
- summ=b-a;
- break;
- }
- case "*":
- {
- decimal a = Convert.ToDecimal(stack.Pop());
- decimal b = Convert.ToDecimal(stack.Pop());
- summ = b * a;
- break;
- }
- case "/":
- {
- decimal a = Convert.ToDecimal(stack.Pop());
- decimal b = Convert.ToDecimal(stack.Pop());
- summ = b / a;
- break;
- }
- case "^":
- {
- decimal a = Convert.ToDecimal(stack.Pop());
- decimal b = Convert.ToDecimal(stack.Pop());
- summ = Convert.ToDecimal(Math.Pow(Convert.ToDouble(b), Convert.ToDouble(a)));
- break;
- }
- }
- }
- catch (Exception ex)
- {
- MessageBox.Show(ex.Message);
- }
- stack.Push(summ.ToString());
- if (queue.Count > 0)
- str = queue.Dequeue();
- else
- break;
- }
- }
- return Convert.ToDecimal(stack.Pop());
- }
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д