Подпрограммы. Параметры. Обмен данными подпрограмм с вызывающими блоками

Процедуры и функции в языке Паскаль

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

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

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

Заголовком подпрограммы называют первую строку ее описания, в которой указан тип подпрограммы (procedure - процедура, function - функция), ее имя (идентификатор, образованный по правилам языка Паскаль), а также список ее параметров. Параметры подпрограммы – это специально выделенное множество величин, обеспечивающих передачу в подпрограмму информации из вызывающего блока программы (исходная информация для расчетов подпрограммы) и обратную передачу результатов расчета из подпрограммы в блок. В том случае, когда подпрограмма выполняет одно и то же действие, например, очистку содержимого экрана, и/или может взять все исходные данные для расчетов из операционной системы, переменных Паскаля или используемых библиотек помимо пользователя, то она может не иметь параметров.

Примеры 1 заголовков процедур:

procedure ClrScr;{очистка экрана и заполнение его заданным ранее цветом}

procedure minmax(a,b:real;var min,max:real); {определение минимального и максимального из двух чисел a и b }

Примеры 2 заголовков функций:

function ReadKey:char;{функция определяет содержимое в буфере клавиатуры и возвращает его }

function min(a,b:real):real; {определение минимального из двух чисел a и b }

Вызовом (обращением) к подпрограмме называют совокупность действий, при которой происходит:

1) передача в нее из вызывающего блока исходной информации,

2) внутри подпрограммы производятся все необходимые действия,

3) из подпрограммы в вызывающий блок передаются результаты расчета.

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

Примеры 3 вызовов процедур:

ClrScr;{обращение к процедуре ClrScr для очистка экрана и заполнения его заданным ранее цветом}

minmax(0.005,х,min1,max1); {обращение в процедуре minmax для определение минимального и максимального из двух чисел 0,005 и х, минимум будет помещен в переменную min1,максимум – в max1}

Примеры 4 вызовов функций:

ReadKey;{ожидание нажатия клавиши для перехода от пользовательского экрана в основной}

min1:=min(0.005,y1); { обращение к функции для определения минимального из двух чисел 0.005 и y1и присвоения этого значения переменнойmin1 }

Рассмотрим основные свойства параметров подпрограмм в зависимости от различных аспектов процесса обмена данными.

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

Рис.7.1. Потоки передачи данных между вызывающим блоком и подпрограммой

2. Формальные и фактические параметры. Имена переменных, используемые в заголовке подпрограммы и в ее тексте, называют формальнымипараметрами. Они являются частью описания подпрограммы и не занимают места в памяти, которое отводится соответствующим их по типу реальным величинам. Фактическими называют реальные значения параметров (числовые, символьные и других типов), которые используются при вызове подпрограммы и подставляются в нее из вызывающего блока вместо формальных параметров при выполнении расчетов.

3. Параметры-значения (передаваемые по значению) и параметры-переменные (передаваемые по ссылке).Данные термины характеризуют два возможных способа передачи параметров в языке Паскаль.

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

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