задача 9 урок 18

задача 9 урок 18

Задана последовательность символов, имеющая следующий вид: 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 task_9_lesson18;
type chisla = array[1..18] of integer;
     znaki = array[1..18] of string;
procedure sort(s: string; var z: znaki; var ch: chisla; var j: integer);
var i, code: integer;
    c: string;
begin
  j := 1;  // каждому элементу выражения соответствует свой номер
  c := '';
  for i := 1 to length(s) do
    begin
    if ((s[i] >= '0') and (s[i] <= '9')) then
      c := c + s[i]    // записал массив знаков
    else
      begin
        val(c, ch[j], code); // записал массив чисел
        j := j + 1;
        z[j] := s[i];
        j := j + 1;
        c := '';
      end;
    end;
  val(c, ch[j], code); // последний элемент из массива чисел

end;

procedure umnojenie(j: integer; var ch: chisla; var z: znaki);
var i: integer;
begin
  for i := 1 to j do
    if z[i] = '*' then
      begin
        ch[i + 1] := ch[i - 1] * ch[i + 1];
        ch[i - 1] := 0;
      end;
end;

procedure minus(j: integer; var ch: chisla; var z: znaki);
var i: integer;
begin
  for i := 1 to j do
    if z[i] = '-' then
      ch[i + 1] := ch[i + 1] * (-1);
end;

function plus(j: integer; ch: chisla; z: znaki): integer;
var i: integer;
    otv: integer;
begin
  for i :=1 to j do
    otv := otv + ch[i];
  result := otv;
end;

var z: znaki; // храню знаки
    s: string;
    ch: chisla;
    j, otv: integer;
begin
    readln(s);
    sort(s, z, ch, j);
    umnojenie(j, ch, z);
    minus(j, ch, z);
    otv := plus(j, ch, z);
    write(s,' = ', otv);
    readln
end.   

Консоль

-50+5*10+100-60
-50+5*10+100-60 = 40
vedro-compota's picture

засчитано

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