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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2011, 00:32   #1
doktor_zlo
Новичок
Джуниор
 
Регистрация: 11.11.2011
Сообщений: 3
По умолчанию Turbo Pascal - вычислить значение выражения в постфиксной форме

В символьной строке записано выражение из цифр и
операций в постфиксной форме (знак операции после операндов).
Проверить правильность записи и найти значение выражения.
Пример: выражение (2+3)*4-5*6 записывается в постфиксной
форме как 2 3+4*5 6*- (7).

Очень нужно!! Помогите кто чем может....

______________
Название темы по правилам форума должно адекватно отражать суть решаемой задачи/проблемы.
На первый раз я исправил.
В последующем, темы с подобным названием будут закрываться или удаляться,
а автор такой темы будет получать штрафные баллы.
Учтите это на будущее.

Модератор.

Последний раз редактировалось Serge_Bliznykov; 11.11.2011 в 00:44.
doktor_zlo вне форума Ответить с цитированием
Старый 11.11.2011, 00:53   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) абсолютно непонятно, что означает (7) семь в скобках.

2) вот, готовая программа.
Проверку на правильность добавите самостоятельно.

Код:

const
  MAXStack = 100;

var
  Stack:array[1..MAXStack] of Double;
  TopofStack:integer; {points to top of stask}


{ помещение объекта в стек }
procedure Push(i:Double);
begin
  if TopofStack>=MAXStack then WriteLn('Stask full')
  else
  begin
    stack[TopofStack]:=i;
    TopofStack:=TopofStack+1;
  end;
end; { конец  процедуры  помещения объекта в стек}

{ выборка объекта из стека }
function Pop:Double;
begin
  TopofStack:=TopofStack-1;
  if TopofStack<1 then
  begin
    WriteLn('Stack underflow');
    TopofStack:=TopofStack+1;
    Pop:=0;
  end
  else Pop := stack[TopofStack];
end; { конец функции выборки объекта из стека }

function Calculate(s : string) : Double;
var
  i,i0, k : integer;
  s0 : string;
  v0 : LongInt;
  d0 : double;
begin
  i:=1;
  while i<=Length(s) do begin
    i0 :=0;
    while ((i+i0)<=Length(s)) and (s[i+i0] in ['0'..'9']) do inc(i0);
    if i0>0 then {нашли число в строке. поместим его в стек} begin
      s0 := Copy(s,i,i0);
      val(s0, v0, k);
      Push(v0);
      inc(i, i0);
    end
    else begin
      case s[i] of
       ' ' : begin end;
       '+' : begin Push( Pop + Pop ); end;
       '-' : begin Push( - Pop + Pop ); end;
       '*' : begin Push( Pop * Pop ); end;
       '/' : begin d0 := Pop;
                if d0<>0
                  then Push( Pop / d0 )
                  else Push(999999999) end;
      end;
      inc(i);
    end;
  end;
  Calculate := Pop;
end;

var sInput : string;
begin
  sInput := '2 3+ 4*5 6*-';

  TopofStack := 1; {проиницилизируем стек}
  WriteLn('Результат выражения " '+sInput+' " равен ',
     Calculate(sInput):1:6);
  Readln;
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.11.2011, 10:13   #3
doktor_zlo
Новичок
Джуниор
 
Регистрация: 11.11.2011
Сообщений: 3
По умолчанию

спасибо за замечание. на будущее учту.
да (7) это лишнее... оно ничего не обозначает..
большое спасибо за помощь!!
doktor_zlo вне форума Ответить с цитированием
Старый 11.11.2011, 14:12   #4
doktor_zlo
Новичок
Джуниор
 
Регистрация: 11.11.2011
Сообщений: 3
По умолчанию

а можешь еще организовать ввод с клавиатуры выражения.. заранее благодарен

Последний раз редактировалось doktor_zlo; 11.11.2011 в 14:26.
doktor_zlo вне форума Ответить с цитированием
Старый 11.11.2011, 14:28   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Еще вопрос. По заданию ввод выражения с клавиатуры. и где хранится результат всех вычислений?
мда... Вы не можете сами сделать так, чтобы переменная вводилась с клавиатуры? Это сложно?!!
ладно. вот так:
Код:
var sInput : string;
    ResultatVyshislenyi : double;
begin
  TopofStack := 1; {проиницилизируем стек}

  WriteLn('Введите строку с выражением в постфиксной форме:');
  Readln(sInput);


  {вычислить выражение, введённое в строку sInput
       и результат сохранить в переменную  ResultatVyshislenyi}
  ResultatVyshislenyi := Calculate(sInput);

  {вывести результат на экран}
  WriteLn('Результат выражения " '+sInput+' " равен ',
              ResultatVyshislenyi:1:6);
  Readln;
end.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычислить значение выражения Nevezet Помощь студентам 4 30.01.2010 01:10
Вычислить значение выражения WhiteKuz Помощь студентам 0 15.12.2009 22:27
Вычислить значение выражения Pascal StartMis Помощь студентам 2 15.09.2009 22:04
дерево выражения, записанного в постфиксной форме Delphi Римма1990 Помощь студентам 0 20.04.2009 20:49