- •Государственный комитет рф по высшему образованию
- •2002 Г. Содержание дипломного проекта:
- •1. Специальная часть. Разработка программного обеспечения «Хроника моего рода».
- •2. Технологическая часть. Технология разработки программных систем.
- •3. Организационно-экономическая часть. Расчет затрат на разработку программного продукта.
- •4. Производственно-экологическая часть. Анализ воздействия вредных факторов на оператора эвм.
- •Введение.
- •1.1 Техническое задание
- •1.2 Эскизный проект
- •1.2.1 Постановка задачи
- •1.2.1.1 Назначение системы
- •1.2.1.2 Общая структура системы
- •1.2.1.3 Требования к программному обеспечению комплекса
- •1.2.1.4 Требования к составным частям программного комплекса
- •1.2.2 Обзор аналогичных программных продуктов, имеющихся на рынке
- •1.2.3 Выбор языка программирования
- •1.3. Технический проект
- •1.3.3 Проектирование создания дерева и способов работы с ним
- •1.3.3.1 Методика построения генеалогического дерева
- •Pис.1.3.3.3 Схема алгоритма рекурсивной процедуры Potomok(Id, pos).
- •Рабочий проект
- •1.4.1 Общий вид программного продукта
- •Инсталляция программного комплекса
- •1.4.3 Защита программного продукта
- •1.4.4 Разработка программы
- •Тестирование надежности программного продукта
- •1.4.6 Зависимость размера файлов родословных и машинного времени построения генеалогического дерева от количества персон.
- •1.5 Выводы
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.3.3.4 и осуществляется модулем программы Combine.pas.
Рассмотрю сам алгоритм.
На начальном этапе дерево, с которым мы работаем, находится в массиве PersonAr. В массивPersonAr1считываем дерево, с которым будем объединять. Сравниваем два массива на предмет общих людей. Присваиваем флажкуIdединичку, если общие люди есть. Затем делаем проверку на этот флажок, если не единица, то показываем формуfmSugestс предупреждением «В деревьях нет общих людей». Затем предлагается выбрать другое для объединения дерево или выйти из задачи объединения.
Общие люди в двух деревьях есть: дополняем массив PersonArмассивомPersonAr1, т.е. вторая половина массиваPersonAr это массивPersonAr1.При записи меняем идентификаторы на соответствующие в массивеPersonAr. Получается, что в массиве два одинаковых элемента – в первой и второй половинах массива. В первой половине массива меняем ссылки общего человека на новые, те которые есть у этого человека во второй половине массива. Запись человека, который находится во второй половине массива, обнуляем. Все готово, чтобы начать рисование дерева.
нет да
Рис.1.3.3.4 Схема алгоритма объединения деревьев