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

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

Задана последовательность символов, имеющая следующий вид: 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
var
  s: string;

function calculator(s: string): integer;
var
  strx: string;
  pred_x, pendent_x, len, j: integer;
  pred_op, op, pendent_op: char;
begin
  len:=length(s);
  result:=-1;
  pendent_x:=-1;
  op:='0';
  pendent_op:='0';
  strx:='';
  for j:=1 to len do
  begin
    if (s[j] in ['0'..'9']) then
    begin
      strx:=strx+s[j];
      if (j<len) then
      begin
        continue;
      end;
    end ;
    pred_op:=op;
    pred_x:=result;
    val(strx, result);
    strx:='';
    op:=s[j];

    if (pred_op='*') then result:=pred_x*result;

    if (op in ['+', '-']) or (j=len) then
    begin
      case pred_op of
        '+': result:=pred_x+result;
        '-': result:=pred_x-result;
      end;
      case pendent_op of
        '+': result:=pendent_x+result;
        '-': result:=pendent_x-result;
      end;
      pendent_op:='0';
    end;

    if (op = '*') and (pred_op in ['+', '-']) then
    begin
      pendent_op:=pred_op;
      pendent_x:=pred_x;
    end;
  end;
end;

begin
  writeln('Введите выражение.');
  readln(s);
  writeln('Результат: ', calculator(s));
  readln();
end.     

Консоль:

Введите исходное выражение
5*6+7-3*2*3+11
Результат: 30
vedro-compota's picture

  • 1) Решить с помощью одного цикла без вложенностей (цикл for по длине строки)

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

vedro-compota's picture

засчитано

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