Подсчитать результат, выполняя арифметические операции в порядке их приоритета - PascalABC.NET

Узнай цену своей работы

Формулировка задачи:

Строка – это правильное арифметическое выражение, содержащее только натуральные числа и знаки арифметических операций между ними (+, -, *, /). Подсчитать результат, выполняя арифметические операции в порядке их приоритета. Входные данные: 5*3-9/3 Выходные данные: 12

Решение задачи: «Подсчитать результат, выполняя арифметические операции в порядке их приоритета»

textual
Листинг программы
begin
  var s := ReadLnString('Введите выражение:');
 
  var nums := New List<real>;
  var op := New List<char>;
  var n := 0;
  foreach var c in s do
    case c of
      #48..#57 : n := n * 10 + StrToInt(c);
      '+', '-', '*', '/' : begin nums.Add(n); n := 0; op.Add(c); end;
    else
      WriteLn('Встречен неожиданный символ «', c, '» в позиции ', Pos(c, s), '.', NewLine,
      'Работа прекращена.');
      Halt;
    end;
  if n > 0 then nums.Add(n);
 
  var opIndex := 0;
  repeat
    if (op[opIndex] = '*') or (op[opIndex] = '/') then
      begin
        if op[opIndex] = '*' then
          nums[opIndex] := nums[opIndex] * nums[opIndex + 1]
        else
          nums[opIndex] := nums[opIndex] / nums[opIndex + 1];
        nums.RemoveAt(opIndex + 1);
        op.RemoveAt(opIndex);
      end
    else
      opIndex += 1;
  until opIndex = op.Count;
 
  repeat
    case op[0] of
      '+' : nums[0] := nums[0] + nums[1];
      '-' : nums[0] := nums[0] - nums[1];
    end;
    nums.RemoveAt(1);
    op.RemoveAt(0);
  until op.Count = 0;
 
  WriteLn(s, ' = ', nums[0]);
end.

Объяснение кода листинга программы

  1. Программа запрашивает у пользователя ввод выражения и сохраняет его в переменную s.
  2. Переменная nums инициализируется как пустой список, который будет содержать числовые значения выражения.
  3. Переменная op инициализируется как пустой список, который будет содержать операции, которые нужно выполнить.
  4. Переменная n инициализируется как 0 и используется для подсчета числового значения выражения.
  5. В цикле foreach перебираются все символы в выражении.
  6. Если символ является числом (от #48 до #57), то он преобразуется в число и умножается на n, после чего добавляется в список nums и n обнуляется.
  7. Если символ является оператором (+, -, *, /), то числовое значение n добавляется в список nums, n обнуляется и оператор добавляется в список op.
  8. Если символ не является числом или оператором, то выводится сообщение об ошибке и программа завершается.
  9. Если n больше 0, то его значение добавляется в список nums.
  10. Переменная opIndex инициализируется как 0 и используется для индексации списка op.
  11. В цикле repeat выполняются операции из списка op.
  12. Если операция является умножением или делением, то выполняется соответствующая арифметическая операция и значение оператора удаляется из списка op.
  13. Если операция является сложением или вычитанием, то выполняется соответствующая арифметическая операция и значения, которые были на позициях 0 и 1 в списке nums, удаляются из списка.
  14. Если список op пуст, то выполняется цикл repeat, который выполняется до тех пор, пока в списке nums не останется только одно значение.
  15. В цикле repeat выполняются операции из списка op.
  16. Если операция является сложением или вычитанием, то выполняется соответствующая арифметическая операция и значение на позиции 1 в списке nums удаляется.
  17. Если операция является умножением или делением, то выполняется соответствующая арифметическая операция и значения на позициях 0 и 1 в списке nums удаляются.
  18. Если список nums пуст, то выводится сообщение об ошибке и программа завершается.
  19. Выводится результат выполнения выражения.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.333 из 5
Похожие ответы