Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
[ Монахов ] Объектно-ориентированное программирование.doc
Скачиваний:
94
Добавлен:
16.08.2013
Размер:
490.5 Кб
Скачать

2.12. Процедуры и функции. Формальные и фактические параметры. Передача параметров по ссылке, по значению и через указатель.

Процедуры по своей структуре напоминают независимую программу, вложенную в основную программу. Главное их отличие в том, что они, как правило, имеют параметры, передаваемые из внешнего программного блока кода внутрь процедуры и/или обратно. Кроме того, что после окончания описания процедуры становится не точка, а точка с запятой. Процедуры можно использовать в других процедурах или в поле программы. Допускается вложение одной процедуры в другую. Возможная степень вложения зависит от реализации компилятора PASCAL и, как правило, бывает не менее7.

program factor1;

procedure factorial(var x:extended; n:integer); {заголовок

процедуры}

var i:integer; {раздел описания переменных}

begin

x:=1; {тело процедуры}

for i:=1 to n do x:=x*i; {тело процедуры}

end;

var x,y,z:extended; {раздел описания переменных программы}

i,k,l:integer; {раздел описания переменных программы}

begin {начало тела программы}

i:=7; k:=2; l:=100;

factorial(x,i);

factorial(y,(k+l)/2-5*i);

{factorial (z+1,l); — так нельзя!}

factorial(z,l); {так можно}

end. {конец тела программы}

Иногда (как в данном случае) гораздо удобнее использовать процедуру-функцию:

program factor2;

function factorial(n:integer):extended; {заголовок функции с

формальным параметром n}

var i:integer; {локальная переменная функции factorial}

x:extended; {локальная переменная функции factorial}

begin

x:=1; {тело функции}

for i:=1 to n do x:=x*i; {тело функции}

factorial:=x;

end;

var x,y,z:extended; {глобальные переменные программы}

i,k,l:integer; {глобальные переменные программы}

{эти x и y совсем не то, что локальные в factorial}

begin

i:=7; k:=2; l:=100;

x:=factorial(i); {вызов1}

y:=factorial((k+l)/2-5*i); {вызов2}

z:=factorial(l); {вызов3}

end.

При описании процедуры (или функции) переменные, описанные в заголовке процедуры — это формальные параметры (в примере fact2 это n для функции factorial). В теле программы при вызове процедуры на соответствующее место надо подставлять фактические (это строка i в вызове1, (k+l)/2-5*i в вызове2, l в вызове3). Если перед формальным параметром стоит зарезервированное слово var — это передача параметра "по ссылке". В этом случае вместо формального параметра подставляется фактическая переменная соответствующего типа, и если в процессе работы процедуры (или функции) должно меняться значение формального параметра, то реально меняется значение этой переменной. После окончания работы процедуры эта переменная сохраняет изменившееся значение. Т.о. через такой параметр можно передавать значения как "внутрь" процедуры, так и "наружу" из нее. В ряде современных языков программирования такой способ передачи параметров описывают как сочетание in ("внутрь") и out ("наружу"). Смысл термина "передача параметра по имени" следующий: при работе процедуры вместо имени формального параметра подставляется имя фактического, и именно с ним проделывается все то, что описано в процедуре.

Второй способ передачи параметров в процедуру или функцию — "по значению", если перед формальным параметром не стоит зарезервированное слово var. В этом случае в программе в качестве фактического параметра можно писать произвольное выражение соответствующего типа (совместимого по присваиванию). Для формального параметра при вызове процедуры создается временная переменная данного типа. Ей присваивается значение выражения, вычисляемое в процессе присваивания (вот почему говорят о передаче параметра "по значению"). Затем с этой переменной выполняются все действия, описанные в процедуре для формального параметра. Перед завершением процедуры временная переменная (ее называют локальной) автоматически уничтожается, поэтому с ее помощью ничего нельзя передать "наружу". Другими словами — это передача параметра типа in. В некоторых других языках программирования (например, ADA), возможна передача параметра типа out. При этом в процедуре такой параметр может стоять только в левой части присваивания, и его нельзя использовать в выражениях в правой части присваивания или в фактических параметрах процедур.

Передача параметра через указатель – это явная передача адреса ячейки. Единственное отличие от передачи по ссылке заключается в том, что для доступа к ячейке внутри подпрограммы требуется ставить символ ^ после имени указателя.

Соседние файлы в предмете Информатика