В файле дана запись (корректная) арифметического выражения, содержащая скобки, +, -, *, /, односимвольные имена переменных и односимвольные целые константы. Унарных операций нет. Составить процедуру преобразования этой формы к бесскобочной префиксной

code: #pascal
program ex9;
type
tf=text;
t=^zap;
zap=record
el:char;
sled,pred:t;
end;
m=set of char;
 
procedure create(var f1:tf;var sp1:t);
var
zv,zv1:t;
begin
reset(f1);
new(zv);
sp1:=zv;
while not eof(f1) do
      begin
      read(f1,zv^.el);
      new(zv^.sled);
      zv1:=zv;
      zv:=zv^.sled;
      zv^.pred:=zv1;
      zv^.sled:=nil;
      end;
close(f1);
end;
 
procedure print(var fp:tf;spp:t);
var
zv:t;
begin
zv:=spp;
writeln(fp,'Прямо');
while zv^.sled<>nil do
      begin
      write(fp,zv^.el);
      zv:=zv^.sled;
      end;
writeln(fp);
writeln(fp,'Обратно');
while zv<>spp do
      begin
      zv:=zv^.pred;
      write(fp,zv^.el);
      end;
end;
 
procedure correct(var f2:tf;sp2:t;var er:boolean);
var
p:m;
zv:t;
k:integer;
begin
zv:=sp2;
er:=false;
k:=0;
while zv^.sled<>nil do
      begin
      if zv^.el='(' then
      k:=k+1;
      if zv^.el=')' then
      k:=k-1;
      zv:=zv^.sled;
      end;
if k<>0 then begin
             er:=true;
             writeln(f2);
             writeln(f2,'При проверке обнаружена ошибка ');
             end;
end;
 
procedure prefix(var f3:tf;sp3:t;er1:boolean);
var
zv,zv1,kz:t;
mz,ms:m;
c:char;
i:integer;
bl:boolean;
begin
if er1=true then exit;
writeln(f3);
writeln(f3,'Префиксная форма ');
i:=0;
mz:=['-','+','*','/'];
ms:=['(',')'];
zv:=sp3;
repeat
      begin
      zv:=zv^.sled;
      if zv^.el in mz then bl:=true;
      end;
until (bl=true) and (zv^.pred^.el=')') and (zv^.sled^.el='(');
kz:=zv;
write(f3,kz^.el);
zv:=sp3;
while zv^.sled<> nil do
      begin
      if zv=kz then bl:=true else bl:=false;
      if (zv^.el in mz) and (bl=false) then
         begin
         write(f3,zv^.el);
         zv1:=zv^.pred;
 
         if (zv1^.el in ms) or (zv1=kz) then c:='0' else write(f3,zv1^.el);
         zv1:=zv^.sled;
         if (zv1^.el in ms) or (zv1=kz) then c:='0' else write(f3,zv1^.el);
         end;
      zv:=zv^.sled;
      end;
end;
 
{Главная}
var
sp:t;
f,g:text;
err:boolean;
begin
assign(f,'dan9.inp');
assign(g,'res9.out');
rewrite(g);
create(f,sp);
print(g,sp);
correct(g,sp,err);
prefix(g,sp,err);
close(g);
dispose(sp);
end.      
Поделиться:

Похожие статьи: