Подпрограммы, возвращающие значение (функции)
В том случае, если подпрограмма возвращает одно значение, удобно использовать другую форму подпрограммы - функцию.
Заголовок и тело такой подпрограммы отличаются от заголовка и тела процедуры.
На Паскале отличия проявляются в том, что 1) вместо слова procedure пишется function и справа от круглых скобок через двоеточие указывается тип возвращаемого значения; 2) в теле функции должен быть оператор присваивания типа
имя_функции:= возвращаемое значение.
Заголовок функции имеет вид:
function имя(список_формальных_параметров) : тип_возвращаемого_значения ;
ПРИМЕР. Рассмотренная задача нахождения суммы трех чисел может быть оформлена с помощью функции; 1)
var 3)
a, b, c, s : real;
function summa (x, y, z : real) : real;
begin
summa : = x+ y+ z; // в Delphi result:= x+ y+ z; --- возврат знвчения
end;
begin 2)
a := 1;
b := 2; ввод начальных значений
c := 3;
s := 0;
4) writeln(‘s=’,s:8:4); --- до
s := summa(a,b,c,); --- вызов функции
writeln(‘s=’,s:8:4); --- после
end.
Из примера важно выделить два момента:
1-й момент. Форма описания и вызова процедуры и функции отличаются. В отличие от процедуры функция задает не просто набор действий как этап вычислительного процесса (это было в случае процедуры), а задает правило вычисления одного значения (с помощью определенных действий). Поэтому и форма вызова функции другая, чем у процедуры - вызов функции может размещаться или в составе какого-либо выражения или в правой части оператора присваивания (R-value).
В общем случае при вычислении выражения, содержащего вызов функции, выполняются следующие действия:
а) вычисляются значения выражений для фактических параметров функции;
б) значения фактических параметров присваиваются соответствующим формальным параметрам ;
в) выполняются действия в теле функции над формальными параметрами (с переданными им значениями фактических параметров) и вычисляется возвращаемое функцией значение;
г) возвращаемое значение подставляется в выражение, из которого (в котором) осуществляется обращения к функции;
д) вычисляется значение выражения с использованием возвращенного функцией значения.
2-ой момент В теле функции обязательно должна быть хотя бы одна строчка в которой имени функции присваивается возвращаемое значение.(в Delphi вместо этого д.б. строка вида: result:= возвращающие значение;)
Обычно делают две следующих ошибкипри записи функции:
Должно быть имя := значение |
begin
f(x) := x*3.14*2;
end;
Нет параметра при вызове функции |
Begin
g:=25;
g := g * a;
end;
В первом случае сделано две ошибки:
1-я синтаксическая: Нарушен синтаксис, т.к. для возврата из функции значения должен быть записан оператор присваивания в форме имя := значение.
2-я семантическая: для f(x) -компилятор посчитает, что вызов функции стоит слева от знака присваивания.
Во втором случае ошибка (синтаксическая) заключается в том, что имя функции используется в выражении в правой части оператора присваивания так же как имя переменной, т.е. без списка параметров, что не совпадает с тем, что записано в заголовке этой функции (там написано, что функция с параметром).
Примечания.
1. Возвращаемым значением может быть значение простого типа или строкового типа или ссылочного типа. Если в теле функции отсутствует оператор присваивания имени функции какого - либо значения, то возвращаемое значение функции считается неопределенным.
2. Часто бывает так, что необходимо возвращать разные значения функции в зависимости от наступления или не наступления различных ситуаций. В этом случае в теле цикла появляется несколько операторов присваивания имени функции возвращаемого значения. В таких функциях трудно понять, какой из них на самом деле возвращает в данный момент значение, и поэтому такие функции труднее отлаживать. Целесообразно придерживаться следующего правила: если необходимо вычислить возвращаемое значение в нескольких местах тела функции, то нужно ввести специальную вспомогательную переменную для такого присваивания, а затем непосредственно перед завершением тела функции, записать оператор присваивания, где слева - имя функции, а справа - имя вспомогательной переменной:
function fact(n:byte):longint;
var
i:word; //параметр (счетчик) цикла for
f:longint; //вспомогательная переменная
begin
f:=1;
for i:=1 to n do
f := f * i;
fact := f;
end;
Дата добавления: 2016-05-28; просмотров: 2446;