задание 8 Урок 21

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

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

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

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

задание 8 Урок 21

var s1: string;
    i: integer;
function count(num,calc: integer; var buf: integer): integer;
begin
  result:=calc+num*buf;
  buf:=1;
end;
function compute(var i: integer; s: string): integer;
var str: string;
    num,buf,calc,skip,code: integer;
begin
  str:='';
  buf:=1;  // число в буфере
  calc:=0; // сборное итоговое число
  skip:=0;  // пропуск сборного числа (при умножении)
  i:=i+1;
  while i <= length(s) do
  begin
    if (s[i]>='0') and (s[i]<='9') then
      str:=str+s[i]
    else    //если не цифра - предыдущее число запишем в num
    begin
      val(str,num,code);
      str:='';
      if (s[i]=')') then
      begin
        result:=count(num,calc,buf); //запись результата из выражения в скобках
        exit;
      end
      else if (s[i]='(') then
      begin
        num:=compute(i,s); //рекурсия  для выполнения вычислений в скобках)
        i:=i+1;
      end;
      if (s[i]='*') then
        buf:=count(num,skip,buf) //результат умножения в буфер
      else if (s[i]='+') then
        calc:=count(num,calc,buf) //сложение текущего числа и буфера
      else begin                // если минус
        calc:=count(num,calc,buf);
        buf:=buf*(-1);     //число в буфере делаем со знаком минус
      end;
    end;
    i:=i+1;
  end;
  result:=calc;
end;

begin
  //writeln('input expretion');
  //readln(s1);
  s1:= '5*(3-4)-7*9+3*(2+(2-7)';
  i:=0;
  writeln(compute(i,s1));
  readln();
end.          

vedro-compota's picture

засчитано

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