- •1 Языки программирования. Язык Pascal. Описание синтаксиса языка программирования.
- •2 Лексическая структура языка Pascal. Структура Pascal-программы. Составной оператор. Константы. Переменные
- •3 Концепция переменной языка Pascal
- •4 Концепция типа данных языка Pascal
- •5 Простые типы языка Pascal
- •6 Стандартные типы языка Pascal
- •7 Операторы языка Pascal
- •8 Составные типы языка Pascal
- •9 Множества (определение, примеры, операции). Представление множеств, примеры использования
- •10 Файловый тип. Операции с файлами.
- •11 Процедуры и функции. Описание процедуры. Оператор процедуры
- •12 Параметры процедур и функций.
- •13 Процедурный тип. Передача процедур и функций в качестве параметра.
- •14 Директивы, используемые при описании процедур и функций.
- •15 Необходимость и преимущества модульного программирования. Структура модуля в языке Pascal.
- •16 Рекурсия. Рекурсия и итерация.
- •17 Линейный поиск. Поиск делением пополам (двоичный поиск).
- •18 Простые алгоритмы сортировки.
- •19 Усовершенствованные алгоритмы сортировки. Сортировка Шелла. Сортировка Шелла
- •20 Ссылочные типы. Динамические структуры данных
- •21 Связанные списки, операции над списками.
- •22 Двусвязные кольца.
- •23 Двоичные деревья поиска
13 Процедурный тип. Передача процедур и функций в качестве параметра.
Основное назначение процедурных типов – дать программисту гибкие средства передачи функций и процедур в качестве фактических параметров обращения к другим процедурам и функциям.
Для объявления процедурного типа используется заголовок процедуры (функции), в котором опускается ее имя, например:
Type
Proc1 = Procedure (var a, b);
Func1 = Function: string;
Итак, существует два процедурных типа: тип-процедура и тип-функция. Pascal не позволяет объявлять функции, возвращающие значения процедурного типа; результат функции должен быть String, Real, Integer, Char, Boolean, Pointer или перечисление.
В программе могут быть объявлены переменные процедурных типов:
var p1: Proc1;
f1, f2: Func1;
Переменным процедурных типов допускается присваивать в качестве значений имена соответствующих подпрограмм. После такого присваивания имя переменной становится синонимом имени подпрограммы.
Так как процедурные типы допустимы в любом контексте, то можно объявить процедуры или функции, параметрами которых являются процедуры или функции.
----------------
Например, программа выведения 2 таблиц различных арифметических операций:
program Tables;
type
Func = function(X, Y: Integer): Integer;
function Add(X, Y: Integer): Integer;
begin
Add := X + Y;
end;
Function Multiply(X, Y: Integer): Integer;
begin
Multiply := X * Y;
end;
procedure PrintTable(W, H: Integer; Operation: Func);
var
X, Y: Integer;
begin
for Y := 1 to H do
begin
for X := 1 to H do Write(Operation(X,Y ) : 5);
Writeln;
end;
Writeln;end;
begin
PrintTable(10, 10, Add);
PrintTable(10, 10, Multiply);end.
Параметры процедурного типа особенно полезны в ситуациях, когда над множеством процедур или функций выполняются общие действия. В нашем случае процедура PrintTable представляет общее действие, выполняемое над функциями Add и Multiply.
14 Директивы, используемые при описании процедур и функций.
Сразу за заголовком подпрограммы может следовать одна из стандартных директив Assembler, External, Far, Forward, Inline, Interrupt, Near. Эти директивы уточняют действия компилятора и распространяются на всю подпрограмму и только на нее, т.е. если за подпрограммой следует другая подпрограмма, стандартная директива, указанная за заголовком первой, не распространяется на вторую.
Assembler – эта директива отменяет стандартную последовательность машинных инструкций, вырабатываемых при входе в процедуру и перед выходом из нее. Тело подпрограммы в этом случае должно реализоваться с помощью команд встроенного ассемблера.
External – с помощью этой директивы объявляется внешняя подпрограмма.
Far – компилятор должен создавать код подпрограммы, рассчитанный на дальнюю модель вызова. Директива Near заставит компилятор создать код, рассчитанный на ближнюю модель памяти. По умолчанию все подпрограммы, объявленные в интерфейсной части модулей, генерируется с расчетом на дальнюю модель вызова, а все остальные подпрограммы – на ближнюю модель.
В соответствии с архитектурой микропроцессора ПК, в программах могут использоваться две модели памяти: ближняя и дальняя.
Модель памяти определяет возможность вызова процедуры из различных частей программы: если используется ближняя модель, вызов возможен только в пределах того же сегмента, при дальней модели вызов возможен из любого сегмента. Ближняя модель экономит один байт и несколько микросекунд на каждом вызове подпрограммы, поэтому стандартный режим компиляции предполагает эту модель памяти. Однако при передаче процедурных параметров, а также в оверлейных модулях соответствующие подпрограммы должны компилироваться с расчетом на универсальную – дальнюю – модель памяти, одинаково пригодную при любом расположении процедуры и вызывающей ее программы в памяти.
Forward – используется при опережающем описании для сообщения компилятору, что описание подпрограммы следует где-то дальше по тексту программы (но в пределах текущего программного модуля).
Inline – указывает на то, что тело подпрограммы реализуется с помощью встроенных машинных инструкций.
Interrupt – используется при создании процедур обработки прерываний.
