Лекция №3.

Процедуры и функции в Турбо – Паскале.

План

Процедуры Функции Рекурсивные процедуры и функции.

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

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

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

1. Процедуры

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

Procedure <имя процедуры> (<список формальных параметров>);

<раздел описаний>

begin

<тело процедуры>

end;

В программе все переменные делятся на глобальные и локальные.

Глобальные переменные – это переменные, объявленные в описании основной части программы и действующие в любой ее части.

Локальные переменные – те, которые объявлены в подпрограмме (процедуре или функции) и действующие лишь в ней.

Пример 1 Рисунок «Елка»

program picture;

*

***

*****

*

***

*****

*

***

*****

и т. д.

 
uses crt;

var k: integer;

procedure treug;

begin

writeln(' *');

writeln(' ***');

writeln('*****');

end;

BEGIN

clrscr;

for k:=1 to 3 do

treug;

readkey;

END.

Передача данных из программы в процедуру и наоборот может быть организована двумя способами:

НЕ нашли? Не то? Что вы ищете?

1)  через глобальные переменные

2)  через аргументы процедуры (формальные параметры)

Вызов процедуры в теле программы:

<имя процедуры> (список фактических параметров);

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

Фактические параметры – это переменные, которые передаются процедуре при обращении к ней.

Формальные параметры – это переменные фиктивно присутствующие в процедуре и определяющие тип и место подстановки фактических параметров, над которыми производятся действия.

Число и тип формальных и фактический параметров должны совпадать с точностью до их следования.

Описание формальных параметров:

список имен переменных: тип; или Var список имен переменных: тип;

 

параметры –значения(входные параметры) параметры – переменные(выходные параметры).

Пример 2.Четырехугольник задан четырьмя своими сторонами a, b, c, d, и диагональю f. С помощью процедуры вычисления площади треугольника по трем сторонам, вычислить площадь заданного четырехугольника.

Program pl;

Uses crt;

Var a, b, c, d, f, s1, s2, s: real;

Procedure treug(x, y, z: real; var v: real);

Var p: real;

Begin

P:=(x + y + z)/2;

V:=sqrt(p*(p – x)*(p – y)*(p – z));

End;

BEGIN

Clrscr;

Writeln(‘Введите стороны четырехугольника и диагональ: ’);

Readln(a, b, c, d, f);

Treug(a, b, f, s1);

Treug(c, d, f, s2);

S:=s1 + s2;

Write(‘Площадь четырехугольника = ’, s:5:2);

Readkey;

END.

2. Функции

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

1)  Заголовком;

2)  В теле функции обязательно должен присутствовать оператор присваивания, где в левой части стоит имя функции, а в правой – ее значение. Иначе, значение не будет определено;

3)  Обращением к функции не оператор, а выражение.

Function <имя >(<список формальных параметров>): <тип результата>;

<раздел описаний>

begin

<тело функции>

<имя>:=<значение>;

end;

Пример 3 .Четырехугольник задан четырьмя своими сторонами a, b, c, d, и диагональю f. С помощью функции вычисления площади треугольника по трем сторонам, вычислить площадь заданного четырехугольника.

Program pl2;

Uses crt;

Var a, b, c, d, f, s: real;

Function PL_t(x, y, z: real):real;

Var p: real;

Begin

P:=(x + y + z)/2;

Pl_t:=sqrt(p*(p - x)*(p - y)*(p - z));

End;

BEGIN

Clrscr;

Writeln('Введите стороны четырехугольника и диагональ: ');

Readln(a, b, c, d, f);

S:=Pl_t(a, b,f)+Pl_t(c, d,f);

Write('Площадь четырехугольника = ', s:5:2);

Readkey;

END.

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

3. Рекурсия в Паскале

Алгоритм называется рекурсивным, если в качестве вспомогательного алгоритма (подпрограммы) он использует самого себя.

n!=1*2*3*…*n

 

1, если n=1

n!

n*(n-1)!, если n>1

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

Пример 4. Рассмотрим пример рекурсивной функции вычисления xn, где n- натуральное число.

1, при n = 0

Воспользуемся известным фактом: xn =

xn-1 * x, при n ≥ 1

function deg(x, n: integer): longint;

begin

if n = 0 then deg:=1

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

end;

Рекурсивность функции или процедуры – это не свойство, а способ задания. Любую рекурсивную подпрограмму можно задать не рекурсивно, а с помощью оператора цикла. Рекурсия делает программу лаконичнее, короче в описании. Однако, программа, использующая рекурсию, работает медленнее. Выбирать рекурсию или не использовать ее зависит от того, желаете вы сделать программу «короче» или «быстрее».

В языке Паскаль допускается и косвенная рекурсия, когда, например, процедура А вызывает процедуру В, а та, в свою очередь, - процедуру А. В этом случае, вместо тела опережающей процедуры пишется директива forward, затем следует описание второй процедуры, а после ее завершения следует полное описание первой процедуры.