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

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

procedure имя [(список формальных параметров)] раздел локальных описаний begin   операторы end;

Оператор вызова процедуры

имя[(список фактических параметров)]

Количество и типы фактических параметров при вызове процедуры должны соответствовать количеству и типам формальных параметров.

Функции

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

Пример. Функция  

function sign(x: real): integer; begin   if x<0 then     sign:=-1   else if x>0 then     sign:=1   else sign:=0 end;

Для того, чтобы функция вернула значение необходимо в её теле имени функции присвоить некоторое значение. Имя функции в этом контексте ведет себя как обычная переменная, но имя функции нельзя использовать в правой части оператора присваивания в качестве значения этой переменной.

var s,a: real; begin   s:=sign(-3);   writeln(s);   read(a);   writeln(sign(a)+sign(1)); end.

Для сравнения реализуем вычисление sign в виде процедуры.

procedure CalcSign(x: real; var sign: integer); begin   if x<0 then     sign:=-1   else if x>0 then     sign:=1   else sign:=0 end;

var a: real;     s,s1,s2: integer;

begin    Calcsign(-3,s);    writeln(3);    read(a);    Calcsign(a,s1);    Calcsign(1,s2);    writeln(s1+s2); end.

Переменная Result

В Delphi и FreePascal неявно определена переменная Result, присваивание которой равносильно и хранит результат функции.

function Sum(n: integer): integer; var i: integer; begin   Result:=0;   for i:=1 to n do     Result:=Result+i // Inc(Result,i) end;

Локальные переменные подпрограмм не инициализируются (место на программном стеке под них отводится при выделении памяти под запись активации), поэтому их явная инициализация обязательна.

Способы передачи параметров Передача по значению. Параметры-значения

procedure Mean(A,B: real; var MA,MG: real); . . . . . . Mean(3,2.1*C+1,MA1,MG1)

При передаче по значению соответствующим формальным параметрам при вызове присваиваются значения фактических параметров.

A:=real(3); B:=2.1*C+1;

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

Передача по ссылке. Параметры-переменные (с ключевым словом var)

procedure Mean(A,B: real; var MA,MG: real); . . . . . . Mean(3,2.1*C+1,MA1,MG1)

При передаче по ссылке передаются не значения, а адреса соответствующих параметров-переменных. В результате любое изменение формального параметра-переменной внутри подпрограммы приводит к изменению соответствующего фактического параметра.

@MA:=@MA1  @-адрес @MG:=@MG1

Фактические параметры-переменные должны иметь ровно тот же тип, что и формальные. Они не могут быть выражениями и должны быть именно переменными.

Передача по ссылке используется для выходных параметров, а по значению - для входных.

Пример. Процедура swap перемены местами двух значений. Входно-выходные параметры.

procedure Swap(var A,B: real); var C: real; begin   C:=A;   A:=B;   B:=C; end;

Семантика вызова подпрограммы

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

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

var r:real; function p(i:integer):real; var r:real; begin   ... end; procedure q(j:integer); var z1:real; begin   r1:=p(1);   writeln; end; begin   q(2);   writeln; end

Статистическая память - это память, которая отводится 1 раз до начала программы. Автоматическая память - это память, которая выделяется на программном стеке и освобождается по ходу работы программы.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]