Задача 10 Урок 18

Задача 10 Урок 18 На вход вашей программы подается строка вида:
5 + 6 -34 + 56 - 7 + 2
("сколько угодно" чисел с операциями суммы и разности в любом порядке). Вычислите результат (пробелов между символом операции и числом может и не быть)

var s, n : string;
  arifm : string;
  one,two,w,i : integer;
  x,y:integer;
  recor,otvet:integer;

 
procedure searchone(s : string; var n : string; var x1 : integer; var y1 : integer; var w : integer);
var    intChislo, Code : Integer;
       i,i2:integer;
       flag:boolean;
       x1s,y1s:string;
begin
  flag:=false;
  n:='';
  y1s:='';
  for i:=1 to length(s) do
    begin
      val(s[i], intChislo, Code);   // в подпрог для поиска мат операции и для чисел
      if not (y1s='') and ((s[i]='+') or (s[i]='-'))  then   // если не пусто и есть + или -, то 
        begin
          w:=i; // присваивание нужно для след подпрог чтобы знать с чего стартовать
          break; // выходим из цикла ( после сложения или вычитания первых двух чисел)
        end;
      if (s[i]='+') or (s[i]='-') and (flag=false) then  // если +/- и флаг спущен, то
        begin
          n:=s[i];  // запись
          flag:= true; // флаг поднят
        end;
      if (code=0) and (flag=false) then // если код 0(цифра) и флаг спущен, то
        x1s:=x1s+s[i];  // запись в эту переменную
      if (code=0) and (flag=true) then  // если код 0(цифра) и флаг поднят, то
        y1s:=y1s+s[i];  // запись в эту переменную
    end;
    val (x1s, intChislo, Code); // в подпрг для преобразования
      x1:=intChislo; // запись преобр числа
    val (y1s, intChislo, Code); // в подпрг для преобразования
      y1:=intChislo; // запись преобр числа
end;

procedure calcularest(s : string;  var recor : integer; var w : integer);
var    intChislo, Code : Integer;
       x1s,y1s:string;
       n:string;
       x1,i:integer;
begin
  n:='';
  x1s:='';
  for i:=w to length(s) do
    begin
      if i=0 then break;   // если расчёт из двух чисел
      val(s[i], intChislo, Code);  // в подпрог для поиска мат операции и для чисел
      if  (n='') and ((s[i]='+') or (s[i]='-'))  then  // для первой мат операции 
        n:=s[i];
      if (code=0) then  // если код 0(цифра) 
          x1s:=x1s+s[i]; // запись в эту переменную
      if not (x1s='') and ((s[i]='+') or (s[i]='-')) or (i=length(s)) then  // если не пусто и +/- или цикл завершается
        begin
          val(x1s, intChislo, Code); // в подпрог для преобраз для чисел
          x1:=intChislo;  // запись  в переменную
          if n='+' then  
            begin
              recor:=recor+x1;
              x1s:='';
            end;
          if n='-' then
            begin
              recor:=recor-x1;
              x1s:='';
            end;
          if ((s[i]='+') or (s[i]='-')) then  // для последующих поисков мат. операции
            n:=s[i];
        end;
    end;
end;



begin
    n:='';
    writeln('enter the line');
    readln(s);
    searchone(s, n,x,y,w);   // в подпрог для поиска первого арифм выражения и вычесления его
    arifm:=n;  // после того как подпрог searchone прервалась по ссылки записываем в переменную
    one:=x; // после того как подпрог searchone прервалась по ссылки записываем в переменную
    two:=y; // после того как подпрог searchone прервалась по ссылки записываем в переменную
    i:=w; // после того как подпрог searchone прервалась по ссылки записываем в переменную
    if arifm='+' then
      recor:=one+two;
    if arifm='-' then
      recor:=one-two;
    calcularest(s,recor,i); // в подпрог для остального расчёта
    otvet:=recor;  // после того как подпрог calcularest прервалась по ссылки записываем в переменную
    writeln('answer',' ',otvet);
end.

Вывод консоли:

enter the line
5 + 6 -34 + 56 - 7 + 2
answer 28