Osnovy_informatiki_-_7_Parametry_podprogramm
.pdfОбласть видимости и время жизни переменных
procedure p; var i: integer;
procedure q( j: integer);
// имя q принадлежит области видимости процедуры p var j: real; // - ошибка - повторное объявление
var i: real; // - верно – перекрытие области видимости
begin
. . .
end; begin
. . .
end;
21 |
27.10.2012 |
Чердынцева М.И. мехмат ЮФУ |
Статические локальные переменные
procedure p; const n: integer = 0;
begin n:=n+1;
writeln ( n, ‘-тый вызов процедуры P ‘);
end;
22 |
27.10.2012 |
Чердынцева М.И. мехмат ЮФУ |
Перегрузка имен подпрограмм
В одном пространстве имен процедуры (функции) могут иметь одинаковые имена, если они имеют различные списки параметров
Полиморфизм – использование одного имени (одного знака операции) для выполнения родственных действий над разными типами данных
23 |
27.10.2012 |
Чердынцева М.И. мехмат ЮФУ |
Примеры
writeln(a,b) – полиморфная процедура: параметры различных типов.
a+b – операция «+» используется для различных типов
procedure swap(var a,b: integer);
...
procedure swap(var a,b: real);
...
24 |
27.10.2012 |
Чердынцева М.И. мехмат ЮФУ |
Сигнатура подпрограммы
_swap_vi_vi
_swap_vr_vr
В сигнатуру включаются только параметры, но не включается тип результата, возвращаемого функцией
function f (a: integer):integer;
function f (a: integer):real; //!!! Перегрузки нет
Тип фактического параметра определяет, какая из перегруженных подпрограмм будет вызвана
25 |
27.10.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,'*');
26 |
27.10.2012 |
Чердынцева М.И. мехмат ЮФУ |
Предварительное описание
procedure p(i: integer); forward; // Предварительное объявление. // p будет определена далее
procedure q; begin
p(3); // можно вызывать end;
procedure p(i: integer); // определение begin
...
end;
27 |
27.10.2012 |
Чердынцева М.И. мехмат ЮФУ |
Проблемы при перегрузке
procedure A(i: integer);
. . .
procedure A(i: real); overload;
. . .
var b: byte;
...
A(b); // ошибка - неоднозначность при вызове процедуры
28 |
27.10.2012 |
Чердынцева М.И. мехмат ЮФУ |