- •Содержание
- •1 Списковые структуры и динамическая память 10
- •2 Списковые структуры и файлы 79
- •3 Мультисписковые структуры 121
- •4 Указатели на функции 134
- •5 Совместное использование указателей на данные и указателей на функции 141
- •6 Оформление курсового проекта 157
- •1.1Представления однонаправленных списков массивами указателей на элементы списка
- •1.1.1Представление однонаправленных списков массивами указателей
- •Введение
- •1Списковые структуры и динамическая память
- •1.1.2Статические массивы указателей
- •1.1.3Операции со списками в статических массивах указателей
- •1.1.4Статические массивы указателей в динамической памяти
- •1.1.5Операции со списками в статических массивах указателей в динамической памяти
- •1.1.6Динамические массивы указателей
- •1.1.7Динамические массивы типизированных указателей
- •1.1.8Операции со списками в динамических массивах типизированных указателей
- •1.1.9Динамические массивы нетипизированных указателей
- •1.1.10Операции со списками в динамических массивах нетипизированных указателей
- •1.1.11Продолжение. Динамические массивы нетипизированных указателей
- •1.1.12Замечания по оператору &
- •1.1.13Нетипизированые указатели и массивы
- •1.1.14Нетипизированые указатели и память
- •1.1.15Продолжение. Динамические массивы нетипизированных указателей
- •2Списковые структуры и файлы
- •2.1Бестиповые файлы и однонаправленные списки на базе массивов указателей на элементы списка
- •2.1.1Представление однонаправленных списков массивами указателей
- •2.1.2Организация файла с однонаправленным списком на базе массивов указателей на элементы списка
- •2.1.3Статические и динамические массивы указателей
- •2.1.4Организация списка дыр
- •2.1.5Функция инициализации файла со списком
- •2.1.6Функция открытия файла со списком
- •2.1.7Функции корректировки указателя на начало списка, заголовка списка дыр, количества элементов списка и текщего размера массива указателей
- •2.1.8Функция выделения записи для нового элемента списка
- •2.1.9Функция освобождения записи удаляемого элемента списка
- •2.1.10 Функция увеличения размера массива указателей на элементы списка
- •2.1.11 Функция вывода содержимого списка
- •2.1.12 Функция поиска элемента списка
- •2.1.13Функция добавления элемента в неотсортированный список
- •2.1.14Функция добавления элемента в отсортированный список
- •2.1.15Функция удаления элемента из отсортированного списка
- •2.1.16Функция удаления списка
- •2.1.17 Функция удаления списка с усечением файла
- •2.1.18 Пример программы обработки отсортированного списка на базе массивов указателей
- •2.1.19Продолжение. Представление однонаправленных списков массивами указателей
- •2.1.20Функция инициализации файла со списком
- •2.1.21Процедура открытия файла со списком
- •2.1.22Процедура корректировки заголовка списка
- •2.1.23 Процедура увеличения размера массива указателей на элементы списка
- •2.1.24Функция поиска элемента списка или позиции вставки нового элемента методом половинного деления
- •2.1.25Функция вывода списка на экран
- •2.1.26Функция добавления нового элемента в отсортированный список
- •2.1.27Функция удаления элемента из отсортированного списка
- •2.1.28Функция удаления списка с усечением файла
- •3Мультисписковые структуры
- •3.1Назначение мультисписков
- •3.2Мультисписки в динамической памяти
- •3.3Мультисписки в бинарных файлах
- •3.4Сохранение и восстановление мультисписка в динамической памяти
- •4Указатели на функции
- •4.1Понятие указателя на функцию и его объявление
- •4.2Переменная-указатель на функцию как параметр другой функции
- •4.3Условия использования указателей на функции
- •4.4Использование указателей на функцию для вызова функций
- •4.4.1Формат переменных-указателей на функцию и бестиповых указателей
- •4.4.2Преобразование переменной-указателя на функцию к бестиповому указателю на функцию
- •4.4.3Вызов функции через бестиповый указатель на функцию
- •4.4.4Преобразование бестипового указателя к переменной типа указатель на функцию
- •4.5Способы вызова функции через указатель на функцию
- •4.5.1Массивы указателей на функции
- •5Совместное использование указателей на данные и указателей на функции
- •5.1Инвариантные функци
- •5.2Функции сравнения
- •5.3Пример 1
- •5.4Пример 2
- •6Оформление курсового проекта
- •6.1Интерфейс программной системы
- •6.2Взаимодействие с мультисписком
- •6.3Отображение содержимого мультисписка
- •6.4Файл справки
- •6.5Документация по курсовому проекту
- •6.5.1Общие положения
- •6.5.2Курсовой проект/работа
- •6.5.3Пояснительная записка
- •6.5.4Техническое задание
- •6.5.5Реферат
- •6.5.6Содержание
- •6.5.7Введение
- •6.5.8 Постановка задачи
- •6.5.9 Анализ решаемой задачи
- •6.5.10Анализ существующих методов организации динамических структур данных
- •6.5.11 Определение путей и методов решения задачи
- •6.5.12Проектирование программы
- •6.5.13Заключение
- •6.5.14Список использованных источников
- •6.6Приложения
6Оформление курсового проекта
Ниже приводятся основные требования и рекомендации по оформлению курсового проекта (КП).
6.1Интерфейс программной системы
Обязательные элементы интерфейса должны включать следующие компоненты MS VisualStudio.Net:
TreeView – просмотр мультисписка в виде дерева;
ListView – просмотр мультисписка в виде таблицы;
ContexMenu – редактирование элементов мультисписка в TreeView;
MainMenu – главное меню;
ToolBar – инструментальная панель;
RadioButton – группа зависимых переключателей;
CheckBox – независимый переключатель;
PictureBox – отображение картинок;
OpenFileDialog, SaveFileDialog – диалоги открытия и сохранения файлов;
StatusBar – информационная панель;
HelpProvider - справочная система.
Примечание. Предусмотреть два способа обновления TreeView после вставки, замены и извлечения элемента мультисписка:
средствами обновления состава узлов дерева TreeView;
перерисовкой в дереве TreeView измененного мультисписка.
6.2Взаимодействие с мультисписком
Взаимодействие с мультисписком – локализация и визуализация требуемого уровня или элемента мультисписка, в качестве одной из возможностей можно использовать компонент TreeView – просмотр дерева. Например – см. Рисунок 6.1:
Рисунок 6.1 – Вывод мультисписка в виде дерева с помощью компонента TreeView
Для построения такого дерева в MS VisualStudio.Net используются три типа данных узел дерева – TreeNode, список узлов дерева - TreeNodeCollection и просмотрщик дерева - TreeView, которые рассматриваются ниже.
Класс TreeNode - узел дерева. Он содержит значительное количество полей разного назначения, но, с точки зрения отображения структуры связи узлов в дереве, можно выделить ряд полей, которые приводятся ниже. Эти поля собраны в отдельные группы по их отношению к разным составляющим дерева.
Имя поля |
Тип Значения |
Содержимое |
Text |
String* |
текст в метке узла дерева |
TreeVeiw |
TreeView* |
все узлы имеют указатель на вершину дерева, к которому они принадлежат |
Level |
Int |
уровень узла в дереве, начиная с 0 |
FullPath |
String* |
Путь из корневого узла дерева к текущему узлу дерева |
Parent |
TreeNode* |
ссылка на родителя узла |
Index |
Int |
индекс узла в списке своих братьев (всех сыновей своего родителя) |
FirstNode |
TreeNode* |
первый дочерний узел дерева |
LastNode |
TreeNode* |
последний дочерний узел дерева |
NextNode |
TreeNode* |
Следующий узел дерева на данном уровне |
PrevNode |
TreeNode* |
Предшествующий узел дерева на данном уровне |
Nodes |
TreeNodeCollection* |
представляет коллекцию узлов TreeNode для данного узла |
FullPath |
String* |
путь из корневого узла дерева к текущему узлу дерева. Путь содержит метки всех узлов дерева, которые должны быть пройдены, начиная с корневого узла дерева, и вплоть до данного узла дерева.Метки узлов отделены знаком разделителя, заданным в свойстве PathSeparator элемента управления TreeView, в котором содержится этот узел. |
Tag |
Object* |
ссылка на объект, содержащий сведения об узле дерева |
Такое разнообразие полей позволило снабдить данные типа узел - TreeNode, большим набором функций [11], наиболее существенные из которых приводятся ниже.
Методы |
Назначение |
void Remove ( ) |
Узел дерева и все дочерние узлы дерева, назначенные объекту TreeNode, удаляются из объекта TreeView.Удаленные дочерние узлы удаляются из объекта TreeView, но остаются присоединенными к этому узлу дерева. |
void BeginEdit ( ) |
Инициирует редактирование метки узла дерева |
void EndEdit ( ) |
Завершает редактирование метки узла дерева. |
Object* Clone() |
Копирует узел дерева и все поддерево с этим корнем в данный узел дерева |
void Collapse ( ) |
Сворачивает узел дерева. |
void Expand ( ) |
Разворачивает узел дерева. |
int GetNodeCount (bool) |
Возвращает количество дочерних узлов дерева |
Тип TreeNodeCollection - список узлов дерева. Он содержит четыре поля.
Имя поля |
Тип значения |
Содержимое |
Count |
Int |
количество узлов в списке |
Item (String) |
TreeNode* |
возвращает узел дерева с указанным ключом из коллекции. |
IsReadOnly |
Bool |
возвращает значение, показывающее, является ли коллекция доступной только для чтения |
Item [Int32] |
TreeNode* |
получает или задает объект TreeNode по указанному индексу в коллекции |
Фактически в сильноветвящемся дереве можно выделить три вида списков:
список братьев узла, включая и сам узел;
список сыновей узла;
список владельцев узла.
С этими списками связано большое количество процедур и функций, наиболее существенные из которых приводятся ниже.
Методы |
Назначение |
void Add(String ) |
Добавляет новый узел дерева с заданным текстом метки в конец текущей коллекции узов дерева |
void Add (TreeNode *) |
Добавляет ранее созданный узел дерева в конец коллекции узов дерева. |
void AddRange (TreeNode * [] ) |
Добавляет в коллекцию массив предварительно созданных узов дерева. |
void Clear ( ) |
Удаляет все узлы дерева из коллекции |
int IndexOf (TreeNode * ) |
Возвращает индекс указанного узла дерева в коллекции. |
void Insert (int, TreeNode * ) |
Вставляет существующий узел дерева в заданную позицию коллекции узов дерева. |
void Remove (TreeNode *) |
Удаляет указанный узел дерева из коллекции узов дерева |
Класс TreeView – представляет иерархическую коллекцию элементов, каждый из которых представляет собой узел TreeNode . Он содержит большое количество полей разного назначения. Для излагаемого материала достаточно выделить три поля, приводимые ниже.
Имя поля |
Тип Значения |
Содержимое |
Nodes |
TreeNodeCollection* |
Получает коллекцию узлов дерева, которая назначена элементу управления иерархического представления. |
SelectedNode |
TreeNode * |
Указатель на выбранный узел дерева. |
Sorted |
Bool |
Получает или задает значение, указывающее, производится ли сортировка узлов дерева в иерархическом представлении |
Некоторые методы класса TreeView .
Методы |
Назначение |
void CollapseAll ( ) |
Свертывает все узлы дерева. |
void ExpandAll ( ) |
Развертывает все узлы дерева. |
int GetNodeCount (bool ) |
Возвращает число узлов дерева, включая при необходимости узлы во всех поддеревьях, которые назначены элементу управления иерархического представления. |
Для примера использования представленных весьма значительных возможностей приведем некоторый иллюстративный фрагмент программы. Предположим, что в дереве будут отмечены в произвольном порядке: факультет – ФИВТ и кафедра – ВТ.
// При создании списка создаем корневой узел в treeView1
void Form1::btn_Create_Click(System::Object * sender, System::EventArgs * e)
{
// Создание корневого узла в treeView1
TreeNode *node_root;
Node_root=treeView1->Nodes->Add(S"Министерство образования");
node->Tag=node_tag; //к корневому узлу подсоединяем объект с данными об //уровне узла
. . .
//Корневой узел будет выбранным
treeView1->SelectedNode=node_root;
}
Следующие децствия могут выполняться в процедурах обработки событий нажатия на кнопки добавления, замены, удаления элемента списка.
В данном примере действия будут выполняться при обработке события click у компонента treeView1
void Form1::treeView1_Click(System::Object * sender, System::EventArgs * e)
{
//Получение имени выделенного узла дерева
char* KeyUniv;
KeyUniv=SystemStringToChar(treeView1->SelectedNode->Text);
//получение уровня выделенного узла в дереве, начиная с 0
int level = treeView1->SelectedNode->Level;
//действия в зависимости от уровня выбранного узла
switch (level)
{
case 1: //выбран университет
. . .
break;
case 2: //выбран факультет
//Фиксация выделенного узла
TreeNode* Node1;
Node1=treeView1->SelectedNode;
//имя выбранного факультета
char* NameFct;
strcpy(NameFct, Node1->Text);
// имя корня дерева – Министерство образования
char* NameRoot;
strcpy(NameRoot, Node1->Parent->Parent->Text);
// имя отца факультета – имя университета
char* NamePar;
strcpy(NamePar, Node1->Parent->Text);
/*Путь от корня до отца выделенного узла заносится в строку S*/
String* S=treeView1->SelectedNode->FullPath;
/*Примечание. Т.к. глубина дерева может быть произвольной, то универсальный способ подъема по дереву можно выполнить с помощью свойства FullPath, которое содержит строку с перечнем всех предков выделенного узла от корня к узлу.
Строка, содержащая имена предков выделенного узла будет, например, иметь вид
"Министерство образования\ЧДТУ\ФЭИТ\ИКС"
Имена предков разделяются символом "\". Символ разделения названия предков содержится в свойстве TreeView – PathSeparator. Первым именем в строке является имя корня, а последним – имя отца выделенного узла.
*/
int CountSon = Node1->Nodes->Count; /*количество элементов в списке сыновей у выбранного узла факультета*/
char* NameSelSon1;
char* NameSelSon2;
strcpy(NameSelSon1, treeView1->SelectedNode->FirstNode->Text);
/*доступ к 1-му элементу списка сыновей узла выбранного факультета*/
strcpy(NameSelSon1, treeView1->SelectedNode->Nodes->Item[0]->Text); /*другой способ доступа к 1-му элементу списка сыновей узла выбранного факультета*/
strcpy(NameSelSon2, treeView1->SelectedNode->Nodes->Item[1]->Text); /* доступ ко 2-му элементу списка сыновей узла выбранного факультета*/
int Ind1 = Node1.Index; //индекс узла факультета в списке братьев
/*доступ к предыдущему узлу факультетов, если он есть, в списке всех узлов дерева при его обходе в прямом порядке*/
TreeNode* Node2;
Node2=treeView1->SelectedNode->PrevNode;
/*имя предыдущего узла факультета*/
char* NameSelBroth1;
strcpy(NameSelBroth1, Node2->Text);
/*доступ к следующему узлу факультетов, если он есть, в списке всех узлов дерева при его обходе в прямом порядке*/
TreeNode* Node3;
Node3=treeView1->SelectedNode->NextNode;
/*имя следующего узла факультета*/
char* NameSelBroth2;
strcpy(NameSelBroth2, Node3->Text);
/*добавление сына ИИТ к выбранному узлу факультета*/
treeView1->SelectedNode->Nodes->Add(S"ИИТ");
/* удаление выбранного узла факультета и всех его потомков */
treeView1->SelectedNode->Remove();
. . .
break;
case 3: //выбрана кафедра
break;
}
}
