- •Содержание
- •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.3Отображение содержимого мультисписка
Для взаимодействия - локализации и визуализации требуемого уровня или содержимого элемента мультисписка в качестве одной из возможностей может использоваться компонент ListView – просмотр списка.
Концептуально компонент ListView, так же как и компонент TreeView, предназначен для выбора и показа нескольких элементов мультисписковой (древовидной) структуры данных. Следовательно, компонент ListView, подобно компоненту TreeView, обладает соответсвующими средствами по локализации (селектированию) отдельных элементов мультисписка и средствами по доступу к их потомкам или владельцам (предкам). Однако, в отличие от компонета TreeView, в компоненте ListView допускается обработка не более двух уровней иерархии элементов мультисписка. Это связано с тем, что визуальные возможности TListView нацелены на более подробное отображение информации, хранящейся на верхнем и нижнем уровнях двухуровневого мультисписка. В действительности этот процесс можно рассматривать как рекрсивный, когда подуровень верхнего уровня двухуровневого мультисписка является верхним уровнем для следующего уровня двухуровневого мультисписка и т.д.
Весьма эффективным является совместное использование компонент TreeView и ListView. Наиболее ярким примером сочетание совместного использования компонент TreeView и ListView является Проводник Windows.
Компонент ListView показывает свои элементы в одном из четырех стилей в виде одной или нескольких вертикальных колонок с пиктограммами или без них.
Три из этих четырех стилей компонента ListView позволяют непосредственно отобразить только один - верхний уровень мультисписка и по требованию перейти к вложенному уроню выделенного элемента верхнего уровня.
Четвертый из этих стилей - отчет (таблица), является наиболее полной формой визуализации двухуровневого мультисписка. В этом случае компонент ListView позволяет визуализировать мультисписок в виде определенным образом заполненой таблицы.
В первом столбце такой таблицы по вертикали отображаются элементы верхнего уровня мультисписка, а для каждого такого элемента во всех остальных столбцах таблицы по горизонтали – элементы соответствующего вложенного списка. В результате обработка первого столбца и обработка остальных столбцов отчета несколько отличаются друг от друга. Так добавление (вставка) или удаление из таблицы элемента верхнего уровня мультисписка влекут за собой добавление (вставку) или удаление строки таблицы. А обработка соответствующих элементов нижнего уровня мультисписка влечет обработку содержимого ячеек соответсвующих строк таблицы (см. далее).
Для просмотра данных в комопненте ListView в виде таблицы необходимо свойству View занести значение Details. Если заголовки столбцов для элемента управления ListView не заданы, а свойство View установлено равным View.Details, в элементе управления ListView не будет отображаться никаких элементов.
В целях выполняемого КП в настоящем пособии рассматриваются только возможности компонента ListView по визуализации двухуровневого мультисписка. Однако для программиста, владеющего возможностями компонента TreeView, не представляет сложности самостоятельное овладение всеми возможностями компонента ListView.
Для построения просмотрщика двухуровневого мультисписка списка в Visual Studio .Net используются три типа данных для описания соответственно: просмотрщика списка - ListView, элемент верхнего уровня - LisViewItem и подэлемента элемента верхнего уровня – ListViewItem.ListViewSubItem, основные свойства (поля) и методы которые рассматриваются ниже.
Класс ListView - просмотрщик списка, содержит значительное количество полей разного назначения, но, с точки зрения отображения содержимого списка, можно выделить ряд полей, которые приводятся ниже.
Имя поля |
Тип значения |
Содержимое |
Columns |
ColumnHeaderCollection* |
содержит коллекцию заголовков столбцов. Свойство используется для удаления или добавления колонок. Используется если свойство View=Detailst |
Items |
ListViewItemCollection* |
Содержит коллекцию элементов верхнего уровня мультисписка в ListView |
View |
class View |
Определяет стиль показа элементов списка. При View=Details отображается таблица. |
С классом ListView связано несколько методов, однако в рамках рассматриваемого материала эти методы существенного интереса не представляют.
При программном заполнении компонента основную роль играют свойства Columns и Items класса ListView.
Свойство Columns имеет тип ListView.ColumnHeaderCollection. Класс ListView.ColumnHeaderCollection - хранит заголовки столбцов (объекты ColumnHeader), отображающиеся в ListView при установке свойства View равным Details. Когда ListView отображает столбцы, каждый элемент и его подэлементы размещаются в своем собственном столбце. С этим свойством связан метод Add, который в качестве параметра получает строку, и служит для именования соответствующего столбца таблицы.
Свойство Items имеет тип ListViewItemCollection*. Класс ListViewItemCollection - список всех элементов верхнего уровня, имеет значительное количество свойств, но для выполняемого КП интерес представляют следующие:
Имя поля |
Тип значения |
Содержимое |
Count |
int |
Количество элементов в списке элементов Items |
Item[Index: integer] |
ListViewItem* |
Обеспечивает индексный доступ к элементам списка Items |
С классом ListViewItemCollection - список всех элементов верхнего уровня, связан ряд методов, наиболее существенные из которых приводятся ниже.
Название метода |
Назначение |
ListViewItem* Add(String* Text) |
Создает новый элемент списка с заданным текстом и добавляет его к списку |
ListViewItem* Insert (int Index, String* Text) |
Создает новый элемент списка со значением Text и вставляет его в указанную позицию |
void Clear() |
Удаляет весь список элементов |
void RemoveAt (int Index) |
Удаляет элемент с индексом Index из коллекции |
void RemoveByKey (String* Key) |
Удаляет элемент с ключом Key из коллекции |
int IndexOfKey (String* Key) |
Возвращает индекс элемента с указанным ключом |
Свойство Item класса ListViewItem предоставляет индексированный доступ к элементам верхнего уровня. Свойство Item имеет тип ListViewItem*.
К наиболее существенным свойствам класса ListViewItem можно отнести:
Имя поля |
Тип Значения |
Содержимое |
Text |
String* |
Получает или задает текст элемента, который отображается на экране в ListView |
Index |
Int |
Используется для индикации позиции элемента в изображении списка элементов. Индикация начинается с позиции 0 |
Slected |
Bool |
Получает или возвращает знаечние выбран ли данный элемент |
SubItems |
ListViewSubItemCollection* |
Обеспечивает добавление строк в колонки, расположенные справа от колонки, содержащей элементы мультисписка верхнего уровня |
С классом ListViewItem связано несколько методов, большинство из которых интуитивно понятно, однако в рамках рассматриваемого материала эти методы существенного интереса не представляют.
При программном заполнении компонента одну из основных ролей играет свойство SubItems класса ListViewItem. Свойство SubItems имеет тип ListViewSubItemCollection*. С этим свойством связан ряд методов, во многом подобных методам свойсва Items класса ListViewItemCollection, который служит для хранения, добавления и удаления подэлементов списка верхнего уровня . В рамках данного КП наиболее важным является метод Add, который в качестве параметра получает строку, и служит для заполнения соответствующей колонки таблицы.
Ниже приводятся функции вывода содержимого списка университетов в компоненту ListView. Тексты процедур составлены из предположения, что они описаны в основном модуле – модуле описания формы. Если функции будут описаны в другом модуле, то имени компоненты ListView1 должен предшествовать квалификатор уточняющий имя формы, т.е. fmTree.ListView1. Подобные функции должны быть составлены для каждого уровня мультисписка.
В действительности описанные действия можно представить в виде одной функции. Выделенеи двух функций выполнено для большей наглядности использования компоненты ListView1. В функции AddColumnsU формируется заголовок компоненты, т.е. определяется количество, ширина и имена сооответвтсвующих столбцов. В процедуре ShowListU выполняется заполнение строк этой компоненты.
void AddColumnsU(System::Windows::Forms::ListView * listView)
{ ColumnHeader* NewCol; /* объявление указателя на объект Заголовок колонки*/
listView->Columns->Clear(); //удаление всех столбцов
listView->Width=570; //установка ширины ListView
listView->View=View::Details; //установка стиля ListView – в виде таблицы
NewCol=listView->Columns->Add(S"Университет");//добавление колонки 1
NewCol->Width=150; //установка ширины колонки 1
NewCol=listView->Columns->Add(S"Аккредитация");//добавление колонки 2
NewCol->Width=170; // установка ширины колонки 2
NewCol=listView->Columns->Add(S"Адрес");//добавление колонки 3
NewCol->Width=250; // установка ширины колонки 3
} /* AddColumnsU */
void ShowListU(void* PtrArrPtr,System::Windows::Forms::ListView * listView)
{
listView->Items->Clear();
int count=((int*)PtrArrPtr) [PosCnt];
if (count==0) return;
for(int i=0; i<count; i++)
{ /*создание и добавление нового элемента списка верхнего уровня – строка таблицы*/
listView->Items->Add(((TElmList*)((( void** )PtrArrPtr )[i]))->Name); /*добавление нового элемента списка нижнего уровня – ячейка таблицы – адрес*/
listView->Items->Item[i]->SubItems->Add( ( (TElmList*) ((( void** ) PtrArrPtr
)[i]))->Address);
/*добавление нового элемента списка нижнего уровня – ячейка таблицы – аккредитация*/
int akred=((TElmList*)((( void** )PtrArrPtr )[i]))->Akreditac;
String* S=Convert::ToString(akred);
listView->Items->Item[i]->SubItems->Add(S);
}
}/* ShowListU */
