- •Лекция 18-19 Процедуры и функции
- •1. Процедура
- •2. Функция
- •3. Формальные и фактические параметры
- •3.1. Параметры-значения
- •3.2. Параметры-переменные
- •3.3. Параметры-константы
- •3.4. Параметры без типа
- •3.5. Массивы и строки открытого типа
- •3.6. Параметры-процедуры и параметры-функции
- •4. Процедура exit
- •5. Директивы подпрограмм
- •6. Рекурсивные процедуры и функции
3.1. Параметры-значения
Параметры-значения передаются основной программой в подпрограмму через стек в виде их копий и, следовательно, собственный параметр программы подпрограммой измениться не может.
Параметр-значение указывается в заголовке подпрограммы своим именем и через двоеточие - типом.
Тип параметра-значения может быть любым за исключением файлового.
Если параметров-значений одного типа несколько, их можно объединить в одну группу, перечислив их имена через запятую, а затем уже указать общий тип.
Пример.
procedure Inp(Max, Min: Real; N: Word); function Mult(X, Y: Integer): Real;
Пример. Функция вычисления максимального элемента в массиве. Пусть в основной программе определен тип-массив, массив этого типа и переменная целого типа
type tArr = array[1..100] of Integer; var Massiv: tArr; Maxim: Integer;
Функция в этом случае может иметь вид:
function Max(Mas: tArr; N: Byte): Integer; var Ma: Integer; i: Byte; begin Ma:= Mas[l]; for i:= 2 to N do if Ma < Mas[i] then Ma:= Mas[i]; Max:= Ma end;
3.2. Параметры-переменные
При передаче параметров-переменных в подпрограмму фактически через стек передаются их адреса в порядке, объявленном в заголовке подпрограммы. Следовательно, подпрограмма имеет доступ к этим параметрам и может их изменять.
Параметр-переменная указывается в заголовке подпрограммы аналогично параметру-значению, но только перед именем параметра записывается зарезервированное слово var.
Действие слова var распространяется до ближайшей точки с запятой, т. е. в пределах одной группы.
Пример.
procedure MaxMin(A: tArr; var Max, Min: Real; N: Word);
Здесь Max, Min - параметры-переменные, А и N - параметры значения.
Тип параметров-переменных может быть любым, включая и файловый.
3.3. Параметры-константы
Часто в качестве параметра в подпрограмму следует передать ту или иную переменную, но изменять ее подпрограмма не должна.
В этом случае нежелательно передавать этот параметр как параметр-переменную. Можно его передать как параметр-значение, однако, если эта переменная имеет большой размер (массив, запись и т. д.), то копия такого параметра займет большую часть стека и даже может его переполнить.
Это же приводит и к уменьшению быстродействия программы. В этой ситуации параметр лучше передать как параметр-константу. Такой параметр, если он структурированного типа, передается своим адресом, не предусматривается защита от его изменения. Использовать параметр-константу можно только в версии 7.0.
Параметр-константа указывается в заголовке подпрограммы аналогично параметру-значению, но перед именем параметра записывается зарезервированное слово const. Действие слова const распространяется до ближайшей точки с запятой, т. е. в пределах одной группы.
Пример.
function NewString(const S: string): string;
Тип параметра-значения может быть любым за исключением файлового.
3.4. Параметры без типа
В Turbo Pascal можно использовать параметры-переменные и параметры-константы без указания типа. В этом случае фактический параметр может быть переменной любого типа, а ответственность за правильность использования того или иного параметра возлагается на программиста.
Пример.
function Equal(var Paraml, Param2; Len: Word): Boolean;
Здесь Param1, Param2 - параметры-переменные без типа; Len - параметр-значение.
Следует иметь в виду, что параметр без типа внутри подпрограммы типа не имеет и его перед использованием следует преобразовать к конкретному типу, применяя идентификатор соответствующего типа.
В этом случае в качестве первого передаваемого параметра можно использовать любой массив (и не только массив), так что подпрограмма становится более универсальной.