Практически во всех серьезных программах используют подпрограммы. В Паскале существуют подпрограммы двух типов:
function (функция) и procedure (процедура).
Подпрограммы взаимодействуют с вызывающими их программными единицами (которые могут быть основными программами или, в свою очередь, являться подпрограммами) посредством обмена параметрами (аргументами). Подпрограммы-функции, в отличие от подпрограмм-процедур, возвращают также в своем имени некоторое значение.
Объявляется подпрограмма-функция так:
function <имя функции>(<список аргументов с указанием их типов>):<тип функции>;
var
<раздел переменных функции>
begin
<тело подпрограммы-функции>
end;
Приведем пример подпрограммы-функции, вычисляющей n-факториал(n!):
{после ключевого слова function приведено имя функции - "fu", а в круглых скобках указан аргумент- имя переменной "n" и ее тип - "integer"}
function fu(n: integer):integer; {сама функция fu также имеет тип "integer"}
var f,i: integer;
{в разделе var функции определены переменные: f, i}
begin
{начало тела подпрограммы-функции fu}
f:=1;
for i:=1 to n do f:=f*i; {в цикле вычисляем факториал, f}
fu:=f;
{фукция возвращает значение факториала}
end;
{конец подпрограммы-функции fu}
{далее- основная программа:}
var
{ее раздел var}
n: integer;
{в котором определяем переменную n}
begin
{begin основной программы}
Write(' n=');
readln(n);
{считываем вводимое пользователем значение n}
write( n,'!=',fu(n));
{пишем возвращаемое функцией fu(n) значение n-факториала}
end.
{конец программы}
Подпрограмма-процедура в Паскале определяется следующим образом:
procedure <имя процедуры>(<список аргументов с указанием их типов>);
var
<раздел переменных процедуры>
begin
<тело подпрограммы-процедуры>
end;
Приведем пример подпрограммы- процедуры, вычисляющей n-факториал(n!):
{Процедуры не возвращают в себе никаких значений: они взаимодействуют с вызывающей программой только через передаваемые аргументы. В процедуре fu - два аргумента (параметра): n и f. Параметр f описан с атрибутом var - изменяемый, т.к. процедура передает измененное значение f в вызывающую программу. Параметр n - без атрибута var, поэтому, даже если его значение изменится в процедуре, в основной программе оно останется прежним}
procedure fu(n: integer; var f:integer); {заголовок процедуры fu}
var i: integer;
begin
f:=1;
for i:=1 to n do f:=f*i;
end;
{конец процедуры fu}
{далее- основная программа:}
var {ее раздел var}
n, fuctorial: integer;
begin
{begin основной программы}
Write(' n=');
readln(n);
fu(n,fuctorial);
{!!! обращение к процедуре fu !!!}
write( n,'!=',fuctorial);
end.
В Паскале разрешена рекурсия- прием программирования, когда в подпрограмме встречается вызов этой же подпрограммы. Приведем пример вычисления факториала в подпрограмме, использующей рекурсивный вызов:
function f(n: integer):integer; {функция f}
begin
if n=1 then f:=1 else f:=n*f(n-1);
end;
{далее- основная программа:}
var
n: integer;
begin
Write(' n='); readln(n);
write( n,'!=',f(n));
end.
то же на С то же на Basic то же на Fortran
аналог на JavaScript