- •Лекция 18-19 Процедуры и функции
- •1. Процедура
- •2. Функция
- •3. Формальные и фактические параметры
- •3.1. Параметры-значения
- •3.2. Параметры-переменные
- •3.3. Параметры-константы
- •3.4. Параметры без типа
- •3.5. Массивы и строки открытого типа
- •3.6. Параметры-процедуры и параметры-функции
- •4. Процедура exit
- •5. Директивы подпрограмм
- •6. Рекурсивные процедуры и функции
3.5. Массивы и строки открытого типа
В версии 7.0 можно в качестве параметров-переменных использовать массивы и строки открытого типа, у которых не задаются размеры. В качестве фактического параметра в этом случае можно использовать массив или строку любого размера, однако массив должен состоять из тех же компонент, что и компоненты j открытого массива.
Такие параметры введены для того, чтобы подпрограмма могла обрабатывать массив или строку любого размера.
Фактический размер массива в этом случае может быть определен с помощью функции High (высота).
Открытый массив задается как и обычный массив, но только без указания типа индекса. Следует иметь в виду, что индексация элементов открытого массива всегда начинается с нуля, а максимальный индекс элемента равен значению функции High.
3.6. Параметры-процедуры и параметры-функции
Передаваемым параметром может быть также параметр-процедура или параметр-функция, т. е. параметр процедурного типа. Фактически этот параметр является параметром-значением, т. к. записывается без зарезервированного слова var.
В качестве фактического параметра в этом случае используется соответствующая процедура или функция, имеющая необходимое количество параметров требуемых типов.
Для параметров-процедур и параметров-функций существуют те же правила, что и для других переменных процедурного типа:
- подпрограммы должны компилироваться с ключом {$F+) или иметь директиву far,
- не должны быть стандартными подпрограммами,
- не должны объявляться внутри других подпрограмм,
- не иметь директив inline (встроенный) или interrupt (прерывать).
Пример. Программа, печатающая таблицы сложения и умножения двух целых чисел в заданном диапазоне.
program EXAMPLE15; type Func = function(X, Y: Integer): Integer; ($F+) function Add(X, Y: Integer): Integer; begin Add := X + Y end; function Multiply(X, Y: Integer): Integer; begin Multiply := X * Y end; {$F-} procedure PrintTable(A, B: Integer; Operation: Func); {процедура печати таблицы} var i, j: Integer; begin for i := 1 to A do begin for j := 1 to В do Write(Operation(i, j): 5); WriteLn end; WriteLn end; begin {начало основной программы} PrintTable(10, 10, Add); PrintTable(10, 10, Multiply) end.
4. Процедура exit
Оператор GOTO нельзя использовать для досрочного выхода из подпрограммы.
В Turbo Pascal с этой целью используется процедура Exit.
Пример. Функция, определяющая первое отрицательное число в массиве.
function Minus(var Massiv; N: Integer): Real; |
{Massiv - параметр без типа} |
type T=array[l..1000] of Real; |
|
var i: Integer; |
|
begin |
|
Minus:=0; |
|
for i:=1 to N do |
|
if T(Massiv)[i] < 0 then |
{преобразование типа} |
begin |
|
Minus:= T(Massiv)[i]; |
|
Exit |
{досрочный выход из функции} |
end |
|
end; |
|