1

Тема: Зворотній Польський Запис

Добрий вечір.
Потрібна допомога у обчисленні створеного Зворотнього Польського Запису. Сам алгоритм обчислення я розумію, але я не можу його представити у програмному вигляді.
На даний момент є лише код програми яка створює запис.

Код
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Button2: TButton;
    XPManifest1: TXPManifest;
    procedure Button1Click(Sender: TObject);
    procedure Push(Sumb:char);
    procedure Pop(var Sumb:char);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  Stack = ^Element;
  Element = record
    Op:Char;
    Next:stack;
  end;

var
  Form1: TForm1;
  Head:Stack;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i:Byte; l:real; sm:Char;
begin
  Edit2.Text:='';
  New(Head); Head^.Next := nil;
  i := 1;
  while i <= Length(Edit1.Text) do
  begin
    case Edit1.Text[i] of
      '(': push('(');
      ')': begin
             Pop(sm);
             while sm <> '(' do
             begin
               Edit2.Text := Edit2.Text + sm;
               Pop(sm);
             end;
           end;
      '+','-': begin
                 if (Head.Op = '+') or (Head.Op = '-') then
                 begin
                   Pop(sm);
                   Edit2.Text := Edit2.Text + sm;
                 end;
                 Push(Edit1.Text[i]);
               end;
      '*','/': begin
                 if (Head.Oper = '*')or(Head.Oper = '/')then
                 begin
                   Pop(sm);
                   Edit2.Text := Edit2.Text + sm;
                 end;
                 push(Edit1.text[i]);
               end;
    else
      Edit2.Text := Edit2.Text + Edit1.Text[i];
    end;
    inc(i);
  end;

  while head^.next <> nil do
  begin
    Pop(sm);
    Edit2.Text := Edit2.Text+sm;
  end;
end;


procedure TForm1.Pop(var Sumb: char);
begin
  Sumb := Head^.Oper;
  Head := Head^.next;
end;


procedure TForm1.Push(sumb: char);
var Elem:Stack;
begin
  New(Elem);
  Elem^.Oper := Sumb;
  Elem^.Next := Head;
  head:=Elem;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Close;
end;

end.

Проблема полягає саме в тому, що я не знаю як стрічку перетворити таким чином, щоб можна було виконувати арифметичні операції.

P.S. Вираз задається у вигляді запису чисел, наприклад: (6+8)/(15-8)

2 Востаннє редагувалося Chemist-i (28.11.2013 00:02:19)

Re: Зворотній Польський Запис

Прочитайте про інтерпретатори, наприклад: http://tigrazone.narod.ru/smallbasic.html (це пошук видав), взагалі-то я про інтерпретатори читав у книзі:

Прихований текст

"Арт Фридман, Ларс Кландер, Марк Михаэлис, Херб Шильдт. С/С++. Алгоритмы и приемы программирования"
Глава 14 приблизно

От ще цікаві посилання:
Розбір та аналіз рядків на паскалі (рус.);
Інтерпретатор арефметичних виразів (рус.);
Синтаксичний розбір формул [Pascal][Download](рус.);

Подякували: Logans1

3 Востаннє редагувалося Очі.завидющі (28.11.2013 01:34:09)

Re: Зворотній Польський Запис

Я хочу це розбачити! Питають за зворотній польский запис, а відповідає людина, яка навіть не знає як робиться найпростіший синтаксичний аналіз за допомогою регулярних виразів. При цьому посилання зовсім не по темі і на люту фофуддю 20 річної давнини. Не знаєш - не відповідай.

Тепер стосовно запитання:
Зворотній польський запис використовується в родині мов форт.
Гарні статті українською - перша, друга. Хоча код на асмі для 8086, проте алгоритм детально пояснюється.

Подякували: Logans1

4

Re: Зворотній Польський Запис

Прихований текст

Очі? За што Ви нас так нєнавідітє?

5

Re: Зворотній Польський Запис

http://www.math.bas.bg/bantchev/place/r … ascal.html

Подякували: Очі.завидющі, Logans2

6 Востаннє редагувалося koala (28.11.2013 07:03:57)

Re: Зворотній Польський Запис

1. Можете приклад виводу своєї програми навести?
2. Алгоритм обчислення ПолІЗ не простий, а дуже простий:

while(вираз не пустий)
if (перший елемент - число) then додати це число до стеку
else /*перший елемент - операція*/ застосувати операцію до двох верхніх елементів в стеку і
  покласти результат у стек;

Тепер перше (і єдине) число в стеку - результат обчислення.

Подякували: Logans1

7

Re: Зворотній Польський Запис

Logans
Ваша структура Element не вміє зберігати числа. Додайте до неї іще одне поле, та передбачте значення Op, яке означатиме, що в даному елементі зберігається число.

Іще раджу почитати книжку "О чём не пишут в книгах по Delphi". Четвертий розділ у ній цілком присвячено аналізу математичних виразів.

Подякували: Logans1