Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АЯП лекции.doc
Скачиваний:
12
Добавлен:
03.12.2018
Размер:
634.37 Кб
Скачать

Структура подпрограмм.

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

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

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

1. Заголовок

PROCEDURE<имя под-мы>(список формальных переменных):ТВЗ

FUNCTION<имя под-мы>(список формальных переменных):ТВЗ

2. Описательная часть

Оформляется по тем же правилам, что и описательная часть основной программы.

3. Тело подпрограммы

BEGIN

Операторы

END;

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

Оформление формальных параметров, которые определяет режим взаимодействия с основной программой.

Существует два режима взаимодействия глобальных переменных, подставленных на место формальных переменных, с основной программой. Эти режимы определяет описание формальной переменной. Формальной переменной называется параметр-значение или параметр-переменная. Формальная переменная описывается в круглых скобках в заголовке по правилам раздела var описательной части программы. Если описание переменной начинается со слова var, то она является параметром-переменной. Определение параметра-переменной заканчивается, как только встречается «;» после var. Если var нет, то определяется параметр-значение.

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

Режим параметра-значения реализуется по более сложной схеме: глобальная переменная, которая подставляется на место такой формальной переменной, не участвует в «вычислениях». Для успешной работы подпрограммы в режиме параметра-значения в блоке данных подпрограммы создается образ этой глобальной переменной. Все изменения фиксируются в образе. Так как блок данных локальных переменных исчезает после завершения работы подпрограммы, то автоматически значение глобальной переменной, подставленной в режиме параметра-значения, «возвращает» то значение, которое было до вызова подпрограммы.

var a,b:integer;

procedure izm(var c:integer; d:integer);

begin

c:=0;d:=0;

writeln (c,d);{0 0}

end;

begin a:=1;b:=1;

writeln(a,b); {1 1}

izm (a,b);

writeln(a,b); {0 1}

end.

Примечание. Считается, что все входящие переменные передаются в режиме параметра-значения, а все выходящие – в режиме параметра-паременной.

Пример.

var a,z,r1,r2:real;

m:integer;

procedure step(c:real;s:integer;var r:real);

var p:integer;

begin r:=1;

for p:=1 to s do

r:=r*c;

end;

begin writeln (‘…’);

read(a,m);

step(a,5,r1);

step(a,m,r2);

z:=(r1+1/r1)/(2*r2);

writeln(z:0:2);

end.

z=(R1+1/R1)/(2*R2)

Примечание. Если проанализовать условие задачи, то видно, что подпрограмма в основной программе должна возвращать всего лишь одно значение, поэтому в качестве подпрограммы целесообразней использовать функцию.

var a,z:real;

m:integer;

function stepf (c:real;s:integer):real;

var p:integer;r:real;

begin r:=1;

for p:=1 to s do

r:=r*c; stepf:=r;

end;

begin read(a,m);

z:=(stepf(a,5)+1/stepf(a,5))/(2*stepf(a,m));

writeln(z:0:2);

end.

Пример. Вычислить y=fact(m)/(fact(5)*fact(2+n))

var y:real;

m,n:integer;

function fact(r:integer):integer;

var f,p:integer;

begin f:=1;

for p:=1 to r do

f:=f*p; fact:=f; end;

begin writeln(‘Введите m и n’)ж

readln(m,n);

y:=fact(m)/(fact(5)*fact(2+n));

writeln(y:0:2);

end.

Т.к. имя функции используется как переменная, то ее можно использовать в теле функции многократно. Например, написать логическую функцию, которая определяет, есть ли в последовательности числа Фибоначчи.

Пример. Последовательность составить не меньше, чем из трех чисел. Числа Фибоначчи – числа из ряда, значение числа равно сумме двух предыдущих из ряда. Окончание ввода – «0».

function fb:boolean;

var a,b,c:integer;

begin writeln (‘Введите три числа’);

readln (a,b,c);

fb:=false;

repeat

if a+b=c then fb:=true;

a:=b; b:=c;

writeln (‘Введите следующее число’);

readln (c);

until c=0;

end.

Имя функции можно использовать только в качестве переменной, которой присваивается какое-либо значение. Особенность компилятора – реализация механизма рекурсии. Рекурсивные подпрограммы – подпрограммы, которые в своем теле вызывают сами себя. Правила оформления такого вызова аналогично правилам вызова подпрограммы в целом. Т.е. имя функции может встречаться и в выражениях. Механизм рекурсии – это циклический процесс, при котором каждый шаг связан с вызовом подпрограммы, формальный параметр которой будет изменяться. Причем механизм рекурсии реализован таким образом, что как только выполняется условие выхода из рекурсии или нарушается условие входа в рекурсию, то компилятор возвращается на предыдущий шаг. Т.е. как только появляется конкретное значение в рекурсивном цикле, рекурсия автоматически сворачивается до ее первого шага. Поэтому тела рекурсивных подпрограмм содержат условный оператор. Операторов циклов в рекурсивной подпрограмме чаще всего не бывает, т.к. рекурсия и есть цикл. Традиционно тело функции состоит из полного условного оператора. Условие – это условие выхода из рекурсии. В ветви положительному имени рекурсивной функции присваивается начальное/конечное значение рекурсивного процесса. А в ветви «иначе» есть оператор присвоения, в выражении которого есть вызов самой этой функции.

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

Пример. Решить процедурную задачу с использование рекурсивной функции. Текст самой программы отличаться не будет. Отличаться будет только функция.

function fr(r:integer):integer;

begin

if r<1 then

fr:=1 else fr:=5*fr(r-1);

end;

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

function step (x:real;n:integer):real;

begin

if n=0 then step:=1

else if n<0 then step:=1/step(x,abs(n));

else step:=x*step(x,n-1);

end;

Примечание. Первое условие в теле рекурсивной функции – условие выхода из рекурсии, поэтому в данной функции вычисление степени не бесконечно.

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