Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Osnovy_informatiki_-_8_Podprogrammy_i_moduli

.pdf
Скачиваний:
11
Добавлен:
13.02.2015
Размер:
168.67 Кб
Скачать

Подпрограммы и модули

2012

Перегрузка имен подпрограмм

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

Полиморфизм – использование одного имени (одного знака операции) для выполнения родственных действий над разными типами данных

2

10.11.2012

Чердынцева М.И. мехмат ЮФУ

Примеры

writeln(a,b) – полиморфная процедура: параметры различных типов.

a+b – операция «+» используется для различных типов

procedure swap(var a,b: integer);

...

procedure swap(var a,b: real);

...

3

10.11.2012

Чердынцева М.И. мехмат ЮФУ

Сигнатура подпрограммы

_swap_vi_vi

_swap_vr_vr

В сигнатуру включаются только параметры, но не включается тип результата, возвращаемого функцией

function f (a: integer):integer;

function f (a: integer):real; //!!! Перегрузки нет

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

4

10.11.2012

Чердынцева М.И. мехмат ЮФУ

Проблемы при перегрузке

procedure A(i: integer);

. . .

procedure A(i: real);

. . .

var b: byte;

...

A(b); // ошибка - неоднозначность при вызове процедуры

5

10.11.2012

Чердынцева М.И. мехмат ЮФУ

Параметры по умолчанию

procedure DoOperation(a,b: real; var res: real; op: char=’+’); begin

case op of

’+’: res:=a+b; ’-’: res:=a-b;

...

end;

end;

...

DoOperation(2,3,res);

DoOperation(2,3,res,'*');

6

10.11.2012

Чердынцева М.И. мехмат ЮФУ

Параметры по умолчанию

Значения по умолчанию могут иметь только параметры, передаваемые по значению

Такие параметры должны идти в списке параметров последними

Если подпрограмма имеет несколько параметров по умолчанию, то при вызове опускать фактические параметры можно только подряд

7

10.11.2012

Чердынцева М.И. мехмат ЮФУ

Предварительное описание

procedure p(i: integer); forward; // Предварительное объявление. // p будет определена далее

procedure q; begin

p(3); // можно вызывать end;

procedure p(i: integer); // определение begin

...

end;

8

10.11.2012

Чердынцева М.И. мехмат ЮФУ

Предварительное описание

При наличии предварительного описания в определении можно опустить список параметров

procedure p(i: integer); forward; // Предварительное объявление. // p будет определена далее

;

procedure p; // определение begin

...

end;

Это возможно только, если нет перегрузки имен подпрограмм

9

10.11.2012

Чердынцева М.И. мехмат ЮФУ

Рекурсия

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

Такой механизм называется рекурсивным вызовом

Рекурсивные вызовы позволяют реализовывать рекурсивно определенные функции

Рекурсия лежит в основе теории алгоритмической разрешимости

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

10

10.11.2012

Чердынцева М.И., мехмат ЮФУ