Вопросы для проверки знаний.

End.

End.

Begin

Begin

Описание и вызов процедур и функций

Вопросы для проверки знаний.

1. В чем заключается основное назначение модулей (подпрограмм) в программировании ?

2. Какие подпрограммы называют стандартными, а какие - определенные пользователем? Каков порядок их использования в Паскале ?

3. Что такое заголовок подпрограммы и какова его структура ?

4. Что такое вызов подпрограммы и какова его структура ?

5. В чем главное назначение параметров подпрограмм ?

6. Что означают входные и выходные параметры подпрограмм ?

7. Что означают формальные и фактические параметры подпрограмм ?

8. Каков смысл параметров-значений и параметров-переменных ?

9. Могут ли константы передаваться: а) по значению, б) по ссылке ?

10. В чем отличие в передаче выходных параметров у процедур и функций ?

Структура описания процедур и функций в Паскале во многом повторяет структуру программы: в нее входит заголовок, раздел описаний и исполняемая часть. Раздел описаний содержит те же подразделы, что и раздел описаний программы: описания констант, типов, меток, процедур, функций, переменных. Исполняемая часть содержит в составном операторе тело подпрограммы.

Формат описания процедуры имеет вид:

procedure имя процедуры (список формальных параметров);

раздел описаний процедуры

исполняемая часть процедуры

end;

Формат описания функции:

function имя функции (список формальных параметров):тип результата;

раздел описаний функции

исполняемая часть функции

end;

Основное различие между функциями и процедурами состоит в количестве возвращаемых ими значений: любая функция, завершив свою работу, должна вернуть в вызывающий блок программы ровно одно значение, причем его тип нужно явным образом указать уже в описании функции (в конце его заголовка). Для возвращения этого результата используется специальная "переменная", имеющая имя, совпадающее с именем самой функции. Обязательным требованием к описанию функции является то, что оператор присваивания значения этой "переменной" должен встречаться в теле функции хотя бы один раз. Отсюда следует, что среди формальных параметров процедуры могут быть и входные и выходные, а среди формальных параметров функции – только входные. Список формальных параметров может отсутствовать.

Синтаксис списка формальных параметров в заголовке процедуры в общем виде можно представить как:

[список входных параметров;] [var список выходных параметров]

где:

- отдельные элементы списка отделяются друг от друга точкой с запятой;

- если параметры однотипны, то их имена можно перечислять в списке через запятую, указывая общее для них имя типа в конце списка;

- квадратные скобки означают, что данный элемент заголовка может отсутствовать;

-описании параметров можно использовать только стандартные имена типов, либо имена типов, определенные с помощью команды type.

Вызов процедуры в Паскале всегда выполняется отдельным оператором программы, который имеет следующий синтаксис:

имя процедуры[(список фактических параметров)];

Список фактических параметров представляет собой простое перечисление параметров через запятую (без описания типов, как в заголовке процедуры).

При вызове процедуры передача входных параметров происходит следующим образом: фактические входные параметры, указанные в операторе вызова процедуры, подставляются вместо формальных, стоящих на тех же местах в ее заголовке. Передача выходных параметров происходит непосредственно после их определения во время работы тела процедуры – получаемые значения заносятся в те фактические переменные, которые указаны в операторе вызова. После завершения выполнения процедуры происходит возврат (передача управления) в вызывающий блок, в его следующий после вызова оператор.

Примеры описаний и вызовов процедур даны в примерах 1 и 3 п.7.1.

Синтаксис списка формальных параметров в заголовке функции в общем виде можно представить как:

[список входных параметров]

Правила оформления списка входных параметров те же, что и для списка входных параметров процедур. Особенностью тела функции является то, что перед возвратом в вызывающий блок обязательно должен стоять хотя бы один оператор присваивания следующего вида:

имя функции := результат;

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

Вызов функции в Паскале может производиться, как и для процедуры, при помощи отдельного оператора. Кроме этого можно осуществить вызов внутри какого-либо другого оператора, в котором этот вызов играет роль обычного выражения. Чаще всего вызов функций ставят в правой части оператора присваивания, в разделе условий оператора if и т.д., например:

1) Y:=sin(x)+b*cos(x);{вызов ф-ций sin и cos языка Паскаль в правой части оператора присваивания}

2) if proof(a,b) then x:=a else x:=b; {функция proof имеет логический тип и используется в качестве логического выражения в операторе IF}

Общие правила, обязательные при вызове процедур и функций:

1) количество фактических параметров равно количеству формальных;

2) соответствующие фактические и формальные параметры должны совпадать как по порядку их в соответствующих списках, так и по типу.

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

Рассмотрим пример простейшей программы, включающей в себя описание и обращения к подпрограмме с именем order, в которой определяется упорядоченность пары вещественных чисел x и y (они составляют множество входных параметров подпрограммы order). Выходной параметр у подпрограммы один и имеет логический тип. Он равен True при xy и False при x>y.

Пример 1 программы, упорядочивающей по возрастанию вводимые в нее три вещественных числа x,y,z, в которой подпрограмма сравнения двух чисел order оформлена в виде процедуры с выходным логическим параметром ord_val. Для передачи его значения из процедуры в программу в последней используем вспомогательную величину ord_value.

var x,y,z,c: real; ord_value: boolean;{описание переменных основной программы}

procedure order (x,y: real; var ord_val: boolean);{заголовок процедуры}

begin{открытие тела процедуры }

if x<=y then ord_val:=true else ord_val:=false;{тело процедуры }

end; {закрытие тела процедуры }

begin{открытие тела основной программы}

write('Vvedite x,y,z');{приглашение на ввод параметров x,y,z'}

readln(x,y,z); { ввод параметров x,y,z'}

order(x,y,ord_value); {вызов процедуры для параметров x,y}

if not(ord_value) then begin c:=x;x:=y;y:=c end; {перестановка параметров x,y}

order(x,z,ord_value); {вызов процедуры для параметров x,z}

if not(ord_value) then begin c:=x;x:=z;z:=c end; {перестановка параметров x,z }

order(y,z,ord_value); {вызов процедуры для параметров y,z}

if not(ord_value) then begin c:=y;y:=z;z:=c end; {перестановка параметров y,z }

writeln('Rezult :x=',x:8, ' y=',y:8, ' z=',z:8); {вывод результатов расчета}

Пример 2 программы, аналогичной программе примера 1, в которой подпрограмма сравнения двух чисел order оформлена в виде функции.

var x,y,z,c: real;{описание переменных основной программы}

function order (x,y: real): boolean;{заголовок функции}

begin{открытие тела функции }

if x<=y then order:=true else order:=false;{тело функции }

end; {закрытие тела функции }

begin{открытие тела основной программы}

write('Vvedite x,y,z');{приглашение на ввод параметров x,y,z'}

readln(x,y,z); { ввод параметров x,y,z'}

if not(order(x,y))then begin c:=x;x:=y;y:=c end; { коррекция параметров x,y}

if not(order(x,z))then begin c:=x;x:=z;z:=c end; { коррекция параметров x,z }

if not(order(y,z))then begin c:=y;y:=z;z:=c end; { коррекция параметров y,z }

writeln('Rezult :x=',x:8,' y=',y:8,' z=',z:8); {вывод результатов расчета}

1. В чем заключается различие между функциями и процедурами по возвращаемым ими значениям?

2. В чем отличие оформления списков параметров в заголовке подпрограммы и в ее вызове?

3. При каком числе выходных параметров возможно оформление подпрограммы как в виде процедуры, так и виде функции ?

Практическое задание.

1. Исправить текст программы из примера 1 п.7.2 таким образом, чтобы она выполняла сортировку переменных x,y,zпо возрастанию их величин.