Лекция №3.
Процедуры и функции в Турбо – Паскале.
План
Процедуры Функции Рекурсивные процедуры и функции.
Если в алгоритме некоторая его часть повторяется несколько раз, то удобнее всего такую часть оформить как подпрограмму, написав ее один раз и обращаться к ней по мере необходимости.
Подпрограмма – это часть программы, оформленная в виде отдельной синтаксической конструкции и снабженная именем.
В Паскале подпрограммы называются процедурами и функциями и описываются в разделе описания процедур и функций (обязательно до раздела операторов!).
1. Процедуры
Процедура имеет ту же структуру, что и программа, за исключением заголовка, являющегося обязательной частью процедуры:
Procedure <имя процедуры> (<список формальных параметров>);
<раздел описаний>
begin
<тело процедуры>
end;
В программе все переменные делятся на глобальные и локальные.
Глобальные переменные – это переменные, объявленные в описании основной части программы и действующие в любой ее части.
Локальные переменные – те, которые объявлены в подпрограмме (процедуре или функции) и действующие лишь в ней.
Пример 1 Рисунок «Елка»
program picture;
|
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, затем следует описание второй процедуры, а после ее завершения следует полное описание первой процедуры.


