Распараллеливание арифметических выражений. Обратная польская запись. Процедура добавления звена в цепочку, страница 3

p^.mem:=c^.mem+'->'+q^.mem //запоминаем прошлые операторы второго звена

end;

memolinessearch(p^.mem); //формируем временный ССО

p.s:=p.s+p^.next^.next^.s+p^.next^.s; //изменение звена с первым операндом

p^.next:=p^.next^.next^.next; //изменения связи звеньев

dispose(q); //удаление звена со знаком

dispose(c); //удаление звена со вторым операндом

p:=p^.next; //переход на следующее звено

end

else

p:=p^.next //переход на следующее звено

else

p:=p^.next;  //переход на следующее звено

end else

Begin

p:=start; //возврат на первое звено

if p^.next<>nil then CreateTable(p, TurnNumber); //рекурсивный вызов для отображения следующего такта

exit;

end

else

p:=p^.next; //переход на следующее звено

p:=start; //возврат на первое звено

if p^.next<>nil then CreateTable(p, TurnNumber); //рекурсивный вызов для отображения следующего такта

end;

Function polska_zap(vvod:string):String;

var  //Функция, перевода пример к виду ПОЗ

x,j,i,l:integer;

s,vivod:string;

s2:char;

begin

vivod:=vvod;

l:=length(Vivod);

for i:=1 to l-1 do //сдвиг умножений и делений враво

begin

if (vivod[i]='/')or(vivod[i]='*') then

begin

if vivod[i+1]='(' then

begin

x:=0;

j:=i;

repeat

s2:=vivod[j];

vivod[j]:=vivod[j+1];

j:=j+1;

if vivod[j]=')' then x:=x-1;

if vivod[j]='(' then x:=x+1;

vivod[j]:=s2;

until x=0;

end

else

if vivod[i+1]in['A'..'Z','a'..'z'] then

begin

j:=i;

s2:=vivod[j];

vivod[j]:=vivod[j+1];

vivod[j+1]:=s2;

end;

end;

end;

for i:=1 to l-1 do //сдвиг плюсов и минусов вправо

begin

if ((vivod[i]='+')or(vivod[i]='-'))and((vivod[i+1]<>'+')and(vivod[i+1]<>'-')and(vivod[i+1]<>')')) then

begin

x:=0;

j:=i;

repeat

s2:=vivod[j];

vivod[j]:=vivod[j+1];

j:=j+1;

if vivod[j]=')' then x:=x-1;

if vivod[j]='(' then x:=x+1;

vivod[j]:=s2;

until ((x=0)and((vivod[j+1]='+')or(vivod[j+1]='-')or(vivod[j+1]=')')))or(j=l)

end;

end;

s:=vivod;

vivod:='';

for i:=1 to l do //удаление скобок

begin

if (s[i]='(')or(s[i]=')') then

else vivod:=vivod+s[i];

end;

polska_zap:=vivod;

end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var i:integer;

begin

for i:=1 to length(edit2.Text) do //создание цепочки

AddPiece(MainP,edit2.Text[i],0,'');

Stringgrid1.ColWidths[2]:=300; //форматирование ширины столбцов

Stringgrid1.ColWidths[1]:=50;

Stringgrid1.ColWidths[0]:=100;

Stringgrid2.ColWidths[2]:=300;

Stringgrid2.ColWidths[1]:=50;

Stringgrid2.ColWidths[0]:=100;

Stringgrid3.ColWidths[2]:=300;

Stringgrid3.ColWidths[1]:=50;

Stringgrid3.ColWidths[0]:=100;

Stringgrid4.ColWidths[2]:=300;

Stringgrid4.ColWidths[1]:=50;

Stringgrid4.ColWidths[0]:=100;

m1:=1; m2:=1; m3:=1; m4:=1;

for i:=1 to length(edit2.Text) do //создание клона

AddPiece(TempP,edit2.Text[i],0,'');

StringGrid1.RowCount:=1;

StringGrid1.Cells[0,0]:='МАП умножение'; //заполнение атрибутов

StringGrid2.RowCount:=1;                 //таблицы

StringGrid2.Cells[0,0]:='МАП деление';

StringGrid3.RowCount:=1;

StringGrid3.Cells[0,0]:='МАП сложение';

StringGrid4.RowCount:=1;

StringGrid4.Cells[0,0]:='МАП вычитание';

CreateTable(TempP,TurnNumber); //заполнение таблицы на текущем шаге

CreateSSO; //выводим ССО

StringGrid1.RowCount:=form1.StringGrid1.RowCount-1; //чистка пустых строк

StringGrid2.RowCount:=form1.StringGrid2.RowCount-1;

StringGrid3.RowCount:=form1.StringGrid3.RowCount-1;

StringGrid4.RowCount:=form1.StringGrid4.RowCount-1;

Dispose(TempP); //удаленние клона

TempP:=nil;

button1.Enabled:=false;

button3.Enabled:=true;

label4.Caption:=inttostr(strtoint(label4.Caption)+1); //наращиевание счётчика

end;

procedure TForm1.Button3Click(Sender: TObject);

var

Pp:Ppiece;

begin

Turn(MainP); //выполнение следующего шага

Pp:=MainP;

m1:=1; m2:=1; m3:=1; m4:=1;

while Pp<>nil do //создание клона текущей цепи

begin

AddPiece(TempP,pp^.s,pp^.number,pp^.mem);

Pp:=pp^.next;

end;

StringGrid1.RowCount:=1;

StringGrid1.Cells[1,0]:=''; //очищение таблицы

StringGrid1.Cells[2,0]:='';

StringGrid2.RowCount:=1;

StringGrid2.Cells[1,0]:='';

StringGrid2.Cells[2,0]:='';

StringGrid3.RowCount:=1;

StringGrid3.Cells[1,0]:='';

StringGrid3.Cells[2,0]:='';

StringGrid4.RowCount:=1;

StringGrid4.Cells[1,0]:='';

StringGrid4.Cells[2,0]:='';

CreateTable(TempP,TurnNumber); //заполенние таблицы на текущем шаге

StringGrid1.RowCount:=form1.StringGrid1.RowCount-1; //чистка пустых строк

StringGrid2.RowCount:=form1.StringGrid2.RowCount-1;

StringGrid3.RowCount:=form1.StringGrid3.RowCount-1;

StringGrid4.RowCount:=form1.StringGrid4.RowCount-1;

Dispose(TempP); //удаление клона

TempP:=nil;

label4.Caption:=inttostr(strtoint(label4.Caption)+1); //наращиевание счётчика

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

edit2.Text:=polska_zap(edit1.Text); //вызов функции перевода в ПОЗ

end;

end.