Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


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



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

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

На Паскале отличия проявляются в том, что 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-07-12; Просмотров: 560; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.017 с.)
Главная | Случайная страница | Обратная связь