Главная страница
    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.06 c
15-1338256258
Error macro
2012-05-29 05:50
2013.03.22
Как стать фрилансером?


4-1259833099
Mixali4
2009-12-03 12:38
2013.03.22
Как получить идентификатор контекстного меню


15-1354034040
Use_R
2012-11-27 20:34
2013.03.22
Яндекс Почта и Одноклассники.


15-1340397005
Юрий
2012-06-23 00:30
2013.03.22
С днем рождения ! 23 июня 2012 суббота


15-1333830603
Юрий
2012-04-08 00:30
2013.03.22
С днем рождения ! 8 апреля 2012 воскресенье





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский