Урок 21. Задача 8.

Урок 21. Задача 8.

"Калькулятор"

Var i, buf :integer;
    s :string;

function calculator(s :string; var i, buf :integer) :integer;
var str, char :string;
    fl_mul, fl_minus, fl_rec :boolean;
    res,num_mul, vl_I :integer;
begin
  str := '';  // строка с актуальным числом
  i += 1;
  char := '';  // знак
  res := 0;  // ответ
  num_mul := 0;
  fl_rec := false;// число из предыдущей итерации
  fl_mul := false;  // флаг умножения
  fl_minus := false;  // флаг для преобразование числа в отрицательное число
  str := '';  // строка с актуальным числом
  //writeln(i);
  while (i <= length(s) + 1) do
  begin

   if s[i] = '(' then
   begin
     calculator(s, i, buf);
     i += 1;
   end
   else
   begin

     if s[i] = ')' then
     begin
       {
       }
     end
     else
     begin

       if (s[i] >= '0') and (s[i] <= '9') then
         str := str + s[i]
       else
       begin
        char := s[i];  // находит знак
        val(str, vl_I);
        writeln(vl_I, char);
        str := '';

       if fl_mul then  // умножает
       begin
         fl_mul := false;
         vl_I := num_mul * vl_I;
       end
       else
         if fl_minus then  // делает число отрицательным
         begin
           fl_minus := false;
           vl_I := vl_I * (-1);
         end;

       if char = '*' then
       begin
         fl_mul := true;
         num_mul := vl_I;
       end
       else
       begin
         if char = '-' then
           fl_minus := true;
         res := res + vl_I;
       end;
       end;
     end;
    end;
    i += 1;
  end;
  calculator := res;
end;

begin
  s := '2*5+(5+2-7)';
  i := 0;
  buf := 0;
  writeln(calculator(s, i, buf));
  readln();
end.    
vedro-compota's picture

   if s[i] = '(' then
   begin
     calculator(s, i, buf);

-- нельзя вызывать не возвращая результат

2)

if s[i] = ')' then

-- если встречаем закрывающую, значит функция должна закончить работу

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