Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ИПОВС (2002) / ol / ol / Пояснительная записка_oll.doc
Скачиваний:
36
Добавлен:
16.04.2013
Размер:
3.64 Mб
Скачать

Pис.1.3.3.3 Схема алгоритма рекурсивной процедуры Potomok(Id, pos).

Данный алгоритм показан на рис. 1.3.3.3 и осуществляется модулем программы SelFam.pasи процедуройDrawBranch, находящейся в модулеPr1.pas. В общем алгоритме программы переход к рассматриваемому алгоритму происходит после просмотра генеалогического дерева.

Суть работы алгоритма:

Выбираем из предложенного списка нужного человека и запоминаем его идентификационный номер Id. Присваиваем идентификаторуIdbranchзначениеtrue. Этот идентификатор будет показывать, что надо рисовать выделенную ветвь при отображении дерева. ПроцедураPotomok(Id,pos)вызывается рекурсивно, ее цель сформировать массивMas,в котором будут находиться только те, кто является потомком выбранного человека. На первое место массиваMasзаносится тот самый выбранный человек. В качестве входных параметров в процедуреPotomok(Id,pos)номерId– тот, чьих потомков ищем,Pos– индекс в массивеMas – место, куда записывается очередной найденный потомок.

Если у человека нет детей и сестер/братьев, то выходим из алгоритма.

Если есть сестры/братья, то проверяем одни ли у них родители. Родители одни – записываем найденного человека в массив Mas. После этого вызываем рекурсивно процедуруPotomok(Id,pos)уже для найденного человека. Так будет продолжаться, пока у найденных сестер/братьев будут находиться дети или их сестры /братья. Если таковых нет, то в массив заносится ребенок выбранного нами человека и вызывается процедура уже для него. Таким образом, в массивеMasокажутся все потомки выбранного пользователем человека. Можно рисовать. Но в рисовании есть тоже некоторые особенности, которые выполняет процедураDrawBranch.

Процедура DrawBranchвызывается при рисовании дерева, если идентификаторIdbranch равенtrue. В этой процедуре почти так же, как и вDrawTreeучитываются все особенности линий-связей. Все элементы массиваMas рисуются цветом, отличным от цвета всего дерева.

Так как в рассмотренном алгоритме основную функцию выполняет рекурсивно вызываемая процедура Potomok(Id,pos), то на рисунке 3.9 приведена схема алгоритма этой процедуры.

        1. Алгоритм объединения деревьев.

Задача алгоритма заключается в объединении того дерева, с которым пользователь в данный момент работает с деревом, которое пользователь выберет из предложенного списка. Объединяются только те деревья, в которых есть общие люди. То есть если две персоны поженились и у них есть свои родословные, то их можно объединить.

Данный алгоритм показан на рис. 1.3.3.4 и осуществляется модулем программы Combine.pas.

Рассмотрю сам алгоритм.

На начальном этапе дерево, с которым мы работаем, находится в массиве PersonAr. В массивPersonAr1считываем дерево, с которым будем объединять. Сравниваем два массива на предмет общих людей. Присваиваем флажкуIdединичку, если общие люди есть. Затем делаем проверку на этот флажок, если не единица, то показываем формуfmSugestс предупреждением «В деревьях нет общих людей». Затем предлагается выбрать другое для объединения дерево или выйти из задачи объединения.

Общие люди в двух деревьях есть: дополняем массив PersonArмассивомPersonAr1, т.е. вторая половина массиваPersonAr это массивPersonAr1.При записи меняем идентификаторы на соответствующие в массивеPersonAr. Получается, что в массиве два одинаковых элемента – в первой и второй половинах массива. В первой половине массива меняем ссылки общего человека на новые, те которые есть у этого человека во второй половине массива. Запись человека, который находится во второй половине массива, обнуляем. Все готово, чтобы начать рисование дерева.

нет

да

Рис.1.3.3.4 Схема алгоритма объединения деревьев

Соседние файлы в папке ol