Форум: "Основная";
Текущий архив: 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