Генеалогическое дерево
ЦЕНТРОСОЮЗ РОССИЙСКОЙ ФЕДЕРАЦИИ
СИБИРСКИЙ
УНИВЕРСИТЕТ ПОТРЕБИТЕЛЬСКОЙ
Кафедра прикладной информатики
Проектирование информационных систем в экономике
КУРСОВАЯ РАБОТА
Генеалогическое дерево
Выполнил:
Студент гр. 391 Пешков Е.Г.
Проверил:
Доцент Гомбоев Л. Г.
Чита 2013
Содержание
1. Постановка задачи 2
1.2. Глоссарий проекта 3
1.3. Анализ и определение требований 3
2. Проектирование программного продукта 6
2.1. Описание модели вариантов использования 6
2.1.1. Диаграмма вариантов использования 6
2.2. Описание модели анализа системы 6
2.2.1. Диаграммы деятельности 6
2.2.2. Диаграммы последовательностей и кооперации 8
2.2.3. Диаграммы состояний 9
2.2.4. Диаграмма классов 10
2.3. Описание модели реализации 12
2.3.1. Диаграмма компонентов 12
3. Процесс генерации программного кода 13
4. Описание программы 14
4.1. Общие сведения 14
4.2. Определение классов 14
5. Тестирование программы 16
Заключение 17
Список литературы 18
Приложения 19
Постановка задачи
Требуется разработать
программную систему для
Система хранит сведения о персонах (Ф.И.О., пол, дата рождения, дата смерти, биография) и о родственных связях между ними. Связи бывают только трех видов: «мужья-жены», «дети-родители» и «братья-сестры». Система обеспечивает возможность добавления данных о новых персонах и родственных связях, изменение введенных данных и удаление ненужных данных. Система следит за непротиворечивостью вводимых данных. Например, недопустимо, чтобы человек был собственным предком или потомком.
Разработанная модель должна содержать схему базы данных для хранения генеалогических деревьев.
Пользователи системы могут осуществлять поиск полезной информации по дереву:
- находить для указанного члена семьи его детей;
- находить для указанного члена семьи его родителей;
- находить для указанной персоны братьев и сестер, если таковые есть;
- получать список всех предков персоны;
- получать список всех потомков персоны;
- получать список всех родственников персоны;
- прослеживать цепочку родственных связей от одной персоны до другой (например, если Петр является шурином Ивана, то на запрос о родственных связях между Петром и Иваном выдается такой результат: «Петр - брат Ольги, Ольга - жена Ивана»).
1.2. Глоссарий проекта
- Система – программная система для поддержки генеалогических деревьев.
- Пользователь – человек, работающий с системой.
- База данных – файл во внешней памяти компьютера, хранящий таблицы данных.
1.3. Анализ и определение требований
Генеалогическое дерево состоит из персон и связей между ними. Эти списки хранятся в базе данных в виде таблиц с несколькими полями.
Поля таблицы «Персона»:
- Код персоны
- Имя
- Пол
- Дата рождения
- Дата смерти
- Биография
Поля таблицы «Связь»:
- Код связи
- Код персоны 1
- Код персоны 2
- Код вида связи
- Название связи
Целесообразно спроектировать базу данных со следующей структурой:
Необходимые функции системы:
1. Наполнение базы информацией. Должна быть предусмотрена возможность добавлять записи о новых персонах и связях, редактировать данные о персонах и удалять ненужные записи.
При создании
связи соблюдается
- участники связи не могут быть одной и той же персоной;
- между каждой парой персон нельзя создавать более одной связи;
- для создания связи «мужья – жены» участники должны иметь разный пол;
- для создания связи «мужья – жены» участники не должны состоять в такой же связи с другими персонами (т.е. у персоны не может быть несколько супругов);
- для создания связи «родители дети» первый участник (родитель) должен быть старше второго участника (ребенок).
Доступны для изменения следующие поля таблицы «Персона»: имя, дата смерти, биография.
Во избежание нарушений целостности данных доступны для удаления только те персоны, которые не состоят в связях.
2. Вывод запрошенной информации. Должна быть предусмотрена возможность получать следующие сведения о персоне:
- список детей;
- список родителей;
- список братьев и сестер;
- список всех предков;
- список всех потомков;
- список всех родственников;
Так же должна быть возможность прослеживать цепочку родственных связей между двумя персонами, то есть выходить с одной заданной персоны на другую через общих родственников.
К предкам персоны относятся родители, их родители, родители их родителей и т.д.
К потомкам персоны относятся дети, их дети, дети их детей и т.д.
К родственникам персоны относятся все персоны, прямо или косвенно связанные с ней.
База данных хранится в файле на внешнем носителе. Должна быть возможность сохранения текущей базы и загрузки ранее созданной.
2. Проектирование программного продукта
2.1. Описание модели вариантов использования
2.1.1. Диаграмма вариантов использования
Были выбраны следующие актеры и прецеденты.
Актёры:
Пользователь – человек, работающий с системой. Этот актер инициирует все прецеденты.
База данных – файл на внешнем носителе, хранящий таблицы данных. Взаимодействие с этим актером происходит при чтении и сохранении базы данных.
Прецеденты:
Наполнение базы – включает в себя процедуры добавления, редактирования и удаления записей из базы.
Запрос к базе – включает в себя процедуры обработки пользовательских запросов и вывода найденной информации.
2.2. Описание модели анализа системы
2.2.1. Диаграммы деятельности
Рассмотрим более подробно прецеденты, выделенные на предыдущем этапе.
Вариант использования «Наполнение базы»
Основные потоки событий:
1. Пользователь выбирает, какое действие выполнить.
1.1. Работа с персонами
1.1.1. Добавить персону.
1.1.1.1. Система запрашивает данные о персоне.
1.1.1.2. Пользователь вводит данные о персоне.
1.1.1.3. Система проверяет, введено ли имя.
1.1.1.4. Если
имя введено, новая запись
1.1.2. Изменить персону
1.1.2.1. Пользователь выбирает персону из списка.
1.1.2.2. Система запрашивает новые данные о персоне.
1.1.2.3. Пользователь вводит данные о персоне.
1.1.2.4. Система проверяет, введено ли имя.
1.1.2.5. Если
имя введено, изменения
1.1.3. Удалить персону.
1.1.3.1. Пользователь выбирает персону из списка.
1.1.3.2. Система проверяет, состоит ли персона в связях.
1.1.3.3. Если не состоит, запись о персоне удаляется из базы.
1.2. Работа со связями.
1.2.1. Добавить связь.
1.2.1.1. Система проверяет, имеется ли хотя бы 2 записи в таблице персон.
1.2.1.2. Если
имеется, пользователь
1.2.1.3. Система проверяет, возможна ли связь между выбранными персонами.
1.2.1.4. Если возможна, в базу добавляется новая запись.
1.2.2. Удалить связь.
1.2.2.1. Пользователь выбирает нужную связь.
1.2.2.2. Из базы удаляется запись о связи.
Альтернативные потоки событий:
1. При удалении персоны
1.1. Выводится сообщение об ошибке, и прецедент завершается.
2. При добавлении связи выясняется, что таблица персон содержит менее двух записей.
2.1. Выводится
сообщение об ошибке и
Предусловия.
1. Система
должна находиться в состоянии
«Ожидание действий от
Постусловия.
1. Система
возвращается в состояние «
Вариант использования «Запрос к базе»
Основные потоки событий:
1. Пользователь выбирает, какой запрос выполнить.
1.1. Исходными данными для запроса служит одна персона.
1.1.1. Пользователь
выбирает нужный запрос в
1.2. Исходными данными для запроса служит 2 персоны.
1.2.1. Пользователь выбирает нужных персон из списка.
2. Система выполняет поиск в базе по запросу.
3. Система отображает результат запроса.
Предусловия.
1. Система
должна находиться в состоянии
«Ожидание действий от
Постусловия.
1. Система
возвращается в состояние «
2.2.2. Диаграммы последовательностей и кооперации
Перед построением диаграмм взаимодействия были разработаны классы будущей программы на основе диаграмм прецедентов и деятельности. Затем были построены диаграммы последовательности, описывающие переход активности между классами во времени, на основании которых средствами Rational Software Architect автоматически были созданы диаграммы кооперации.
Для построения диаграмм взаимодействия были выбраны следующие объекты:
- Актер Пользователь.
- Объект класса CGenealogicalTreeView – класса вида, содержащего методы-обработчики пользовательских действий.
- Объект класса CGenealogicalTreeDoc – класса документа.
Вариант использования «Наполнение базы»
Выполняется одно из следующих действий.
1. Пользователь добавляет персону.
1.1. В базу данных
добавляется новая запись (функция CGenealogicalDoc::AddPerson())
2. Пользователь изменяет персону.
2.1. В базу
данных вносятся изменения (CGenealogicalDoc::
3. Пользователь удаляет персону.
3.1. Проверяется,
не участвует ли персона в связях (CGenealogicalDoc::
3.2. Если
не участвует, выполняется удаление записи
из базы (CGenealogicalDoc::
4. Пользователь добавляет связь.
4.1. В базу
данных добавляется новая запись (CGenealogicalDoc::
4.1.1. Если
создали связь типа «родители - дети»,
автоматически создаются связи «брат-сестра»
между новым ребенком и другими детьми
родителя, при этом выполняется функция
CGenealogicalDoc::
5. Пользователь удаляет связь.
5.1. Выполняется
удаление записи из базы (CGenealogicalDoc::
Вариант использования «Запрос к базе»
Выполняется один из следующих запросов.
1. Получить список детей персоны.
1.1. Выполняется
поиск детей и выводится результат (функция
CGenealogicalDoc::ShowChild())
2. Получить список родителей персоны.
2.1. Выполняется
поиск родителей и выводится результат
(CGenealogicalDoc::ShowParent(
3. Найти братьев и сестер персоны.
3.1. Выполняется
поиск братьев и сестер и выводится результат
(функция CGenealogicalDoc::
4. Получить список всех предков персоны.
4.1. Выполняется
поиск предков и выводится результат (CGenealogicalDoc::
4.1.1. Выполняется
рекурсивная функция поиска родителей
CGenealogicalDoc::
5. Получить список всех потомков персоны.
5.1. Выполняется
поиск потомков и выводится результат
(CGenealogicalDoc::
5.1.1. Выполняется
рекурсивная функция поиска детей CGenealogicalDoc::
6. Получить
список всех родственников
6.1. Выполняется
поиск родственников и выводится результат
(CGenealogicalDoc::
6.1.1. Выполняется
рекурсивная функция поиска ближайших
родственников CGenealogicalDoc::
7. Проследить цепочку родственных связей между персонами.
7.1. Выполняется
поиск связей и выводится результат (CGenealogicalDoc::
7.1.1. Выполняется
рекурсивная функция поиска связей CGenealogicalDoc::
2.2.3. Диаграммы состояний
Система может находиться в следующих состояниях:
- Ожидание действий от пользователя.
- Ввод данных о новой персоне.
- Изменение данных о персоне.
- Ввод данных о связи.
- Загрузка базы.
- Сохранение базы.
Поскольку выполнение запросов и поиск информации в базе системой с точки зрения пользователя выполняется мгновенно (при небольших объемах базы данных, однако на большие объемы данный проект не рассчитан), при проектировании было принято, что при выполнении запросов система не меняет состояния.
Переходы между состояниями отражены на диаграмме состояний.
2.2.4. Диаграмма классов
На диаграмме классов были размещены следующие классы:
CPersona – класс, описывающий строку в таблице «Персона».
Атрибуты:
- int id_persona; //код персоны
- CString name; //имя
- int gender; //пол
- COleDateTime birthdate; //дата рождения
- COleDateTime deathdate; //дата смерти
- CString bio; //биография
Функции:
- int GetId(); //возвращает идентификатор персоны
- CString GetName(); //возвращает имя персоны
- int GetGender(); //возвращает пол персоны
- COleDateTime GetBirthdate(); //возвращает дату рождения персоны
- COleDateTime GetDeathdate();//возвращает дату смерти персоны
- CString GetBio(); //возвращает биографию персоны
CRelationship – класс, описывающий строку в таблице «Связь».
Атрибуты:
- int id_relationship; //идентификат
ор связи - int pers1; //идентификатор первой персоны
- int pers2; //идентификатор второй персоны
- int variety; //идентификатор типа связи
- CString variety_name; //название типа связи
Функции:
- int GetId(); //возвращает идентификатор связи
- int GetPers1(); //возвращает идентификатор первой персоны
- int GetPers2(); //возвращает идентификатор второй персоны
- int GetVarietyNumb(); //возвращает идентификатор типа связи
- CString GetVariety(); //возвращает название типа связи
Поскольку используется MFC-приложение с архитектурой «Документ-вид», в диаграмму классов были добавлены классы CGenealogicalTreeDoc и CGenealogicalTreeView.
CGenealogicalTreeDoc – класс документа.
Атрибуты:
//таблица персон
- CTypedPtrArray<CObArray,
CPersona*> PersonaTable();
//таблица связей
- CTypedPtrArray<CObArray,CRelat
ionship*> RelationshipTable();
Функции:
- void AddPerson(); //добавить персону в базу
- void AddRelationship(); //добавить связь в базу
- void ChangePerson(); //отредактиров
ать персону
//проверить возможность создания связи между указанными //персонами
- bool CheckCorrectRelationship();
//проверить, есть ли связи между указанными персонами
- bool CheckRelationshipExist();
- void DeletePersona(); //удалить персону из базы
- void DeleteRelationship(); //удалит
ь связь из базы - void FindAllAncestors(); //рекурсивная функция поиска родителей
- void FindAllDescendants(); //рекурсивная функция поиска детей
//рекурсивная функция поиска ближайших родственников
- void FindAllRelatives();
- void FindRelationship(); //рекурсив
ная функция поиска связей - void ShowAncestor(); //функция поиска предков
- void ShowBrotherSister(); //функция поиска братьев и сестер
- void ShowChild(); //функция поиска детей
- void ShowDescendant(); //функция поиска потомков
- vod ShowParent(); //функция поиска родителей
- void ShowRelative(); //функция поиска родственников
//функция прослеживания связи между персонами
- void TraceRelationship();
Атрибуты и функции класса CGenealogicalTreeView в проекте не рассмотрены, т.к. это класс, обеспечивающий ввод-вывод данных пользователем, который не несет реализации алгоритмов функционирования системы. По этой же причине опущены прочие классы реальной программы и нкоторые атрибуты и функции выше описанных классов.
2.3. Описание модели реализации
2.3.1. Диаграмма компонентов
На диаграмме компонентов
Компонент |
Описанный класс |
Persona.h/cpp |
CPersona |
Relationship.h/cpp |
CRelationship |
GenealogicalTreeDoc.h/cpp |
CGenealogicalTreeDoc |
GenealogicalTreeView.h/cpp |
CGenealogicalTreeView |
MFC |
Библиотека MFC, подключенная к проекту |
3. Процесс генерации программного кода
Была выполнена генерация кода программы с помощью IBM Rational Software Architect по инструкции по кодогенерации UML модели в C++.
В результате были получены *.h и *.cpp файлы для следующих классов из модели проектирования: CPersona, CRelationship, CGenealogicalTreeDoc, CGenealogicalTreeView. Сгенерированный код не был использован при написании программы.
4. Описание программы
4.1. Общие сведения
В качестве языка реализации проекта был выбран C++, среда разработки – Microsoft Visual Studio 2008. Для удобства и облегчения разработки была использована библиотека MFC. Архитектура приложения – «Документ-вид».
Условно
структуру программы можно
- Интерфейсная часть. В ней реализован обмен информацией между системой и пользователем, ввод и вывод данных. Представлена классом вида CGenealogicalTreeView и несколькими классами диалоговых окон, не включенными в описание проекта.
- Функциональная часть. В ней реализована логика работы системы и хранение данных. Представлена классом документа CGenealogicalTreeDoc и классами, описывающими персону (CPersona) и связь (CRelationship).
4.2. Определение классов
Помимо классов, описанных в модели анализа UML-проекта, написанная программа содержит следующие классы:
persondlgClass – класс диалогового окна для ввода данных о новой персоне и редактирования данных об уже существующей персоне.
relationshipdlgClass – класс диалогового окна для ввода данных о новой связи.
CGenealogicalTreeApp – класс приложения.
CMainFrame – класс главного окна-рамки.
CAboutDlg –
класс диалогового окна о
4.3. Определение структур хранения данных
Таблицы
с данными реализованы
class CGenealogicalTreeDoc : public CDocument
{
// …
public:
//коллекция персон
CTypedPtrArray<CObArray,
//коллекция связей
CTypedPtrArray<CObArray,
// …
}
Для сохранения данных в файл на внешнем носителе использован механизм сериализации. Для поддержки этого механизма классы CPersona и CRelationship наследованы от MFC-класса CObject и в них переопределен метод Serialize().
5. Тестирование программы
По итогам статистического тестирования программа работает корректно и адекватно реагирует на действия пользователя, выдавая верные результаты запросов. В качестве эталонной базы данных использовалась база с генеалогическим деревом следующей структуры:
Заключение
В ходе выполнения курсового проекта была разработана модель в Rational Software Architect, ставшая основой для написания программы в среде Microsoft Visual Studio 2008 на языке C++.
Проект не отвечает признаку успешного проекта «написан в срок». Конечная система реализует все заданные заказчиком требования.
Реализованная
программа может иметь
Дальнейшее развитие системы может включать в себя расширение сроков существования рода (существующее ограничение – 14.09.1752 – 31.12.9999), более строгую проверку непротиворечивости создаваемых связей, улучшение алгоритмов поиска информации в базе данных, добавление графической визуализации деревьев.
Список литературы
1. Вендров А.М., Малышко В.В. Объектно-ориентированный анализ и проектирование с использованием языка UML. М.: Издательский отдел факультета ВМиК МГУ, 2002
2. Леоненков
А.В. Самоучитель UML 2. БХВ-Петербург, 2007
г.
Приложения
Приложение
1. Диаграмма вариантов использования.
Приложение 2. Диаграмма деятельности для прецедента «Наполнение базы»
Приложение 3. Диаграмма деятельности для прецедента «Запрос к базе»
Приложение 4. Диаграмма кооперации для прецедента «Наполнение базы»
Приложение 5. Диаграмма кооперации для прецедента «Запрос к базе»
Приложение 6. Диаграмма последовательности для прецедента «Наполнение базы»
Приложение 7. Диаграмма последовательности для прецедента «Запрос к базе»
Приложение 8. Диаграмма состояний системы
Приложение 9. Диаграмма классов.
Приложение 10. Диаграмма компонентов.
Приложение
11. Руководство пользователя.
При запуске приложения на экране отобразится главное окно программы.
Главное окно состоит из следующих областей:
- Список персон, входящих в генеалогическое дерево.
- Список связей между персонами.
- Панель элементов управления для запроса о прослеживании родственных связей.
- Поле вывода результатов запроса.
- Главное меню программы.
Для начала работы с деревьями надо или загрузить ранее сохраненную базу данных (меню «Файл» → «Загрузить», в открывшемся диалоговом окне выбрать файл базы с расширением «.gt»), или создать новое дерево вручную.
Чтобы создать генеалогическое дерево, необходимо сначала внести в список персон всех людей-членов родословной. Добавить новую персону можно либо через главное меню («Правка» → «Добавить персону»), либо через контекстное меню списка персон. Затем в появившемся окне нужно заполнить данные о персоне и нажать кнопку «ОК». Добавлять персоны можно в произвольном порядке.
Если в списке персон числится хотя бы две персоны, между ними можно создать родственную связь. Добавить новую связь можно либо через главное меню («Правка» → «Добавить связь»), либо через контекстное меню списка связей. Затем нужно ввести данные о связи и нажать кнопку «ОК». Добавлять связи можно так же в произвольном порядке.
Записи о персонах можно редактировать. Окно редактирования вызывается двойным щелчком мыши по выбранной из списка персоне.
Также записи о персонах и связях можно удалять из базы. Для удаления персоны нужно выбрать пункт контекстного меню «Удалить». Для удаления связи нужно выполнить двойной щелчок по нужной связи. Персоны, состоящие в связях, удалению не подлежат.
Когда база наполнена, можно выполнять запросы на поиск тех или иных данных о персонах. Все запросы, кроме одного, вызываются из контекстного меню списка персон. Запрос о прослеживании цепочки родственных связей между двумя персонами вызывается кнопкой «Проследить связь» в главном окне программы, при этом в выпадающих списках необходимо выбрать обе персоны, связь между которыми нужно найти. Результат выполнения запроса выводится в поле вывода результатов запроса.
Если дерево создавалось с нуля или редактировалось, можно сохранить изменения в базе. Диалог сохранения базы вызывается либо из меню «Файл» → «Сохранить», либо нажатием сочетания клавиш CTRL+S.
Для завершения работы с программой следует выбрать пункт «Выход» в меню «Файл».
Приложение 12. Руководство программиста.
Проект содержит следующие файлы:
- Папка Workspace – рабочее пространство IBM Rational Software Architect с UML-проектом.
- Папка GenealogicalTree – проект Visual Studio 2008, исходные коды программы.
Папка GenealogicalTree содержит:
Файлы определения и реализации классов программы:

- Генеалогическое древо
- Генеалогическое древо
- Генеалогія роду Нарбут
- Генеза молодіжного руху в Україні
- Генезис валютной политики Республики Беларусь
- Генезис государства и права: общие закономерности и особенности возникновения права
- Генезис детской беспризорности и безнадзорности
- Гендерный фактор в теории и практике коммуникации и механизм его действия в коммуникативном процессе
- Гендерным исследованиям в России - десять лет
- Гендер социологиясы
- Гендетная идентичность
- Гендорные особенности в воспитание ребенка
- Генеалогическая классификация языков
- Генеалогическая классификация языков. Индоевропейские языки. Романская группа (Румынский язык)