Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2015.11.29;
Скачать: [xml.tar.bz2];

Вниз

Символьное дифференцирование   Найти похожие ветки 

 
Ivan   (2012-04-08 14:39) [0]

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


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

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

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;


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

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


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

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


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

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


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

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


 
oldman ©   (2012-04-10 11:38) [6]


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


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

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


 
oldman ©   (2012-04-10 14:07) [7]

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


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

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

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

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


 
Ega23 ©   (2012-04-10 19:22) [9]


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


Тебе обратная польская запись нужна.
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


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

> [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


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

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

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;


 
Ega23 ©   (2012-04-11 19:37) [12]


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


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


 
CRLF   (2012-04-11 21:11) [13]


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


 
Inovet ©   (2012-04-11 21:44) [14]

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

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


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


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


 
Inovet ©   (2012-04-11 23:04) [16]

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

Я автору.


 
oldman ©   (2012-04-12 08:04) [17]


> нерекурсивно вычислить арифметическое выражение


Очень мудро автор пытается это делать.
Сначала +, потом -, потом *...
Надо, вроде, как-бы наоборот.


 
Ivan   (2012-04-16 20:21) [18]

>надо что-то там преобразовать в символьном виде, а он вычислять пытается.

ПОДСКАЖИТЕ,ПОЖ-СТА КАК?

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


 
Ega23 ©   (2012-04-16 21:04) [19]


> ВЫ можете мне подкинуть программный код хотя бы,чтобы я
> на чём-то ориентировался.


Изложи задачу внятно.


 
Inovet ©   (2012-04-16 23:25) [20]

> [18] Ivan   (16.04.12 20:21)
> ПОДСКАЖИТЕ,ПОЖ-СТА КАК?

Сначала распарсить исходное в дерево, потом сделать преобразования и вывести результат обходом дерева.


 
Pavia ©   (2012-04-17 16:04) [21]

Начни с простой задачки. Используя стек проверь правильность расстановки скобок.


 
Pavia ©   (2012-04-17 16:06) [22]

PS. Во входной строке могут встречаться 3 вида скобок {}[]()


 
Ega23 ©   (2012-04-17 17:06) [23]


> Начни с простой задачки. Используя стек проверь правильность
> расстановки скобок.


А я вот на первом курсе её без стека решил. Через опу. :)


 
jack128_   (2012-04-18 09:46) [24]


> А я вот на первом курсе её без стека решил. Через опу. :
> )

Так стек для этой задачи и не нужен.

var
 input: string;
..
 OpenBracketCount: Integer;
begin
 OpenBracketCount := 0;
 for I := 1 to Length(Input) do
 begin
   case Input[I] of
     "(": Inc(OpenBracketCount);
     ")": Dec(OpenBracketCount);
   end;
   if OpenBracketCount < 0 then
     raise Exception.Create("ВНЕЗАПНО появилась закрывающая скобка");  
 end;
 if OpenBracketCount <> 0 then
   raise Exception.Create("Не хватает закрывающих скобок");
end;


 
Inovet ©   (2012-04-18 09:57) [25]

> [24] jack128_   (18.04.12 09:46)
> Так стек для этой задачи и не нужен.

Это ты проверил открыто = закрыто. А как преобразовать (а + б) * (а - б)?


 
Ega23 ©   (2012-04-18 10:20) [26]


> Так стек для этой задачи и не нужен.


Для трёх видов скобок?


 
jack128_   (2012-04-18 16:35) [27]


> Это ты проверил открыто = закрыто. А как преобразовать (а
> + б) * (а - б)?

во что преобразовать?

Задача как стояла? проверить

> правильность расстановки скобок.

?? агло вроде решает эту задачу. либо приведи строку, на которой он лажает.


> Ega23 ©   (18.04.12 10:20) [26]
> Для трёх видов скобок?

передавай символы скобок параметрами и вызови функцию три раза.


 
Ega23 ©   (2012-04-18 16:45) [28]


> передавай символы скобок параметрами и вызови функцию три раза.


( [ { ] ) }


 
Ivan   (2012-04-18 18:53) [29]

Решил что буду работать с бинарным деревом.Всё переделаю.     Наверняка кто -то делал же прогу на дифференцирование.    

А я вот на первом курсе её без стека решил. Через опу. :)

  Хотелось бы посмотреть как другие выполняли эту работу.Если можно с исходником.(благодарю)

В процессе продумывания плана моей работы возник вопрос.  А как сделать так, чтобы можно было посмотреть промежуточные результаты выполнения символьного дифференцирования?


 
Ega23 ©   (2012-04-18 18:57) [30]


> .Если можно с исходником.(благодарю)


Смеёшься? Я не храню говнокод пятнадцатилетней давности  :)


 
Ivan   (2012-04-18 21:47) [31]

Я не храню говнокод пятнадцатилетней давности  :)

Иногда говнокод  может в чём-то даже помочь)))))))))

А как насчёт промежуточных результатов дифференцирования. как тут быть?


 
Inovet ©   (2012-04-18 21:58) [32]

> [29] Ivan   (18.04.12 18:53)
> А как сделать так, чтобы можно было посмотреть промежуточные
> результаты выполнения символьного дифференцирования?

Так же как начальный и конечный - обходом дерева.


 
jack128_   (2012-04-18 22:25) [33]


> > передавай символы скобок параметрами и вызови функцию
> три раза.
>
>
> ( [ { ] ) }

Да, лажает. Ну тогда можно массив из трех элементов завести, где будет храниться порядок в котором открываются разные виды скобок.  Правда такой массив можно назвать стеком с фиксированной длинной -)


 
han_malign   (2012-04-19 09:15) [34]


> > Так стек для этой задачи и не нужен.
> Для трёх видов скобок?

- 6 - счетчиков((открытые+закрытые)*3) с обратным сканированием - O(N^2)...
Правда - то мне блазнится, что засад нет, то - что есть..., а додумывать лень, да и поработать в конце-концов надо...


 
han_malign   (2012-04-19 09:46) [35]

А, не - таки три указателя на последнюю открытую, с обратным поиском предыдущей незакрытой(только по "своей" скобке, т.к. внутренние коллизии уже обработаны).
Коллизия ловится сразу на закрывающей...
Счетчики можно добавить уже для оптимизации.


 
Ivan   (2012-04-20 10:19) [36]

благодарю всех кто давал подсказки, как подступиться к данной задаче.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2015.11.29;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.003 c
11-1259870840
Dy1
2009-12-03 23:07
2015.11.29
SubMenu


15-1428575410
картман
2015-04-09 13:30
2015.11.29
как называется


15-1419436548
Kerk
2014-12-24 18:55
2015.11.29
delphimaster.net


1-1334302310
TNK
2012-04-13 11:31
2015.11.29
Word - работа с таблицей


2-1402491436
Sakipiel
2014-06-11 16:57
2015.11.29
Фильтр ClientDataset не работает





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский