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

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

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

var
  s: string;
function getSumm(a, b: integer): integer;
begin
  result := b + a;
end;

function getMult(var a: integer; b: integer; var mult: boolean): integer;
begin
  result := a * b;
  mult := false;
end;

function TakeResult(var s: string): integer;
var
  str: string;
  a, i, midres: integer;
  minus, mult: boolean;
begin
  minus := false;
  mult := false;
  result := 0;
  for i:= 1 to length(s)+1 do
  begin
    if (s[i] >= '0') and (s[i] <= '9') then
      str := str + s[i]
    else
    begin
      val(str, a);
      if minus = true then
      begin
        a := a*(-1);
        minus := false;
      end;

      if mult = true then
        a := getMult(a, midres, mult);

      if s[i] = '*' then
      begin
        mult := true;
        midres := a;
      end
        else
          result := getSumm(a, result);

      if s[i] = '-' then
        minus := true;
      str := '';
    end;
  end;
end;

begin
s := '5*6-7-3*2*3+11';
writeln(s,' = ', TakeResult(s));
readln();
end.  
vedro-compota's picture

1)

function getMult(var a: integer; b: integer; var mult: boolean): integer;

-- разобраться с сигнатурой, есть незначащие передачи по ссылке

2) В данном случае создание подпрограммы не выглядят сильно обоснованно

3)

if mult = true then

-- можно записать короче

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

var
  s: string;

function TakeResult(var s: string): integer;
var
  str: string;
  a, i, midres: integer;
  minus, mult: boolean;
begin
  minus := false;
  mult := false;
  result := 0;
  for i:= 1 to length(s)+1 do
  begin
    if (s[i] >= '0') and (s[i] <= '9') then
      str := str + s[i]
    else
    begin
      val(str, a);
      if minus = true then
      begin
        a := a*(-1);
        minus := false;
      end;

      if mult then
      begin
        a := a * midres;
        mult := false;
      end;

      if s[i] = '*' then
      begin
        mult := true;
        midres := a;
      end
        else
          result := result + a;

      if s[i] = '-' then
        minus := true;
      str := '';
    end;
  end;
end;

begin
s := '5*6+7-3*2*3+11';
writeln(s,' = ', TakeResult(s));
readln();
end.