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

Урок 18 Задача 11:

var
  s, n: string;
  i, a, b, mnozh: integer;
  znak1, znak2: char;
  flag1, flag2, flagUmn: boolean;
begin
  writeln ('Введите строку: ');
  readln(s);
  i:= 0;
  n:= '';
  znak1:= ' ';
  znak2:= ' ';
  flag1:= false;
  flag2:= false;
  flagUmn:= false;
  while (i < length(s)) do           // цикл для обхода строки
  begin
    i:= i+1;
    if (s[i]>='0')and(s[i]<='9') then    // если встретилось число
    begin
      for i:= i to length(s) do
      begin
        n:= n + s[i];
        if not ((s[i+1]>='0')and(s[i+1]<='9')) then
          break;
      end;
      if flagUmn then
      begin
        val(n, mnozh);
        if flag2 then
          b:= b*mnozh
        else
          a:= a*mnozh;
        flagUmn:= false;
      end else
        if flag1 then
        begin
            val(n, b);
            flag2:= true;
        end else begin
          val(n, a);
          if (znak1 = '-') then
            a:= 0-a;
          flag1:= true;
        end;
      n:= '';
    end else
      if (s[i] = '+') or (s[i] = '-') or (s[i] = '*')then // если встретился знак
      begin
        if (s[i] = '+') or (s[i] = '-') then
        begin
          if flag2 then
            znak2:= s[i]
          else
            znak1:= s[i];
        end else begin
          flagUmn:= true;
        end;
      end;
    if flag2 and ((i = length(s)) or (not (znak2 = ' '))) then
    begin
      if znak1 = '+' then
        a:= a+b
      else
        a:= a-b;
      znak1 := znak2;
      znak2 := ' ';
      flag2 := false;
    end;
  end;
  writeln ('Ответ: ', a);
  readln();
end.

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

Введите строку: 
-2  + 2 + 4*2  * 1   -  1  *3
Ответ: 5
Введите строку: 
2+2*2
Ответ: 6
Введите строку: 
3*0 -1
Ответ: -1
Введите строку: 
- 10  *11 +   10*11  +2*15*1
Ответ: 30
vedro-compota's picture

засчитано

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