нужна помощь. перевод из инфиксной формы в префиксную

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

нужна помощь. перевод из инфиксной формы в префиксную

Сообщение glupo » 19.12.2009 20:11:44

помогите пожалуйста идеей или накрайняк кодом. надо написать программу перевода выражения из инфиксной формы в префиксную без исполльзования деревьев, рекурсии и указателей. буду очень благодарен.
glupo
незнакомец
 
Сообщения: 3
Зарегистрирован: 19.12.2009 20:08:10

Re: нужна помощь. перевод из инфиксной формы в префиксну

Сообщение alexrayne » 20.12.2009 14:29:59

без использования всего етого, или как минимум рекурсии неполучица. мое имхо. как минимум рекурсию можно будет замменить на итерацию+стек параметров, но ето будет просто эквивалентная замена рекурсии.
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26

Re: нужна помощь. перевод из инфиксной формы в префиксну

Сообщение glupo » 21.12.2009 01:37:02

уфф, решение нашел.в силу того, что я только начинающий в программировании, хотелось бы выслушать конструктивную критику по поводу кода:
Код: Выделить всё
program lab8;
uses
    crt;
const
     n = 20;
type
    pos = 0..n;
var
   st,res : string;
   critical : array[0..n div 2] of pos;
   temp : array[0..n div 2 +1] of string;
   sign : array[1..n] of char;
   priority : array[0..n] of pos;
   SignPos : array[1..n] of integer;
   i,j,k,m,x,l,o : integer;
   f : boolean;
   pr,min,top : pos;
begin
clrscr;
writeln('enter the expression in the infix form :');
read(st);
j := 1;
for i := 1 to length(st) do
begin
f := true;
case st[i] of
  '+' : sign[j] := '+';
  '-' : sign[j] := '-';
  '*' : sign[j] := '*';
  '/' : sign[j] := '/';
else
   begin
   dec(j);
   f := false;
   end;
end;
if f = true then SignPos[j] := i;
inc(j);
end;
dec(j);
pr := 3;
priority[0] := pr;              {priority[0] - max element in mass priority}
for i := j downto 1 do
begin

  if st[signpos[i] + 2] = ')' then inc(pr,2);
  priority[i] := pr;
  if st[signpos[i] - 2] = '(' then dec(pr,2);


if (sign[i] = '*') or (sign[i] = '/') then inc(priority[i]);
if priority[i] > priority[0] then priority[0] := priority[i];
if pr > priority[0] then priority[0] := pr;
end;

m := priority[0];
writeln;
priority[0] := 0;
k := 0;
critical[0] := 0;
  for i := 1 to j do
  begin
    if (priority[i-1] > priority[i]) and (priority[i+1] > priority[i]) then
    begin
    inc(k);
    critical[k] := i;     {finding critical points}

    inc(critical[0]);   {nubmer of critical points}
    end;
  end;
  critical[k+1] := j+1;
  k := 1;
  x:=1;
{} for i := 1 to critical[0]+1 do
{} begin
    for m := k to critical[i]-1 do
    begin
     if (priority[m] > priority[m+1]) and (priority[m] > priority[m-1]) then
     begin
     top := m;
     temp[x] := sign[m] + st[signpos[m]-1] + st[signpos[m]+1];
     pr := priority[m];
     if priority[k] <  priority[critical[i]-1] then min := priority[k]
      else min := priority[critical[i]-1];
     end;

    end;

    for l := pr - 1 downto min do
    begin
     for m := k to critical[i]-1 do
     begin
      if priority[m] = l then
      begin
       if m < top then
       begin
       o := signpos[m] - 1;
       temp[x] := sign[m] + st[o] + temp[x];
       end;
       if m > top then
       begin
       o :=  signpos[m] + 1;
       temp[x] := sign[m] + temp[x] + st[o];
       end;
      end;
     end;
    end;
   k := critical[i]+1;
   inc(x);
end;
m := 0;
min := n;
  for i := 1 to critical[0] do
  begin
  if priority[critical[i]] > m then m := priority[critical[i]];
  if priority[critical[i]] < min then min := priority[critical[i]];
  end;

  for i := m downto min do
  begin
   for k := 1 to critical[0] do
   begin
    if priority[critical[k]] = i then
    begin
    temp[k] := sign[critical[k]] + temp[k] + temp[k+1];
    temp[k+1] := temp[k];
    l := k+1;
     while priority[critical[l]] > priority[critical[k]] do
     begin
     temp[l+1] := temp[k];
     inc(l);
     end;
    l := k-1;
     while priority[critical[l]] >= priority[critical[k]] do
     begin
     temp[l] := temp[k];
     dec(l);
     end;
    end;
   end;
  end;
res := temp[1];
if top = 0 then
begin
for i := 1 to j do res := sign[i] + res;
for i := 0 to j do res := res + st[2*i +1];
end;
writeln(res);
readkey;
end.



glupo
незнакомец
 
Сообщения: 3
Зарегистрирован: 19.12.2009 20:08:10

Re: нужна помощь. перевод из инфиксной формы в префиксну

Сообщение alexrayne » 21.12.2009 02:34:41

еслиб Вы необъяснили что ето за задача, то по коду понять невозможно.
гиасилил я код, в обзих чертах себе представляю что ето, но как баги ловить?
потому и делают все нормальные люди рекурсию.
alexrayne
постоялец
 
Сообщения: 125
Зарегистрирован: 03.12.2008 16:56:26


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 2

Рейтинг@Mail.ru