Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Способы подстановки аргументов





Процедуры и функции

 

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

 

Содержание

 

Подпрограммы.. 1

Объявление и описание. 2

Объявление функции. 2

Объявление процедуры.. 2

Описание подпрограммы.. 2

Список параметров. 3

Возвращаемые значения. 4

Вызов подпрограмм.. 5

Способы подстановки аргументов. 6

Параметр-значение. 6

Описание. 6

Механизм передачи значения. 6

Параметр-переменная. 7

Описание. 7

Механизм передачи значения. 7

Параметр-константа. 7

Описание. 7

Механизм передачи значения. 8

Области действия имен. 8

Разграничение контекстов. 8

Побочный эффект. 9

Совпадение имен. 9

Нетипизированные параметры.. 10

Явное преобразование типа. 10

Совмещение в памяти. 10

Открытые параметры.. 11

Открытые массивы.. 11

Открытые строки. 11

Процедурный тип данных. 12

Описание. 12

Аргументы.. 12

Вызов. 13

 

Подпрограммы

 

Весьма поэтичное объяснение понятия подпрограмма дал В.Ф. Очков: " Подпрограмма - это припев песни, который поют несколько раз, а в текстах песен печатают только один раз".

 

В самом деле, если есть необходимость многократно совершать одни и те же действия, то вполне логично описать их единожды, а потом лишь ставить на них ссылку. Именно такой смысл имеет использование подпрограмм.

 

С математической же точки зрения любая подструктура - это замкнутая часть целого, которую можно рассматривать как самостоятельную структуру: подмножество является множеством, подгруппа - группой, подалгебра - алгеброй, подпространство - пространством и т.д.

 

Таким образом, подпрограмма - это в первую очередь программа. Со всеми полагающимися полноценной программе атрибутами: именем, разделами описания меток (label), констант (const), типов (type), переменных (var) и даже со своими (вложенными) функциями и процедурами.

 

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

Объявление и описание

 

Подпрограммы объявляются и описываются в начале Pascal-программы, до ключевого слова begin, означающего начало тела программы.

 

Различия между процедурами и функциями начинаются уже с момента их объявления.

Объявление функции

 

Функции объявляются следующим образом:

 

function <имя_функции> [(<список_параметров>)]:<тип_результата>;

 

В отличие от констант и переменных, объявление подпрограммы может быть оторвано от ее описания. В этом случае после объявления нужно указать ключевое слово forward:



 

function <имя_функции> [(<параметры>)]:<тип_результата>; forward;

Объявление процедуры

 

Процедуры следует объявлять так:

 

procedure <имя_процедуры> [(<список_параметров>)];

 

Если объявление процедуры оторвано от ее описания, нужно поставить после него ключевое слово forward:

 

procedure <имя_процедуры> [(<список_параметров>)]; forward;

Описание подпрограммы

 

Описание подпрограммы должно идти после ее объявления. Оно осуществляется по следующей схеме (единой для процедур и функций ):

 

[ uses <имена_подключаемых_модулей>;]

[ label <список_меток>;]

[ const <имя_константы> = <значение_константы>;]

[ type <имя_типа> = <определение_типа>;]

[ var <имя_переменной> : <тип_переменной>;]

 

[ procedure <имя_процедуры> <описание_процедуры>]

[ function <имя_функции> <описание_функции>;]

 

begin {начало тела подпрограммы}

<операторы>

end; (* конец тела подпрограммы *)

 

Если объявление подпрограммы было оторвано от ее описания, то описание начинается дополнительной строкой с указанием только имени подпрограммы:

 

function <имя_подпрограммы>;

 

или

 

procedure <имя_подпрограммы>;

 

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

 

Пример подпрограммы-процедуры:

 

procedure err(c:byte; s:string);

var zz: byte;

begin if c = 0

then writeln(s)

else writeln('Ошибка!')

end;

 

Список параметров

 

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

 

