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

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

Задана последовательность символов, имеющая следующий вид: , где — цифра, а — знак арифметического действия из набора {+, –, *}. Вычислите значение выражения, предполагая, что действия выполняются согласно правилам арифметики.

  • Входные данные: На вход программе подается строка указанного вида, состоящая не более чем из 9 чисел, разделенных символами арифметических операций.
  • Выходные данные: Выведите значение арифметического выражения.

Примеры:

1
2
3
4
5
6
Входные данные   Результат
 
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 i, int, acc_sum, acc_mul, o, l: integer;
  s, prev, num: string;
  z: boolean;
begin
  s := '5*6+7-33*2*3-11*2';
  l := length(s);
  for i := 1 to l + 1 do
   begin
    val(s[i], int, o);
    if o = 0 then num += s[i]
    else
     begin
      val(num, int);
      if z then
       begin
        int := -int;
        z := false;
       end;
      if prev = '*' then acc_mul *= int
      else
       if s[i] = '*' then acc_mul := int
       else acc_sum += int;
      if s[i] = '*' then prev := '*'
      else
       begin
        if s[i] = '-' then z := true;
        acc_sum += acc_mul;
        acc_mul := 0;
        prev := '';
       end;
      num := '';
     end;
   end;
  writeln('Ожидается: ', 5*6+7-33*2*3-11*2);
  writeln('Ответ: ', acc_sum);
  readln();
end.
vedro-compota's picture

засчитано

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