Добавил:
БГУИР ПОИТ Дистанционное Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИПР1 / ИПР 1.docx
Скачиваний:
18
Добавлен:
06.10.2021
Размер:
169.58 Кб
Скачать

Interface

uses

Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, Menus;

type

{ TForm3 }

TForm3 = class(TForm)

Button1: TButton;

Edit1: TEdit;

Edit2: TEdit;

Edit3: TEdit;

Label1: TLabel;

Label2: TLabel;

Label3: TLabel;

MainMenu1: TMainMenu;

MenuItem1: TMenuItem;

MenuItem2: TMenuItem;

procedure Button1Click(Sender: TObject);

procedure Edit1KeyPress(Sender: TObject; var Key: char);

procedure MenuItem2Click(Sender: TObject);

private

public

end;

var

Form3: TForm3;

Implementation

Type pt_1=^el_1;

el_1=Record //описание стека для первой части программы

data:Char;

next:pt_1;

End;

Var s:String;

rez_1, rez_2:String;

{$R *.lfm}

{ TForm3 }

Procedure WriteStack_1(Var u:pt_1; dig:Char);

//запись в стек

//u – указатель на начало стека

//dig – значение символа, которое записывается в стек

Var x: pt_1;

Begin

New(x);

x^.data:=dig; x^.next:=u;

u:=x;

End;

Procedure ReadStack_1(Var u:pt_1; Var dig:Char);

//извлечение из стека

//u – указатель на начало стека

//dig – значение символа, которое извлекается из стека

Var x: pt_1;

Begin

dig:=u^.Data;

x:=u;

u:=u^.Next; Dispose(x);

End;

Function Priority(c: Char): Byte;

Var R:Byte;

Begin

R := 0;

Case c of

'+', '-': R:= 1;

'*', '/', '^': R:= 2;

end;

Priority:=R;

End;

Function Free_1(u:pt_1):Boolean;

//u – указатель на начало стека

Begin

If u=Nil Then Free_1:=False Else Free_1:= True;

End;

Procedure Convert_expression (a:String;Var z:String); // Постфиксная форма из инфиксной

Var head:pt_1;

i:Integer;

w:Char;

Begin

head:=Nil;

z:='';

i:=1;

While i<=Length(a) Do

Begin

Case a[i] of

'0'..'9': z:=z+a[i];

'a'..'z': z:=z+a[i];

'A'..'Z': z:=z+a[i];

'(': WriteStack_1(head,a[i]);

')': Begin //Считываем из стека до символа «(»

ReadStack_1(head,w);

While w<>'(' Do

Begin z:=z+w; ReadStack_1(head,w); End;

End;

'+','-','*','/','^':

begin

If not Free_1(head) Then WriteStack_1(head,a[i])

else

begin

w:=head^.data;

While Free_1(head)and(Priority(head^.data)>= Priority(a[i]))

do

Begin ReadStack_1(head,w);z:=z+w; End;

WriteStack_1(head,a[i]) ;

end;

end;

End;

Inc(i);

End;

//Дополняем строку символами операций, запомненных в стеке

While Free_1(head) Do Begin ReadStack_1(head,w); z:=z+w; End;

End;

Procedure Convert_expression_2 (a:String;Var z:String); // Перевод из постфиксной в префиксную

var

stat:integer;

i:integer;

s:string;

begin

z:='';

i:=1;

While i<=Length(a) Do begin

case a[i] of

'0'..'9': stat:=0;

'a'..'z': stat:=0;

'A'..'Z': stat:=0;

' ' : stat:=0;

'+','-','*','/','^': stat:=1;

end;

if stat = 1 then begin

s:= a[i] + a[i-2] + a[i-1];

if (s[2]= ' ') or (s[3] = ' ') then

z:= s[1] + s[2] + z + s[3]

else z:= z + s;

a:= StringReplace(a, a[i-2] + a[i-1] + a[i], ' ',

[rfReplaceAll, rfIgnoreCase]);

i:=0;

end;

inc(i);

end;

z := StringReplace(z ,' ','', [rfReplaceAll, rfIgnoreCase]);

end;

procedure TForm3.MenuItem2Click(Sender: TObject); // Задание

begin

ShowMessage(' 1. Используя стек, реализовать алгоритм преобразования алгебраиче'+

'ского выражения из инфиксной формы записи в постфиксную форму пред'+

'ставления.'+ #13 + '2. Используя стек, реализовать алгоритм преобразования алгебраиче'+

'ского выражения из инфиксной формы записи в префиксную форму пред'+

'ставления.' + #13 + 'Для обоих алгоритмов предусмотреть вхождение операций с различны'+

'ми приоритетами, а также наличие скобок в инфиксных выражениях.')

end;

procedure TForm3.Button1Click(Sender: TObject); // Перевод!

begin

If Edit1.text = '' then begin

ShowMessage ('Нельзя ввести пустую строку!');

exit;

end;

if length(Edit1.text)<3 then begin

ShowMessage ('Слишком короткая запись!');

exit;

end;

s:= Edit1.Text;

Convert_expression(s,rez_1);

Edit2.Text:=rez_1;

Convert_expression_2(rez_1,rez_2);

Edit3.Text:=rez_2;

end;

procedure TForm3.Edit1KeyPress(Sender: TObject; var Key: char); // Ограничение ввода

begin

if not (Key in ['0'..'9', #8]) then

if not (Key in ['a'..'z', #8]) then

if not (Key in ['A'..'Z', #8]) then

if not (Key in ['+','-','*','/','^','(',')', #8]) then

Key := #0;

end;

end.

Соседние файлы в папке ИПР1