
- •64 Жегуло а.И. Компьютерные науки 2-й семестр 2011-2012 гг. Компьютерные науки Лекции для студентов 1 курса мехмата, 2011-2012 уч. Г.
- •2 Семестр
- •16.Модули
- •16.1.Модуль и модульное программирование
- •16.2.Структура модуля
- •Interface //Раздел интерфейса
- •Implementation //Раздел реализации
- •Initialization //Раздел инициализации
- •Пример модуля и его использования
- •Interface //Раздел интерфейса
- •Implementation //Раздел реализации
- •Заголовок модуля
- •Раздел интерфейса interface
- •Раздел реализации implementation
- •Раздел инициализации initialization
- •16.4.Использование объявленных в модуле объектов
- •17.Файлы
- •17.1.Файлы. Классификация файлов
- •17.2.Организация работы с файлами
- •17.3.Подпрограммы для работы с файлами любых типов Связывание файловой переменной с файлом
- •Запись в файл
- •17.5.Обработка ошибок ввода-вывода
- •17.6.Текстовые файлы
- •17.6.1.Структура текстового файла
- •17.6.2.Особенности открытия текстовых файлов
- •17.6.3.Особенности чтения и записи для текстовых файлов
- •17.6.7.Поэлементная обработка текстовых файлов, состоящих из строковых значений и чисел
- •17.7.Типизированные файлы
- •17.7.1.Описание и структура типизированного файла
- •17.7.5.Сравнение текстовых и типизированных файлов
- •17.7.6.Пример работы с типизированными файлами из записей
- •18.Процедурные типы
- •18.1.Назначение процедурных типов
- •18.2.Описание процедурных типов и процедурных переменных
- •18.3.Присваивание процедурным переменным. Вызов подпрограмм через процедурные переменные
- •18.4.Процедурные переменные в качестве параметров
- •19.Рекурсия
- •19.1.Что такое рекурсия
- •19.2.Рекурсивные подпрограммы
- •19.3.Прямая и косвенная рекурсия
- •19.4.Предварительное (опережающее) описание подпрограммы
- •19.5.Опасности рекурсии
- •19.5.1.Бесконечная рекурсия
- •19.5.2.Глубокая рекурсия
- •19.5.3.Итерация и рекурсия, необоснованное применение рекурсии
- •19.6.Когда использовать рекурсию
- •19.7.Формы рекурсивных подпрограмм
- •19.8.Примеры рекурсивных программ
- •19.8.1.Вывод цифр целого числа в прямом порядке
- •19.8.2.Поиск максимального элемента массива
- •19.9.Задача о Ханойских башнях
- •20.Указатели
- •20.1.Указательные типы
- •Описание типизированного указателя
- •20.2.Операции с указателями
- •20.3.Примеры присваивания для указателей
- •20.4.Статические и динамические переменные
- •Создание новой динамической переменной базового типа и установка на нее указателя
- •Уничтожение динамической переменной, на которую ссылается указатель
- •Проблема потерянных ссылок
- •21.Динамические структуры данных
- •21.1.Данные статической структуры и данные динамической структуры
- •21.2.Односвязные линейные списки
- •21.2.1.Структура односвязного линейного списка
- •Вставка элемента после заданного элемента
- •21.3.Стеки
- •21.3.1.Реализация стека через односвязный линейный список
- •21.3.2.Применение стеков
- •21.3.3.Реализация стека на основе массива
- •21.4.Деревья
- •21.4.1.Основные определения
- •Алгоритм построения идеально сбалансированного дерева
- •21.4.3.Способы обхода дерева
- •Деревья поиска
- •Построение дерева поиска
20.3.Примеры присваивания для указателей
Пусть объявлены следующие переменные и указатели и выполнены присваивания:
var x1, x2:integer; p1,p2:^integer;
p1:=@x1; p1^:=значение1;
p2:=@x2; p2^:=значение2;
p2:=p1; {Копирование адреса} |
|
p2^:=p1^; {Копирование значения} |
|
if p1=p2 then {Сравнение адресов на равенство} if p1<>p2 then …{Сравнение адресов на неравенство} if p1^=p2^ then …{Сравнение значений возможно любой операцией сравнения} |
|
20.4.Статические и динамические переменные
Переменные, размер которых можно определить по их описанию, называются статическими. При компиляции программы для них выделяется место в статической памяти, которое сохраняется в течение всей работы программы.
Доступ к статическим переменным обычно производится по их именам. Кроме того, для доступа к статической переменной можно использовать и ее физический адрес, который можно получить по операции взятия адреса @имя_переменной и хранить в указателе.
Динамическими переменными называются переменные, память под которые выделяется во время выполнения программы в динамической памяти. Это часть оперативной памяти компьютера, предоставляемая программе при ее работе. Программист сам запрашивает в программе определенный объем динамической памяти для динамической переменной и освобождает эту память после использования динамической переменной. Вся выделенная программе во время ее работы динамическая память освобождается по ее окончанию.
Динамические переменные имени не имеют. Для доступа к ним используются только указатели.
Создание новой динамической переменной базового типа и установка на нее указателя
П
усть
описан указатель: var
p : ^базовый тип
Для создания динамической переменной используется стандартная процедура new(p) , которая выделяет в динамической памяти область памяти, размер которой напрямую зависит от базового типа. Адрес этой области заносится в указатель p. Если свободной динамической памяти недостаточно, выдается ошибка.
Уничтожение динамической переменной, на которую ссылается указатель
dispose(p)
З
анимаемая
переменной динамическая память
освобождается и может использоваться
под новые динамические переменные.
Значение указателя становится
неопределенным. Ему лучше присвоить
нулевой адрес: P:=nil.
Проблема потерянных ссылок
При копировании указателей динамическая переменная может оказаться без указателя (будет потеряна). Например: new(p1); new(p2); p2:=p1; В результате на первую динамическую переменную ссылаются два указателя, а вторая динамическая переменная, на которую сначала ссылался p2, осталась без указателя, ею никак нельзя воспользоваться.
Если на одну динамическую переменную ссылаются несколько указателей, например, p1 и p2 в предыдущем пункте, тогда после освобождения памяти dispose(p1) указатель p2 будет указывать на освобожденную память.
Потеря ссылок возможна при использовании локальных указателей в подпрограммах. Например: procedure Proc; var p:^integer; begin … new(p) … end; После выхода из подпрограммы локальный указатель перестает существовать, поэтому нет доступа к памяти, на которую он указывал. Надо либо освобождать динамическую память перед выходом из подпрограммы, либо не использовать локальные указатели.
Процесс неконтролируемого уменьшения объёма свободной оперативной памяти, связанный с ошибками в работающих программах, называется утечкой памяти.