Задание 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
type
  digArr = array[1..9] of string;
  symbArr = array[1..8] of char;
var
  s, temp, tempArrStr: string;
  digitArr: digArr;
  symbolArr:  symbArr;
  i, j, k, result, intChislo, intChislo1, intChislo2, Code, numIter, sum: integer;

Function IntToStr(I : Longint) : String;
Var S : String [11];
begin
   Str(I, S);
   IntToStr:=S;
end;

begin
  writeln('vvedite vyrajenie');
  readln(s);
  j := 1;
  k := 1;
  tempArrStr := '';
  for i:=1 to length(s) do
  begin
    Val(s[i], intChislo, Code);
    if (Code = 0) then
      begin
        tempArrStr := tempArrStr + s[i]; //накапливаем число
      end
    else
      begin
        symbolArr[k] := s[i];  //символ
        k := k + 1;
        digitArr[j] := tempArrStr; // вносим в массив чисел накомпленное число
        tempArrStr := '';           // и сбрасываем накопитель
        j := j + 1;
      end;
  end;
  digitArr[j] := tempArrStr;

  for i:=low(symbolArr) to high(symbolArr) do  // итерируем по массивам
    begin
      if (symbolArr[i] = '*') then // если знак умножения то перемножаем соответствующий числа из массива чисел
        begin
          if (i = 1) then   // умножение в начале
          begin
            Val(digitArr[i], intChislo1, Code);
            Val(digitArr[i+1], intChislo2, Code);
            digitArr[i] := '0';                                // один множитель обнуляем, второй делаем равным результату умножения
            digitArr[i+1] := IntToStr(intChislo1 * intChislo2);
            symbolArr[i] := '+';
          end
          else    // все оставшиеся умножения
          begin
            Val(digitArr[i], intChislo1, Code);
            Val(digitArr[i+1], intChislo2, Code);
            digitArr[i] := '0';                                // один множитель обнуляем, второй делаем равным результату умножения с соответствующим знаком
            digitArr[i+1] := IntToStr(intChislo1 * intChislo2);
            symbolArr[i] := symbolArr[i-1];
          end;
        end;
    end;

  Val(digitArr[1], intChislo, Code);
  sum := intChislo;

  for i:=(low(digitArr)+1) to high(digitArr) do
    begin
      temp := symbolArr[i-1] + digitArr[i];
      Val(temp, intChislo, Code);
      sum := sum + intChislo;
    end;

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

консоль:

vvedite vyrajenie
10*9-9+4-10*10
resultat = -15