![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Символьное дифференцирование [D7]
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;