Поскольку внутри подпрограммы параметры рассматриваются как переменные с начальным значением, то имена локальных переменных, описываемые в разделе var (внутреннем для подпрограммы ), не могут совпадать с именами параметров этой же подпрограммы. Подробнее о локальных и глобальных переменных будет сказано в пункте "Разграничение контекстов ".

 

Список параметров может и вовсе отсутствовать:

 

procedure proc1;

function func1: boolean;

 

В этом случае подпрограмма не получает никаких переменных "извне". Упомянутый в начале лекции песенный припев как раз и является примером подпрограммы, в которую не передается никаких данных при вызове.

 

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

 

Если же параметры имеются, то каждый из них описывается по следующему шаблону:

 

[<способ_подстановки>]<имя_параметра>:<тип>;

 

О возможных способах подстановки значений в параметры ( <пустой>, var, const ) мы расскажем в разделе "Способы подстановки аргументов ".

 

Если способ подстановки и тип нескольких параметров совпадают, описание этих параметров можно объединить:

 

[<способ_подстановки>]<имя1>,...,<имяN>: <тип>;

 

Пример описания всех трех способов подстановки:

 

function func2(a,b:byte;var x,y,z:real;const c:char):integer;

 

В заголовке подпрограммы можно указывать только простые (не составные) типы данных. Следовательно, попытка записать

 

procedure proc2(a: array[1..100]of char);

 

вызовет ошибку уже на этапе компиляции. Для того чтобы обойти это ограничение, составной тип данных нужно описать в разделе type, а при объявлении подпрограммы воспользоваться именем этого типа:

 

type arr = array[1..100] of char;

procedure proc2(a: arr);

function func2(var x: string): arr;

Возвращаемые значения

 

Основное различие между функциями и процедурами состоит в количестве возвращаемых ими значений.

 

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

 

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

 

Например:

 

function min(a,b: integer): integer;

begin if a>b

then min:= b

else min:= a

end;

 

В отличие от функций, процедуры вообще не возвращают (явным образом) никаких значений. О том, как все-таки получить результаты работы процедуры, вы узнаете из пункта " Параметр-переменная ".

Вызов подпрограмм

 

Любая подпрограмма может быть вызвана не только из основного тела программы, но и из любой другой подпрограммы, объявленной позже нее.

 

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

 

<имя_подпрограммы>(<список_аргументов>)

 

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

 

Количество и типы передаваемых в подпрограмму аргументов должны соответствовать количеству и типам ее параметров. Кроме того, тип каждого аргумента должен обязательно учитывать способ подстановки, указанный для соответствующего параметра (подробнее об этом будет рассказано в разделе "Способы подстановки аргументов "). Если у подпрограммы вообще нет объявленных параметров, то при вызове список передаваемых аргументов будет отсутствовать вместе с обрамляющими его скобками.

 

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

 

c:= min(a,a*2);

if min(z, min(x,y))= 0 then...;

 

Процедура же ничего не возвращает явным образом, поэтому ее вызов является отдельным оператором в программе. Например:

 

err(res,'Привет!');

 

Замечание: После того как вызванная подпрограмма завершит свою работу, управление передается оператору, следующему за оператором, вызвавшим эту подпрограмму.

Способы подстановки аргументов

 

Как уже упоминалось выше, при вызове подпрограммы подстановка значений аргументов в параметры производится в соответствии с правилами, указанными в атрибуте <способ_подстановки>. Мы рассмотрим три различных значения этого атрибута:

 

  • <пустой>;
  • var;
  • const.

 

Параметр-значение

Описание

 

В списке параметров подпрограммы перед параметром-значением служебное слово отсутствует. Например, функция func3 имеет три параметра-значения:

 

function func3(x:real; k:integer; flag:boolean):real;

 

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

 

dlina:= func3(shirina/2, min(a shl 1,ord('y')), true)+0.5;

 

Для типов данных здесь не обязательно строгое совпадение (эквивалентность), достаточно и совместимости по присваиванию (см. лекцию 2).









Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2018 zdamsam.ru Размещенные материалы защищены законодательством РФ.