Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Чет про программирование / 13) Процедуры и функции

.docx
Скачиваний:
25
Добавлен:
25.04.2015
Размер:
17.62 Кб
Скачать

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

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

Подпрограммы решают три важные задачи:

  • избавляют от необходимости многократно повторять в тексте программы аналогичные фрагменты;

  • улучшают структуру программы, облегчая ее понимание;

  • повышают устойчивость к ошибкам программирования и непредвидимым последствиям при модификациях программы.

Подпрограммы могут быть стандартными, т.е. определенными системой, и собственными (пользовательскими), т.е. определенными программистом.

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

По своей структуре они очень напоминают программу и состоят из заголовка и блока. Заголовок процедуры состоит из зарезервированного слова procedure, имени процедуры и необязательного заключенного в круглые скобки списка формальных параметров. Имя процедуры - это идентификатор, уникальный в пределах программы. Формальные параметры - это данные, которые вы передаете в процедуру для обработки, и данные, которые процедура возвращает. Если процедура не получает данных извне и ничего не возвращает, формальные параметры (в том числе круглые скобки) не записываются. Тело процедуры представляет собой локальный блок, по структуре аналогичный программе:

  • procedure <имя процедуры> ( <список формальных параметров> ); const ...; type ...; var ...; begin <операторы> end;

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

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

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

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

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

Директивы подпрограмм

Директивы дают дополнительную информацию компилятору о размещении подпрограмм.

  • Forward. Если одна подпрограмма использует другую, а та, в свою очередь, эту первую, то возникает проблема размещения этих подпрограмм в программе (ни одну из них нельзя поместить перед другой). Чтобы устранить это противоречие, используется директива forward. Сначала описывается полный заголовок первой процедуры с ключевым словом forward, затем полностью описывается вторая процедура, использующая первую, после чего полностью описывается первая процедура.

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

Перегрузка

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

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

  • procedure Increment(var Value: Integer); overload;

  • procedure Increment(var Value: Real); overload;

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

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

Соглашения о вызове подпрограмм

  В различных языках программирования используются различные правила вызова подпрограмм. Для того чтобы из программ, написанных на языке Паскаль, возможно было вызывать подпрограммы, написанные на других языках (и наоборот), в языке Паскаль существуют директивы, соответствующие четырем известным соглашениям о вызове подпрограмм: register, stdcall, pascal, cdecl.

Директива, определяющая правила вызова, помещается в заголовок подпрограммы.