Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Архив ПТ Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 105 106 107 108 109 110 111 112 113 [114]
 Re: С++?  [new]
D!sa
Member

Откуда:
Сообщений: 288
ня =) http://pascal.sources.ru/parsing/bpc-sec.htm
21 фев 08, 20:02    [5325313]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
D!sa
Member

Откуда:
Сообщений: 288
Еще есть такая идея - записать в постфиксную запись, параметр заменять значением, и передовать dc, он поидее быстрый. Т.е. чет вроде байт кодов получается=) Если dc достаточно быстрый, то может получиться. Вообще можно попробовать сделать на bash.
21 фев 08, 20:12    [5325341]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
rt555
Member [заблокирован]

Откуда:
Сообщений: 446
D!sa
ня =) http://pascal.sources.ru/parsing/bpc-sec.htm

хрень там какая-то, я бы сказал..... Да я собс-но уже всё накодил, весь постфикс в массиве записей {number XOR operation}:

type
  type_st1=array[0..999] of record num: double; op: char; end;
var
  hr,ht: longint;
  str,stt: type_st1;


procedure rev_pn(s: string; j: byte);
const
  d=['0'..'9','.','x'];
var
  i,h1,h2: longint;
  num: string;
  st2: array[1..999] of char;
  st1: type_st1;

begin
i:=0; h1:=0; h2:=0;
fillchar(st1,sizeof(st1),0);

while i<=length(s) do
  begin
    if s[i] in d then
      begin
        num:=s[i];
        i:=i+1;
        while (i<=length(s))and(s[i] in d) do
          begin num:=num+s[i]; i:=i+1; end;
        h1:=h1+1;
        if s[i-1]<>'x' then
          begin
            st1[h1].num:=strtofloat(num);
            st1[h1].op:='_';
          end
        else
          st1[h1].op:='x';
        continue;
      end
    else if s[i] in ['+','-','*','/'] then
      begin
        while (h2>0)and(st2[h2] in ['*','/']) do
          begin
            h1:=h1+1;
            st1[h1].op:=st2[h2];
            st2[h2]:='#';
            h2:=h2-1;
          end;
        h2:=h2+1;
        st2[h2]:=s[i];
      end
    else if s[i]='(' then
      begin
        h2:=h2+1;
        st2[h2]:='(';
      end
    else if s[i]=')' then
      begin
        while st2[h2]<>'(' do
          begin
            h1:=h1+1;
            st1[h1].op:=st2[h2];
            st2[h2]:='#';
            h2:=h2-1;
          end;
        st2[h2]:='#';
      end;
    i:=i+1;
  end;
  for i:=h2 downto 1 do
    if st2[i]<>'#' then
      begin h1:=h1+1; st1[h1].op:=st2[i]; end;

  if j=1 then
    begin
      hr:=0;
      for i:=1 to h1 do
        if st1[i].op<>'#' then
          begin hr:=hr+1; str[hr]:=st1[i]; end;
    end
  else
    begin
      ht:=0;
      for i:=1 to h1 do
        if st1[i].op<>'#' then
          begin ht:=ht+1; stt[ht]:=st1[i]; end;
    end;
end;

21 фев 08, 23:03    [5325706]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
rt555
Member [заблокирован]

Откуда:
Сообщений: 446
D!sa
Еще есть такая идея - записать в постфиксную запись, параметр заменять значением, и передовать dc, он поидее быстрый. Т.е. чет вроде байт кодов получается=) Если dc достаточно быстрый, то может получиться. Вообще можно попробовать сделать на bash.

что такое dc я не знаю (или зобыл? (больше суток не сплю)):)
но если чесно я не сильно верю что все эти "нотации" помогут мне в этой таске
Но проверить хочется, а я ж упрямый как сто ослов
21 фев 08, 23:07    [5325715]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
C#C++
Member [заблокирован]

Откуда: Суровые северные земли
Сообщений: 2636
Когда в ВУЗе учился, делал прогу, которая графики функций строила (функция, конечно, строкой задавалась). Чтоб график построить, надо было вычислять на множестве точек.
Поэтому для ускорения разбор выполнялся 1 раз, строилось дерево разбора, по которому потом функция вычислялась в цикле.

Дерево составлялось примерно из таких узлов:
class Node  // любая элементарная функция
{
public:
     virtual double Calc(double x) = 0;
};

class Const : public Node // константа
{
     double val;
public:
     double Calc(double x) { return val; }
};

class Arg : public Node // переменная
{
public:
     double Calc(double x) { return x; }
};

class Func1 : public Node // функция 1 аргумента (sin, exp и т.д.)
{
     Node *op;
     double (*fn)(double);
public:
     double Calc(double x) { return fn(op->Calc(x)); }
};

class Func2 : public Node // функция 2 аргументов (+, * и т.д.)
{
     Node *op1;
     Node *op2;
     double (*fn)(double, double);
public:
     double Calc(double x) { return fn(op1->Calc(x), op2->Calc(x)); }
};

значение вычислялось по дереву довольно быстро (практически как "зашитая" функция).
22 фев 08, 03:48    [5325977]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
rt555
Member [заблокирован]

Откуда:
Сообщений: 446
ну да... дерево разбора; только построить его совсем не просто. А так, оно, конечно.
И не думаю что это намного лучше чем постфикс в массиве: 2+5*3 --> [ 2, 5, 3, *, + ]
Те же яйца. Я ОПН калькулятор собс-но сделал, работает чудесно, а таска не сдается.
Хотя щас я запросто делаю 200-500 тыс. приращений F(x)dx.
22 фев 08, 08:46    [5326169]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
TonY.Soprano
Member

Откуда:
Сообщений: 285
от так нафлудили ....
22 фев 08, 17:22    [5329875]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
D!sa
Member

Откуда:
Сообщений: 288
rt555
Те же яйца.


Абсолютно согласен. И вариант с массивом мне больше нравиться, так работать должно намного быстрее чем с классами.
23 фев 08, 18:49    [5331325]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
rt555
Member [заблокирован]

Откуда:
Сообщений: 446
Таска почему-то сдалась.
Может, потому что я добавил проверку на случай достаточно массивного дна пустой чашки
чтобы ее центр масс был ниже ее дна (при виде сверху). И тогда любой долив воды будет
только поднимать общий ЦМ. А это нам не надо.
23 фев 08, 23:19    [5331732]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
D!sa
Member

Откуда:
Сообщений: 288
Я опять про лисп - один хороший товарищ дал ссылку на упрощалку символических выражений: http://paste.lisp.org/display/56989
Ждем ответ от доблестных С++ прогеров=)
10 мар 08, 01:58    [5390080]     Ответить | Цитировать Сообщить модератору
 Re: С++?  [new]
Charles Weyland
Member

Откуда: Feorina "Fury" 161
Сообщений: 4168
Наконец-то эту тему все забыли....
21 июн 08, 18:36    [5830092]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 105 106 107 108 109 110 111 112 113 [114]
Все форумы / Архив ПТ Ответить