Задача 9 урок 17

Задача 9 урок 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 sum: integer;
      s: string;
  swich: boolean;
procedure ravers  (m: string; var s: string);
var w: char;
begin
  if length(m)=1 then
    s:=m
  else if length(m)=2 then
    begin
      w:=m[2];
      m[2]:=m[1];
      m[1]:=w;
      s:=m;
    end;
  writeln('ravers ',m);
end;

procedure replacement (p, s: string; k, j: integer; var Z: string);
var i, g, n, L: integer;
begin
  L:=0; //длина произведения N1*N2
  n:=0; //счетчик L
  for i:=1 to length(p) do//цикл вычисления длены L
    inc(L);
  for i:=k to j do //цикл подмены значения внешний
    begin
      if n >= L then
      begin
        s[i]:=' ';
        break;
      end;
    for g:=1 to 2 do //цикл подмены значения вложеный
      begin
        s[i]:=p[g];
        break;
      end;
    inc(n);
    end;
  s[j]:=' ';
  Z:=s;
end;

procedure choice (str: string; var swich: boolean);
var i: integer;
begin
  for i:=1 to length(str) do
    if str[i]='*' then
      begin
      swich:=true;
      break;
      end
    else
      swich:=false;
end;

procedure addition(s: string; var sum: integer);
var i, N, Code: integer;
          m, z: string;
begin
  z:=''; //хранит значение арефмитич знака +/-
  // m переменная текущего числа
  sum:=0; //переменная текущейсуммы по строке
  for i:=1 to length(s) do
    begin
      Val(s[i], N, Code);
      if Code=0 then
        m:=m+s[i]
      else if (s[i]='+') OR (s[i]='-') then
        begin
          if z = '' then //определение первого числа в строке
            begin
              Val(m, N, Code);
              sum:=N;  //сумма = первое число
              m:='';  //обнуляем строку числа
            end
          else   //если число не первое
             begin
               Val(m, N, Code);
               if z='+' then
                 sum:=sum+N
               else
                 sum:=sum-N;
               m:='';
             end;
          if s[i]='+' then
            z:='+'
          else
            z:='-';
        end;
      if i = length(s) then
        begin
          Val(m, N, Code);
          if z='+' then
            sum:=sum+N
          else
            sum:=sum-N;
        end;
    end;
end;
procedure multiplication(s: string; var sum: integer);
var i, y, B1, B2, N1, N2, C1, C2, B12, C22, Code: integer;
       M1, M2, M3, P, SS: string;
begin
  for i:=1 to length(s) do
    if s[i] = '*' then
      begin
        B1:=i+1;//начальный индекс следующего числа
        C1:=i-1;//начальный индекс предыдующего числа
        for y:=B1 to length(s) do//цикл записи следующей цифры в string
          begin
            if (s[y]='+') OR (s[y]='-') OR (s[y]='*') OR (s[y]=' ') then
              begin
                B12:=y-1;//запоминаем конечный индекс следующего чиссла
                break;
              end
            else
              begin
                M1:=M1+s[y];
                B12:=y; //запоминаем конечный индекс следующего чиссла
              end;
          end;
        Val(M1, N1, Code);//след цифра=N1
        for y:=C1 downto 1 do//цикл записи предыдущей цифры в string
          begin
            if (s[y]='+') OR (s[y]='-') OR (s[y]='*') OR (s[y]=' ') then
              begin
              C22:=y+1;//запоминаем конечный индекс предыдущего чиссла
              break;
              end
            else
            begin
              M2:=M2+s[y];
              C22:=y; //запоминаем конечный индекс предыдущего чиссла
            end;
          end;
        ravers(M2, M3);//"разворачиваем" предыдущее число
        Val(M3, N2, Code);//пред-щая цифра=N2
        str((N1*N2), P);
        replacement(P, s, C22, B12, SS);
        s:=SS;
      end;
    writeln('multiplication ',s);
end;
begin
  writeln('Vvedite stroku');
  readln(s);
  choice(s, swich);
  if swich then
    multiplication(s, sum)
  else
    addition(s, sum);
  writeln('Result = ', sum);
  readln();
end.
vedro-compota's picture

перейти на выделение двух массивов:

  1. массива знаков операций
  2. массива значений

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

type myArr = array[1..9] of integer; //  a массив чисел int
     myArr2 = array[1..8] of string;   //  b массив знаков символами
var a: myArr; b: myArr2;
  s: string; i, result: integer;
procedure arr(s: string; var a: myArr; var b: myArr2);
var i, N, Code, x: integer; t: string;
begin
  x:=1;//индекс чисел в массиве
  for i:=1 to length(s) do
    begin
      if (s[i]>='0')and(s[i]<='9') then //встретили число
        begin
          t:=t+s[i];
          Val(s[i+1], N, Code);//если после числа не число
          if (Code<>0) then
            begin
              Val(t, N, Code);//пишем число в массив int
              a[x]:=N;
              t:='';
            end;
        end
      else if (s[i]='+') OR (s[i]='-') OR (s[i]='*') then
        begin
          b[x]:=s[i];
          inc(x);
        end;
    end;
end;

begin
writeln('Vvedite stroku');
readln(s);
arr(s, a, b);
for i:=1 to high(b) do
  if b[i]='*' then
    begin
      a[i+1]:=a[i]*a[i+1];      //процесс перемножения, 
      a[i]:=0;                        //обнуление первого множителя
      if (i=1) OR (i=high(b)) then    //и замены знака "*"
        b[i]:='+'
      else
        b[i]:=b[i-1];
    end;
result:=a[1];     //первое число строки автоматически=результату
for i:=1 to high(b) do
  begin
    if b[i]='+' then              //в зависимости от знака, 
      result:=result+a[i+1]     //   +/- результат до конца строки
    else
      result:=result-a[i+1];
  end;
writeln('resultat= ',result);

readln();
end.
vedro-compota's picture

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

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