Pascal Урок 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

program U17Z9;
type
  a=array[1..7] of integer;
  b=array[1..6] of char;
var
  l:a;
  t:b;
  i,d,f,c,m: integer;
  s:string;
function Sieve(s:string; var t:b; var m:integer):a;// функция распределения чисел и знаков в массивы из string
var p:integer; //счетчик массива знаков
var w:string;
begin
d:=1;
c:=1;
p:=1;
    for i:= 1 to length(s) do
    begin
      if (s[i]>='0')and(s[i]<='9') then // выделяем цифры в массив
      begin
        w:=w+s[i];
        val(w,f); // функция val преобразует и сразу записывает в масив integer
        l[d]:=f;
        c:=p;
      end
      else if (s[i]<>' ') then
      begin
        t[c]:=s[i];
        d:=d+1;
        w:='';
        inc(p); // счетчик массива знаков
      end;
    end;
    m:=d; // m количество чисел в массиве
    result:=l
end;
procedure MulNum(var l:a; var t:b); // процедура для умножения
var h:integer; //положения знака в массиве с которого делаем сдвиг
begin
    c:=0;
    while (c<(m)) do // цикл для поиска умножения
    begin
       c:=c+1;
       if (t[c]='*') then // если нашли умножение
       begin
         d:=c;
         h:=c;
         l[d]:=l[d]*l[d+1]; //умножаем текущее число с следующим
         for d:= (c+1) to m do //сдвиг в масииве чисел
         begin
           l[d]:=l[d+1];
         end;
         for c:= h to (m-1) do //сдвиг в масиве знаков
         begin
           t[c]:=t[c+1];
         end;
       c:=1;
       end;
    end;
end;
procedure AddSub(l:a); //процедура нахождения суммы/разности цифр
var n:integer; //сумма/разность произведения
begin
d:=1;
c:=1;
  if (t[c]='+') then //находим первую сумму/разность
  begin
    n:=l[d]+l[d+1];
    d:=d+1;
    c:=c+1
  end
  else
  begin
    n:=l[d]-l[d+1];
    d:=d+1;
    c:=c+1;
  end;
  while (d<m) do //продолжение следующих операций с предыдущей суммой и цифрами
  begin
    if (t[c]='+') then //если не сумма, значит разность
    begin
      n:=n+l[d+1];
      c:=c+1;
      d:=d+1;
    end
    else
    begin
      n:=n-l[d+1];
      c:=c+1;
      d:=d+1;
    end;
  end;
     writeln(n);
end;
begin
   readln(s);
   Sieve(s,t,m);
   MulNum(l,t);
   AddSub(l);
   readln();
end.                           
vedro-compota's picture

замечание:

  • уйти от использования от глобальных переменных
  • function Sieve(s:string; var t:b; var m:integer):a;

    -- переделать на процедуру

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

program U17Z9;
type
  a=array[1..7] of integer;
  b=array[1..6] of char;
var
  l:a;
  t:b;
  m:integer;
  s:string;
procedure Sieve(s:string; var t:b; var m:integer);// процедура распределения чисел и знаков в массивы из string
var p,c,d,f,i:integer; //счетчик массива знаков
    w:string;
begin
d:=1;
c:=1;
p:=1;
    for i:= 1 to length(s) do
    begin
      if (s[i]>='0')and(s[i]<='9') then // выделяем цифры в массив
      begin
        w:=w+s[i];
        val(w,f); // функция val преобразует и сразу записывает в масив integer
        l[d]:=f;
        c:=p;
      end
      else if (s[i]<>' ') then
      begin
        t[c]:=s[i];
        d:=d+1;
        w:='';
        inc(p); // счетчик массива знаков
      end;
    end;
    m:=d; // m количество чисел в массиве
end;
procedure MulNum(var l:a; var t:b; m:integer); // процедура для умножения
var h,c,d:integer; //положения знака в массиве с которого делаем сдвиг
begin
    c:=0;
    while (c<(m)) do // цикл для поиска умножения
    begin
       c:=c+1;
       if (t[c]='*') then // если нашли умножение
       begin
         d:=c;
         h:=c;
         l[d]:=l[d]*l[d+1]; //умножаем текущее число с следующим
         for d:= (c+1) to m do //сдвиг в масииве чисел
         begin
           l[d]:=l[d+1];
         end;
         for c:= h to (m-1) do //сдвиг в масиве знаков
         begin
           t[c]:=t[c+1];
         end;
       c:=1;
       end;
    end;
end;
function AddSub(l:a;t:b):integer; //функция нахождения суммы/разности цифр
var n,d,c:integer; //сумма/разность произведения
begin
d:=1;
c:=1;
  if (t[c]='+') then //находим первую сумму/разность
  begin
    n:=l[d]+l[d+1];
    d:=d+1;
    c:=c+1
  end
  else
  begin
    n:=l[d]-l[d+1];
    d:=d+1;
    c:=c+1;
  end;
  while (d<m) do //продолжение следующих операций с предыдущей суммой и цифрами
  begin
    if (t[c]='+') then //если не сумма, значит разность
    begin
      n:=n+l[d+1];
      c:=c+1;
      d:=d+1;
    end
    else
    begin
      n:=n-l[d+1];
      c:=c+1;
      d:=d+1;
    end;
  end;
     result:=n;
