LINUX.ORG.RU

Дифференцирование функций на паскале


0

0

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

На скрине вы видете редактор GNU/Emacs версии 22.0.50.1 (к сожалению, кроме убогого pascal-mode никаких инструментов для паскаля в нем нет. К счастью, gdb и gud теперь поддерживают отладку паскалевского кода в полном обьеме). В нем можете лицезреть код, который дифференцирует произведение и частное. Если у кого-то есть предложения о том, как бы код упростить -- буду рад выслушать.

Все это запущено в kde-3.4 под xorg-x11-6.8.2 в gentoo linux.

ЗЫ. Емакс собран без gtk для улучшения быстродействия.

>>> Просмотр (1024x768, 66 Kb)



Проверено: Shaman007 ()

такие вещи либо на лиспе по старинке либо питоном как это сегодня делают
паскаль увы ...

vm ★★
()
Ответ на: комментарий от nsav

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

function SymDiff (sexp : PSExpression ): PSExpression;
...
var
...
begin
   case sexp^.type of 

     Atom : 
         case sexp^.AtomType of 
           Number : SymDiff:=MakeZero;

           Identifier : if sexp^.Atom = X then
                          SymDiff:=MakeOne;
                        else 
                          SymDiff:=MakeZero;
         end;
   
    Form : 
         case sexp^.Form.Func of 
           
           Plus :           SymDiff:=Make(Plus,SymDiff(Arg(1,sexp)),SymDiff(Arg(2,sexp)));
           Minus:
                 ...  


         end;
    end;
    ....
    Тут можно удалить не нужную вершину исходного секспа
     
end;

...

function MakeZero : PSExpression;
...
begin
...

 New(atom);
 InitAtom(atom,......);
 MakeZero:=sexp; 
...  
end;

Примерно так. 

Язык программирования играет во многом ту же роль что и обычный язык. И писать на нем надо _понятно_, а не как курица левою ногой после похмелья!
   

ukez
()
Ответ на: комментарий от ukez

Кстати, если использовать реализацию с использованием объектныхъ фишек того же TP или Delphi, которые идеально ложится на структуру секспов, код будет выглядеть как картинка. По нему можно будет еще не одно поколение студентов учить.

ukez
()
Ответ на: комментарий от ukez

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

Но принципиально иного ты так и не предложил. Тоже дерьмо, только в красивой обертке.

ЗЫ. ИМХО, вводить перечисляемый тип "функция формы" не лучшее решение. Так мы, например, теряем возможность использовать пользовательские названия функций.

ЗЫЫ. Почему в кейсе можно только переменную перечисляемого типа использовать? Как это объясняется с педадогической точки зрения?

nsav
() автор топика
Ответ на: комментарий от nsav

> Но принципиально иного ты так и не предложил. Тоже дерьмо, только в красивой обертке.

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

Не хуже чем в том же Си.

> ЗЫ. ИМХО, вводить перечисляемый тип "функция формы" не лучшее решение. Так мы, например, теряем возможность использовать пользовательские названия функций.

Тонкости реализации. На самом деле тут надо делать через хеш-таблицу символов.

ukez
()
Ответ на: комментарий от nsav

>Там есть что улучшить, но мне лень код перелопачивать. Сдам да забуду, все равно курсач по сути своей халтура

Это у тебя преподы лояльные =)
а вот я когда сдавал курсач на том же паскале, то за структурирование оч как драли.
Да и правильно, лучше ты сейчас перелопатишь свой код, а потом еще раз  20, потом будешь писать..

правильно тут сказал ukez, и я продолжу. Язык программирования - это язык, на котором ты "общаешься" с железом. И не важно какое у него название А, В, С, паскаль или там еще что... В принципе, железу пофиг на то как ты будешь писать
while ... do begin case .... of 1: begin ... end; 2: begin...end end;

или нормально структурированно, как показал ukez

тут дело в другом: надо писать так, чтобы любой другой прогер понял что ты хочешь. Иначе бы в книгах не делали абзацев и пробелов (как, кстати, писали на берестах раньше). 

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

toreo
()
Ответ на: комментарий от toreo

извините, криворукий я =)

>Там есть что улучшить, но мне лень код перелопачивать. Сдам да забуду, все равно курсач по сути своей халтура

Это у тебя преподы лояльные =) а вот я когда сдавал курсач на том же паскале, то за структурирование оч как драли. Да и правильно, лучше ты сейчас перелопатишь свой код, а потом еще раз 20, потом будешь писать..

правильно тут сказал ukez, и я продолжу. Язык программирования - это язык, на котором ты "общаешься" с железом. И не важно какое у него название А, В, С, паскаль или там еще что... В принципе, железу пофиг на то как ты будешь писать while ... do begin case .... of 1: begin ... end; 2: begin...end end;

или нормально структурированно, как показал ukez

тут дело в другом: надо писать так, чтобы любой другой прогер понял что ты хочешь. Иначе бы в книгах не делали абзацев и пробелов (как, кстати, писали на берестах раньше).

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

toreo
()
Ответ на: комментарий от toreo

Всё, несу завтра свои коды на бересте преподу, скажу, мол, комп. загнулся =)

Kbps
()

Настоящий программист не ставит комментариев? :)

anonymous
()
Ответ на: комментарий от toreo

Со всем согласен, но повторюсь, что кроме препода никто этот код не увидит, и я в том числе (после сдачи, разумеется).

nsav
() автор топика
Ответ на: комментарий от toreo

> правильно тут сказал ukez, и я продолжу. Язык программирования - это язык, на котором ты "общаешься" с железом. И не важно какое у него название А, В, С, паскаль или там еще что... В принципе, железу пофиг на то как ты будешь писать while ... do begin case .... of 1: begin ... end; 2: begin...end end;

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

nsav
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.