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

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

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

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

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

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

var x1:string;   i1:integer;

function culc(x,z:string; a,sk:integer; var i:integer):integer;
var b,{i,}l:integer; c:string;
begin
  b:=0;
  i+=1;
  while i<=length(x) do
  begin
    if (x[i]>='0') and (x[i]<='9') then
    begin
      while (x[i]>='0') and (x[i]<='9') do
      begin
        c+=x[i];
        i+=1;
      end;
      if a<>0 then
        val(c,b,l)
      else
        val(c,a,l);
      c:='0';
      if b<>0 then
      begin
        if (x[i]='*') or (x[i+1]='*') then
        begin
          case z of
            '*':a*=culc(x,x[i],b,1,i);
            '+':a+=culc(x,x[i],b,1,i);
            '-':a:=a-culc(x,x[i],b,1,i);
          end;
        end
        else
        begin
          case z of
            '+':a+=b;
            '-':a-=b;
          else
          begin
            a*=b;
            break;
          end;
          end;
        end;
        if (i=length(x)) or (x[i]=')') then
          break;
      end
      else
      begin
        z:=x[i];
        i+=1;
      end;
    end
    else if x[i]='(' then
    begin
        case z of
          '*':a*=culc(x,'#',0,1,i);
          '+':a+=culc(x,'#',0,1,i);
          '-':a-=culc(x,'#',0,1,i);
          '#':a:=culc(x,'#',0,1,i);
        end;
      if i<length(x) then
        i+=1;
      if i=length(x) then
        break;
    end
    else
    begin
      z:=x[i];
      i+=1;
    end;
  end;
  result:=a;
end;

begin
  x1:='5*(3+4)-7*9+3*(2+(2-7))';
  i1:=0;
  write(culc(x1,'#',0,0,i1));
  readln();
end.