Osnovy_informatiki_-_8_Podprogrammy_i_moduli
.pdfПодпрограммы и модули
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 |
Чердынцева М.И., мехмат ЮФУ |