Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
ВнизРабота с формулами Найти похожие ветки
← →
Empleado © (2012-03-19 17:46) [0]Добрый день.
Возникла следующая необходимость.
Дано: Формула записанная "от руки" (составленная из заранее указанных наименований переменных).
Например, такого вида: A1 + (BD*0.35 - COS(HD + 3)) / (50*M - 11 * A2) + B1 * A3 + B2 + B3 * 0.10
Необходимо: Распарсить эту строку-формулу на элементарные составляющие, т.е. получить упорядоченный список операций, в котором используются не более двух операндов.
Т.е., надо получить следующий/подобный список:
STEP1 BD * 0.35
STEP2 HD + 3
STEP3 COS(STEP2)
STEP4 STEP1 - STEP3
STEP5 50 * M
STEP6 .....
Может кто уже пользуется подобным? Может кто-нибудь подскажет уже готовое решение?
Спасибо.
ПС. Уточню: задача не посчитать значение выражения по заданной формуле, подставляя в нее значения переменных. Задача именно распарсить в соответствии с законами математики, не вычисляя и не подставляя значения переменных.
← →
Юрий Зотов © (2012-03-19 18:21) [1]Обратная польская запись?
← →
Kerk © (2012-03-19 18:29) [2]
> Empleado © (19.03.12 17:46)
Обратная польская запись даст тебе дерево вычисления. Проходом снизу вверх это дерево легко преобразуется в нужный тебе список.
← →
Empleado © (2012-03-19 19:50) [3]Спасибо.
← →
Димка На (2012-03-19 20:10) [4]Если не секрет для чего потом нужна эта формула. Был у меня где-то модуль для парсинга. (и для вычисления потом отпарсеного)
← →
Empleado © (2012-03-19 20:36) [5]
> Димка На (19.03.12 20:10) [4]
Чтобы базу данных нашпиговать разными формулами :)
Фактически: представление любой формулы в БД, с последующим обращением к ней через n-ое количество лет.
Необходимо для парамертизации вычислений различной сложности, моделирования различных процессов, а также для представления поэтапных результатов вычисления.
> Был у меня где-то модуль для парсинга. (и для вычисления
> потом отпарсеного)
Спасибо.
Уже сделали. По ходу, упростили реализацию.
← →
Димка На (2012-03-19 20:40) [6]Только у меня немного другой список получался:
A1 + (BD*0.35 - COS(HD + 3)) / (50*M - 11 * A2) + B1 * A3 + B2 + B3 * 0.10
PushVar a1
PushVar bd
Push 3.50000000000000E-0001
Mul
PushVar hd
Push 3.00000000000000E+0000
Add
!cos 1
Sub
Push 5.00000000000000E+0001
PushVar m
Mul
Push 1.10000000000000E+0001
PushVar A2
Mul
Sub
Div
Add
PushVar B1
PushVar A3
Mul
Add
PushVar B2
Add
PushVar B3
Push 1.00000000000000E-0001
Mul
Add
← →
Димка На (2012-03-19 20:41) [7]Ну раз не надо так не надо:) Тем более это я делал на работе и по работе, так что мне наверное нельзя это выкладывать:)
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.062 c