Процедуры ( функции ) могут содержать любые операторы языка Паскаль и повторяют структуру основной программы, только текст процедуры ( функции) - заканчивается «;».
Процедуры
Процедура – это независимая именованная часть программы, которую после однократного описания можно многократно вызывать по имени.
<список формальных параметров> - список имен переменных с указанием их типа, передающих информацию в процедуру и возвращающих результаты в основную программу.
Обращение к процедуре из основной программы:
<имя> (<список формальных параметров>);
<список фактических параметров> - список переменных или констант, разделенных запятыми.
Например:
procedure prim(x:real; var s:integer; z,y:integer);
Описан заголовок процедуры где:
x, z, y - передают информацию в процедуру;
s - передает информацию в процедуру и возвращает результат - в основную (можно сказать процедура изменяет значение s, хотя значение s в основной программе может быть до процедуры и не определено).
Чтобы формальный параметр возвращал результат в основную, его необходимо описать с использованием служебного слова var.
Обращение к процедуре из основной:
prim (x, s, z, y); ( имена фактических параметров x, s, z,y - совпадают с именами формальных)
или
prim (a, s1, b, 5); ( именами фактических параметров a, s1, b – не совпадают с именами формальных, а последний фактический параметр является числовой константой)
Формальные и фактические параметры должны совпадать по типу, количеству и порядку следования. Фактические параметры должны быть описаны в основной программе. Они называются глобальными переменными и доступны как в основной программе, так и в процедуре. Формальные параметры отдельно в процедуре не описываются. Время существования глобальных переменных – от начала и до конца работы программы.
Промежуточные переменные, которые используются только в процедуре, описываются в процедуре и называются локальными. Локальные переменные не доступны в основной программе. Время существования локальных переменных – от начала и до конца работы процедуры, в которой они описаны.
Вложенные процедуры
Директива forward
Если одна подпрограмма использует другую, а та, в свою очередь, использует первую, возникает проблема размещения этих процедур в программе. Какую из них поместить в программе первой? В этих случаях прибегают к директиве forward.
Например:
procedure pp1(a,b:integer):forward;
procedure pp2(c: real); {Вторая процедура}
var x,y:integer;
begin
…
pp1(x, y);
end;
procedure pp1; {Первая процедура}
var z:real;
begin
…
pp2 (z);
end;
…
Задача.
Задан одномерный массив вещественных чисел. Найти максимальный элемент массива и определить его номер.
Составим программу с использованием двух процедур:
процедура ввода элементов массива;
процедура поиска максимального элемента и определение его номера.
Для передачи массива в процедуру введем пользовательский тип mas.
program PP;
type
mas=array[1..100] of integer; {пользовательский тип}
var { глобальные переменные }
a:mas;
max:real;
n,max,kmax:integer;
procedure input_mas(n:integer ; var a:mas );
var i:integer; {локальная переменная}
begin
for i:=1 to n do readln(a[ i ]);
end;
procedure max_m(n:integer; a:mas; var max,kmax:integer );
var i:integer;
begin
max:=a[1];kmax:=1;
for i:=1 to n do
if a[i]>max then
begin max:=a[i]; kmax:=i; end;
end;
begin
writeln(‘ Введите n<=100’) ; readln( n );
writeln (‘ Введите элементы массива ‘);
input_mas(n,a);
max_m(n,a,max,kmax );
writeln(‘max=’,max,‘kmax=’,kmax);
readln;
end.
Функции
Если результатом подпрограммы является только одно значение, то имеет смысл оформить такую подпрограмму в виде функции.
Первая строка любой функции:
function <имя >(<список формальных параметров> ):<тип>;
<список формальных параметров> - список имен переменных с указанием их типа, передающих информацию в функцию;
<имя> - возвращает результат в основную программу;
<тип> - тип возвращаемого результата.
Обращение из основной программы к функции возможно в структуре какого либо оператора, например оператора присваивания:
Функция возвращает в основную программу только один результат через переменную, являющуюся именем функции. Эта переменная не должна быть описана в основной программе. В описательной части функции этой переменной должно быть присвоено какое-либо значение, иначе функция не возвращает никакого значения.
Задача.
Составить программу вычисления n! с использованием функции.
n! = 1* 2 * 3 * …* n
program factorial;
{описательная часть основной программы}
var
n,k:integer;
function fun(k:integer):integer;
{описательная часть подпрограммы}
var
p,i:integer;
begin
{исполнительная часть подпрограммы}
p:=1;
for i:=1 to k do
p:=p*i;
fun:=p;
end;
{ исполнительная часть основной программы }
begin
writeln('введите n');
readln(n);
for k: = 1 to n do
writeln(fun(k));
end.
n, k - глобальные переменные.
p, i - локальные переменные.
fun - имя функции, возвращает результат в основную программу.
Имя функции в теле функции в операторах присваивания может стоять только слева от знака «:=» , поэтому использована дополнительная переменная p для подсчета произведения.