Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.058 c
15-1337805002
Юрий
2012-05-24 00:30
2013.03.22
С днем рождения ! 24 мая 2012 четверг


15-1353318107
ЕщеОдинКакжеНадоели
2012-11-19 13:41
2013.03.22
CheckListBox с 2 чекерами.


3-1284731391
Сергей М.
2010-09-17 17:49
2013.03.22
Провайдер VFPOLEDB.1 и запрет возврата удаленных запис


15-1337670031
Pcrepair
2012-05-22 11:00
2013.03.22
Правильное использование DLL


15-1337109798
palva
2012-05-15 23:23
2013.03.22
Мы все под колпаком





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский