Урок 17 (решенная задача номер 9)

Урок 17 (решенная задача номер 9)

Задана последовательность символов, имеющая следующий вид: 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 mastring = array[1..10] of string;
     mascisl = array[1..10] of integer;

var stroka : string;

procedure cubik(h:string; var cismas:mascisl; var znakmas:mastring);
var g : string;
    v, c, i, s, j, k : integer;

begin
  s := 1;
  j := 1;
  k := 0;
  for i := 1 to length(h) do
  begin
    if (h[i] >= '0') and (h[i] <= '9') or (h[i] = '-') then
      g := g + h[i];
    if (h[i+1] = '+') or (h[i+1] = '-') or (h[i+1] = '*')
    or (i = length(h)) then
    begin
      val(g, cismas[s], c);
      Inc(s);
      g := '';
      Inc(k);
    end;
    if (h[i] = '+') or (h[i] = '-') then
    begin
      znakmas[j] := '+';
      Inc(j);
    end
    else if (h[i] = '*') then
    begin
      znakmas[j] := '*';
      Inc(j);
    end;
  end;
  i := 0;
end;

function rubika(hi : string): integer;

var i, l : integer;
    bydytliechodeystv : boolean;
    f : mascisl;
    y : mastring;
begin
  bydytliechodeystv := false;
  i := 1;
  result := 1;
  cubik(hi, f, y);
  while (i < high(f)) do
  begin
    if (y[i] = '*') then
    begin
      f[i] := f[i] * f[i+1];
      l := i;
      i := 1;
      result := result * f[l];
      while (f[l] <> 0) do
      begin
        f[l+1] := f[l+2];
        y[l] := y[l+1];
        Inc(l);
      end;
    end;
    Inc(i);
  end;
  i := 0;
  for i := 1 to high(y) do
  begin
    if (y[i] = '+') then
    begin
      if (bydytliechodeystv = false) then
      begin
        result := f[1];
        bydytliechodeystv := true;
      end;
      result := result + f[i+1];
    end;
  end;
end;

begin
  stroka := '10+12*33*56-72-57*31-46';
  write(rubika(stroka));
end.     
vedro-compota's picture

решение засчитано

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