Теоретический материал (Паскаль)

Функции

Другой вид подпрограммы – функция оформляется аналогично процедуре. Отличительные особенности функции: она имеет только один результат выполнения (но может иметь несколько входных параметров); результат обозначается именем функции и передаётся в основную программу.

Функция оформляется в следующем виде:

Function <имя функции>(формальные параметры): тип значения функции;
Var
  . . .
Begin
  . . .
End ;

Вызывается функция по её имени с указанием фактических параметров.

Вызов функции можно делать непосредственно внутри выражения. При вызове функции тип не указывается.

Пример. Пусть требуется найти (x! - y!) * d!.

Напомним, что n! представляет собой произведение n чисел натурального ряда: n! = 1*2*3*......*n

Function fac(n: integer): integer;
Var
  p, i: integer;
Begin
  p:=1;
  for i:=2 to n do
    p:=p*i;
  fac:=p;
End;

Вызвать данную функцию можно так: f := (fac(x) - fac(y)) * fac(d).

Внимание! В теле функции обязательно должен быть хотя бы один оператор присваивания, где в левой части стоит имя функции, а в правой – ее значение. В противном случае значение функции не будет определено.

Различие между процедурами и функциями

Функции - это процедуры особого вида, результатом работы которых является некоторое значение, подобное переменной.

Функция, как и процедура, может иметь список параметров, следующих за именем функции в круглых скобках. Но если имя процедуры используется только для ее вызова, то с именем функции связывается ее значение. На примере задачи сложения двух целых чисел проиллюстрируем возможности Турбо Паскаля 7.0 по оформлению подпрограмм при помощи процедур и функций, а также рассмотрим различия между этими двумя подходами.

Program ProcedureAndFunction;
Uses
  Crt;
Var
  a, b, SumNumbers : integer;
Procedure Summa1(Var Sum : integer; a, b : integer);
Begin
  Sum:= a+b;
End;

Function Sum(a, b : integer) : integer;
Begin
  Sum:= a+b;
End;

Begin
  ClrScr;
  a := 12;
  b := 15;
  Summa1(SumNumbers, a, b);
  writeln ('С помощью процедуры сумма чисел равна ', SumNumbers);
  writeln ('С помощью функции сумма чисел равна ', Sum(a, b));
End.

Вызов процедуры производится по ее имени. Наряду с параметрами-значениями a и b, которые подлежат сложению, в списке параметров присутствует параметр-переменная Sum, который содержит возвращаемое процедурой значение – сумму.

Функция же имеет только два параметра. Это связано с тем, что само имя функции представляет собой идентификатор параметра, значение которого после окончания работы функции равно результату вычисления. Этот параметр соответствует параметру-переменной Sum процедуры. При объявлении функции ей в соответствие ставят определенный тип данных – тип возвращаемого функцией значения.

Объявление функции

Function Sum(a, b : integer) : integer;

внешне похоже на объявление переменной Sum типа integer. Тип функции объявляется следом за списком параметров – после закрывающейся скобки этого списка и двоеточия.

Процедуры и функции в Турбо Паскале отличаются не только описанием, но и способом их вызова. Так вызов функции Sum можно произвести в следующей форме

SumNumbers:= Sum(a,b);

Если не обращать внимания на наличие списка параметров, то этот оператор выглядит как присвоение переменной SumNumbers значения переменной Sum. Компилятор, конечно же, знает, что Sum – это имя функции (т.к. определение функции предшествует ее использованию) и организует вычисления соответствующим образом. Точно так же, как константа или переменная, вызов функции может использоваться в списке параметров оператора write (см. программу), что для процедур невозможно.

Последнее отличие процедур от функций заключается в необходимости присваивания результата вычисления в теле функции переменной, имя которой совпадает с именем функции. Если такое присваивание в теле функции не выполнено, то функция не возвратит никакого результата (точнее, возвратит произвольный результат).

Итак, из вышесказанного возьмите на заметку следующее.

Оформлять подпрограмму как функцию целесообразно только в том случае, если она имеет один выходной параметр. Если же последовательность команд ориентирована на выполнение некоторого действия (выдача информации на экран и т.п.), целесообразно оформлять ее как процедуру.