В файле дана запись (корректная) арифметического выражения, содержащая скобки, +, -, *, /, односимвольные имена переменных и односимвольные целые константы. Унарных операций нет. Составить процедуру преобразования этой формы к бесскобочной префиксной
Категория: Delphi/Pascal
2012-02-05 19:15:03
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.
Поделиться: