Задача 8 Урок 20

Задача 8 Урок 20:

Напишите функцию, которая получает на вход произвольную строку вида:

5*(3+4)-7*9+3*(2+(2-7))

(арифметическое выражение со скобками любого уровня вложенности и операциями умножения, вычитания и сложения)

и в качестве ответа возвращает результат этого выражения.

Рекомендация: сначала убедитесь, что число открывающих скобок, равно числу закрывающих.

Примечание: алгоритмически похожая задача использовалась на собеседовании стажеров в DataArt.

var
  s: string;
  j: integer;

function calculator(s: string; var j: integer): integer;
var
  pred_x, pendent_x, len: integer;
  pred_op, op, pendent_op: char;
  strx: string;
begin
  len:=length(s);
  result:=-1;
  pendent_x:=-1;
  op:='0';
  pendent_op:='0';
  strx:='';

  while (j<=len) and (s[j]<>')') do
  begin
    if (s[j] in ['0'..'9']) then
    begin
      strx:=strx+s[j];
      if (j<len) and (s[j+1]<>')') then
      begin
        j:=j+1;
        continue;
      end;
    end ;

    pred_op:=op;
    pred_x:=result;

    if (s[j]='(') then
    begin
      j:=j+1;
      result:=calculator(s, j);
      j:=j+1;//пролистнули закрывающуюся скобку
    end else
    begin
      val(strx, result);
      strx:='';
    end;
    op:=s[j];

    if (pred_op='*') then result:=pred_x*result;

    if (op in ['+', '-']) or (j=len) or (s[j+1]=')') then
    begin
      case pred_op of
        '+': result:=pred_x+result;
        '-': result:=pred_x-result;
      end;
      case pendent_op of
        '+': result:=pendent_x+result;
        '-': result:=pendent_x-result;
      end;
      pendent_op:='0';
    end;

    if (op = '*') and (pred_op in ['+', '-']) then
    begin
      pendent_op:=pred_op;
      pendent_x:=pred_x;
    end;
    j:=j+1;
  end;
end;

begin
  writeln('Введите выражение.');
  readln(s);
  j:=1;
  writeln('Результат: ', calculator(s, j));
  readln();
end.   

Консоль:

Введите исходное выражение
5*(3+4)-7*9+3*(2+(2-7))
Результат: -37
vedro-compota's picture

засчитано

_____________
матфак вгу и остальная классика =)