
Процедуры и функции. Решение задач с использованием процедур и функций.
Во всех, ранее рассмотренных примерах считалось, что какой-либо вычислительный процесс необходимо выполнять один раз, например, отсортировать числовой массив по возрастанию его элементов, найти наименьший (наибольший) элемент массива и т.д.
На практике часто возникает необходимость один и тот же вычислительный процесс выполнять несколько раз, используя различные начальные данные. В этих случаях следует использовать подпрограммы, то есть самостоятельные программные единицы, к которым могут обращаться другие программы.
Подпрограмма – это именованная, логически законченная группа операторов, которую можно вызывать любое количество раз в любом месте программы.
Подпрограммы повышают продуктивность работы, экономят память, делают всю программу наиболее наглядной, упрощают разработку больших программ.
В языке ТР есть два вида подпрограмм – процедуры и функции. Они отличаются между собой структурой и способом вызова.
На этапе проектирования программы программисту необходимо определить, какую часть алгоритма нужно реализовать в виде процедуры, а где понадобится функция.
Программа-процедура используется в случаях, когда необходимо получить и передать в вызывающую программу совокупность значений. На этапе проектирования программы программист определяет, какую часть алгоритма нужно реализовать в виде процедуры, а где понадобиться функция.
В главной программе все подпрограммы размещаются после раздела описания данных перед оператором Begin исполняемой части, а вызываются при необходимости в процессе выполнения главной программы или другой подпрограммы.
Любая подпрограмма состоит из заголовка (имени) подпрограммы, раздела описания данных и раздела операторов.
Заголовок процедуры, начинающийся служебным словом procedure, содержит имя и некоторую дополнительную информацию, облегчающую использование этой процедуры.
Структура подпрограммы процедуры имеет вид:
Procedure имя (список формальных параметров);
{раздел локальних данных}
begin {раздел выполняемых операторов}
. . .
end;
Имя подпрограммы выбирает программист, как и имя переменной. В заголовке процедуры после имени перечисляются формальные параметры. В списке формальных параметров перечисляются через «;» отдельные параметры и информация об их типе. Некоторые параметры предназначены для передачи данных в процедуру, другие – для возвращения результатов из процедуры в ту программную единицу, которая их вызывает.
Наличие слова Var перед параметром является внешним признаком его типа. Следует помнить, что в случае, когда параметр должен только передавать значения в процедуру, перед его именем Var можно не ставить (когда формальный параметр является параметром-значением). В случае использования параметра-переменной (если подпрограммы должна вернуть один или несколько результатов в ту программу, которая ее вызвала), перед именем параметра-переменной необходимо ставить слово Var.
Параметр-переменную используют в тех случаях, когда подпрограммы должна вернуть один или несколько результатов в ту программу, которая ее вызвала, например, процедура вычисляет переменную, значение которой необходимо в главной программе.
Параметр-значение используют тогда, когда в подпрограмму нужно передать какую-либо величину и она не должна в ней изменяться.
В общем случае фактический параметр, который отвечает параметру-значению, может быть константой, переменной или выражением, а параметр, который отвечает параметру-переменной, должен быть переменной.
В разделе локальных данных (который вообще может отсутствовать) описывают те данные, которые используются только для «служебных» целей в самой процедуре.
В разделе исполняемых операторов записывают последовательность операторов, которые реализуют необходимый алгоритм. При этом они оперируют с формальными параметрами, локальными и глобальными данными.
Связь между процедурой и отдельными программными единицами осуществляется через списки формальных/фактических параметров и при помощи глобальных переменных.
Необходимо обратить внимание на то, что между формальными и фактическими параметрами должны быть такие требования: количество, тип и порядок размещения фактических параметров должен отвечать количеству, типу и порядку размещения формальных параметров.
Глобальные данные описываются в главной программе, они не являются фактическими параметрами, не описаны в подпрограммах, а могут использоваться и в программе и в процедуре. Использование глобальных данных удобно, но их следует употреблять ограничено, иначе вся программа может стать неудобной для чтения, особенно это касается тех программ, в которых используется насколько подпрограмм.
Следует обратить внимание на особенности использования массивов во время работы с подпрограммами. Массив может быть формальным параметром, при его описании в заголовке нужно ссылаться на заранее описанный тип в главной программе. В языке ТР (начиная с 7 версии) появилась возможность использовать открытый массив, то есть в заголовке подпрограммы указывать массив без задания его длины, а в разделе исполняемых операторов организовывать циклы по обработке такого массива с использованием функции Low и High. Эта функция определяет верхнюю границу массива, который передается в подпрограмму для обработки.
Рассмотрим несколько простейших примеров:
Пример 1
var a,b: integer;
Begin
a:=1; b:=2;
b:=a+b;
writeln(b);
a:=5; b:=9;
b:=a+b;
writeln(b);
readln;
End.
В программе находятся два оператора, каждый из которых предназначен для решения по сути дела одной и той же задачи (сумма переменных a и b). Поэтому алгоритм решения этой частичной задачи целесообразно объявить процедурой.