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

Leave a Comment

− 1 = 1