Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Высокоуровневые методы информатики и программир...docx
Скачиваний:
25
Добавлен:
12.11.2019
Размер:
6.53 Mб
Скачать

1.3.3.2. Процедуры и функции, определенные пользователем

Процедура и функция пользователя начинаются с заголовков вида, соответственно:

Procedure <имя процедуры> [(<параметры>)];

Function <имя функции> [(<параметры>)] : <тип результата>;

Возвращаемое значение формируется одной из равнозначных команд: <имя функции>: = <значение> или Result:=<значение>.

Предопределенная переменная Result может быть использована в качестве операнда (Result:=X+Y; Result:=Result*C).

Для выхода из подпрограммы используется команда Exit.

Параметры в заголовке указываются в виде списка объявлений переменных через запятую, и они могут быть структурированы (массивами, записями, множествами). Передача параметров производится по значению, по ссылке, в виде константы или как выходной параметр.

Параметры, переданные по значению (параметры‑значения), не могут быть изменены процедурой, функцией, а параметры, переданные по ссылке, называются параметрами‑переменными и могут изменить свое значение в подпрограмме. Они описываются в заголовке процедуры, функ­ции после слова Var.

Параметры-константы описываются после слова Const. При по­пыт­ке изменить значение аргумента в подпрограмме будет выдано ком­пилятором сообщение об ошибке.

Выходной параметр описывается после слова Out. Он похож на па­ра­метр‑переменную, но не требует исходного значения от аргумента, при этом память, занимаемая аргументом, очищается. Подпрограмма фор­ми­ру­ет значение этого аргумента.

Не типизированный параметр не содержит указание типа, что означает возможность обработки подпрограммой аргумента любого типа. В этом случае в подпрограмме должны применяться операции приведения (преобразования) типов (п.1.2.9).

Пример. Procedure P(Var X); Begin Real (X):=Real (X)+2.1; End;

Для не типизированного параметра нельзя передавать в качестве аргумента число или не типизированную числовую константу.

Обращение к процедуре или к функции имеет вид:

<имя процедуры или функции> [(<список аргументов через запятую>)]

Параметр с умалчиваемым значением задает значение, которое принимается при отсутствии аргумента в команде вызова подпрограммы. После объявления такого параметра в заголовке подпрограммы указы­вает­ся знак равенства и константное выражение. Такие параметры должны быть последними в списке параметров, и, если один аргумент не указан, то не указываются и все оставшиеся.

Пример:

Fuction Nalog (X : Double, Nds : Double=0.2, Imuh : Double=0.01) : Double;

... N:=Nalog(V); //вызов функции с указанием только 1 аргумента вместо 3.

// Ошибочным будет вызов функции вида: N:=Nalog(V,,0.02).

Перегрузка подпрограмм. Если определить несколько одноименных подпрограмм с различным числом или типами параметров и в конце за­го­лов­ков указать слово Overload, то компилятор автоматически вызовет ту подпрограмму, которая соответствует данным аргументам.

Пример двух функции с различными типами параметров:

Function Add (X, Y: Real) : Real; Overload; Begin Result:=X+Y; End;

Function Add (X, Y: Integer) : Integer; Overload; Begin Result:=X+Y; End;

A=Add (1.3,2.1); //вызов первой функции с вещественными параметрами

A=Add (1,2); //вызов второй функции с целочисленными параметрами

Правила использования параметров и аргументов:

1. Количество неумалчиваемых параметров и аргументов совпадает.

2. Длины строк могут не совпадать, если указана директива {$V‑}.

3. Если типы параметров и аргументов не совпадают, то обязательно указать типы параметров в заголовке.

4. В заголовке можно использовать и указатели.

5. Параметрами могут быть открытые массивы (п.1.1.4.1).

6. Параметры типов массивов, строк и записей должны быть пред­ва­рительно определены через типы пользователя, например:

Type Atype=Array [1..10] Of Real;//объявление типа массив из 10 вещ.чис.

Intype=String[15]; Outtype=String[30]; //объявление типов строк

Procedure S (A:Atype); //заголовок процедуры с параметром типа массив

Function St (S:Intype):OutType;//строковая функция с параметром строки

Пример программы возведения числа в степень:

Program Demo; //заголовок основной программы

Var Z : Integer; K : Real; //объявление переменных

Function Step (F:Real, Exp: Integer) : Real; //заголовок функции Step

Var C: Integer; T: Real; //объявление переменных функции

Begin T:=F; For C:=2 To Abs(Exp) Do T:=T*F; //цикл умножения

If Exp<0 Then Result:=1/T Else Result:=T; //формирование результата

End; //окончание тела функции

Begin Writeln (Step (2, 3),Step(5,4)) End. //операторы основной программы

Рекурсивные программы в ходе выполнения обращаются сами к себе.

Пример рекурсивной функции Factor вычисления факториала:

Procedure TForm1.Button1Click(Sender: TObject);//основная процедура

Function Factor (A:Integer) : Integer; //заголовок функции Factor

Begin If A=1 Then Result:=1 Else Result:=A*Factor(A‑1)End; //функция

Begin Label1.Caption:=IntToStr(Factor(10))end;//основная функция‑вывод10!

Предварительное описание программы. Допускается описание про­це­ду­ры или функции в конце основной программы. В этом случае перед разделом операторов основной программы указывается:

<заголовок процедуры>; Forward;

Сама процедура будет описана позже без указания параметров.