Re: Частые вычисления по неопределенной формуле!!!
От: kaa_t Россия  
Дата: 26.04.04 07:02
Оценка:
Здравствуйте, 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;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.