2. ОСНОВЫ ПРОГРАММИРОВАНИЯ НА ПАСКАЛЕ
2.6. Подпрограммы
Если в программе возникает необходимость выполнить
несколько раз одну и ту же последовательность операторов (не циклически), то
эту последовательность операторов выделяют в самостоятельный блок, к которому
можно обращаться, указывая его имя. Такие разработанные программистом
самостоятельные программные блоки называются подпрограммами пользователя.
Передача данных из вызывающей программы в подпрограмму
и возврат результатов осуществляются с помощью переменных, которые называются параметрами.
Различают формальные параметры – параметры, определенные в заголовке
программы, и фактические параметры – выражения, задающие конкретные значения
при обращении к подпрограмме.
Подпрограмма, чтобы ее можно было вызывать в
программе, должна быть объявлена в разделе описаний программы. Объявить
подпрограмму – значит указать ее заголовок (с используемыми в ней формальными
параметрами), описать локальные (т.е. используемые только в данной
подпрограмме) переменные и, наконец, задать ее тело. В разделе описаний
подпрограммы могут быть объявлены новые подпрограммы, которые, в свою очередь,
также могут включать подпрограммы. Таким образом, возможно множество уровней
вложения подпрограмм. В Паскале приняты два вида подпрограмм: функции и
процедуры.
Функции
Заголовок функции состоит из:
1) зарезервированного слова function;
2) имени подпрограммы – функции;
3) заключенного в круглые скобки списка формальных
параметров;
4) типа возвращаемого функцией значения.
Пример заголовка функции:
function step (
n :
integer ; x, y : real ) : real;
имя формальные
параметры тип результата
В
теле подпрограммы–функции должен находиться, по крайней мере, один оператор,
присваивающий имени функции значение, например:
step
:
= sin (n * x * x) ;
В точку вызова возвращается результат последнего
присваивания.
Пример. Функция, которая возвращает максимальное
из двух целых чисел:
function max
( a, b: integer): integer;
begin
if a > f then
max: = a else max: = b;
end;
Обращение к функции осуществляется по имени с
указанием списка фактических параметров. При этом следует соблюдать соответствие
между формальными и фактическими параметрами по количеству параметров, их типу
и порядку следования.
Например, обращение к функции max
может иметь вид:
max ( x + 5, y)
При таком обращении формальные параметры а и b заменяются
фактическими параметрами х +5 и у, соответственно.
Процедуры
Заголовок процедуры состоит из:
1) зарезервированного слова procedure;
2) имени;
3) списка формальных параметров.
Процедура, как и функция, вызывается по ее имени с
указанием фактических параметров в круглых скобках: имя (фактические
параметры);
Основное отличие процедур от функций состоит в том,
что имени функции присваивается возвращаемое значение, а имени процедуры – нет.
Пример:
программа, использующая процедуру, которая выводит на экран строку, состоящую
из звездочек. Длина строки (количество звездочек) является параметром
процедуры.
Program
primer;
n : integer;
procedure starline ( k :
integer); {заголовок процедуры}
var
i : integer; {описание переменной для процедуры}
begin {начало тела подпрограммы}
for
i : = 1 to k do
write
( ′ * ′ );
end; {конец тела подпрограммы}
begin {начало основной программы}
write ( ′ n = ′ ); readln (n);
starline (n); {вызов подпрограммы}
end.
В подпрограмму можно передавать целый массив. Для
этого в качестве формального параметра указывается массив, тип которого должен
быть сначала описан в разделе описания типов type.
Например:
const
n=5; m=6;
type
mas
= array [1..n, 1..m] of real;
var
m : mas;
procedure pr(a
: mas);
В этом случае обращение к процедуре в вызывающей
программе будет иметь вид : pr(m); При этом
формальный параметр – массив а –
принимает значение фактического параметра – массива m.
Когда
лучше использовать процедуры и когда функции? Это зависит от конкретного
случая. Если подпрограмма вычисляет единственный результат, ее можно
реализовать как функцию. Если же от подпрограммы требуется вычислить несколько
значений, ее лучше оформить в виде процедуры.
Область действия параметров
Все
объекты (метки, константы, типы, переменные, процедуры и функции), которые
описываются после заголовка подпрограммы, называются локальными объектами
и доступны только в пределах этой подпрограммы, но недоступны вызывающей программе.
Эти объекты создаются при входе в подпрограмму и уничтожаются при выходе из
нее.
Все
объекты, описанные в вызывающей программе, называются глобальными.
Они доступны внутри подпрограмм, вызываемых этой программой. Поэтому обмен
данными между программой и вызываемой ею подпрограммой может производиться и
через глобальные переменные.
В
Турбо Паскале допускается любой уровень вложенности процедур и функций.
Процедура, описанная в основной
программе, может иметь описания внутренних процедур и функций и так далее. При
этом объекты, описанные в вызывающей процедуре, являются глобальными по
отношению к вызываемой процедуре.
Например,
пусть структура блоков некоторой Паскаль-программы
схематически может быть изображена таким образом:
Объекты,
описанные в блоке В, известны (видимы), кроме самого
блока В, еще и в блоках C и D, но невидимы в блоке А. Объекты, описанные в блоке F, известны только в пределах этого блока.