Добро пожаловать, гость
:: алгоритмы  и методы :: :: олимпиадные задачи :: :: связь :: :: о сайте :: :: форум ::

Форум работает в режиме архива, только для чтения и поиска.
Архив 2004 Архив 2007 Архив 2013

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.12.2010, 10:50
Новичок

Отправить личное сообщение для Бунтарь Посмотреть профиль Найти все сообщения от Бунтарь
 
Регистрация: 20.12.2010
Сообщений: 2

Стек. Польская записиь. Вычисление значения
Здравствуйте!

Очень нужна помощь в написании данной программы!!! (реализовать в динамике в паскале)

Написать программу, вычисления значения выражения представленного в виде польской записи (постфиксной записи). Выражение состоит из цифр от 1 до 9 и знаков операций.(к примеру (a+b)*c в выражение ab+c*). Просматривая строку, анализируем очередной символ, если это: - цифра, то записываем её в стек; - то читаем 2 элемента из стека, выполняем математическую операцию, определяемую этим знаком, и заносим результат в стек. После просмотра всей строки в стеке должен оставаться один элемент, он и является решением задачи. (Процедура Val (s,x,k) преобразует символьное представление цифры s в соответствующее числовое значение. При этом k=0, если такое преобразование возможно, в противном случаи k>0)


Заранее благодарен тем, кто поможет в решение данной задачи!!!
  #2  
Старый 20.12.2010, 10:59
гocть

 
Сообщений: n/a

Элементарная учебная задача.
ЕЕ КОД ЗА ВАС ТУТ НИКТО ПИСАТЬ НЕ БУДЕТ

В чем при ее выполнении вам требуется помощь? Сформулируйте конкретные вопросы. Алгоритм не ясен?
  #3  
Старый 20.12.2010, 22:49
Новичок

Отправить личное сообщение для Бунтарь Посмотреть профиль Найти все сообщения от Бунтарь
 
Регистрация: 20.12.2010
Сообщений: 2

Сообщение от гocть Посмотреть сообщение
Элементарная учебная задача.
ЕЕ КОД ЗА ВАС ТУТ НИКТО ПИСАТЬ НЕ БУДЕТ

В чем при ее выполнении вам требуется помощь? Сформулируйте конкретные вопросы. Алгоритм не ясен?
Я реализовал задачу так как понял, вот так:

Код:
Const
  cmPUSH  = 0;
  cmMINUS = 1;
  cmPLUS  = 2;
  cmMUL   = 3;
  cmDIV   = 4;

Type
  code_mem=record
   a:array[0..1023] of byte;
   p:integer;
  end;

Var
  Stack:array[0..100] of real;

Procedure Parse(s:string;var code:code_mem);
Var
  i,j:byte;
  a,b:integer;
Begin

 
  j:=0;
  for i:=byte(s[0]) downto 1 do
    case s[i] of
      ')': inc(j);
      '(': dec(j);
      '-': if j=0 then
             begin
               parse(copy(s,1,i-1),code);
               parse(copy(s,i+1,byte(s[0])-i),code);
               code.a[code.p]:=cmMINUS;
               inc(code.p);
               exit;
             end;
      '+': if j=0 then
             begin
               parse(copy(s,1,i-1),code);
               parse(copy(s,i+1,byte(s[0])-i),code);
               code.a[code.p]:=cmPLUS;
               inc(code.p);
               exit;
             end;
    end;

 j:=0;
  for i:=byte(s[0]) downto 1 do
    case s[i] of
      '(': inc(j);
      ')': dec(j);
      '/': if j=0 then
             begin
               parse(copy(s,1,i-1),code);
               parse(copy(s,i+1,byte(s[0])-i),code);
               code.a[code.p]:=cmDIV;
               inc(code.p);
               exit;
             end;
      '*': if j=0 then
             begin
               parse(copy(s,1,i-1),code);
               parse(copy(s,i+1,byte(s[0])-i),code);
               code.a[code.p]:=cmMUL;
               inc(code.p);
               exit;
             end;
    end;

  val(s,a,b);

 
  if b=0 then
    begin
     
      code.a[code.p]:=cmPUSH;
      inc(code.p);
      code.a[code.p]:=lo(a);
      inc(code.p);
      exit
    end;

 
  if s='' then
    begin
      code.a[code.p]:=cmPUSH;
      inc(code.p);
      code.a[code.p]:=0;
      inc(code.p);
      exit
    end;

   if (s[1]='(') and (s[byte(s[0])]=')') then
    begin
      
    i:=2;
      j:=1;
      while (i<(byte(s[0])-1)) and (j>0) do
        begin
          if s[i]='(' then inc(j);
          if s[i]=')' then dec(j);
          inc(i);
        end;
      if j<>0 then
          parse(copy(s,2,byte(s[0])-2),code);
    end;
End;

Function Calk(code:code_mem):real;
Var
  i:byte;
  StackPointer:byte;
Begin
  i:=0;
  StackPointer:=0;
  while (i<code.p) do
    Begin
      case code.a[i] of
        cmPUSH :Begin
                 inc(i);
                 Stack[StackPointer]:=code.a[i];
                 inc(StackPointer);
                end;
        cmMINUS:Begin
                 Dec(StackPointer);
                 Stack[StackPointer-1]:=Stack[StackPointer-1]-Stack[StackPointer];
                End;
        cmPLUS :Begin
                 Dec(StackPointer);
                 Stack[StackPointer-1]:=Stack[StackPointer-1]+Stack[StackPointer];
                End;
        cmDIV  :Begin
                 Dec(StackPointer);
                 Stack[StackPointer-1]:=Stack[StackPointer-1]/Stack[StackPointer];
                End;
        cmMUL  :Begin
                 Dec(StackPointer);
                 Stack[StackPointer-1]:=Stack[StackPointer-1]*Stack[StackPointer];
                End;
      End;
      inc(i);
    End;
    Calk:=Stack[0];
End;

Var
 q:code_mem;
 s:string;
BEGIN
 q.p:=0;
 write('Введите выражение которое преобразуем:'); { Строка типа '((10+6)/(6-2))'}
 readln(s);
 parse(s,q);
 writeln(calk(q):1:5);
 readln;
 end.
Что скажите?

Последний раз редактировалось Бунтарь, 20.12.2010 в 22:54.
  #4  
Старый 22.12.2010, 00:54
гocть

 
Сообщений: n/a

я скажу что вы нам врете, и это не вы писали этот код. источник вашего код хорошо гуглится, вот идите и задавайте туда вопросы по этому коду
 


Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на поиск максимального значения Maria_Kap Математические алгоритмы (другое) 7 30.07.2010 18:30
Опять прямая польская intelligangster Реализация, исходники, языки 4 13.12.2009 05:03
собственные значения матрицы гость Реализация, исходники, языки 2 10.12.2008 00:48
Стек и очередь. Не до конца понял смысл. Alexander_ua Задачи 4 06.11.2008 23:49
обчисления значения многочлена гость Реализация, исходники, языки 12 06.04.2008 11:29