
- •1.Язык Object Pascal. Алфавит языка. Операторы. Выражения. Структура программы.
- •2. Простые типы данных. Преобразование типов. Приведение типов. Составной оператор.
- •3. Управляющие конструкции языка.
- •3.1 Безусловные конструкции
- •3.2 Условные конструкции.
- •3.3 Циклические конструкции.
- •4. Комментарии в крограммах. Директивы.
- •5. Структурные типы данных.
- •5.3 Записи.
- •6. Подрограммы.
- •6.1 Процедуры и функции. Состав. Синтаксис.
- •6.2 Список формальных параметров.
- •6.3 Параметры-значения. Параметры-переменные. Параметры-константы. Нетипизированные параметры.
- •6.4 Передача массивов в подпрограммы. Параметры типа открытый массив.
- •6.5 Локальные переменные. Область видимости. Время жизни.
- •6.6 Рекурсия. Виды рекурсии. Опережающее описание подпрограмм.
- •6.7 Процедурные типы
- •7. Модули
- •7.1 Назначение. Синтаксис.
- •8. Файлы
- •8.1 Общий алгоритм работы с файлом.
- •8.2 Подпрограммы для открытия файла.
- •8.3 Типизированные файлы. Режимы доступа к файлу. Переменная Filemode.
- •8.4 Обработка ошибок ввода-вывода.
- •8.5 Нетипизированные файлы.
- •8.6 Текстовые файлы
- •9. Динамическая память и указатели.
- •9.1 Указатель. Синтаксис. Допустимые операции.
- •9.2 Типизированные и нетипизированные указатели.
- •9.3 Операция резадресации (разыменования) указателя. Операции взятия адреса. Пустой указатель.
- •10. Типы с управляемым временем жизни.
- •10.1 Длинные строки. Механизм подсчета ссылок.
- •12.2 Динамические массивы.
- •11. Динамические структуры данных. Связные списки. Вставка и удаление узлов.
- •11.1 Односвязные списки. Структура. Особенности обработки.
- •11.2 Двусвязные списки
- •11.3 Кольцевые списки.
- •12. Отладка программ.
- •12.1 Виды программных ошибок.
- •12.2 Отладка программ.
- •12.3 Принципы контрактного программирования.
- •12.4 Принципы модульного тестирования.
- •12.5 Трассировка. Точки контрольного останова
- •12.6 Ведение протокола программы.
- •12.8 Основные принципы оформления исходного кода программы.
- •13. Алгоритмы
- •13.1 Алгоритм последовательного поиска.
- •13.2 Алгоритм бинарного поиска.
- •13.3 Алгоритм интерполирующего поиска.
- •13.4 Алгоритм вставки элемента в отсортированный массив.
- •13.5 Алгоритм поиска минимального (максимального) элемента массива.
- •13.6 Алгоритм пузырьковой сортировки.
- •13.7 Алгоритм сортировки перемешиванием.
- •13.8 Алгоритм сортировки прочесыванием.
- •13.9 Алгоритм сортировки методом выбора.
- •13.10 Алгоритм сортировки методом вставок.
- •13.11 Алгоритм сортировки методом Шелла.
- •13.12 Алгоритм сортировки слиянием.
- •13.13 Алгорим быстрой сортировки (сортировка Хоара).
12.2 Динамические массивы.
Наряду с обычными, статическими массивами, можно использовать динамические массивы, в которых не определено число элементов на этапе компиляции. Синтаксис объявления динамического массива, в целом, схож и синтаксисом объявления статического массива, кроме указания диапазона индексов.
array of <тип элемента>
Пример объявления динамического массива
var a: array of integer;
Фактически динамические массивы, как и длинные строки, являются указателями, но в отличие от длинных строк память для динамических массивов необходимо выделять самостоятельно использую процедуру SetLength.
Перед использованием динамического массива следует установить его длину с помощью процедуры SetLength имеющую следующий синтаксис
procedure SetLength(var S; NewLength: Integer)
гдеS – динамический массив;
NewLength – новая длина массива (число элементов).
После использования массив можно удалить из памяти с помощью функции Finalize(S) или SetLength(S, 0). Следует помнить, что динамические массивы всегда начинаются с нулевого индекса. Верхнюю границу динамического массива можно определить с помощью функции High(S).
Возможно также создание динамических многомерных массивов, например.
var a:array of array of Double; //двумерный массив
выделить память под многомерный массив можно различными способами например с помощью процедуры SetLength
SetLength(a, 3, 4); //массив 3x4 элемента
После выполнения этой подпрограммы в памяти будет создана следующая структура
Видно, что фактически создается массив из указателей, каждый из которых, указывает на одномерный массив. Это дает возможность создавать матрицы (таблицы) со строками переменной длины.
Следует отметить, что при изменении размеров массива значения элементов массива не теряются, т. е. если уменьшить размер массива со 100 элементов до 50, то первые 50 элементов останутся неизменными. Но следует помнить, что при увеличении массива элементы будут добавляться в конец массива и их содержимое не предсказуемо.
Динамические массивы, в отличие от длинных строк, не используют технологию подсчета ссылок, поэтому, для того чтобы выполнить операцию присвоения (получить копию) необходимо использовать стандартную функцию Copy имеющую следующий синтаксис.
function Copy(S; Index, Count: Integer): array;
гдеS – копируемый массив;
Index – индекс начиная с которого необходимо осуществить копирование;
Count – число копируемых элементов.
Для динамических массивов существует укороченная версия этой функции, без указания индекса и числа копируемых элементов
function Copy(S): array;
11. Динамические структуры данных. Связные списки. Вставка и удаление узлов.
Динамическими структурами данных называют структуры данных размер и количество элементов которых может изменяться во время работы программы. Существует большое количество динамических структур данных. Примером таких структур могут служить связные списки и деревья. Рассмотрим одну из наиболее распространенных структур данных – связные списки.
11.1 Односвязные списки. Структура. Особенности обработки.
Односвязный список представляет собой цепочку элементов, называемых узлами. При этом каждый элемент (узел) содержит указатель, указывающий на следующий элемент (узел) в этом списке
Для получения доступа ко всем элементам списка достаточно знать первый узел списка, от которого, путем переходов по ссылкам можно обойти все остальные узлы.
В отличие от массива, узлы списка могут располагаться в различных (не смежных) участках памяти, а их порядок определяется ссылками. Недостатком списка является большое количество обращений к памяти при выборе элемента списка, как следствие меньшее быстродействие при чтении списка, а также больший занимаемый объём, за счет хранения ссылок. Достоинством списка является простота и высокая скорость вставки или удаления элемента из списка.
Создание односвязного списка
Для описания односвязного списка достаточно задать его первый узел, называемый головой списка.
var HeadNode:PslNode;
Если HeadNode содержит nil значит списка еще нет. Таким образом, односвязный список создается следующим образом
var HeadNode:PslNode = nil;
Вставка и удаление элементов в односвязном списке
Для односвязного списка существует только один вариант вставки нового узла в список – вставка после указанного узла списка.
Пошаговый алгоритм удаления узла из односвязного списка
Прохождение односвязного списка реализуется с помощью очень простого алгоритма:
•вводится текущий узел;
•текущему узлу присваивается первый узел списка;
•далее производится переход от узла к узлу с помощью указателей next. При этом для каждого узла может вызываться некоторая подпрограмма обрабатывающая данные содержащиеся в узле;
•процесс останавливается при достижении указателя nil.