Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.12.2010, 19:31   #1
Бунтарь
 
Регистрация: 16.12.2010
Сообщений: 5
Восклицание Стек. Калькулятор + польская запись. Вопрос!

Написать программу, вычисления значения выражения представленного в виде польской записи (постфиксной записи). Выражение состоит из цифр от 1 до 9 и знаков операций.
Написал программу. Программа работает и переводит выражение ( к примеру (a+b)*c в выражение ab+c* )
Подскажите как реализовать процедуру которая выводила бы после польской записи значение полученного результата?
Код HTML:
program perevod;
uses crt;
var Stack:array[1..100] of char;
    Prior:array[1..100] of integer;
    i,j,t,flag,m,tpr:integer;
    nz,pz:string;
    per:char;
procedure Prioritet(a,b,c:integer;
 tp:array of char;ip:array of integer);
begin
  {ne dopusk nulevogo indeksa}
  if i>2 then begin
   t:=m-1;
   if tpr<=prior[t] then
    begin
    flag:=0;
     repeat
      per:=stack[t];
      stack[t]:=stack[t+1];
      stack[t+1]:=per;
     {ne dopusk nulevogo indeksa pri t}
       if t>1 then
        begin
         t:=t-1;
     {proverka prioritetov}
          if tpr<=prior[t] then
           flag:=0
          else flag:=1 {flag vyhoda iz tsikla}
        end
       else flag:=1
     until flag<>0;
     pz:=pz+stack[m];
     m:=m-1;
    end
   else stack[m]:=nz[i];
    end
  else stack[m]:=nz[i];
end;
 
Begin
 clrscr;
 write('vvedite vyrazhenie <100 simvolov ');
 read(nz);
 pz:=' ';
 j:=0;
 i:=1;
 m:=1;
 for i:=1 to length(nz) do
  begin
   if (nz[i]=('(')) or (nz[i]=(')')) then j:=j+1;
  end;
 if j mod 2=0 then
  begin
  for i:=1 to length(nz) do
   begin
   j:=m;
   {esli otkryv. skobka (}
   if nz[i]=('(') then
    begin
    m:=m+1;
    stack[m]:=('(');
    prior[m]:=0;
    end
   else
  {esli znaki + ili -}
    if (nz[i]=('+')) or (nz[i]=('-')) then
     begin
      tpr:=1;
      prior[m]:=1;
      stack[m]:=nz[i];
      prioritet (t,flag,tpr,stack,prior);
     end
    else
   {esli znaki * ili /}
     if (nz[i]=('*')) or (nz[i]=('/')) then
      begin
       tpr:=2 ;
       prior[m]:=2;
       stack[m]:=nz[i];
       prioritet(t,flag,tpr,stack,prior);
      end
     else
    {esli zakryv. skobka )}
      if nz[i]=(')') then
       begin
       {izvlechenie vseh simvolov s kontsa steka}
        repeat
         pz:=pz+stack[j-1];
         j:=j-1;
         m:=m-1;
        until stack[j-1]=('(');
        m:=m-1;
       end
      else
       begin
        pz:=pz+nz[i];
        if i>1 then
         m:=m+1
        else
         m:=m;
       end;
  end;
{prpverka na ostavshiesya simvoly v steke}
j:=1; {j=1 esli vyrazhenie bez skobok}
if nz[1]=('(') then j:=2;
{dobavlenie ostavshihsya simvolov iz kontsa steka}
for i:=m-1 downto j do
 pz:=pz+stack[i];
write (pz);
 end
else
 write ('zapis nekorrektna') ;
 readkey
end.
Бунтарь вне форума Ответить с цитированием
Старый 16.12.2010, 19:34   #2
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

недавно делала подобное, могу кинуть исходник
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 16.12.2010, 19:41   #3
Бунтарь
 
Регистрация: 16.12.2010
Сообщений: 5
Сообщение

Цитата:
Сообщение от Sparky Посмотреть сообщение
недавно делала подобное, могу кинуть исходник
Очень поможешь, если не трудно, кинь исходник, пожалуйста.
Какой день уже втыкаюсь

Последний раз редактировалось Бунтарь; 16.12.2010 в 19:57.
Бунтарь вне форума Ответить с цитированием
Старый 16.12.2010, 20:27   #4
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

вот исходник на delphi
Вложения
Тип файла: rar poliz.rar (62.6 Кб, 139 просмотров)
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 16.12.2010, 23:32   #5
Бунтарь
 
Регистрация: 16.12.2010
Сообщений: 5
Сообщение

Цитата:
Сообщение от Sparky Посмотреть сообщение
вот исходник на delphi
Спасибо большое Sparky. Но всё это я реализовал. Мне нужно дописать свою программу так, чтобы после перевода в польскую запись, следом прога считала и выводила значение
Бунтарь вне форума Ответить с цитированием
Старый 17.12.2010, 00:41   #6
unbanned
Форумчанин
 
Аватар для unbanned
 
Регистрация: 23.11.2010
Сообщений: 530
По умолчанию

ну дак ты вычисляй до преобразований... а потом просто выводи результат
unbanned вне форума Ответить с цитированием
Старый 17.12.2010, 03:03   #7
Sparky
Участник клуба
 
Аватар для Sparky
 
Регистрация: 15.05.2009
Сообщений: 1,222
По умолчанию

дак а что у меня этого нет? Пробегаете по свое польской записи еще раз, встретили число засунули его в стек, встретили операцию выполнили ее над значениями в стеке и записали в стек ее результат. У меня все это сделано в процедуре calc
Единственное, что ограничивает полет мысли программиста-компилятор
Sparky вне форума Ответить с цитированием
Старый 20.12.2010, 00:54   #8
Бунтарь
 
Регистрация: 16.12.2010
Сообщений: 5
Сообщение

Цитата:
Сообщение от Sparky Посмотреть сообщение
У меня все это сделано в процедуре calc
Уважаемая, Sparky! В вашей программе нет процедуры calc.
Бунтарь вне форума Ответить с цитированием
Старый 20.12.2010, 01:58   #9
Бунтарь
 
Регистрация: 16.12.2010
Сообщений: 5
Сообщение

Исходное условие задачи (решить на паскале реализовать в ДИНАМИКЕ)

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

Никак не могу вникнуть( хоть убей...
Бунтарь вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обратная польская запись alexobenikov Общие вопросы C/C++ 12 25.11.2010 23:03
Польская запись tatu_cat_69 Общие вопросы .NET 0 15.04.2010 19:03
Польская запись azl-8 Помощь студентам 0 06.05.2009 20:19
Обратная польская запись Катуха Помощь студентам 6 27.12.2008 10:23