end;
begin
   readln(s);
   Sieve(s,t,m);
   MulNum(l,t,m);
   writeln(AddSub(l,t));
   readln();
end.          
vedro-compota's picture

Избавиться от использования глобальных переменных в процедурах.

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

vedro-compota's picture

 while (c<(m)) do // цикл для поиска умножения
    begin
       c:=c+1;
       if (t[c]='*') then // если нашли умножение
       begin
         d:=c;
         h:=c;
         l[d]:=l[d]*l[d+1]; //умножаем текущее число с следующим
         for d:= (c+1) to m do //сдвиг в масииве чисел
         begin
           l[d]:=l[d+1];
         end;
         for c:= h to (m-1) do //сдвиг в масиве знаков
         begin
           t[c]:=t[c+1];
         end;
       c:=1;
       end;

-- вызывает сомнения сборс переменной "c"

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

uses DateUtils, sysutils;
type
a=array[1..30000] of integer;
b=array[1..29999] of char;
var
FromTime, ToTime: TDateTime;
MilliSecondsDiff: Integer;
s:string;
procedure Sieve(s:string);// процедура распределения чисел и знаков в массивы из string
var p,c,d,f,i,n,h,m:integer; //счетчик массива знаков
    w:string; l:a;
    t:b;
begin
d:=1;
c:=1;
p:=1;
    for i:= 1 to length(s) do
    begin
      if (s[i]>='0')and(s[i]<='9') then // выделяем цифры в массив
      begin
        w:=w+s[i]; // вытаскиваем число
        val(w,f); // функция val преобразует и сразу записывает в масив integer
        l[d]:=f;  // добавляем в массив чисел
        c:=p;  // сдвигаем идекс массива знаков ,
      end
      else if (s[i]<>' ') then
      begin
        t[c]:=s[i]; //добавляем в массив знаков
        d:=d+1;  // сдвигаем индекс в массиве чисел для записи
        w:=''; // обнуляем строку
        inc(p); // счетчик массива знаков
      end;
    end; // строка закончилась. массивы заполнились****************************
    m:=d; // m количество чисел в массиве
    c:=0; // обнуляем индекс массива знаков
    while (c<(m)) do // цикл для поиска умножения
    begin
       c:=c+1; //счетчик while
       if (t[c]='*') then // если нашли умножение
       begin
         d:=c; //находим в массиве чисел число которое будем умножать
         h:=c; //с какой позиции делать сдвиг в массиве знаков после умножения
         l[d]:=l[d]*l[d+1]; //умножаем текущее число со следующим
         for d:= (c+1) to m do //сдвиг в масииве чисел(оставляем произведение двух чисел)
         begin
           l[d]:=l[d+1]; //сдвиг в массиве чисел
         end;
         for c:= h to (m-1) do //сдвиг в масиве знаков(с положения умножения)
         begin
           t[c]:=t[c+1];//сдвиг в массиве знаков
         end;
       c:=1;//после нахождения умножения и операции с ним, начинаем поиск нового умножения
       end; //к этому моменту в масиве знаков остались только +/-
    end;    //а в массиве чисел произведения чисел **************************
d:=1; //1 в индексе массива чисел
c:=1; //1 в индексе массива знаков
  if (t[c]='+') then //находим первую сумму/разность
  begin // если сумма то плюсуем
    n:=l[d]+l[d+1];//n - сумма/разность
    d:=d+1; //увеличиваем индекс в массиве чисел
    c:=c+1   //увеличиваем индекс в массиве знаков
  end
  else //а если разность отнимаем
  begin
    n:=l[d]-l[d+1]; //n - сумма/разность
    d:=d+1;  //увеличиваем индекс в массиве чисел
    c:=c+1;  //увеличиваем индекс в массиве знаков
  end;
  while (d<m) do //продолжение следующих операций с предыдущей суммой и цифрами
  begin
    if (t[c]='+') then //если не сумма, значит разность
    begin
      n:=n+l[d+1];//n-значение + следующее число
      c:=c+1; //увеличиваем индекс в массиве знаков
      d:=d+1; //увеличиваем индекс в массиве чисел
    end
    else
    begin
      n:=n-l[d+1];//n-значение - следующее число
      c:=c+1; //увеличиваем индекс в массиве знаков
      d:=d+1; //увеличиваем индекс в массиве чисел
    end;
  end;
writeln(n); //конечное число****************************************
end;
begin
   s:='5+92-15+75*53+76-21+5+92-15+75*53+76-21+5+92-15+75*53+76-21-15+75*53+76-15+75*53+76-15+75*53+76-15+75*53+76';
   FromTime := Now();

   Sieve(s);
   readln();
  ToTime := Now();
  MilliSecondsDiff := MilliSecondsBetween(ToTime,FromTime);

  writeln('Vremya: ', MilliSecondsDiff);
  readln();
end.