Заголовок функции состоит из словаFunction, за которым указывается имя функции, затем в круглых скобках записывается список формальных параметров, далее ставится двоеточие и указывается тип результата функции.
В теле функции обязательно должен быть хотя бы один оператор присваивания, в левой части которого стоит имя функции, а в правой − ее значение. Иначе значение функции не будет определено.
Таким образом, общий вид описания функции следующий:
Function Имя[(Список формальных
параметров)]: Тип
результата;
Описательная часть
Begin
Тело функции, в котором обязательно
должно быть присваивание
Имя функции:=значение
End;
Пример 1
Составить программу, подсчитывающую число сочетаний без повторения из n элементов по k.
Число сочетаний без повторения вычисляется по формуле:
Обозначим через n и k переменные для хранения введенных чисел; c − переменную для хранения результата.
Чтобы подсчитать количество сочетаний без повторения, необходимо вычислить n!, (n-k)!, k!
Опишем функцию для вычисления факториала числа
n(n!= 1•2•...•n).
Function factorial(n:Integer):Longint;
{заголовок функции}
Var i: Integer; {описательная часть}
rez: Longint;
Begin {тело функции}
rez:=1;
For i:=1 To n Do rez:=rez*i;
factorial:=rez;
{присваивание значения имени функции}
End;
Первая строчка в описании функции − это ее заголовок. Служебное словоFunction (функция) указывает на то, что именем factorial названа функция. В скобках записан список формальных параметров функции, состоящий из одной переменной целого типа. Далее в заголовке указан тип значения функции. В данном примере результат функции factorial − длинное целое число.
За заголовком функции следует описательная часть функции, которая, как и у программы, может состоять из разделов описания переменных, констант, типов. В данном примере имеется только раздел описания переменных. В нем описаны переменные i (счетчик цикла) и rez (для накопления значения факториала).
Далее идет раздел операторов (тело функции). Результат присваивается имени функции, таким образом функция получает свое значение.
В тексте программы описания функций всегда следуют за разделом описания переменных и до начала основной части, как и описания процедур. После того как функция описана, ее можно использовать в программе.
Program Example_73;
Var n, k: Integer;
a1, a2, a3, c: Longint;
Function factorial (n:Integer): Longint;
Var i: Integer;
rez: Longint;
Begin
rez:=1;
For i:=1 To n Do rez:=rez*i;
factorial:=rez;
End;
Begin
Writeln('Ввод n и k:');
Readln(n,k) ;
a1:=factorial(n); {вычисление n!}
a2:=factorial(k); {вычисление k!}
a3:=factorial(n-k);{вычисление(n-k)!}
c:=a1 div (a2*a3) ; {результат}
Writeln(c);
Readln;
End.
Пусть n=5, k=3. Когда в программе встречается оператор a1:=factorial(n), выполняются следующие действия:
¨ выделяется память для переменных, описанных в функции factorial;
¨ формальному параметру присваивается значение фактического: n:=n (n=5);
¨ выполняется функция, вычисляется факториал числа 5;
¨ значение функции передается в место обращения к этой функции, то есть присваивается переменной а1.
В операторах a2:=factorial(k) и a3:factorial(n-k) еще дважды вызывается функция factorial с параметрами k=3 и n-k=2. Всего в программе имеется 3 обращения к функции factorial, столько же раз выполняются и описанные выше действия.
Еще раз подчеркнем, что функция − это самостоятельная часть программы, имеющая собственные переменные, которым отводится отдельное место в памяти ЭВМ. Этим объясняется тот факт, что переменные с одинаковыми именами, используемые в функции и в основной программе, являются разными (в рассмотренном примере - переменная n основной программы и параметр n функции). При выполнении программы машина "не путает" имена этих переменных, так как области их действия не совпадают.
Это особенно важно при написании больших программ.
Пример 2
Написать функцию, подсчитывающую количество цифр натурального числа. Используя ее, определить, в каком из двух данных чисел больше цифр.
Решение
Мы уже решали похожую задачу, только в ней не требовалось написать функцию.
Надо выделять последнюю цифру числа до тех пор, пока число не станет равным нулю. При этом каждый раз счетчик увеличивается на 1 (начальное значение счетчика − 0).
Function Quantity(x: Longint): Byte;
Var k: Byte;
Begin
k:=0;
While x <> 0 Do
Begin
Inc(k) ;
x:=x div 10;
End;
Quantity:=k;
End;
В заголовке функции указано ее имя − Quantity. Функции передается только один параметр − целое число, количество цифр которого надо найти. Результат − тоже целое число. В разделе переменных описана переменная k − счетчик цифр. В теле функции с помощью цикла While выполняются указанные выше действия (увеличивается значение счетчика и удаляется последняя цифра).
Еще раз заметим, что память для переменной k, которая является локальной, выделяется только тогда, когда начинает свою работу функция. После завершения работы функции эта часть памяти освобождается и значение k будет не определено.
Program Example_74;
Var n1, n2: Longint;
k1, k2: Byte;
Function Quantity(x: Longint): Byte;
Var k: Byte;
Begin
k:=0;
While x<>0 Do
Begin
Inc(k) ;
x:=x div 10;
End;
Quantity:=k;
End;
Begin
Writeln('Введите два числа');
Readln(n1, n2);
k1:=Quantity(n1);
{количество цифр первого числа}
k2:=Quantity(n2);
{количество цифр второго числа}
If k1=k2 Then
Writeln('Одинаковое количество цифр')
Else If k1>k2 Then
Writeln('В первом числе цифр больше')
Else
Writeln('Во втором числе цифр
больше');
Readln;
End.
Пример 3
Составьте программу решения неравенства bn≤a≤bn+1относительно n при условии a≥1, b>1.