При изучении программирования в 1С часто возникает задача обработки математических выражений, вводимых пользователем в строку. Давайте разберем, как подступиться к решению задачи, где необходимо вычислять выражение, учитывая скобки, но игнорируя стандартный приоритет умножения и деления (выполняя действия строго по порядку).
Самый изящный способ работы со скобками в программировании — это рекурсия. Представьте, что ваша функция — это «читатель», который идет по строке символ за символом. Как только он встречает открывающую скобку (, он должен «запомнить» текущее состояние и запустить новую копию самого себя для обработки того, что находится внутри скобок.
Рассмотрим алгоритм действий:
( вызываем эту же функцию рекурсивно. Результат выполнения этой функции будет числом, которое мы используем как очередной операнд.) или при окончании строки.Этот метод позволяет обрабатывать любую вложенность скобок, что делает его универсальным для задач парсинга.
Если вам нужно быстрое решение для простых выражений и вы только начинаете осваивать работу с алгоритмами, можно воспользоваться встроенной в платформу 1С функцией Вычислить(). Однако, чтобы система учитывала порядок действий согласно вашему условию (без приоритета), нам нужно правильно расставить скобки.
Рассмотрим пример реализации кода, который «оборачивает» выражение в скобки, чтобы принудительно задать нужный порядок вычислений:
КоличествоСкобок = СтрЧислоВхождений(Выражение, "*") + СтрЧислоВхождений(Выражение, "/");
Выражение = СтрЗаменить(Выражение, "*", ")*");
Выражение = СтрЗаменить(Выражение, "/", ")/");
Для Счетчик = 1 По КоличествоСкобок Цикл
Выражение = "(" + Выражение;
КонецЦикла;
Результат = Вычислить(Выражение);
Сообщить(Результат);
Важное примечание: Данный метод является «хитрым» приемом и не заменяет полноценный парсер, но он наглядно показывает, как можно управлять порядком вычислений через логику скобок.
Прежде чем приступать к вычислениям, полезно нормализовать строку. Проанализируем ситуацию: пользователь может ввести пробелы, лишние символы или специфические знаки операций. Разберем шаги подготовки:
"5", "+", "7", "*", "8".Разбор строки — это фундаментальный навык. Даже если сейчас вам достаточно простого решения, в будущем при работе с форматами JSON или XML, а также при написании сложных правил обмена, понимание того, как работает парсер (лексический анализ и синтаксический анализ), сэкономит вам недели разработки. Мы рекомендуем вам не останавливаться на функции Вычислить(), а попробовать реализовать алгоритм, который проходит по строке вручную, используя массив и рекурсивный вызов функций. Это лучший способ прокачать навыки алгоритмического мышления в 1С.