Задание 11 урок 18

Задание 11 Урок 18

Задана последовательность символов, имеющая следующий вид: p1q1p2q2p3...qn–1pn
, где pi
— число, а qi
— знак арифметического действия из набора {+, –, *}. Вычислите значение выражения, предполагая, что действия выполняются согласно правилам арифметики.
Входные данные: На вход программе подается строка указанного вида, состоящая не более чем из 9 чисел, разделенных символами арифметических операций.
Выходные данные: Выведите значение арифметического выражения.
Примеры:

Входные данные   Результат 
 
5+2               7
1-2*5+2          -7
5*6+7-3*2+11      42
5*6+7-3*2*3+11    30
var
  s, temp1, temp2, temp3, znak: string;
  flag1, flag2, flagZnak1: boolean;
  i, intChislo, intChislo1, intChislo2, intChislo3, Code, sum, sumTemp: integer;


begin
  writeln('vvedite vyrajenie');
  readln(s);
  sum := 0;
  sumTemp := 0;
  temp1 := '';
  temp2 := '';
  temp3 := '';
  flag1 := true;
  flag2 := true;
  flagZnak1 := false;
  znak := '';
  i := 1;

  while (i < (length(s)+1)) do   // итерируем по выражению
  begin
    if (i > 1) and (flagZnak1) then
    begin
      znak := s[i-1];
      flagZnak1 := false;
    end;

    if (flag1) then
    begin
      temp1 := temp1 + s[i];
      Val(s[i+1], intChislo, Code);
      if (Code = 0) then  // если число то добавляем в temp1 и переходим к следующему
      begin
        i := i + 1;
        continue;
      end
      else
      begin
        if (s[i+1] <> '*') then
        begin
          Val(znak + temp1, intChislo1, Code);
          sum := sum + intChislo1;
        end
        else
        begin
          flag1 := false;
          i := i + 2;
          continue;
        end
      end
    end
    else
    begin

      if (flag2) then
      begin
        temp2 := temp2 + s[i];
        Val(s[i+1], intChislo, Code);
        if (Code = 0) then  // если число то добавляем в temp2 и переходим к следующему
        begin
          i := i + 1;
          continue;
        end
        else
        begin
          if (s[i+1] <> '*') then
          begin
            Val(znak + temp1, intChislo1, Code);
            Val(temp2, intChislo2, Code);
            sum := sum + intChislo1 * intChislo2;
          end
          else
          begin
            Val(znak + temp1, intChislo1, Code);
            Val(temp2, intChislo2, Code);
            sumTemp := intChislo2;
            flag2 := false;
            i := i + 2;
            continue;
          end
        end
      end
      else
      begin
        temp3 := temp3 + s[i];
        Val(s[i+1], intChislo, Code);
        if (Code = 0) then  // если число то добавляем в temp3 и переходим к следующему
        begin
          i := i + 1;
          continue;
        end
        else
        begin
          if (s[i+1] = '*') then
          begin
            Val(temp3, intChislo3, Code);
            sumTemp := sumTemp * intChislo3;
            temp3 := '';
            i := i + 2;
            continue;
          end
          else
          begin
            Val(temp3, intChislo3, Code);
            Val(znak+temp1, intChislo1, Code);
            sumTemp := sumTemp * intChislo3;
            sum := sum + sumTemp * intChislo1;
          end

        end
      end
    end;

    temp1 := '';
    temp2 := '';
    temp3 := '';
    flag1 := true;
    flag2 := true;
    flagZnak1 := true;
    znak := '';
    i := i + 2;
  end;

  writeln(s, ' = ', sum);
  readln();
end.




консоль:

vvedite vyrajenie
5*6+7-3*2*3+11
5*6+7-3*2*3+11 = 30

vvedite vyrajenie
10*10*10-10*10
10*10*10-10*10 = 900