Как реализовать вычисление арифметического выражения со скобками без приоритета операций?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При изучении программирования в 1С часто возникает задача обработки математических выражений, вводимых пользователем в строку. Давайте разберем, как подступиться к решению задачи, где необходимо вычислять выражение, учитывая скобки, но игнорируя стандартный приоритет умножения и деления (выполняя действия строго по порядку).

Подход 1: Использование рекурсивного разбора

Самый изящный способ работы со скобками в программировании — это рекурсия. Представьте, что ваша функция — это «читатель», который идет по строке символ за символом. Как только он встречает открывающую скобку (, он должен «запомнить» текущее состояние и запустить новую копию самого себя для обработки того, что находится внутри скобок.

Рассмотрим алгоритм действий:

  1. Создаем функцию, которая принимает строку выражения.
  2. Идем по символам строки. Если встречаем число — накапливаем его, если оператор — выполняем накопленную операцию.
  3. При встрече открывающей скобки ( вызываем эту же функцию рекурсивно. Результат выполнения этой функции будет числом, которое мы используем как очередной операнд.
  4. Завершаем работу при встрече закрывающей скобки ) или при окончании строки.

Этот метод позволяет обрабатывать любую вложенность скобок, что делает его универсальным для задач парсинга.

Подход 2: Упрощенная реализация через строковые манипуляции

Если вам нужно быстрое решение для простых выражений и вы только начинаете осваивать работу с алгоритмами, можно воспользоваться встроенной в платформу 1С функцией Вычислить(). Однако, чтобы система учитывала порядок действий согласно вашему условию (без приоритета), нам нужно правильно расставить скобки.

Рассмотрим пример реализации кода, который «оборачивает» выражение в скобки, чтобы принудительно задать нужный порядок вычислений:


КоличествоСкобок = СтрЧислоВхождений(Выражение, "*") + СтрЧислоВхождений(Выражение, "/");
Выражение = СтрЗаменить(Выражение, "*", ")*");
Выражение = СтрЗаменить(Выражение, "/", ")/");

Для Счетчик = 1 По КоличествоСкобок Цикл
    Выражение = "(" + Выражение;
КонецЦикла;

Результат = Вычислить(Выражение);
Сообщить(Результат);

Важное примечание: Данный метод является «хитрым» приемом и не заменяет полноценный парсер, но он наглядно показывает, как можно управлять порядком вычислений через логику скобок.

Как правильно готовить данные для обработки

Прежде чем приступать к вычислениям, полезно нормализовать строку. Проанализируем ситуацию: пользователь может ввести пробелы, лишние символы или специфические знаки операций. Разберем шаги подготовки:

Почему это полезно для обучения?

Разбор строки — это фундаментальный навык. Даже если сейчас вам достаточно простого решения, в будущем при работе с форматами JSON или XML, а также при написании сложных правил обмена, понимание того, как работает парсер (лексический анализ и синтаксический анализ), сэкономит вам недели разработки. Мы рекомендуем вам не останавливаться на функции Вычислить(), а попробовать реализовать алгоритм, который проходит по строке вручную, используя массив и рекурсивный вызов функций. Это лучший способ прокачать навыки алгоритмического мышления в 1С.

← На главную