Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Чернов Шафеева.doc
Скачиваний:
11
Добавлен:
15.07.2019
Размер:
1.57 Mб
Скачать

2.7.5. Функции

Функция описывается в программе следующей структурой:

FUNCTION <имя>(формальные параметры):<тип>;

{ раздел описаний: переменные, типы, метки}

BEGIN

{ операторы функции }

<имя>:= <выражение> {имени функции присваивается значение}

END;

Функция передает в вызывающую программу единственное значение, которое хранится под ее именем. В качестве переменных могут использоваться параметры-переменные и параметры-значения. <Тип> функции должен соответствовать значению, которое вычисляется в данной подпрограмме (типу результата). В вызывающую подпрограмму передается значение функ­ции данного типа.

Вызов функции в программе производится не обособленно, как в про­цедуре, а в выражении указывается имя функции со списком параметров.

Пример. Вычислить вторую и N-ю степени числа Х.

PROGRAM FUNC;

VAR X : REAL; N: INTEGER;

FUNCTION STEPEN(M: INTEGER; A: REAL): REAL;

VAR P: REAL;

I: INTEGER;

BEGIN

P:=1;

FOR I:=1 TO M DO P:=P*A;

STEPEN:=P;

END;

BEGIN

READ(X,N);

WRITELN('X=', X, 'квадрат', STEPEN(2,X));

WRITELN('X=', X, 'степень', STEPEN(N,X));

END.

2.7.6. Передача в подпрограмму параметров-массивов и параметров-строк

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

Пример: TYPE ATYPE=ARRAY[1..10] OF REAL;

PROCEDURE R(A: ATYPE);

Такое описание необходимо в связи с тем, что в списке формальных пара­метров могут использоваться только стандартные или ранее описанные ти­пы.

Поэтому нельзя, например, объявить следующую процедуру:

PROCEDURE R(A: ARRAY[1..10] OF REAL);

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

Пример описания и передачи строковых переменных:

TYPE INTYPE = STRING[10];

ONTYPE = STRING[30];

FUNCTION R(A: INTYPE): ONTYPE;

2.7.7. Рекурсия

Рекурсия  это способ организации вычислительного процесса, при котором подпрограмма в ходе выполнения своих операторов обращается сама к себе.

Пример. Пусть задано целое положительное число, вывести на экран дисплея цифры в обратном порядке.

PROGRAM REKURS;

VAR

N: INTEGER;

PROCEDURE REVERS(M:INTEGER);

BEGIN

WRITE(M MOD 10);

IF (M DIV 10)<>0 THEN REVERS(M DIV 10);

END;

BEGIN

READ(N);

REVERS(N);

END.

В ходе выполнения программы процедура рекурсивно обращается сама к себе и выводит на экран при каждом обращении очередную цифру.

Рекурсия может быть прямой или косвенной. В первом случае модуль подпрограммы содержит оператор вызова этой же подпрограммы. Во втором случае один модуль (например: А) вызывается из другого модуля (напри­мер: В), а модуль В – из А. Поскольку по правилам языка каждый иденти­фикатор перед объявлением должен быть описан, то необходимо выполнить опережающее описание подпрограммы В. Для этого объявляется заголовок процедуры В, за которым следует служебные слово FORWARD. Теперь из процедуры А можно обращаться к процедуре В. Например:

PROCEDURE B(I:BYTE); FORWARD;

PROCEDURE A(J:BYTE);

BEGIN

...

B(J);

END;

PROCEDURE B; {параметры опущены}

BEGIN

...

A(I);

END.

Формальные параметры при повторной записи заголовка опускаются.