Функции и процедуры.
-
реализуют принципы структурного программирования. К функциям и программам обращаются если необходимо:
-
разделить большую задачу на несколько меньших по объему и сложности задач;
-
уменьшить объем программы за счет выделения типовых программных действий в функции или процедуре;
-
создание программных модулей, которые могут быть использованы и в других программах.
Структура программы. Содержание процедуры, функции.
Program <имя>;
<описательная часть>; (описание глобальных меток, констант, переменных);
procedure <имя процедуры>;
(function <имя функции>;)
<описательная часть процедуры/функции>; (описание локальных меток, констант, переменных)
begin
<исполнительная часть процедуры/функции>;
end;
begin
<исполнительная часть основной программы>
end.
Процедуры/функции - могут содержать операторы PASCAL. Строятся по тем же правилам, что и основная программа, только текст процедуры/функции заканчивается после end -;
Процедуры.
Procedure <имя> (список формальных параметров);
-
строится по правилам составления имен основных программ;
-
список переменных передающих информацию в процедуру, а результаты - в основную программу.
Обращение к процедуре из основной прогаммы:
<имя> (список фактических параметров);
-
список переменных или констант, разделенных запятыми.
Пример:
Procedure PRIM (x: real; var s: integer; z, y: integer);
x, z, y - передают информацию в процедуру;
s - передает информацию в процедуру и возвращает результат - в основную (можно сказать процедура изменяет значение s, хотя значение s в основной программе может быть до процедуры и не определено).
Чтобы формальный параметр возвращал результат в основную, его необходимо описать словом var.
Обращение к процедуре из основной:
PRIM (x, s, z, y); или (из другого места программы)
PRIM (a, s1, b, 5);
Формальные и фактические параметры должны совпадать по типу, количеству и порядку следования. Фактические параметры должны быть описаны в основной программе. Они называются глобальными переменными. Формальные параметры отдельно в процедуре не описываются.
Переменные, промежуточные, используемые в процедуре - должны быть описаны в процедуре и называются локальными.
-
Локальные метки не доступны из основной программы.
-
Глобальные метки - доступны в процедуре.
Функции.
Function <имя > (список фор. Параметров):
<тип результата>;
-
передает информацию в программу-функцию.
-
<имя> - возвращает результат в основную программу.
Обращение из основной к функции:
<переменная>: = <имя> (список фактических переменных);
Функция возвращает в основную программу только один результат через переменную, являющуюся именем функции. Эта переменная не должна быть описана в основной программе. В основном блоке функции этой переменной должно быть присвоено какое-либо значение, иначе функция не возвращает никакого значения.
Пример:
Function SUM (x, y: integer): integer;
Обращение к ней из основной
A: =sum (a, b); или
B: =sum (z, 2);
Рассмотрим применение процедур при работе с массивами.
Пример:
Program pr;
type
mas: array [1…10] of integer;
var
i, n: integer;
k: mas;
procedure input _ mas (var k: mas; n: integer);
var
j: integer;
begin
for j:=1 to n do
readln (k[ j ]);
end;
begin
writeln ('введите n'); readln (n);
input _ mas (k, n);
for i:=1 to n do
writeln (k[i]);
end.
j - локальная переменная.
i, n, k - массив - глобальные переменные.
Пример:
Program pr;
Описание
var
a, b, s: integer;
Процедура
procedure summa (var s: integer; a, b:integer);
begin
s: =a+b;
end;
Функция
fnction sum (a, b: integer): integer;
begin
sum: = a+b
end;
Основная программа
begin
a:=10; b:=15;
summa (s, a, b); writeln (s);
s:= sum (a, b); writeln (s);
end.
Директива 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;
end.
Задача: составить программу нахождения палиндромов в диапазоне 09999, используя процедуру.
program palindrom;
var
f, i: integer;
procedure two (var f: integer; i: integer);
var
a, b: real;
begin
a: =int (i/10); b:=i-a*10;
if a=b then f:=1;
end;
procedure thr (var f: integer; i: integer);
var
a, c: real;
begin
a:= int(i/100); c:= i-int(i/10)*10;
if a=c then f:=1;
end;
procedure fo (var f: integer; i: integer);
var
a, b, c, d: real;
begin
a: =int (i/100); b: =int((i-a*1000)/100);
c: =int ((i-a*1000-b*100)/10);
d: =i-a*1000-b*100-c*10;
if (a=d) and (c=b) then f=1;
end;
begin
for i=0 then 9999 do
begin
f:=0
case i of
0 .. 9 : f:=1;
10 .. 99 : two (f, i);
100 .. 999 : thr (f, i);
1000 .. 9999 : fo (f, i);
end;
if f=1 then writeln (i);
end;
end.
Задача: составить программу вычисления n! С использованием функции.
program factorial;
Описательная часть основной программы:
var
n, k: integer;
function fac (k: integer): integer;
Описательная часть подпрограммы:
var
p, i: integer
begin
Исполнительная часть подпрограммы:
p:=1
for i:=1 to k do
p: = p*i;
fac: =p;
end;
Исполнительная часть основной программы:
begin
write ('введите n');
readln (n);
for k: = 1 to n do
writeln (fac(k));
end.
n, k - глобальные переменные.
p, i - локальные переменные.
fac - имя "функции", возвращает результат в основную программу. Может в подпрограмме присутствовать в операторах присваивания только слева от знака "=".
Второй вариант задачи вычисления n!
program factorial;
var
n: integer;
function fac (i: integer): integer;
begin
if i=1 then fac: = 1
else fac: = i * fac(i-1);
end;
begin
writeln ('введите n');
readln (n);
writeln ('n! = ', fac(n));
end.
Подпрограмма-функция многократно обращается сама к себе. Вычисление начинается с конца i = n и до i = 1.