Подпрограммы
В практике программирования часто возникает необходимость выполнения одной и той же последовательности операторов в различных частях программы. Наиболее простым способом реализации программы является запись последовательности операторов в тех участках программы, где это необходимо. Однако такой прием зачастую оказываетcя нерациональным. В этом случае целесообразно оформить повторяющуюся группу операторов в виде подпрограммы. В алгоритмическом языке Паскаль возможно организовать два типа подпрограмм (подпрограммы типа процедуры и подпрограммы типа функции. Процедуры и функции позволяют описать повторяющиеся участки вычислений один раз, а в нужных местах программы приводить лишь обращение к этим описаниям. Использование подпрограмм позволяет сократить объем программы, улучшить ее структуру и уменьшить вероятность наличия ошибок. Предоставляется возможность реализовать структурное программирование. С некоторыми стандартные процедуры и функции вы уже знакомы и использовали их . Это: стандартные процедуры Read, Write, а так же различные стандартные функции вычисления тригонометрических, логарифмических, экспоненты, вычисления квадратного корня и другие функции. Для стандартных процедур и функций разработаны программы, которые записаны в библиотеке и пользователь, соблюдая определенные правила, обращается к ним по имени с указанием фактических параметров (списка или аргументов).
Подпрограмма - функция
Подпрограммой - функцией описывается вычислительный процесс результатом выполнения, которого будет одно значение. Описание подпрограммы - функции выполняется в разделе описаний в подразделе Описание функции вслед за разделом описания глобальных переменных программы. Описание Функция состоит из заголовка, описания локальных переменных и тела функции (группы операторов). Общий вид подпрограммы - функции таков:
Function <имя_функции> (а1;...;аn): <тип результата>;
Раздел описания
функции, который может содержать
описания локальных меток, констант,
типов, переменных, процедур и функций,
действующих в теле описываемой функции.
B
Группа любых
операторов – тело функции
End;
где а1;...;an - список формальных параметров с указанием типа (указателем типа может быть только простой тип, в том числе и создаваемый пользователем). Формальными параметрами могут быть простые переменные, имена массивов.
Функция передает в вызывающую программу единственное значение (результат) через свое имя. Тип передаваемого значения результата определяется в заголовке функции. В теле подпрограммы - функции имени функции обязательно должно быть присвоено рассчитанное значение результата, т.е. теле функции должно хотя бы один раз присутствовать оператор присваивания, в левой части которого указано имя функции.
Обращение к описанной функции в основной программе выполняется аналогично обращению к стандартной функции: указывается имя функции затем в круглых скобках через запятую список фактических параметров <имя_функции>(β1,β2,…,βn),
где β1,β2,…,βn – список фактических параметров. Фактическими параметрами могут быть: константы, переменные (простые и с индексами), массивы, выражения. Список фактических параметров должен строго соответствовать списку формальных параметров (по количеству, порядку следования, типу данных).
Выполнение функции:
Сверяется имя функции с именами стандартных функций библиотеки
Сверяется имя функции с именами функций в разделе описаний программы
Проверяется соответствие списка фактических и формальных параметров
Происходит замена формальных параметров фактическими в теле описания функции
Выполняется модифицированное тело функции
Полученный результат присваивается имени функции и возвращается в основную программу в точку вызова функции.
Если в теле описания функции встречаются имена переменных не входящих в список формальных, они являются глобальными и должны быть описаны в основной программе..
Пример 1. Оформить в виде подпрограммы возведение в целочисленную степень у=хn.
Function rez1 (n:integer; x:real) : real;
var i:integer;
begin
rez1:=1;
for i:=1 to n do
rez1:=rez1*x;
end;
Пример 2. Оформить в виде подпрограммы возведение вещественного числа в вещественную степень y=ax.
Function rez2(x:real; a:real) : real;
begin
Rez2:=exp(x*ln(a));
end;
В примере 2 подстепенное выражение не может принимать отрицательное значение или быть равным нулю. В примере 1 может быть и отрицательным.
Переменные n, x, i примера 1 определены только в теле подпрограммы -функции. Вне тела функции они не определены, т.е. не существуют. Аналогичными переменными являются параметры а, х в примере 2.
Обращение к подпрограмме-функции осуществляется по имени функции с указанием в скобках вместо формальных параметров фактических. Причем имена формальных и фактических параметров могут и не совпадать, но их последовательность, количество и тип должны обязательно соответствовать друг другу. Так, обращение к функции rez2 примера 2 может быть таким:
у:=а*rez2(n,х);,
что соответствует решению задачи у=а*хn. Здесь переменная n обязательно должна быть описана как переменная вещественного типа.
В примере 2 переменные х и а являются формальными параметрами - переменные, формально присутствующие в подпрограмме и определяющие тип и место подстановки фактических значений, передаваемых из вызывающей программы. Конкретные (фактические) значения передают фактические параметры при обращении в вызывающей программе. Так, при рассмотренном выше обращении к функции rez2 фактическими параметрами являются переменные n и x.
Пример 3. Вычислить элементы двух векторов: A={ai}, где i=[1..n], n=10 и B={bk}, где j=[1..m], m=7.
Элементы вектора A и B вычисляются по формулам:
Вычислить значение переменной Z=an-bk, где an и bk количества элементов векторов A и B, принадлежащих интервалу [c..d], где c=-1,5; d=4,8.
Вычисление компонент векторов A, B а также подсчет количества элементов векторов принадлежащих интервалу [c..d] оформить подпрограммой.
Структурная схема подпрограммы имеет вид:
да
нет
да
нет
Вычисления элементов векторов также оформим подпрограммой функцией.