Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Фамильное представление ДЕРЕВА

Автор: Jill 15.09.2005 15:56

Вобщем, есть выражение:

Код
X = (C+1+4*D)/(1+A/2)
. Его надо представить в виде префиксной записи. Если не ошибаюсь это выглядит так:
Код
= X / + + C 1 * 1 / 4 D A 2
(ужас какой!!!)
А главное - нарисовать в виде фамильного дерева:
Код
 =

X                           /

        +                                        +

C       1         *                     1                /
                                                             
               4        D                            A         2  


*)прикреплю файл с нормальным изображением - тут понятно плохо

Я СОВСЕМ не понимаю КАК, вводя выражение (вот ту самую префиксную запись), вывести на экран графическое представление дерева!!! Помогите, плз!!! Я просто не представляю как это сделать и тихо впадаю в панику... sad.gif


Прикрепленные файлы
Прикрепленный файл  tree.doc ( 24 килобайт ) Кол-во скачиваний: 409

Автор: virt 15.09.2005 16:32

по каким правилам вы делали преобразование??

и куда потеряли третий плюс??

Код
= X / + C + 1 * 4 D + 1 / A 2


далее по выражению однозначно строится дерево (тк эта строка -- свернутое представление дерева). Но так красиво на паскале не получится.Прикрепленное изображение

Автор: Jill 15.09.2005 16:42

да как же его строить-то? sad.gif

ну не клацает у меня в голове! не клацает!!!
не могу понять - для элементов выражения надо зараннее забивать положение (корень-узел-лист), либо есть способ просто ввести выражение и получить графическое представление по заданным параметрам???

_______________
я не волшебник, я только учусь ;) велосипед выдумать не смогу, а исходников похожих у меня нет и найти не получается sad.gif

Автор: volvo 15.09.2005 16:48

Jill, по-моему, ты ошибаешься:

Цитата
(C+1+4*D)/(1+A/2)
в префиксной форме будет выглядеть вот так:
Цитата
/+C+1*4D+1/A2


Теперь нужно по этой строке построить бинарное дерево (бинарное - если ты хочешь пользоваться процедурой из FAQ-а для отрисовки дерева: http://forum.pascal.net.ru/index.php?showtopic=2706&view=findpost&p=28334, если хочешь сделать это самостоятельно - дерево может быть не обязательно бинарным...) smile.gif

Автор: Jill 15.09.2005 16:51

пасиба, с этим разобралась :-)

_____________
это моя первая задача....по деревьям...сложно пока
и примеров подобных нет sad.gif

Автор: Jill 15.09.2005 18:03

офф...

подскажите, плз, каким макаром запустить пример в факе? при попытке запуска uses TreeUnit пишет "не найден TreeUnit.TPU"
TreeUnit.PAS в той же папке

что куда размещать?

не пойму никак... мне бы посмотреть... sad.gif

Автор: volvo 15.09.2005 18:13

Вот пример использования: http://forum.pascal.net.ru/index.php?showtopic=6129&view=findpost&p=46185

Автор: volvo 15.09.2005 20:02

Сообщения были разделены в тему http://forum.pascal.net.ru/index.php?showtopic=6212&view=findpost&p=46613, все дальнейшие вопросы связанные именно с подключением модулей решаем там, сюда возвращаемся только для обсуждений по теме...

Автор: volvo 16.09.2005 5:21

Jill, попробуй вот это (процедура Build строит дерево из префиксной строки, пока строка для простоты задана константой, можно вводить ее непосредственно в программе... Не забудь добавить реализацию PrintTreeGraph из FAQ):

Uses Crt, Graph;

Type
TType = Char;
PTTree = ^TTree;
TTree = Record
Data: TType;
Left, Right: PTTree;
End;

Procedure PrintTreeGraph(root: PTTree);
{
!!! Здесь - реализация процедуры PrintTreeGraph !!!
}

var
global_root: pttree;

Procedure Build(Var root: PTTree;
Expr: String; Var Shift: Integer);
Begin
New(root);
Root^.Data := Expr[Shift];
Root^.Left := nil;
Root^.Right := nil;
If (Expr[Shift] in ['+','*','-','/']) Then Begin
Inc(Shift);
Build(Root^.Left, Expr, Shift);
Build(Root^.Right, Expr, Shift);
End
Else Inc(Shift)
End;

Const
i: integer = 1;
s: String =
'/+C+1*4D+1/A2';

Var
grDriver: integer;
grMode: integer;
ErrCode: Integer;

begin
global_root := nil;
Build(global_root, s, i);

grDriver := Detect;
InitGraph(grDriver, grMode,'');
ErrCode := GraphResult;
if ErrCode <> grOk then begin
Writeln('Graphics error:', GraphErrorMsg(ErrCode)); Halt(100);
end;
PrintTreeGraph(global_root);
readln;
CloseGraph;
end.


Цитата(virt @ 15.09.05 12:32)
Но так красиво на паскале не получится
А если попробовать? ;)

Автор: Jill 16.09.2005 14:47

Цитата(volvo @ 16.09.05 1:21)
А если попробовать?  ;)


volvo, пробую!!! это ж на экран должно выводиться?
не выводится ничего sad.gif

Автор: Romtek 16.09.2005 15:23

А что происходит при запуске программы (поточнее) ?

Автор: Jill 16.09.2005 15:29

Цитата(Romtek @ 16.09.05 11:23)
А что происходит при запуске программы (поточнее) ?


значится так: программа запускается (то бишь, в ошибки всякие не впадает), НО! возвращается к синему экрану с листингом / readln не помогает...

Автор: Romtek 16.09.2005 15:47

Что видно при нажатии Alt - F5 ?
"Error: Graphics not initialized" ?

Автор: Jill 16.09.2005 15:52

Цитата(Romtek @ 16.09.05 11:47)
Что видно при нажатии Alt - F5 ?
"Error: Graphics not initialized" ?



ууууууес! закинула EGAVGA.BGI в рабочую папку...........ииииииииииии.......

РЕБЯТЫ, Я ВАС ПРОСТО-ТАКИ ЛЮБЛЮ!!! СПАААААААААААСИБО!!!! ЭТО ПРОСТО СУПЕР!!! УРРРРРРРРРРААААААААА!!!

Автор: Jill 16.09.2005 16:46

последний маааааааленький вопросик:
дописала полностью префисную строку

  s: String =
'=X/+C+1*4D+1/A2';


изображение символов 4 D немного накладывается
с остальными - все ок
где это подправить можно?

Автор: volvo 16.09.2005 16:59

Jill, к сожалению, это пока не исправляется... sad.gif Чем больше "глубина" дерева, тем меньше места для рисования остается на каждом последующем уровне. А ты сразу "отобрала" половину экрана для никому не нужной ветви "X=". Я не думаю, что это тоже должно включаться в дерево, т.к. обычно дерево строится по выражению, которое необходимо вычислить (т.е. по выражению справа от знака равенства...)

Но в любом случае, для исправления "наложения" придется переписывать процедуру полностью...

Автор: Jill 16.09.2005 17:03

Цитата(volvo @ 16.09.05 12:59)
Я не думаю, что это тоже должно включаться в дерево, т.к. обычно дерево строится по выражению, которое необходимо вычислить (т.е. по выражению справа от знака равенства...)


ок, значит так и надо smile.gif спасибо большое - очень красиво получается smile.gif и не нуже совсем там этот Х!!! ;)