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

Задача 12 Урок 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

Как решать: Посчитайте результат за одно прочтение строки, без использования массивов (в нашем курсе решение в таком стиле для этой задачки было впервые добавлено участником slavina036).

var s:string; i,l,j,a,b,c,h,m:integer; x:array[1..17] of string;

begin
  readln(s);
  j:=1;
  for i:=1 to length(s) do
  begin
    if (s[i]>='0')and (s[i]<='9')then
      x[j]:=x[j]+s[i]
    else
    begin
      j+=1;
      x[j]:=s[i];
      j+=1;
    end;
  end;
  i:=j;
  val(x[1],a,l);
  j:=3;
  While j<=i do
  begin
    h:=2;
    val(x[j],b,l);
    if x[j+1]='*' then
    begin
      m:=j+1;
      while x[m]='*' do
      begin
       val(x[m+1],c,l);
       b:=b*c;
       m+=2;
       h+=2;
      end;
    end;
    case x[j-1] of
      '+':a+=b;
      '-':a-=b;
      '*':a*=b;
    end;
    j+=h;
  end;
  write(a);
  readln();
end.

var l,x,i,d,a,b,c: integer;
  s:string; z1,z2: char;
begin
  x:=0;
  a:=0;
  b:=0;
  z1:='0';
  z2:='0';
  s:='5*6+7-3*2+11';
  for i:=1 to length(s) do
  begin
    if (s[i]>='0') and (s[i]<='9') then
    begin
      val(s[i],d,l);
      x:=(x*10)+d;
      if z2='*' then
      begin
        c:=x;
        b:=c*b;
        c:=0;
        z2:='0';
      end
      else
      if (a=0) or (z1='0') then
        a:=x
      else
        b:=x;
    end
    else
    begin
      x:=0;
      if z1<>'0' then
      begin
        z2:=s[i];
        if z2<>'*' then
        begin
          case z1 of
            '+':a+=b;
            '-':a-=b;
            '*':a*=b;
          end;
          b:=0;
          z1:=z2;
          z2:='0';
        end;
      end
      else
        z1:=s[i];
    end;
  end;
  case z1 of
    '+':a+=b;
    '-':a-=b;
    '*':a*=b;
  end;
  writeln('Otvet:',' ',a);
  readln();
end.