Программирование с использованием подпрограмм


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

1 громоздкие вспомогательные вычисления, например, взятие тригонометрических и иных функций;

2 одинаковые по структуре расчёты, планируемые в разных точках задачи, например, вычисление сумм, произведений, факториалов для различных аргументов.

Первые из них, как правило, являются стандартными, вторые должны составляться пользователем.

Для организации совместной работы в нужных точках основного алгоритма выполняется обращение к вспомогательному алгоритму (алгоритмам) непосредственно из блоков, используемых для основных вычислений или с помощью специального блока «Предопределённый процесс».

В любом случае обращение записывается внутри блока и имеет структуру:

имя (фактические параметры)

где имя – буквенно-цифровое обозначение дополнительного алгоритма, к которому осуществляется обращение;

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

( ) – ограничители списка.

Имя выбирается из каталога уже разработанных алгоритмов или составляется пользователем, определяя назначение дополнительного алгоритма.

В качестве фактических параметров могут использоваться как отдельные операнды, так и их совокупности.

Например, в качестве обращений могут использоваться sin(p), sin(p/2), sin(a+b) при работе со стандартными вспомогательными алгоритмами или f(a), sum(a,b), f2(0.63, x ,cos(c)) для передачи аргументов в дополнительные алгоритмы пользователя. В первых четырёх обращениях используются по одному фактическому параметру, в пятом – два, в шестом – три.

Дополнительные алгоритмы выполняются, как правило, в виде отдельных схем. Их особенностями являются:

1. надписи вход (наименование) в начале алгоритма и выход (возвращаемое значение) – в конце;

2. использование в качестве операндов формальных параметров.

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

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

Имена формальных параметров выбираются программистом. Ввиду того, что дополнительный алгоритм является отдельным модулем, некоторые формальные и фактические параметры могут иметь одинаковые обозначения, однако лучше этого не допускать. Так, в дополнительном алгоритме вычисления разложенного в степенной ряд синуса в качестве формального параметра выбрана переменная X. Поэтому при работе с основным алгоритмом, в котором указаны три обращения: sin(p), sin(p/2), sin(a+b), в первом случае формальному параметру x будет присвоено численное значение фактического параметра p, во втором – значение p/2, в третьем – (a+b).

В дополнительном алгоритме одновременно с формальными параметрами могут использоваться и другие операнды, как правило, переменные локальные для данного алгоритма.

Число фактических параметров, указанных в обращении, определяет количество формальных параметров, используемых в дополнительном алгоритме. При записанном ранее обращении из основного алгоритма sum(a,b), в дополнительном, для вычисления функции sum, необходимо использовать два формальных параметра, например, x и y. Первому из них будет присвоено численное значение a, второму – в.

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

Схема взаимодействия головного алгоритма с дополнительными имеет вид рис. 6.1.

 

Рис. 6.1. Схема взаимодействия головного алгоритма с дополнительными

В простейшем варианте используется основной и один вспомогательный алгоритмы. Программная реализация рассмотренной схемы состоит из головной программы и подпрограмм.

Головная (главная) программа – программный модуль, выполняющий основные вычисления (основной алгоритм).

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

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

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

В языке Си в качестве основной конструкции используется функция.

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

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

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

Головная функция является основным программным модулем, из которого организуется вызов дополнительной функции (функций).

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

Функции можно также классифицировать на вызывающие и вызываемые.

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

Вызываемой является функция, к которой обращен вызов.

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

Дополнительная функция может быть стандартной или пользовательской.

Стандартной является функция, созданная для выполнения стандартных вычислений (действий) и хранящаяся в одной из библиотек языка программирования в виде машинных кодов (объектных модулей).

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

Каждая функция имеет заголовок. Заголовок определяет её основные элементы: название (назначение), используемые формальные параметры, тип возвращаемого результата.

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

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

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

С учетом изложенного, программный модуль задачи с подпрограммами имеет вид рис.6.2.

Рис.6.2 Структура программы с подпрограммами

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

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

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