Использование подпрограмм является главной особенностью структурного программирования. По сути, подпрограмма представляет собой составной оператор, объединяющий ряд простых операторов. При этом этот «составной оператор» оснащается именем и внешне оформляется как программа. В подпрограмме бывают свои константы, переменные и другие атрибуты полноценной программы. Локальные переменные никак не связаны с одноименными глобальными переменными (относящимися к основной программе).
Зачем нужны подпрограммы? Их использование удобно, когда в программе несколько раз решается одна и та же подзадача, но для разных наборов данных. Кроме того, использование подпрограмм естественно для человека, которому проще воспринимать логически связанные объекты, чем множество разнородных данных.
Программный код подпрограммы описывается единожды перед телом основной программы, затем из основной программы можно им пользоваться многократно. Обращение к этому программному коду из тела основной программы осуществляется по его имени (имени подпрограммы).
В большинстве языков структурного программирования подпрограммы существуют только в виде функций. В Паскале же их два типа: процедуры и функции. Их заголовки выглядят соответственно так:
procedure имя (параметры);
function имя (параметры): тип результата;
Между функциями и процедурами есть существенное отличие. Значение, полученное в результате выполнения кода функции, жестко соотносится с ее именем путем присвоения этому имени конкретного значения. Тип, который может принять вычисляемое значение, указывается в заголовке функции (тип результата). И в теле основной программы функция вызывается только в том случае, если ее имя фигурирует в каком-либо выражении. В то время как процедура вызывается отдельно.
Параметры не являяются обязательным компонентом (Randomize, Procedure Menu), однако их использование повышает гибкость процедуры или функции, т.к. они перестают быть привязанными к определенным данным.
Когда процедура или функция вызываются, то в скобках вместо формальных параметров, указываются фактические параметры (аргументы). Это могут быть либо конкретные значения, либо переменные из основной программы.
Формальные и фактические параметры не обязательно должны быть одинаково обозначены.
Параметры процедур могут быть следущих видов: параметры-значения, параметры-переменные, параметры – константы, бестиповые параметры, параметры-процедуры, параметры-функции.
Пример:
Procedure pr (x1, x2:t1; var x3:t2;const mas:t_mas; var y; procedure g; function f:t4);
Тело подпрограммы, как и любого составного оператора на языке Паскаль, ограничивается скобками begin и end.
Пример использования процедуры.
procedure box (s: char; w,h: integer); {Формальные параметры} var i,j:integer; begin for i := 1 to h do begin for j := 1 to w do write (s); writeln end; writeln end; begin box ('+', 10, 5); {Вызов процедуры} {Фактические параметры} box ('r', 20, 3); box ('|', 50, 10); box ('$', 12, 4); readlnend.
Параметры-значения, параметры-переменные
Параметры-значения (x1, x2:myType) – создается локальная копия переменной, передаваемой в качестве параметров. Существует только во время работы процедуры.
Параметры-переменные (varx1, x2:MyType) – процедура работает с с самой переменной, переданной ей в качестве параметра. Тем самым можно изменять непосредственно значение самой переменной, находящейся в основной программе.