Выпускная квалификационная работа бакалавра


void Visit(int index, int maxLevel, XmlNode branch, XmlDocument xDoc, List typeOnLevel)


Download 1.08 Mb.
bet4/6
Sana15.01.2023
Hajmi1.08 Mb.
#1094232
1   2   3   4   5   6
Bog'liq
ВКР.pdf (1)

void Visit(int index, int maxLevel, XmlNode branch, XmlDocument xDoc, List typeOnLevel)
index - это номер узла из списка Nodes, который мы просматриваем. maxLevel - максимальный уровень вложенности структуры.
branch - элемент xml документа, в который заносится информация о потомках текущего узла.
xDoc - весь xml документ.
typeOnLevel - список, в который будем добавлять типы контейнеров, используемых на разных уровнях в структуре.
После занесения в файл информации о ветвлении, заносим в него информацию об имени структуры и об её конечном типе, а также количество уровней в ней. Далее, пользуясь полученным списком typeOnLevel, заносим в файл необходимые для подключения заголовочные файлы и последовательность контейнеров, которые используются в структуре.
Пример заполненного шаблона:
0” encoding=”utf-8”?>
name= "Matrix” finite_type="int" levels_size="2"> «include text="#include " start="<" end=">j”> > iterator*:/ element0> vectorc/elementl> listelement2>
<using text = "using ’’ end=";">
namespace std «/usings text=”class " start="{" end="};"> «private text="private:"> «name text=" " start= middle=">n end="_;">
vectorc/elementO> listelementl>
private> «public text=”public:"> «constructor text=" " start="(" end=");" /> «operator text=" " return="&" start="operator()(" middle="int" end=");" /> «insert text=" " return="void " start="Insert(" middle="int" end=");" /> «find text=" " return="bool " start="Find(" end=");" /> «erase text=" " return="void " start="Erase(" middle="int" end=");" /> publio «level© size©="2" /> «levell size0="2" sizel="2" /> val©="l" vall="2" val2="2" val2="4" /> «/struct>
Рисунок 56 - Пример заполненного шаблона.
С помощью полученного шаблона создадим необходимые файлы .h и .cpp, которые будут содержать реализацию спроектированной структуры на
языке C++. Для этого воспользуемся функциями CreateHeader()
и CreateCpp()
.
Функция CreateHeader()
отвечает за создание файла, в котором будет объявление спроектированной структуры. Его построение будет осуществляться на основе заполненного шаблона. Блоки кода, которые отвечают за подключение заголовочных файлов и пространств имён, формируются путем перебора элементов из узлов include и using. Перебираем их в цикле и, соблюдая форматирование, заносим в файл необходимые значения. При объявлении класса также происходит соблюдение форматирования и запись необходимых элементов кода, которые содержатся в шаблоне. Для объявления полученной структуры просто перебираются все элементы, содержащиеся в элементе name, с соблюдением синтаксиса языка. У тех функций, которые в качестве входных параметров принимают индексы доступа, их количество определяется исходя из максимального уровня структуры. Во всех местах, где функции требуют конечный тип структуры, он заменяется на тот, который указал пользователь.
Пример созданного .h файла:
#pragma once
#include «iterator:*
#include
#include using namespace std; class Matrix { private:
vector> Matrix_;
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>::iterator it_0 = Matrix_.begin();
while (it_0 != Matrix.end()) {
it_0->resize(branch[l][count_0]);
list::iterator it_l = it_0->begin();
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>::iterator it_0 = Matrix_.begin();
for (;index_0 > 0; --index_0)
++it_0;
if (indexl >= it_0->size())
it_0->resize(index_l + 1);
list::iterator it_l = it_0->begin();
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: iterator it_0 = Matrix.begin();
for (;index_0 > 0; --index_0)
++it_B;
if (index_l >= it_0->size())
it_0->resize(index_l + 1);
list::iterator it_l = it_0->begin();
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:
1   2   3   4   5   6




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling