Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Подпрограммы, возвращающие значение (функции)
В том случае, если подпрограмма возвращает одно значение, удобно использовать другую форму подпрограммы - функцию. Заголовок и тело такой подпрограммы отличаются от заголовка и тела процедуры. На Паскале отличия проявляются в том, что 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-07-12; Просмотров: 560; Нарушение авторского права страницы