
- •Основы программирования
- •Введение
- •Основы delphi
- •Общая технология программирования
- •Язык программирования
- •Объектно-ориентированное программирование
- •Визуальное программирование
- •Событийно управляемое программирование
- •Windows-приложение
- •Среда программирования
- •Первоначальные сведения о проекте приложения
- •Встроенный отладчик
- •Использование встроенных классов
- •Иерархия классов
- •Использование палитры компонентов и инспектора объектов
- •Использование графики
- •Основные инструменты
- •Основные характеристики шрифтов
- •Графические данные и палитра
- •Некоторые общие свойства компонентов
- •Сохранение проекта
- •Построение простейшего проекта
- •Понятие исключительной ситуации
- •Введение в object pascal
- •Структура приложения
- •Структура программы-проекта
- •Структура модуля
- •Пример 1
- •Описания программных элементов
- •Программные элементы и адреса памяти
- •Области видимости
- •Правила записи имен
- •Время жизни идентификаторов
- •Использование локальных переменных в примере 1
- •Использование глобальных переменных в примере 1
- •Простые типы
- •Целые типы
- •Целые типы
- •Некоторые операции с целым типом
- •Символьные типы
- •Логические типы
- •Тип перечень
- •Интервальный тип
- •Вещественный тип
- •Вещественные типы
- •Некоторые операции с вещественным типом
- •Тип дата-время
- •Выражения
- •Константы
- •Типизированные константы.
- •Переменные
- •Операции
- •Унарная операция not (отрицание)
- •Логические операции and, or, xor
- •Функции
- •Порядок вычисления выражений
- •Виды операторов
- •Простые операторы
- •Составной оператор
- •Операторы условного перехода
- •Оператор if
- •Пример 2
- •Оператор case
- •Пример 3
- •Использование enter в примере 3
- •Операторы цикла
- •Оператор цикла for
- •Пример 4
- •Оператор цикла while
- •Пример 5
- •Оператор цикла repeat
- •Пример 6
- •Использование процедур break и continue
- •Пример 7
- •Массивы
- •Статические массивы
- •Динамические массивы
- •Пример 8
- •Пример 9
- •Записи (объединения)
- •Оператор with
- •Пример 10
- •Совместимость и преобразование типов данных
- •Идентичность типов
- •Совместимость типов
- •Совместимость по присваиванию
- •Преобразование типов
- •Операторы обработки исключительных ситуаций
- •Пример 11
- •Множества
- •Операции над множествами
- •Пример 12
- •Вариантный тип данных
- •Процедуры и функции
- •Процедура
- •Функция
- •Рекурсия
- •Формальные и фактические параметры
- •Параметры-значения
- •Параметры-переменные
- •Параметры-константы
- •Параметры без типа
- •Массивы открытого типа
- •Парамеры по умолчанию
- •Процедура exit
- •Директивы подпрограммы
- •Соглашения по передаче данных
- •Директива forward
- •Директива external
- •Директива assembler
- •Перегруженные подпрограммы
- •Пример 13
- •Инкапсуляция
- •Класс как объектный тип
- •Наследование
- •Области видимости
- •Операции is и as
- •Виды методов
- •Методы virtual и полиморфизм
- •Методы dynamic
- •Методы message
- •Методы abstract
- •Методы override
- •Методы class
- •Пример 14
- •Динамическое создание компонентов
- •Использование класса со счетчиком объектов
- •Отслеживание разрушения объектов
- •События
- •Указатели на методы
- •Пример 15
- •Типы ссылки на класс
- •Свойства
- •Свойства simple
- •Свойства enumerated
- •Свойства set
- •Свойства object
- •Свойства array
- •Задание начальных значений свойствам
- •Пример 16
- •Файловые типы
- •Текстовые файлы
- •Типизированные файлы
- •Файлы без типа
- •Дополнительные процедуры и функции
- •Пример 17
- •Компонент tmainmenu
- •Указатели
- •Пример 18
- •Динамические структуры данных
- •Однонаправленные списки
- •Двунаправленные списки
- •Стеки, очереди
- •Бинарные деревья
- •Пример 19
- •Процедурный тип
- •Программные единицы dll
- •Пример 20
- •Технологии программирования
- •Потоки данных
- •Пример 21
- •Пример 22
- •Интерфейс drag and drop
- •Пример 23
- •Технология drag and dock
- •Пример 24
- •Использование функций windows api при работе с файлами
- •Пример 25
- •Использование отображаемых файлов
- •Пример 26
- •Программные потоки
- •Приоритеты потоков
- •Класс tthread
- •Пример 27
- •Использование блокировки в примере 27
- •Многопоточное приложение в примере 28
- •Проблемы синхронизации потоков
- •Список используемых в примерах компонентов
- •Список используемых компонентов и других классов
- •Библиографический список
- •Оглавление
Двунаправленные списки
Структура двунаправленного связанного списка приводится на рис. 42. Данная структура соответствует следующему объявлению: Type PStroka = ^Stroka;
Stroka = record
Info:string;
Pred,Sled: PStroka;
End;
Рис. 42 Структура двунаправленного списка.
Для построения связей между отдельными элементами списка используются два указателя: Pred – связь с предыдущим элементом и Sled – связь с последующим элементом. Соответственно имеет место ограничение связей элементов списка и слева и справа с помощью пустого указателя nil. Построим список из трёх элементов, как в предыдущем случае и при условиях предыдущей задачи.
New(Spisok); {Начало списка}
Spisok^.Info:=S1; {Запись строки S1 в список}
Spisok^.Pred:=nil; {Ограничение связей списка слева}
New(P); {Новый элемент списка}
P^.Info:=S2; {Запись строки S2 в элемент P}
P^.Pred:=Spisok; {Связь с предыдущим элементом}
Spisok^.Sled:=P;{Подключение элемента два в список}
New(P); {Третий элемент списка}
P^.Info:=S3; Запись строки S3 в элемент P}
P^.Pred:=Spisok^.Sled; {Связь с предыдущим элементом}
Spisok^.Sled^.Sled:=P; {Подключение элемента 3 в список}
P^.sled:=nil; {Конец списка}
P:=nil;
На основе двунаправленного списка возможно формирование кольцевых связанных списков, когда самый первый элемент списка ссылается на последний элемент, а последний – на первый элемент.
Стеки, очереди
Предполагается, что элементы в списках могут добавляться и извлекаться в произвольном порядке. Существуют списки с заранее заданными процедурами добавления и извлечения элементов. Это стеки и очереди. Очередью называется однонаправленный или двунаправленный связанный список с процедурой работы FIFO – First In, First Out (первым пришёл, первым ушёл). В списках типа очередь элемент добавляется в конец списка, а извлекается из начала списка. Стек – связанный список с процедурой работы LIFO – Last In, First Out (последним пришёл, первым ушёл). Элементы стека добавляются в конец списка и извлекаются из конца списка.
Идентифицируется очередь с помощью двух указателей: запоминается начало очереди и конец списка. Стек можно идентифицировать одним указателем, помечая дно стека с помощью nil.
Бинарные деревья
Содержательную информацию часто требуется как-то ранжировать. С целью ранжирования информации вводится понятие ключа. Например, в шахматных программах очередные ходы помечают с помощью числовых критериев оценки текущей позиции. Одним из способов представления ранжированной информации является бинарное дерево.
Бинарное дерево, по определению, - это иерархическая структура, схематично представляемая, например так, как на рис. 43.
Рис. 39. Структура бинарного дерева.
Бинарное дерево имеет узлы, в которые может входить одна ветвь, а выходить не более двух (бинарное). Верхняя вершина не имеет входа и называется корнем. Построить бинарное дерево можно следующим образом. Пусть имеется набор числовых оценок для некоторого ключа, например, такой: 35, 86, 49, 27, 31, 56, 62, 44, 29, 26, 33, 88. Примем, что вправо по ходу дерева, начиная от корня, значение ключа увеличивается, а влево – уменьшается. Тогда получим структуру дерева, представленную на рис. 43. Структуру бинарного дерева синтаксически можно объявить следующим образом:
Type
PDerevo=^Derevo;
Derevo=record
Key:word;
Info: string;
Left,Right: Pderevo;
End;
В заключение рассмотрим такую задачу. Пусть требуется построить очередь для данных, содержащихся в текстовом файле A.txt. Можно записать:
Program Prim;
Type PStroka = ^Stroka;
Stroka = record
Info:string;
Sled: PStroka;
End;
Var T:TextFile;
P,Pbegin,Pend:PStroka;
S:string;
Begin
New(Pbegin);
Pend:=Pbegin;
P:=Pbegin;
AssignFile(T,’A.txt’);
Reset(T);
While not eof(T) do begin
Readln(T,S);
P^.Info:=S;
Pend^.Sled:=P;
Pend:=P;
New(P);
End;
Pend^.sled:=nil;
Dispose(P);
CloseFile(T);
End.
Здесь указаталь Pbegin является идентификатором начала очереди, поэтому ему ещё до начала цикла выделяется память. Указатель Pend необходим для запоминания последнего элемента очереди. Вспомогательный указатель P позволяет обеспечить циклические вычисления. Цикл построен так, что указатель Pend постоянно продвигается по списку, обеспечивая добавление очередного элемента в конец очереди.