Функции Ещё одна разновидность подпрограмм
Общие сведения Функция оформляется аналогично процедуре. Отличительные особенности функции: она имеет только один результат выполнения (но может иметь несколько входных параметров); результат обозначается именем функции и передаётся в основную программу. Функция оформляется в следующем виде: Function (формальные параметры: тип): тип значения функции; Var... Begin... End ;
Найти (x!-y!)*d! 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). Внимание! В теле функции обязательно должен быть хотя бы один оператор присваивания, где в левой части стоит имя функции, а в правой - ее значение. Иначе, значение не будет определено.
Различие между функциями и процедурами 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 (см. программу), что для процедур невозможно.
Обязательное присваивание результата Последнее отличие процедур от функций заключается в необходимости присваивания результата вычисления в теле функции переменной, имя которой совпадает с именем функции. Если такое присваивание в теле функции не выполнено, то функция не возвратит никакого результата (точнее возвратит произвольный результат).
Когда что использовать? Оформлять подпрограмму как функцию целесообразно только в том случае, если ожидается результат работы подпрограммы. Если же последовательность команд ориентирована на выполнение некоторого действия (выдача информации на экран и т.п.), целесообразно оформлять ее как процедуру.
Решение задач Найти сумму цифр числа. Найти первую цифру числа. Найти количество делителей числа. Составьте программу, проверяющую, является ли число палиндромом (например, число палиндром). Определить, является ли число автоморфным, то есть квадрат этого числа заканчивается этим же числом, например, числа 6 и 25, т.к. их квадратами являются числа 36 и 625.