Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2017
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 6.04 KB | None | 0 0
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, StdCtrls;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     mathexpr: TEdit;
  12.     Button1: TButton;
  13.     res: TEdit;
  14.     procedure Button1Click(Sender: TObject);
  15.   private
  16.     { Private declarations }
  17.   public
  18.     { Public declarations }
  19.   end;
  20.  
  21. var
  22.   Form1: TForm1;
  23.  
  24. implementation
  25.  
  26. {$R *.dfm}
  27.  
  28. (********************************************************************)
  29. //Использованные сокращения
  30. //  expr = expression
  31. //  sym = symbol
  32. //  tab = table
  33. //  prior = priority
  34. //  ExprToOpn = Expression to OPN (ОПН - Обратная польская нотация)
  35. (********************************************************************)
  36.  
  37. //Определение приоритета знака
  38. function prior (sym: String): Shortint;
  39. begin
  40.   if sym[1] in ['/','*'] then
  41.     Result := 2
  42.   else
  43.     if sym[1] in ['+','-'] then
  44.       Result := 1
  45.     else
  46.       Result := -1;
  47. end;
  48.  
  49. //Поиск конца стека
  50. function stackend (tab: Variant; sym: Byte): Integer;
  51. var
  52.   i: Integer;
  53. begin
  54.   for i := 0 to 500  do
  55.     if tab[i,sym] = '' then
  56.       begin
  57.         Result := i - 1;
  58.           break;
  59.       end;
  60. end;
  61.  
  62. //Замена унарного минуса на букву 'm'
  63. function delmin (expr: String): String;
  64. var
  65.   i: Integer;
  66. begin
  67.   for i := 1 to length(expr) do
  68.     if (expr[i] = '-') and ((i = 1) or (expr[i - 1] = '(')) then
  69.       expr[i] := 'm';
  70.     Result := expr;
  71. end;
  72.  
  73.  
  74. //Перевод выражения в ОПН
  75. function ExprToOpn(expr: String): String;
  76. var
  77.   i,outstr: Integer;
  78.   tab: array of array of String;
  79. begin
  80.   expr := '(' + delmin(expr) + ')';
  81.   SetLength(tab, length(expr), length(expr));
  82.   outstr := 0;
  83.   { Проверяем каждый символ в выражении, если символ не знак операции или скобки,
  84.     то выводим его в выходную строку }
  85.   for i := 1 to length(expr) do
  86.     if not(expr[i] in ['+', '-', '*', '/', '(', ')']) then
  87.       begin
  88.         tab[outstr,0] := tab[outstr,0] + expr[i];
  89.       end
  90.     else
  91.     { Если временнный стек пуст, то помещаем в
  92.     него символ }
  93.       if tab[0,1] = '' then
  94.         begin
  95.           tab[0,1] := expr[i];
  96.           outstr := stackend(tab,0) + 1;
  97.         end
  98.         else
  99.         { Если приоритет последнего символа в стеке меньше чем символ в
  100.           выражении и не скобка, то помещаем его в стек }
  101.           if (prior(tab[stackend(tab,1),1]) < prior(expr[i]))
  102.           and (prior(expr[i]) <> -1) then
  103.             begin
  104.               tab[stackend(tab,1) + 1,1] := expr[i];
  105.               outstr := stackend(tab,0) + 1;
  106.             end
  107.           else
  108.           { Если приоритет последнего символа в стеке больше или
  109.             равен символу в выражении и не скобка, то перемещаем символы из
  110.             стека в выходную строку до тех пор, пока его приоритет не
  111.             станет меньше или не станет скобкой }
  112.             if (prior(tab[stackend(tab,1),1]) >= prior(expr[i]))
  113.             and (prior(expr[i]) <> -1) then
  114.               begin
  115.                 while (prior(tab[stackend(tab,1),1]) >= prior(expr[i]))
  116.                 and (prior(tab[stackend(tab,1),1]) <> -1) do
  117.                   begin
  118.                     tab[stackend(tab,0) + 1,0] := tab[stackend(tab,1),1];
  119.                     tab[stackend(tab,1),1] := '';
  120.                     if stackend(tab,1) < 0 then
  121.                       break;
  122.                   end;
  123.                     { Когда последний символ в стеке станет меньше
  124.                       или равен символу в выражении, вставляем символ из
  125.                       выражения в выходную строку }
  126.                     tab[stackend(tab,1) + 1,1] := expr[i];
  127.                     outstr := stackend(tab,0) + 1;
  128.             end
  129.             else
  130.            { Если символ открывающая скобка, то вставляем его в
  131.              выходную строку }
  132.                 if expr[i] = '(' then
  133.                   begin
  134.                     tab[stackend(tab,1) + 1,1] := '(';
  135.                     outstr := stackend(tab,0) + 1;
  136.                 end
  137.                 else
  138.                 { Если символ закрывающая скобка, то переносим символы из
  139.                   стека в выходную строку до тех пор, пока не встретим
  140.                   открывающую скобку, после чего уничтожаем её }
  141.                   begin
  142.                     if expr[i] = ')' then
  143.                       while tab[stackend(tab,1),1] <> '(' do
  144.                         begin
  145.                           tab[stackend(tab,0) + 1,0] := tab[stackend(tab,1),1];
  146.                           tab[stackend(tab,1),1] := '';
  147.                         end;
  148.                     tab[stackend(tab,1),1] := '';
  149.                     outstr := stackend(tab,0) + 1;
  150.                   end;
  151.   { После прочтения всех символов выражения, переносим все знаки
  152.     из стека в выходную строку }
  153.   while stackend(tab,1) <> -1 do
  154.     begin
  155.       tab[stackend(tab,0) + 1,0] := tab[stackend(tab,1),1];
  156.       tab[stackend(tab,1),1] := '';
  157.     end;
  158.     {Копируем выходную строку в результат}
  159.   for i := 0 to stackend(tab,0) do
  160.     begin
  161.       Result := Result + ' ' + tab[i,0];
  162.       tab[i,0] := '';
  163.     end;
  164. end;
  165.  
  166.  
  167. procedure TForm1.Button1Click(Sender: TObject);
  168. begin
  169.   res.Text := ExprToOpn(mathexpr.Text);
  170. end;
  171.  
  172. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement