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

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

Как решать: Выделите массив операций и массив значений, сначала посчитайте все
умножения, а потом все остальное


type
  iArr = array[1..9] of integer;
  cArr = array[1..8] of char;

var
  inputString: string;
  intArr: iArr;
  charArr: cArr;
  intCount, charCount: integer;

procedure getNumsAndChar(inputString: string; var intArr: iArr; var charArr: cArr; var intCount, charCount: integer);
//процедура разбирает строку на массив чисел и массив знаков, и считает, сколько было каждого из них;

  var
    loopCount, errorCode: integer;
    toString2: string;
    flag: boolean;

begin
  intCount := 0;
  charCount := 0;
  flag := false;
  toString2 := '';
  for loopCount := 1 to length(inputString) do
  begin
    if (inputString[loopCount] >= '0') and (inputString[loopCount] <= '9') then
    begin
      toString2 := toString2 + inputString[loopCount];
      flag := true;
    end
    else if flag and (inputString[loopCount] <> ' ') then
    begin
      flag := false;
      inc(intCount);
      val(toString2, intArr[intCount], errorCode);
      toString2 := '';
    end;
    if (inputString[loopCount] = '-') then
    begin
      flag := false;
      inc(charCount);
      charArr[charCount] := '-';
    end
    else if (inputString[loopCount] = '+') then
    begin
      flag := false;
      inc(charCount);
      charArr[charCount] := '+';
    end
    else if (inputString[loopCount] = '*') then
    begin
      flag := false;
      inc(charCount);
      charArr[charCount] := '*';
    end;
  end;
  inc(intCount);
  val(toString2, intArr[intCount], errorCode);
  writeln('Массив чисел: ');
  for loopCount := 1 to length(intArr) do
    write(intArr[loopCount], ' ');
  writeln('Массив знаков: ');
  for loopCount := 1 to length(charArr) do
    write(charArr[loopCount], ' ');
  writeln();
  writeln('Чисел: ', intCount, '; Знаков: ', charCount, ';');
end;

function algebra(num1, num2: integer; char1: string): integer;

begin
  if (char1 = '+') then
    algebra := num1 + num2
  else if (char1 = '-') then
    algebra := num1 - num2
  else if (char1 = '*') then
    algebra := num1 * num2;
end;

procedure proCut(var intArr: iArr; var charArr: cArr; charCount, loopCount: integer);// сокращение массивов при умножении
  var
    i: integer;

begin
  for i := loopCount to charCount do
  begin
    charArr[i] := charArr[i + 1];
    intArr[i + 1] := intArr[i + 2];
  end;
end;


function multiplicator(var intArr: iArr; var charArr: cArr; var intCount, charCount: integer): integer; //умножение
  var
      loopCount: integer;

begin
{
  writeln('Массив чисел до операций: ');

  for loopCount := 1 to length(intArr) do
    write(intArr[loopCount], ' ');
  writeln('Массив знаков: ');
  for loopCount := 1 to length(charArr) do
    write(charArr[loopCount], ' ');
  writeln();
  writeln('Чисел: ', intCount, '; Знаков: ', charCount, ';');
}

  loopCount := 1;
  while (loopCount <= charCount) do
  begin
    if charArr[loopCount] = '*' then
    begin
      intArr[loopCount] := algebra((intArr[loopCount]), (intArr[loopCount + 1]), (charArr[loopCount]));
      proCut(intArr, charArr, charCount, loopCount);
      intCount := intCount - 1;
      charCount := charCount - 1;
      loopCount := loopCount - 1;
    end;
  inc(loopCount);
  end;
{
  writeln('Массив чисел после умножения: ');
  for loopCount := 1 to length(intArr) do
    write(intArr[loopCount], ' ');
  writeln('Массив знаков: ');
  for loopCount := 1 to length(charArr) do
    write(charArr[loopCount], ' ');
  writeln();
  writeln('Чисел: ', intCount, '; Знаков: ', charCount, ';');
}

  for loopCount := 1 to charCount do
    intArr[loopCount + 1] := algebra(intArr[loopCount], intArr[loopCount + 1], charArr[loopCount]);
{
  writeln('Массив чисел после арифметики: ');
  for loopCount := 1 to length(intArr) do
    write(intArr[loopCount], ' ');
  writeln('Массив знаков: ');
  for loopCount := 1 to length(charArr) do
    write(charArr[loopCount], ' ');
  writeln();
  writeln('Чисел: ', intCount, '; Знаков: ', charCount, ';');
}

// writeln(intArr[intCount]);
  multiplicator := intArr[intCount];
end;

begin
  writeln('Введите строку');
 // readln(inputString);
  inputString := '5*6+7-3*2*3+11';
  writeln(inputString);
  getNumsAndChar(inputString, intArr, charArr, intCount, charCount);
  writeln('Ответ (30): ', multiplicator(intArr, charArr, intCount, charCount));
  readln();
end.

КОНСОЛЬ

Введите строку
5*6+7-3*2*3+11
Массив чисел:
5 6 7 3 2 3 11 0 0 Массив знаков:
* + - * * +
Чисел: 7; Знаков: 6;
Ответ (30): 30
vedro-compota's picture

засчитано

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