Автор: Пользователь скрыл имя, 23 Декабря 2012 в 23:41, курсовая работа
Целью создания программного продукта данной курсовой работы является изучение структуры данных B+ - дерево.
В данной курсовой работе реализуется программный комплекс "Информационно-поисковая система банка на основе B+-дерева".
Основания для разработки
Данный программный продукт разрабатывается как задание на курсовую работу по дисциплине "Структуры и алгоритмы обработки данных".
1 ТЕХНИЧЕСКОЕ ЗАДАНИЕ 5
1.1 Введение 5
1.2 Основания для разработки 6
1.3 Назначение разработки 6
1.3.1 Функциональное и эксплуатационное назначение изделия 6
1.3.2 Перечень требований пользователя к программному продукту 6
1.3.3 Рассмотренные альтернативы 6
1.4 Требования к программе или программному изделию 7
1.4.1 Стандарты 7
1.4.2 Требования к составу и параметрам технических средств 7
1.4.3 Требования к информационной и программной совместимости 7
1.4.4 Требования к функциональным характеристикам 8
1.4.5 Результирующие компоненты изделия 8
1.4.6 Носители информации 8
1.4.7 Безопасность и секретность 8
1.4.8 Удобства эксплуатации 8
1.4.9 Мобильность 9
1.5 Требования к программной документации 9
1.6 Стадии и этапы разработки 9
1.7 Порядок контроля и приемки 10
2 ТЕХНИЧЕСКИЙ ПРОЕКТ 11
2.1 Анализ области 11
2.2 Структура программы 11
2.2.1 Класс TFormMain 11
2.2.2 Класс CBTree 12
2.2.3 Методические ограничения 13
2.2.4 Аппаратные ограничения 13
3 РАБОЧИЙ ПРОЕКТ 14
3.1 Введение 14
3.2 Назначение разработки 14
3.3 Требования к программе или программному изделию 14
3.3.1 Стандарты 14
3.3.2 Требования к составу и параметрам технических средств 14
3.3.3 Требования к информационной и программной совместимости 15
3.3.4 Результирующие компоненты изделия 15
3.3.5 Безопасность и секретность 15
3.3.6 Рестарт 15
3.4 Описание модулей Form.h и Form.cpp 16
3.4.1 Диаграммы классов 16
3.4.2 Описание структуры Bus 17
3.4.3 Описание класса TFormMain 17
3.4.4 Описание констант и макроопределений 17
3.4.5 Описание подпрограмм 18
3.5 Описание модуля Bstar.h 22
3.5.1 Диаграммы классов 22
3.5.2 Описание структуры CBTree<Data,T>::Node 23
3.5.3 Описание класса template <class Data, short T=2> class CBTree 23
3.5.4 Описание констант и макроопределений 24
3.5.5 Описание подпрограмм 24
3.6 Тестирование 34
3.6.1 Цель испытаний 34
3.6.2 Тесты 34
Список использованных источников 41
Приложение А. 42
Приложение Б 54
Программное изделие выполнено согласно стандартам, указанным в техническом задании в пункте 1.4.1.
Программное изделие работает на компьютере под управлением операционной системы Windows XP. Рекомендуемый объем оперативной памяти – 1024 Мбайт или более.
Программное изделие написано на языке C++ в среде разработки C++ Builder 6 и работает под управлением операционной системы Windows XP.
Согласно пункту 1.4.6. технического задания все файлы программы предоставляются на компакт-диске.
Данный программный продукт не является секретным и не требует защиты, поэтому ограничения доступа к нему не предусматриваются.
В случае, когда программа по внешним причинам перестает отвечать на запросы пользователя, необходимо нажать комбинацию клавиш «CTRL+ALT+DEL» и средствами операционной системы прервать программу.
Рисунок 3.1
В структуре имеется 4 поля: номер счета, ФИО, сумма вклада, длительность (мес - %). В структуру также входят конструктор по умолчанию, конструктор копирования и конструктор с инициализирующими значениями.
Класс TFormMain – основа для графической части данного программного продукта. На рис. 3.1 представлены все члены класса. Переменные X0,Y0 указывают смещение левого верхнего угла компоненты PaintBox, нужны для прокрутки вверх-вниз. Переменные X_max и Y_max задают границы рабочей области. X_Selected и Y_Selected – координаты выделенного ключа. Count – количество ключей в дереве. Selected – флаг, сигнализирующий о том, что имеется выделенный ключ. Changed – флаг, определяющий необходимость перестраивания дерева.
В модулях Form.h и Form.cpp описываются следующие константы:
Подпрограмма TFormMain::TFormMain(
Входные данные: по умолчанию.
Выходные данные: нет.
Процессы обработки: инициализация переменных, вызов функции чтения данных из файла.
Подпрограмма void TFormMain::ReadFromFile(char* filename)
Входные данные: полный путь к файлу
Выходные данные: данные из файла.
Процессы обработки: чтение данных из файла и добавление их в дерево.
Подпрограмма void __fastcall TFormMain::BtnAddClick(TObject *Sender)
Входные данные: по умолчанию.
Выходные данные: нет.
Процессы обработки: чтение данных из компонент, расположенных в графическом интерфейсе и добавление их в дерево.
Подпрограмма void __fastcall TFormMain::BtnDeleteClick(
Входные данные: по умолчанию.
Выходные данные: нет.
Процессы обработки: чтение значения ключа из компоненты и удаление из дерева.
Подпрограмма void __fastcall TFormMain::BtnSearchClick(
Входные данные: по умолчанию.
Выходные данные: нет.
Процессы обработки: чтение значения ключа из компоненты и поиск записи в дереве.
Подпрограмма void __fastcall TFormMain::BtnSearchClick(
Входные данные: по умолчанию.
Выходные данные: нет.
Процессы обработки: чтение значения ключа из компоненты и поиск записи в дереве.
Подпрограмма void __fastcall TFormMain::PaintBoxPaint(
Входные данные: дерево.
Выходные данные: прорисованное в компоненте дерево.
Процессы обработки: рассчитывает при необходимости параметры узлов дерева и запускает функцию рисования дерева.
Подпрограмма void TFormMain::DrawTree(CB_PLUS_
Входные данные: указатель на текущий узел.
Выходные данные: рисование дерева.
Процессы обработки: осуществляется рекурсивный обход дерева, в ходе которого для каждого узла запускается функция отрисовки.
Подпрограмма void TFormMain::DrawNode(CB_PLUS_
Входные данные: указатель на текущий узел.
Выходные данные: рисование узла.
Процессы обработки: отрисовка узла дерева с учетом флага selected.
Подпрограмма void __fastcall TFormMain::PaintBoxMouseDown(
Входные данные: дерево.
Выходные данные: запись, хранящаяся в выделенном узле.
Процессы обработки: определение факта попадания курсора мыши внутрь какого-либо ключа, вывод сведений об этой записи в компоненты.
Подпрограмма void TFormMain::FindKey(CB_PLUS_
Входные данные: указатель на текущий узел, координаты ключа.
Выходные данные: data – найденная запись.
Процессы обработки: поиск записи по координатам ключа в ходе рекурсивного неполного обхода дерева.
Подпрограммы void __fastcall TFormMain::ScrollBarHorScroll(
Входные данные: по умолчанию.
Выходные данные: нет.
Процессы обработки: смещение начала координат при прокрутке.
Текст подпрограмм
См. Приложение А.
Рисунок 3.2
Структура описана внутри класса-шаблона CBTree, в нее входят следующие переменные:
В структуре присутствует 4 различных конструктора и деструктор.
Класс CBTree является шаблонным, Data определяет данные, которые будут содержаться в записи, в классе Data обязательно наличие поля int key и конструктора копирования. В классе содержится переменная: Node* root – корень.
В модуле BTree.h описывается перечисляемый тип RESULT со следующими значениями:
Подпрограмма Node::Node(Data data, Node* p, short i, bool l)
Входные данные: запись, указатель на предшествующий узел, индекс (номер узла в списке детей), признак листа.
Выходные данные: нет.
Процессы обработки: конструктор, создающий объект типа Node с единственной записью data, родителем p, индексом I и признаком листа leaf.
Подпрограмма Node:: Node(Data* data, Node** ptrs, short start, short count, Node* p, short ind, bool l)
Входные данные: массив записей, массив указателей, начальная позиция, количество записей в узле, указатель на предшествующий узел, индекс, признак листа.
Выходные данные: нет.
Процессы обработки: конструктор создает объект типа Node с count записями и count+1 указателями, взятыми из массивов data и ptrs. Инициализирует значения полей KeysCount, parent, index, IsLeaf.
Подпрограмма Node:: ~Node(void)
Входные данные: нет.
Выходные данные: нет.
Процессы обработки: деструктор, который освобождает память, выделенную под объект Node и обнуляет значения полей.
Подпрограмма CB_PLUS_Tree <Data>::CBTree(void)
Входные данные: нет.
Выходные данные: нет.
Процессы обработки: конструктор, в котором инициализируются значения полей класса.
Подпрограмма CB_PLUS_Tree <Data>::CBTree(void)
Входные данные: нет.
Выходные данные: нет.
Процессы обработки: деструктор, вызывающий функцию удаления дерева.
Подпрограмма RESULT CB_PLUS_Tree <Data>::AddKey(Data d)
Входные данные: запись с данными.
Выходные данные: SUCCESS в случае успеха, KEY_ALREADY_EXISTS – если запись с таким же ключом содержится в дереве.
Процессы обработки: происходит добавление записи d в дерево, в случае переполнения – вызов функции разбиения SplitNode.
Краткая блок-схема алгоритма
Подпрограмма CB_PLUS_Tree<Data>::Node*CB_
Входные данные: запись с данными, текущий узел, переменная для хранения индекса записи (номер записи в узле).
Выходные данные: функция возвращает указатель на узел, в котором завершился поиск. В случае удачного поиска значение переменной index отличается от -1.
Процессы обработки: рекурсивный поиск записи в дереве (поддереве), начинающийся в узле CurrentNode.
Подпрограмма RESULT CB_PLUS_Tree<Data>::DeleteKey(
Входные данные: запись с данными.
Выходные данные: SUCCESS в случае успеха, NOT_FOUND – если записи с ключом d.key нет в дереве.
Процессы обработки: поиск записи в узле, удаление либо замена записи d, вызов функции Balancing, которая перераспределяет ключи для сохранения структуры B+-дерева
Подпрограмма void CB_PLUS_Tree<Data>::SplitNode(
Входные данные: узел, в котором произошло переполнение.
Выходные данные: 2 узла, созданных при разделении.
Процессы обработки: расщепление узла node на 2. Если процесс достигает корня, то он расщипляется на 2 узла и создается новый корень, тем самым высота дерева увеличивается на 1.
Подпрограмма void CBTree<Data,T>::EraseKeys(
Входные данные: узел, из которого нужно удалить count ключей с позиции start.
Выходные данные: удаленные ключи.
Процессы обработки: удаляется count ключей с позиции start из узла node. В результате этой операции ненулевые записи в узле остаются упорядоченными, а нулевые записи остаются справа.
Подпрограмма void CB_PLUS_Tree<Data>:: ErasePointers(Node* node,short start, short count)
Входные данные: узел, из которого нужно удалить count указателей с позиции start.
Выходные данные: удаленные указатели.
Процессы обработки: удаляется count указателей с позиции start из узла node. В результате этой операции ненулевые указатели в узле остаются упорядоченными, а нулевые остаются справа.
Подпрограммы RESULT CB_PLUS_Tree<Data>::
Входные данные: узел, в который нужно переместить запись.
Выходные данные: SUCCESS – успешное перемещение, NOT_FOUND – если соседнего левого/правого узла не существует, NOT_ENOUGH_KEYS – если в соседних узлах недостаточно ключей для перемещения.
Процессы обработки: рекурсивный проход вправо(влево) в поисках «свободного» ключа и перемещение его влево (вправо).
Подпрограмма CB_PLUS_Tree<Data>::Node*CB_
Входные данные: узел, из которого нужно удалить запись. index – номер записи в листовом узле, которую нужно удалить.
Выходные данные: листовой узел, из которого произошло удаление.
Процессы обработки: если node – нелистовой узел, то в нем нужно заменить запись с номером index на запись из потомка. Затем функция применяется рекурсивно к потомку. Если node – листовой узел, то возвращаем указатель на него, а index становится равным номеру перемещенной записи, которую теперь нужно удалить.
Подпрограмма void CB_PLUS_Tree<Data>::Balancing(
Входные данные: узел, из которого произошло удаление.
Выходные данные: перемещенные ключи из соседнего узла.
Процессы обработки: в случае нехватки ключей в узле node вызываются функции перемещения ключей из соседних узлов (TransferFromLeftNode и TransferFromRightNode). Если они не дают нужного результата, вызывается функция ConcatNodes, собирающая 2 в 1. Далее весь процесс повторяется для узла-родителя.
.
Подпрограмма void CB_PLUS_Tree<Data>::
Входные данные: самый левый из узлов, которые нужно «склеить».
Выходные данные: узел, созданный при лбъединении.
Процессы обработки: в общем случае собираются массив записей из ключей склеиваемых узлов и ключей-разделителей родителя и массив указателей. Потом из этих массивов выбирается средний ключ, который перемещается в узел верхнего уровня, замещая два старых ключа-разделителя, далее создается два узла из первой и второй половин массивов записей и указателей. Если. node – прямой потомок корня, который содержит 1 ключ, то корень удаляется и создается новый корень, включающий записи двух узлов и ключ-разделитель из удаленного корня. Таким образом высота дерева уменьшается на 1.
Подпрограмма void CB_PLUS_Tree<Data>::
Входные данные: текущий узел.