Можно ли написать код, который будет сам решать любое выражение? - C#

Узнай цену своей работы

Формулировка задачи:

Можно ли написать код, который будет сам решать любое выражение? Выражения типа 54+(45-67)/(4*9)... Я имею ввиду выражения с четырьмя действиями и со скобками, выражение представлено в виде строки. Есть возможность так сделать?

Решение задачи: «Можно ли написать код, который будет сам решать любое выражение?»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Windows.Forms;
  4. namespace PostfixNotation
  5. {
  6.     public class PostfixNotationExpression
  7.     {
  8.         public PostfixNotationExpression()
  9.         {
  10.             operators = new List<string>(standart_operators);
  11.            
  12.         }
  13.         private List<string> operators;
  14.         private List<string> standart_operators =
  15.             new List<string>(new string[] { "(", ")", "+", "-", "*", "/", "^" });
  16.  
  17.         private IEnumerable<string> Separate(string input)
  18.         {            
  19.             int pos = 0;
  20.             while (pos < input.Length)
  21.             {
  22.                 string s = string.Empty + input[pos];
  23.                 if (!standart_operators.Contains(input[pos].ToString()))
  24.                 {
  25.                     if (Char.IsDigit(input[pos]))
  26.                         for (int i = pos + 1; i < input.Length &&
  27.                             (Char.IsDigit(input[i]) || input[i] == ',' || input[i] == '.'); i++)
  28.                             s += input[i];
  29.                     else if (Char.IsLetter(input[pos]))
  30.                         for (int i = pos + 1; i < input.Length &&
  31.                             (Char.IsLetter(input[i]) || Char.IsDigit(input[i])); i++)
  32.                             s += input[i];
  33.                 }
  34.                 yield return s;
  35.                 pos += s.Length;
  36.             }
  37.         }
  38.         private byte GetPriority(string s)
  39.         {
  40.             switch (s)
  41.             {
  42.                 case "(":
  43.                 case ")":
  44.                     return 0;
  45.                 case "+":
  46.                 case "-":
  47.                     return 1;
  48.                 case "*":
  49.                 case "/":
  50.                     return 2;
  51.                 case "^":
  52.                     return 3;
  53.                 default:
  54.                     return 4;
  55.             }
  56.         }
  57.  
  58.         public string[] ConvertToPostfixNotation(string input)
  59.         {
  60.             List<string> outputSeparated = new List<string>();
  61.             Stack<string> stack = new Stack<string>();
  62.             foreach (string c in Separate(input))
  63.             {
  64.                 if (operators.Contains(c))
  65.                 {
  66.                     if (stack.Count > 0 && !c.Equals("("))
  67.                     {
  68.                         if (c.Equals(")"))
  69.                         {
  70.                             string s = stack.Pop();
  71.                             while (s != "(")
  72.                             {
  73.                                 outputSeparated.Add(s);
  74.                                 s = stack.Pop();
  75.                             }
  76.                         }
  77.                         else if (GetPriority(c) > GetPriority(stack.Peek()))
  78.                             stack.Push(c);
  79.                         else
  80.                         {
  81.                             while (stack.Count > 0 && GetPriority(c) <= GetPriority(stack.Peek()))
  82.                                 outputSeparated.Add(stack.Pop());
  83.                             stack.Push(c);
  84.                         }
  85.                     }
  86.                     else
  87.                         stack.Push(c);
  88.                 }
  89.                 else
  90.                     outputSeparated.Add(c);
  91.             }
  92.             if (stack.Count > 0)
  93.                 foreach (string c in stack)
  94.                     outputSeparated.Add(c);
  95.  
  96.             return outputSeparated.ToArray();
  97.         }
  98.         public decimal result(string input)
  99.         {
  100.             Stack<string> stack = new Stack<string>();
  101.             Queue<string> queue = new Queue<string>(ConvertToPostfixNotation(input));
  102.             string str = queue.Dequeue();
  103.             while (queue.Count >= 0)
  104.             {
  105.                 if (!operators.Contains(str))
  106.                 {
  107.                     stack.Push(str);
  108.                     str = queue.Dequeue();
  109.                 }
  110.                 else
  111.                 {
  112.                     decimal summ = 0;
  113.                     try
  114.                     {
  115.                        
  116.                         switch (str)
  117.                         {
  118.  
  119.                             case "+":
  120.                                 {
  121.                                     decimal a = Convert.ToDecimal(stack.Pop());
  122.                                     decimal b = Convert.ToDecimal(stack.Pop());
  123.                                     summ = a + b;
  124.                                     break;
  125.                                 }
  126.                             case "-":
  127.                                 {
  128.                                     decimal a = Convert.ToDecimal(stack.Pop());
  129.                                     decimal b = Convert.ToDecimal(stack.Pop());
  130.                                     summ=b-a;
  131.                                     break;
  132.                                 }
  133.                             case "*":
  134.                                 {
  135.                                     decimal a = Convert.ToDecimal(stack.Pop());
  136.                                     decimal b = Convert.ToDecimal(stack.Pop());
  137.                                     summ = b * a;
  138.                                     break;
  139.                                 }
  140.                             case "/":
  141.                                 {
  142.                                     decimal a = Convert.ToDecimal(stack.Pop());
  143.                                     decimal b = Convert.ToDecimal(stack.Pop());
  144.                                     summ = b / a;
  145.                                     break;
  146.                                 }
  147.                             case "^":
  148.                                 {
  149.                                     decimal a = Convert.ToDecimal(stack.Pop());
  150.                                     decimal b = Convert.ToDecimal(stack.Pop());
  151.                                     summ = Convert.ToDecimal(Math.Pow(Convert.ToDouble(b), Convert.ToDouble(a)));
  152.                                     break;
  153.                                 }
  154.                         }
  155.                     }
  156.                     catch (Exception ex)
  157.                     {
  158.                         MessageBox.Show(ex.Message);
  159.                     }
  160.                     stack.Push(summ.ToString());
  161.                     if (queue.Count > 0)
  162.                         str = queue.Dequeue();
  163.                     else
  164.                         break;
  165.                 }
  166.                
  167.             }
  168.             return Convert.ToDecimal(stack.Pop());
  169.         }
  170.     }
  171.  
  172. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы