Подпрограммы, возвращающие значение (функции)


В том случае, если подпрограмма возвращает одно значение, удобно использовать другую форму подпрограммы - функцию.

Заголовок и тело такой подпрограммы отличаются от заголовка и тела процедуры.

На Паскале отличия проявляются в том, что 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:= возвращающие значение;)

Обычно делают две следующих ошибкипри записи функции:

Должно быть имя := значение
1). function f(x : real): real;

begin

f(x) := x*3.14*2;

end;

Нет параметра при вызове функции
2). function g(a: byte): real;

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; просмотров: 2290;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.009 сек.