Russian Qt Forum
Ноябрь 22, 2024, 12:52 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Посоветуйте вычислитель :)  (Прочитано 7671 раз)
burunduk
Гость
« : Ноябрь 12, 2007, 12:24 »

чтобы самому не изобретать
нужно вот такие строки вычислять, формулу задаёт пользователь:

=Сумма1*(Коэффициент1+Коэффициент2):100-Сумма2
Записан
Kainit
Гость
« Ответ #1 : Ноябрь 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();

Вы этого хотите?
« Последнее редактирование: Ноябрь 12, 2007, 16:37 от Kainit » Записан
burunduk
Гость
« Ответ #2 : Ноябрь 12, 2007, 13:15 »

именно этого Улыбающийся
Записан
sikuda
Гость
« Ответ #3 : Ноябрь 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.
Записан
Kainit
Гость
« Ответ #4 : Ноябрь 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 строчек. По этому делу есть специальная литература и статьи в интернете, но можно их не читать и написать исходя из здравого смысла.
« Последнее редактирование: Ноябрь 12, 2007, 16:33 от Kainit » Записан
burunduk
Гость
« Ответ #5 : Ноябрь 12, 2007, 16:44 »

спасибо за советы
эх, нада обновляться, у меня ещё нету этих классов (Qt 4.2.2)
Записан
Barmaglodd
Гость
« Ответ #6 : Ноябрь 13, 2007, 12:23 »

Зачем писать самому, если есть море готовых встраиваемых скриптовых движков? Сам использовал Lua. Интегрируется просто и быстро, Qt обновлять не надо.
Записан
Kainit
Гость
« Ответ #7 : Ноябрь 13, 2007, 12:41 »

Писать самому чтобы понять как оно работает в принципе. Готовые скриптовые языки нацелены на широкий круг задач и потому, если вам надо вычислять значение функции миллион раз (каждый раз меняется одна из меременных), то собственнописанный движок будет работать на порядки быстрее.

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

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

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 21.