Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Символьное дифференцирование [D7]


Страницы:   1 2

Ivan ©   (2012-04-08 14:39:00) 

Здравствуйте,уважаемые форумчани.Есть вопрос по структуре программного кода на символьное дифференцирование.Подпрограммы вроде все работают,а вот с блоком основной программы,что-то не получается у меня.Подскажите что я делаю не так.


Inovet   (2012-04-11 23:04:00) [21]

> [15] CRLF   (11.04.12 22:50)
> Я как бы знаю. :-)

Я автору.


CRLF   (2012-04-11 22:50:00) [22]


> Inovet ©   (11.04.12 21:44) [14]
Я как бы знаю. :-)


Inovet   (2012-04-11 21:44:00) [23]

> [13] CRLF   (11.04.12 21:11)
> постфиксная запись

Всё равно без стека или без рекурсии не вычислит. И вообще автору надо что-то там преобразовать в символьном виде, а он вычислять пытается.


CRLF   (2012-04-11 21:11:00) [24]


> что ты хочешь этим кодом сделать?
нерекурсивно вычислить арифметическое выражение, вестимо. постфиксная запись -- для яйцеголовых.


Ega23   (2012-04-11 19:37:00) [25]


> Что в моем коде не так?


Я где-то с минуту на него смотрел и пытался понять, что он делает. Не понял. Честно.
Скажи своими словами, что ты хочешь этим кодом сделать?


Ivan   (2012-04-11 18:42:00) [26]

Благодарю,учту ваши предложения.     проконсультируйте,пожалуйста.  Что в моем коде не так?

while (pos('[',s)<>0)and(pos(']',s)<>0) do begin

razbor(s,a,b,c);
s:='|'+a+'|'+b+'|'+c+'|';
edit3.Text:=s;
f:=b;

for i:=1 to length(b) do
begin
        if b[i]='+' then   begin s:=slozh(b);
                          q:=s;
                          s:=a+q+c;
                          edit4.Text:=s;
                            end;
                           end;
                            if pos('+',b)=0 then
for j:=1 to length(b) do
begin
         if b[j]='-' then begin s:=vych(b);
                          q1:=s;
                          s:=a+q1+c;
                          edit5.Text:=s;
                          end;
                             end
                            else if pos('-',b)=0 then
for k:=1 to length(b) do
begin
    if b[k]='*' then  begin s:=pro(b);
                            q2:=s;
                            s:=a+q2+c;

                          edit6.Text:=s;
                          end;
                             end;   end;end;


Inovet   (2012-04-10 20:06:00) [27]

> [9] Ega23 ©   (10.04.12 19:22)
> Тебе обратная польская запись нужна.

Или дерево строить типа такого, рекурсивно оно хорошо строится:

20 * d * c * b - a + 10 + (a + b) * (a - b) + b * b

               +
              / \
             /   \
            /     \
           +       *
          / \     / \
         +   \   b   b
        / \   \
       -  10   *
      / \     / \
     *   a   /   \
    / \     /     \
   *   b   ()     ()
  / \     /      /
 *   c   +      -
/ \     / \    / \
20  d   a   b  a   b


Ega23   (2012-04-10 19:22:00) [28]


> (мне надо разобрать для начала процесс вычисления элементарных
> выражений,а потом уж всё остальное


Тебе обратная польская запись нужна.
https://www.google.ru/search?q=%D0%BE%D0%B1%D1%80%D0%B0%D1%82%D0%BD%D0%B0%D1%8F+%D0%BF%D0%BE%D0%BB%D1%8C%D1%81%D0%BA%D0%B0%D1%8F+%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C+delphi&ie=utf-8&oe=utf-8&aq=t&rls=org.mozilla:ru:official&client=firefox


Ivan   (2012-04-10 19:02:00) [29]

у меня факт появления скобок учитываться не будет.Сложные функции появляться тоже не будут.Ввод осуществляется в виде полинома.  (мне надо разобрать для начала процесс вычисления элементарных выражений,а потом уж всё остальное)

Я сам то понимаю что "> т.е. нашли например '+' ,вызвали процедуру для плюса.она
> раставляет [.....]+[....]
"    
У меня не получается когда именно точно будет вызываться процедура.))).

