Помощь - Поиск - Пользователи - Календарь
Полная версия: Фамильное представление ДЕРЕВА
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Jill
Вобщем, есть выражение:
Код
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
virt
по каким правилам вы делали преобразование??

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

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


далее по выражению однозначно строится дерево (тк эта строка -- свернутое представление дерева). Но так красиво на паскале не получится.Нажмите для просмотра прикрепленного файла
Jill
да как же его строить-то? sad.gif

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

_______________
я не волшебник, я только учусь ;) велосипед выдумать не смогу, а исходников похожих у меня нет и найти не получается sad.gif
volvo
Jill, по-моему, ты ошибаешься:
Цитата
(C+1+4*D)/(1+A/2)
в префиксной форме будет выглядеть вот так:
Цитата
/+C+1*4D+1/A2


Теперь нужно по этой строке построить бинарное дерево (бинарное - если ты хочешь пользоваться процедурой из FAQ-а для отрисовки дерева: FAQ: Деревья (процедура PrintTreeGraph), если хочешь сделать это самостоятельно - дерево может быть не обязательно бинарным...) smile.gif
Jill
пасиба, с этим разобралась :-)

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

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

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

не пойму никак... мне бы посмотреть... sad.gif
volvo
Вот пример использования: Деревья
volvo
Сообщения были разделены в тему Проблема с подключением Graph.TPU, все дальнейшие вопросы связанные именно с подключением модулей решаем там, сюда возвращаемся только для обсуждений по теме...
volvo
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
Цитата(volvo @ 16.09.05 1:21)
А если попробовать?  ;)


volvo, пробую!!! это ж на экран должно выводиться?
не выводится ничего sad.gif
Romtek
А что происходит при запуске программы (поточнее) ?
Jill
Цитата(Romtek @ 16.09.05 11:23)
А что происходит при запуске программы (поточнее) ?


значится так: программа запускается (то бишь, в ошибки всякие не впадает), НО! возвращается к синему экрану с листингом / readln не помогает...
Romtek
Что видно при нажатии Alt - F5 ?
"Error: Graphics not initialized" ?
Jill
Цитата(Romtek @ 16.09.05 11:47)
Что видно при нажатии Alt - F5 ?
"Error: Graphics not initialized" ?



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

РЕБЯТЫ, Я ВАС ПРОСТО-ТАКИ ЛЮБЛЮ!!! СПАААААААААААСИБО!!!! ЭТО ПРОСТО СУПЕР!!! УРРРРРРРРРРААААААААА!!!
Jill
последний маааааааленький вопросик:
дописала полностью префисную строку
  s: String =
'=X/+C+1*4D+1/A2';


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

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


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