Здравствуйте, GrayWizard, Вы писали:
GW>Помогите решить такую задачу:
GW>В программе происходят вычисления по разным формулам
GW>( Например (v1*v2)/v3+6 и значение переменных v1, v2, v3 )
GW>Функция проводит синтаксический анализ формулы и строит что-то (это главный вопрос), что в последствии программой воспринимается, как алгоритм рассчета с переменными v1,v2...
GW>В результате получаем какое-то число...
GW>Надо, чтобы подобная функция проводила анализ шаблона формулы один раз, чтобы потом просто подставлять туда переменные и вычислять арифметическое выражение...
GW>Т.е.:
GW>??? f(char par[]) — функчия разбора синтаксиса
GW>{
GW> return ???;
GW>}//Должна запускаться один раз и скорость работы не важна
GW>int f1(???,int a, int b, int c)
GW>{
GW> с=..Только арифмитические действия над a, b и с по какому-то правилу ???
GW> return c;
GW>}//Для этой функции необходима максимальная скорость вычисления
GW>Что использовать в качестве "???"
GW>Помогите!!!
GW>Зарание огромное спасибо...
Есть вариант использовать, псевдокомпиляцию.
Разделим анализ строки и вычисления результата. Анализатор формирует последовательный массив операций в вычисляемом порядке и кодирует по типам операций ( получить переменную 1, * 2, + 3 и т д ). А также массив переменных (a-0,b-1,c-2);
Пример строка «a*b+c» декодируется так “ab*c+” -> a(1,v[0]); b(1,v[1]); *(2,a,b); c(1,v[2]); +(3,*,c)
struct oper
{
int index;
double res;
int op;
};
double calc( oper* d,int n )
{
double res=0;
for( int i=0;i<n;i++)
{
if( d[i].op == 1 )
{
d[i].res = varlist[ d[i].index ];
}
if( d[i].op == 2 )
{
d[i].res = d[i-1].res * d[i-2].res;
}
if( d[i].op == 3 )
{
d[i].res = d[i-1].res + d[i-2].res;
}
res = d[i].res;
}
return res;
}