Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ol / ol / Пояснительная записка_oll.doc
Скачиваний:
32
Добавлен:
16.04.2013
Размер:
4 Мб
Скачать
        1. Алгоритм выделения отдельной ветви дерева

Задача этого алгоритма состоит в следующем. Пользователю предлагается полный список людей рассматриваемого им дерева. Из этого списка пользователь выбирает того человека, потомков которого он хочет увидеть. Потомки и линии, связывающие их с выбранным человеком, выделяются более ярким цветом.

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