Выпускная квалификационная работа бакалавра
void Visit(int index, int maxLevel, XmlNode branch, XmlDocument xDoc, List typeOnLevel)
Download 1.08 Mb.
|
ВКР.pdf (1)
- Bu sahifa navigatsiya:
- xDoc
- CreateHeader()
- include
- branch[
- operator ()
- Insert()
- indexl
- list ::iterator
index - это номер узла из списка Nodes, который мы просматриваем. maxLevel - максимальный уровень вложенности структуры. branch - элемент xml документа, в который заносится информация о потомках текущего узла. xDoc - весь xml документ. typeOnLevel - список, в который будем добавлять типы контейнеров, используемых на разных уровнях в структуре. После занесения в файл информации о ветвлении, заносим в него информацию об имени структуры и об её конечном типе, а также количество уровней в ней. Далее, пользуясь полученным списком typeOnLevel, заносим в файл необходимые для подключения заголовочные файлы и последовательность контейнеров, которые используются в структуре. Пример заполненного шаблона: 0” encoding=”utf-8”?> <using text = "using ’’ end=";"> Рисунок 56 - Пример заполненного шаблона. С помощью полученного шаблона создадим необходимые файлы .h и .cpp, которые будут содержать реализацию спроектированной структуры на языке C++. Для этого воспользуемся функциями CreateHeader() и CreateCpp(). Функция CreateHeader() отвечает за создание файла, в котором будет объявление спроектированной структуры. Его построение будет осуществляться на основе заполненного шаблона. Блоки кода, которые отвечают за подключение заголовочных файлов и пространств имён, формируются путем перебора элементов из узлов include и using. Перебираем их в цикле и, соблюдая форматирование, заносим в файл необходимые значения. При объявлении класса также происходит соблюдение форматирования и запись необходимых элементов кода, которые содержатся в шаблоне. Для объявления полученной структуры просто перебираются все элементы, содержащиеся в элементе name, с соблюдением синтаксиса языка. У тех функций, которые в качестве входных параметров принимают индексы доступа, их количество определяется исходя из максимального уровня структуры. Во всех местах, где функции требуют конечный тип структуры, он заменяется на тот, который указал пользователь. Пример созданного .h файла: #pragma once #include «iterator:* #include #include vector
public: MatrixQ j int& operator()( intj int); void Insert( intj intj int)j bool Find(int); void Erase( intj int); Рисунок 57 - Пример созданного .h файла. Функция CreateCpp() отвечает за создание файла, в котором будет содержаться реализация методов класса структуры. Вся необходимая информация для этого также содержится в шаблоне. Рассмотрим создание конструктора структуры. Для этого в конструкторе создается матрица ветвления структуры branch размера n на m, где n - это количество уровней в структуре, а m - максимальное количество элементов на уровне среди всех уровней. В эту матрицу заносится информация о потомках для каждого узла. Также понадобится массив инициализации init, размер которого равен количеству терминальных вершин последнего уровня в структуре. В нём будут содержаться начальные значения для элементов. Далее потребуются счетчики для каждого уровня матрицы branch и счетчик для массива инициализации. Совершаем прямой обход дерева. На каждом уровне структуры для узла захватываем память под потомков, количество которых находится в матрице branch[ i ][/], где i - номер уровня, а j - счетчик текущего уровня. Как только доходим до терминальных вершин, то присваиваем им значение из массива init. Пример реализации конструктора: Matrix::Matrix() { int branch[2][2] = {{2, -1},{2Л 2}}; int init[4] = { 1, 2Л 3, 4}; int count_0 = 0, init_count = 0; Matrix_.resize(branch[0][0]); vector
while (it_0 != Matrix.end()) { it_0->resize(branch[l][count_0]); list while (it_l != it_0->end()) { *it_l = init[init_count]; ++init_count; -H-it_lj ++it_0; ++count_0; } } Рисунок 58 - Пример реализации конструктора. Функция доступа к элементам реализуется через перегрузку оператора operator (). Входными параметрами при этом являются n индексов, где n - это количество уровней в структуре. Для каждого уровня делается проверка: не превышает ли индекс этого уровня максимальное количество элементов. Если превышает, то захватываем память под количество элементов, равное этому индексу. Потом по текущему уровню перебираем с помощью итератора k элементов, где k - индекс текущего уровня. Повторяем эти шаги для каждого уровня и в результате найдём искомый элемент. Пример реализации оператора доступа к элементам: int& Matrix::opeгator()( int index_0, int index_l) { if ( index_0 < 0 && index_l < 0) throw ”bad_index"; if (index_0 >= Matrix_.size()) Matrix_.resize(index_0 + l)j vector
for (;index_0 > 0; --index_0) ++it_0; if (indexl >= it_0->size()) it_0->resize(index_l + 1); list for (;index_l > 0; --index_l) ++it_lj return *it_l; } Рисунок 59 - Пример реализации оператора доступа к элементам. Функция добавления нового элемента аналогична функции доступа к элементам. Также по п индексам находится положение для нового элемента и происходит его добавление. Добавление элемента происходит с помощью функции Insert(), которую поддерживают все контейнеры. Пример реализации функции добавления нового элемента: void Matrix::Insert( int index_0, int indexl, int value) { if ( index_0 < 0 && index_l < 0) throw "badindex"; if (index© >= Matrix_.size()) Matrix_.resize(index_0 + 1); vector for (;index_0 > 0; --index_0) ++it_B; if (index_l >= it_0->size()) it_0->resize(index_l + 1); list for (;index_l > 0; --index_l) ++it_l; it_0->insert(it_l, value); Рисунок 60 - Пример реализации функции добавления нового элемента. В функции поиска элемента рассматриваются только терминальные вершины последнего уровня. Производим обход дерева, подобный обходу в конструкторе структуры, и при достижении вершин последнего уровня сравниваем их ключ с ключом, по которому производится поиск. При совпадении заканчиваем эту процедуру. Пример реализации функции поиска: Рисунок 61 - Пример реализации функции поиска. Функция удаления элемента аналогична функции доступа к элементам, но индекс каждого уровня должен быть меньше количества потомков узла. Удаление элемента производится при помощи функции Erase(), которую поддерживают все контейнеры. Пример реализации функции удаления элемента: Download 1.08 Mb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling