Если результатом подпрограммы является только одно значение, то имеет смысл оформить такую подпрограмму не в виде процедуры, а в виде функции. Функция пользователя аналогична процедуре, но имеются два отличия.
• Функция передает в программу результат своей работы — единственное значение, носителем которого является имя самой функции.
• Имя функции может входить в выражение как операнд. Функция возвращает результат в точку своего вызова.
Функция, определенная пользователем, состоит из заголовка и тела функции. Заголовок содержит зарезервированное слово function, имя функции, заключенный в круглые скобки необязательный список формальных параметров и, обратите внимание — в отличие от процедуры, тип возвращаемого функцией значения:
function ИмяФункции(ФормальныеПараметры) : ТипРезультата;Например:
function fibo(n: integer): integer; { n — формальный параметр }Имя функции уникально в пределах программы.
Тело функции по своей структуре аналогично обычной программе:
function ИмяФункции(ФормальныеПараметры) : ТипРезультата;Обратите внимание — в разделе операторов функции должен находиться по крайней мере один оператор, который присваивает ее имени значение, возвращаемое как результат работы функции. Если таких присваиваний несколько, то результатом выполнения функции будет значение последнего оператора присваивания. Если же такой оператор отсутствует или не был выполнен, то значение, возвращаемое функцией, не определено.
В отличие от процедуры, вызов функции не оформляется в виде отдельного оператора. Обращение к функции осуществляется путем использования указателя функции в качестве операнда в некотором выражении. Указатель функции представляет собой имя функции с необязательным списком аргументов — фактических параметров. Требования к ним такие же, как и в случае процедуры.
Например:
writeln(fibo(i)); { параметр — значение переменной }Программа, представленная в листинге 5.4, использовала процедуру для вычисления членов ряда Фибоначчи. Листинг 5.5 решает эту задачу при по¬мощи функции.
Листинг 5.5. Программа вычисления членов ряда Фибоначчи (вариант № 2)
function fibo(n: integer): integer;Представленная программа менее эффективна, чем предыдущая (см. листинг 5.4). В соответствии с программой (листинг 5.5) числа Фибоначчи вычисляются, печатаются и "забываются". При поиске нового, большего числа приходится повторять те же самые действия.
Рассмотренный выше листинг 3.10 содержал программу решения квадратного уравнения. Выполним ту же задачу с использованием функции (листинг 5.6).
Листинг 5.6. Решение квадратного уравнения (вариант № 2)
Обратите внимание — приведенный пример позволяет сделать важный вывод, расширяющий наше представление о функциях. Функция может возвращать более одного результата, если в ней используются параметры-переменные.
Листинг 5.7 содержит программу, вычисляющую значение корня х уравнения f(х) = 4 — ех — 2х2 = 0 методом половинного деления (дихотомии).
Листинг5.7. Вычисление корня уравнения методом половинного деления
function f(x: real): real; предыдущая         меню        вверх         следующая