- •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.Способы обхода дерева
- •Деревья поиска
- •Построение дерева поиска
18.3.Присваивание процедурным переменным. Вызов подпрограмм через процедурные переменные
Процедурной переменной можно присвоить:
процедуру или функцию, например, f1:=FMin; причем FMin должна быть описана; В результате присваивания процедурная переменная будет содержать ссылку на функцию FMin.
значение другой процедурной переменной, например, f2:= f1;
Для присваивания должна выполняться совместимость по присваиванию:
Процедурный тип и заголовок присваиваемой процедуры (или функции) или процедурные типы двух переменных должны иметь одинаковое количество формальных параметров с одинаковыми типами на соответствующих позициях. Для функций типы возвращаемых значений должны совпадать.
Присваивание f1:=FMin(1,2) будет недопустимым из-за несовместимости типов: слева ‑ процедурный тип, справа – тип integer результата функции.
function FMin(a,b: integer): integer;
begin if a<b
then Result:= a
else Result:= b
end;
function FMax(a,b: integer): integer;
begin if a>b
then Result:= a
else Result:= b
end;
var x,y:integer;
begin
f1:=FMin; //Присваивание процедурной переменной ссылки на функцию FMin
x:=f1(1,2); //Вызов функции Fmin через переменную f1, x получит значение 1
f2:=FMax; //Присваивание процедурной переменной ссылки на функцию FMax
y:=f2(1,2); //Вызов функции Fmax через переменную f2 y получит значение 2
writeln(x,’ ’, y)
end.
Вызовы f1(1,2) и FMin(1,2) – это одно и то же.
18.4.Процедурные переменные в качестве параметров
Подпрограммы могут иметь параметры процедурных типов. При вызове подпрограммы фактическими параметрами тогда являются имена процедур и функций. Это прямой вызов.
При выполнении подпрограммы из нее будет вызвана процедура или функция, имя которой передано в подпрограмму.
Это обратный вызов (callback).
function MinMax(i,j:integer; f: TFunc): integer; //f ‑ параметр процедурного типа
begin
Result:= f(i,j); //Обратный вызов
end;
begin
… res:=MinMax(x,y,FMin);//Прямой вызов функции MinMax . Фактический параметр – имя функции FMin
… end.
Технику обратного вызова можно использовать для организации выполнения действий над элементами динамических структур (списков, деревьев).
19.Рекурсия
19.1.Что такое рекурсия
«Рекурсия – мощный метод программирования, который позволяет разбить задачу на части все меньшего и меньшего размера до тех пор, пока они не станут настолько малы, что решение этих подзадач сведется к набору простых операций» (Род Стивенс)
Рассмотрим задачу вычисления факториала n!, означающего число различных перестановок последовательности из n элементов. Факториал определяется через произведение n!=12...n. Оно конечно и вычисляется с помощью цикла F:=1; for i:=1 to n do F:=F*i.
Рассмотрим рекуррентные формулы:
{1} 0!=1;
{2} n!=n(n-1)!, для любого n>0.
Определение {2} сводит задачу вычисления n! к вычислению (n-1)! и т.д. до тех пор, пока задача не сведется к вычислению 0!, решение которой следует из определения {1}. Например:
3!=32!, 2!=21!, 1!=10!, 0!=1. Тогда, двигаясь в обратном порядке, получим: 1!=11=1, 2!=21!=21=2, 3!=32!=32=6
Рекурсивным определением объекта называют такое определение, которое содержит внутри себя ссылку на определяемый объект.
Объект называется рекурсивным, если он частично определяется через самого себя.
