задача 10 урок 18

задача 10 урок 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).

Решение

program task_10_lesson18;
var s, ch: string;
    i, n, n1, code: integer;
    flag1, flag2: boolean; // сигнал к изменению числа
    otv: integer; // записывать ответ
begin
  n1 := 0; // - для хранения числа при умножение
  otv := 0;
  flag1 := false;
  flag2 := false;
  s := '-300*3+500-600*2-100';  // -1700
  ch := '';
  for i := 1 to length(s) + 1 do   // последний виток цикла обработка последнего числа
    begin
      if ((s[i] >= '0') and (s[i] <= '9')) then
        ch := ch + s[i]
      else
        begin
          val(ch, n, code);
          ch := '';
          // действие зависит от флага
          if flag1 then
            begin
              n := n * n1;
              flag1 := false;
            end;
          if flag2 then
            begin
              n := n * (-1);
              flag2 := false;
            end;
          // условия изменения флага
          if s[i] = '*' then
            begin
              flag1 := true;
              n1 := n; // сохранить число для операции умножения
            end
          else
            begin
              if  s[i] = '-' then
                flag2 := true;
              otv := otv + n;     // делаю только одно действое - складываю числа
            end;                  // если надо, то видоизменяю при условии флага1 и флага2
        end;
      end;
  writeln(s);
  writeln(otv);
  readln
end. 

Консоль

-300*3+500-600*2-100
-1700
vedro-compota's picture

засчитано

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