Russian Qt Forum

Qt => Qt Script, QtWebKit => Тема начата: burunduk от Ноябрь 12, 2007, 12:24



Название: Посоветуйте вычислитель :)
Отправлено: burunduk от Ноябрь 12, 2007, 12:24
чтобы самому не изобретать
нужно вот такие строки вычислять, формулу задаёт пользователь:

=Сумма1*(Коэффициент1+Коэффициент2):100-Сумма2


Название: Re: Посоветуйте вычислитель :)
Отправлено: Kainit от Ноябрь 12, 2007, 12:58
Если я правильно понял вопрос, то вы ищете парсер символьных арифметических выражений?
Вы хотите какой-нибудь класс типа Formula

Formula *pFormula = new Formula();
pFormula->Set("Сумма1*(Коэффициент1+Коэффициент2):100-Сумма2");
pFormula->SetValue("Сумма1",123);
pFormula->SetValue("Сумма2",123);
pFormula->SetValue("Коэффициент1",123);
pFormula->SetValue("Коэффициент2",123);
double result = pFormula->Value();

Вы этого хотите?


Название: Re: Посоветуйте вычислитель :)
Отправлено: burunduk от Ноябрь 12, 2007, 13:15
именно этого :)


Название: Посоветуйте вычислитель :)
Отправлено: sikuda от Ноябрь 12, 2007, 13:20
Если У Вас Версия Qt 4.3 то читайте про модуль QtScript

Типа
QScriptValue val(&engine, 123);
engine.globalObject().setProperty("foo", val);
qDebug() << "foo times two is:" << engine.evaluate("foo * 2").toNumber();

Если Ниже и это критично - Смотрите в сторону QSA.


Название: Re: Посоветуйте вычислитель :)
Отправлено: Kainit от Ноябрь 12, 2007, 16:29
Пути 2 (1- дешёвый и простой, но медленный и 2-интересный и быстрый)

1.
Код:
QString functionString = "Сумма1*(Коэффициент1+Коэффициент2):100-Сумма2";
functionString.replace("Сумма1",QString ::number(123));
functionString.replace("Сумма2",QString ::number(123));
functionString.replace("Коэффициент1",QString ::number(123));
functionString.replace("Коэффициент2",QString ::number(123));
QScriptEngine engine;
double result = engine.evaluate(functionString).toNumber();

2. Первый способ заставит вас при любом изменении любого коэффициента перехреначивать первоначальную строку что есть очень и очень медленно при массивных вычислениях.
Второй способ состоит в том, чтобы самому написать парсер. У меня код парсера занял 300 строчек. По этому делу есть специальная литература и статьи в интернете, но можно их не читать и написать исходя из здравого смысла.


Название: Re: Посоветуйте вычислитель :)
Отправлено: burunduk от Ноябрь 12, 2007, 16:44
спасибо за советы
эх, нада обновляться, у меня ещё нету этих классов (Qt 4.2.2)


Название: Re: Посоветуйте вычислитель :)
Отправлено: Barmaglodd от Ноябрь 13, 2007, 12:23
Зачем писать самому, если есть море готовых встраиваемых скриптовых движков? Сам использовал Lua. Интегрируется просто и быстро, Qt обновлять не надо.


Название: Re: Посоветуйте вычислитель :)
Отправлено: Kainit от Ноябрь 13, 2007, 12:41
Писать самому чтобы понять как оно работает в принципе. Готовые скриптовые языки нацелены на широкий круг задач и потому, если вам надо вычислять значение функции миллион раз (каждый раз меняется одна из меременных), то собственнописанный движок будет работать на порядки быстрее.

LUA - прелесть. Сам с Qt приложениями не использовал, а вот отдельно очень даже. Надо будет и мне попробовать.

Qt обновлять надо, чтобы не изобретать велосипеды и всё было code less. Они там не зря постоянно новые версии выпускают.