
- •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 Алгорим быстрой сортировки (сортировка Хоара).
11.2 Двусвязные списки
В отличие от односвязного списка, двусвязный список имеет ссылку не только на следующий, но и на предыдущий элемент. Узел двусвязного списка имеет следующую структуру.
Главным преимуществом двусвязного списка перед односвязным является наличие ссылки на предыдущий узел. Недостаток двусвязного списка вытекает из его преимуществ – больший размер из-за хранения не одной, а двух ссылок.
Описание узла двусвязного списка, в целом, повторяет описание узла односвязного, но содержит ещё одну дополнительную ссылку – ссылку на предыдущий элемент.
typePdlNode = ^TdlNode;
TdlNode = record
next: PdlNode; //ссылка на следующий узел
prior: PdlNode; //ссылка на предыдущий узел
data: pointer; //ссылка да данные узла
end;
Движение в двусвязном списке возможно в обе стороны, например
CurNode:= CurNode^.next;
или
CurNode:= CurNode^.prev;
Создание двусвязного спискаДля описания двусвязного списка достаточно задать любой из узлов списка. Но удобнее описывать список первым узлом списка. Это упрощает дальнейшие манипуляции со списком.
var AList: PdlList = nil;
11.3 Кольцевые списки.
Кольцевой список является частным случаем связного списка. Главной особенностью таких списков является то, что в нём, фактически, отсутствует понятие первого или последнего узла списка, т. к. в их качестве может выступать любой из узлов списка. Рассмотрим работу с кольцевым списком на примере односвязного списка. Односвязный кольцевой список содержащий один узел будет выглядеть следующим образом.
Вставка в кольцевой список происходит по следующей схеме.
Как можно заметить, для вставки узла A после узла B необходимо поменять местами указатели на следующий узел узлов A и B.
Теперь рассмотрим вставку одного кольцевого списка в другой (слияние списков).Вставим узел C после узла A с помощью функции slcInsertAfter.
Рассмотрим удаление из кольцевого списка. Вставим в список узел «E», принадлежащий списку, после узла «A», также принадлежащего списку. Меняем местами указатели на следующий узел для узлов «A» и «E», рисунок 13. Видно, что список распался на два кольцевых списка. Очевидно что удаление из кольцевого списка является частным случаем слияния списков. Учитывая это составим подпрограммы для удаления и вставки элементов в кольцевой односвязный список.
12. Отладка программ.
12.1 Виды программных ошибок.
Все ошибки делятся на синтаксические и логические. Наличие синтаксических ошибок (ошибок в написании операторов) проверяется на этапе компиляции программы. При наличие синтаксических ошибок компилятор останавливает компиляцию и выводит сообщение об ошибке. Подобные ошибки исправляются проще всего.
Логические ошибки – это ошибки, при которых программа работает, но неправильно, выдавая не те результаты, которые ожидает разработчик или пользователь. Другое наименование таких ошибок – ошибки времени выполнения (runtime errors). Логические ошибки исправить сложнее, чем синтаксические, иногда для этого приходится переписывать отдельные участки программы, а иногда перерабатывать весь алгоритм.
Существует довольно много способов обнаружения логических ошибок. Некоторые логические ошибки могут быть выявлены на этапе компиляции программы, например: не инициализированные переменные, неопределенное значение функции, потенциально опасные приведения типов и т. п.
Вызвать окно сообщений компилятора можно через меню «Compile» или просто нажав F12.