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

Урок 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

Как решать: Сделать за 1 проход

var
  loopCount, errorCode: integer;
  inputString, stringToInt, lastCh: string;
  flag1: boolean;
  newInt1, multInt, res: integer;

begin
  writeln('Введите строку');
  // readln(inputString); //закоментил для отладки
  inputString := '-2-5-8-7-33*15+520+3*2*5';
  writeln(inputString);
  newInt1 := 0;
  multInt := 0; //число для следующего умножения с newInt1
  res := 0;
  flag1 := false; //флаг умножения
  stringToInt := ''; // строка для получения числа
  lastCh := '+'; //память на последние + и -
  for loopCount := 1 to length(inputString) do //прохожу по строке
  begin
    //ищу число
    if (inputString[loopCount] >= '0') and (inputString[loopCount] <= '9') then
    begin
      stringToInt := stringToInt + inputString[loopCount]; //добавляю цифру в числовую строку
    end
    else //если не цифра, а знак
    begin
      val(stringToInt, newInt1, errorCode); //получаем число из прошлого набора цифр
      stringToInt := '';
      if flag1 then //если проходили знак * перед последним числом
      begin
        newInt1 := newInt1 * multInt;
        flag1 := false;
      end;
      if inputString[loopCount] = '*' then // если сейчас знак *, то запоминаем число
      begin
        multInt := newInt1; //запомнили
        flag1 := true; //надо умножить в след раз
      end
      else //если сейчас не знак умножения,
      // то получаем результат от предыдущего + или -
      begin
        if lastCh = '+' then // +
        begin
          res := res + newInt1;
        end
        else // -
        begin
          res := res - newInt1;
        end;
        lastCh := inputString[loopCount]; // если сейчас + или -, то запоминаем
      end;
    end;
  end;
      // блок для отработки последнего числа и конечного результата
      val(stringToInt, newInt1, errorCode);
      if flag1 then
      begin
        newInt1 := newInt1 * multInt;
        flag1 := false;
      end;
      if lastCh = '+' then //отработка последнего числа
      begin
        res := res + newInt1;
      end
      else
      begin
        res := res - newInt1;
      end;
  writeln('Ответ: ', res);
  readln();
end.

КОНСОЛЬ

Введите строку
-2-5-8-7-33*15+520+3*2*5
Ответ: 33
vedro-compota's picture

засчитано

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