Вычисление производной через бинарное дерево еще есть вроде ,но мне бы желательно уже коли я начал,доделать через обработку строковых данных.


oldman   (2012-04-10 14:07:00) [30]

Обратная польская запись не спасет отца русской демократии?


oldman   (2012-04-10 11:38:00) [31]


> т.е. нашли например '+' ,вызвали процедуру для плюса.она
> раставляет [.....]+[....]


2+2*2 = [2]+[2*2]
Вроде логично

(2+2)*2 = [(2]+[2)*2]
Бред!


Ivan   (2012-04-08 18:20:00) [32]

В коде подпрограммы работают,а вот в основном коде для кнопки button (т.е для вычисления производной) не могу разобрать как делать.  при соответствующем вызове подпрограмм они расставляют квадратные скобки.Мне нужно выяснить ситуацию когда вызываем нужную подпрограмму,т.е. нашли например '+' ,вызвали процедуру для плюса.она раставляет [.....]+[....].потом процедура razbor делит её на : то что до '[',  то что внутри  и то что после   ']'.ПРи каждом  случае мы рассматриваем то что внутри,а потом склеиваем . это упрощается  до получения производной из элементарных частей.    Идея вообщем такова.Если я в чем-то размышляю не так,то пожалуйста исправьте.        Могу выслать весь код.Благодарю за скорый отзыв


ДимкаНа   (2012-04-08 17:33:00) [33]

Напиши словами что ты хочешь сделать и  получить в итоге.


Ivan   (2012-04-08 17:27:00) [34]

Else нужно убрать в соответствующих местах.У меня работает для '+'и'-' ,а вот дальше не идёт.


ДимкаНа   (2012-04-08 16:11:00) [35]

Удалено модератором
Примечание: Три дня.


Ivan   (2012-04-08 14:41:00) [36]

Вот отрывок из кода:  

procedure TForm1.BitBtn1Click(Sender: TObject);
var {v:TextFile;} sn,sk,s,X,p,a,q,b,c,t1,t:string; mn,mk,i,k,l,o,j,d,f,g,sit:integer;

begin
 s:=edit1.Text;
 if pos('[',s)=0
 then     begin
 s:='['+s+']''';
 edit1.Text:=s;

 razbor(s,a,b,c);
s:='|'+a+'|'+b+'|'+c+'|';
edit2.Text:=s;

end;

  while (pos('[',s)<>0)and(pos(']',s)<>0) do begin

razbor(s,a,b,c);
s:='|'+a+'|'+b+'|'+c+'|';
edit3.Text:=s;

for i:=1 to length(b) do
begin
         if b[i]='+' then   begin s:=slozh(b);
                          q:=s;
                          s:=a+q+c;
                          edit4.Text:=s;
                            end
          else if pos('+',b)=0 then
for j:=1 to length(b) do
begin
         if b[j]='-' then begin s:=vych(b);
                          q1:=s;
                          s:=a+q1+c;
                          edit5.Text:=s;
                          end
          else if pos('-',b)=0 then
for k:=1 to length(b) do
begin
         if b[k]='*' then begin s:=pro(b);
                                q2:=s;
                                s:=a+q2+c;
                                edit6.text:=s;
                           end
          else if pos('*',b)=0 then
for l:=1 to length(b) do
begin
         if b[l]='/' then  begin s:=del(b);
                                 q3:=s;
                                 s:=a+q3+c;
                                 edit7.text:=s;
                           end
          else if pos('/',b)=0 then
for o:=1 to length(b) do
begin
         if b[o]='^' then  begin s:=step(b);
                                 q4:=s;
                                 s:=a+q4+c;
                                 edit8.text:=s;
                                 end;
end;
end;
end;
end;
end;
end;
end;


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо