Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конструирование программ.doc
Скачиваний:
12
Добавлен:
05.05.2019
Размер:
12.37 Mб
Скачать

2.4.4 Процедуры

Синтаксис спецификации процедуры:

procedure <имя>(<список формальных параметров>);

Входные параметры (аргументы) процедуры передаются значением или по адресу, а выходные параметры (результаты) – по адресу.

Вызов процедуры – это отдельный оператор, который содержит имя процедуры и список фактических параметров. Например:

P(x); {это вызов процедуры P с фактическим параметром x}

В качестве примера использования процедуры рассмотрим возведение переменной base в степень exponentbaseexponent (аналогично power).

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

procedure power( base, exponent: real; var pow: real);

begin

pow:= exp( exponent ln(base));

end;

Пример вызова процедуры power:

power(3, 5, j);

writeln(j);

2.4.5 Значения параметров по умолчанию

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

Формальные параметры, имеющие значения по умолчанию, должны быть объявлены друг за другом и должны находиться в конце спецификации подпрограммы.

Пример задания значений параметров по умолчанию:

function power( base: real; exponent: real = 2): real;

begin

result := exp( exponent ln(base));

end;

При вызове power(base, 3) параметр exponent получит значение 3 и результатом функции будет base3. В случае вызова power(base) – exponent получит значение 2 (значение по умолчанию) и результатом функции будет base2.

2.4.6 Перегрузка функций

В языке Object Pascal несколько функций могут иметь одно и то же наименование. Для того чтобы компилятор мог определить, какую именно из этих функций вызвать, одноименные функции должны иметь разные параметры и описание overloadперегруженные.

Пример перегруженных функций:

function Divide (x, y: real): real; overload;

begin

if y<>0 then

result := x / y;

end;

function Divide (x, y: integer): integer; overload;

begin

if y<>0 then

result := x div y;

end;

При вызове Divide (2.4, 2.0) будет вызвана первая функция, при вызове Divide (4, 2) – вторая.

2.4.7. Рекурсивные подпрограммы

Слово рекурсия происходит от латинского слова «recursio» – возвращение.

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

Известными рекурсивными подпрограммами являются вычисление факториала (рисунок 2.8), решение задачи о Ханойских башнях, быстрая сортировка К.Хоара, подпрограммы работы с динамическими структурами данных, подпрограммы построения фракталов и многие другие.

Пример рекурсивной подпрограммы:

Рисунок 2.8 –Рекурсивная подпрограмма вычисления 3!

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

  • рекурсивная подпрограмма имеет хотя бы один параметр

  • рекурсивная подпрограмма всегда содержит условие завершения рекурсии и, если это условие не выполняется, подпрограмма вызывает сама себя с изменением значения параметра.