Глава 10. Программирование процессов с подпроцессами
Рассмотренные типовые процессы реализовывались как единое вычисление различной структуры и сложности. В общем случае при решении задачи эффективней использовать несколько взаимосвязанных вычислений. Одно из них – основной процесс (процесс), а остальные – подпроцессы, работающие только в комплексе с основным (рис. 10.1).
Рис. 10.1. Структура вычислительного процесса
Процесс – основные (главные) вычисления, реализующие общую цель задачи.
Подпроцесс – дополнительные (вспомогательные) вычисления детализации частных подзадач процесса.
По критерию назначение подпроцессы классифицируются на стандартные и индивидуальные (рис. 10.2).
Рис. 10.2. Классификация подпроцессов
Стандартный – подпроцесс реализации типовых громоздких вспомогательных вычислений.
Типичный пример – расчет тригонометрических и иных трансцендентных функций численным методом.
Индивидуальный – подпроцесс реализации одинаковых по структуре нестандартных расчётов, планируемых в разных точках задачи.
Типичный пример – вычисление сумм, произведений, факториалов для различных аргументов одной задачи.
Программные модули реализации стандартных подпроцессов созданы фирмой-разработчиком языка программирования и хранятся в библиотеках программного обеспечения.
Индивидуальные подпроцессы оформляются пользователем на этапе создания математической модели задачи и требуют разработки отдельных алгоритмов с последующим преобразованием в соответствующие программные модули.
Организация совместной работы процесса с подпроцессами использует три вида данных: локальные, фактические и формальные параметры (рис. 10.3).
Рис. 10.3. Классификация видов данных
Локальные – данные (параметры), используемые внутри процесса или подпроцесса без права передачи.
Фактические – данные (параметры) процесса, численные значения которых требуется передать в качестве аргументов в подпроцесс.
Формальные – данные (параметры) подпроцесса, получающие численные значения соответствующих фактических параметров процесса.
Локальные – реализуются полным набором данных (константы, переменные, функции, арифметические выражения). По месторасположению они жестко разделяются на используемые в процессе и в каждом подпроцессе.
Фактические параметры – отдельные операнды из полного набора данных или их совокупности. Используются только в основном процессе.
Формальные параметры – переменные. Используются только в подпроцессе. Формальными (обезличенными) они называются потому, что не имеют собственных численных значений. Следовательно, подпроцесс самостоятельно, без процесса, работать не может.
Совместная работа процесса с подпроцессом реализуются с помощью обращений.
Обращение – указание перехода из процесса в подпроцесс детализации некоторого фрагмента вычислений.
Структура обращения:
имя (фактические параметры)
где имя – буквенно-цифровое обозначение подпроцесса, к которому осуществляется обращение;
фактические параметры – список операндов процесса, численные значения которых требуется передать в качестве аргументов в подпроцесс. Операнды в списке разделяются запятыми;
( ) – ограничители списка.
Имя выбирается из каталога стандартных подпроцессов или составляется пользователем, определяя назначение конкретного (индивидуального) подпроцесса.
Например, в качестве обращений к стандартным подпроцессам могут использоваться sin(p), sin(p/2), sin(a+b), к индивидуальным подпроцессам – f(a), sum(a, b), f2(0.63, x ,cos(c)). В первых четырёх обращениях используются по одному фактическому параметру, в пятом – два, в шестом – три.
Список фактических параметров определяется математической моделью задачи.
Имена формальных параметров подпроцесса задаются программистом. Ввиду того, что подпроцесс оформляется отдельным модулем, некоторые формальные и фактические параметры могут иметь одинаковые обозначения, однако лучше этого не допускать. Так, в подпроцессе вычисления синуса, разложенного в степенной ряд, в качестве формального параметра выбрана переменная X. Поэтому при работе с процессом, в котором указаны три обращения: sin(p), sin(p/2), sin(a+b), в первом случае формальному параметру «x» будет присвоено численное значение фактического параметра «p», во втором – значение «p/2», в третьем – «a+b».
Обращение к подпроцессу выполняется в соответствующих точках процесса. Число обращений определяется количеством подпроцессов и вариантами их использования.
В процессе одновременно используются его локальные и фактические параметры. В подпроцессе параллельно с формальными параметрами могут применяться и другие операнды (собственные локальные параметры).
Число фактических параметров, указанных в конкретном обращении, определяет количество формальных параметров, используемых в соответствующем подпроцессе.
Так, записанное ранее для использования в процессе обращение sum(a, b), требует в подпроцессе двух формальных параметров, например, «x» и «y», для вычисления функции sum. Первому из них («х») будет присвоено численное значение a, второму («y») – b.
Внимание! Результаты проведённых в подпроцессе расчётов должны быть возвращены в процесс.
Схема взаимодействия процесса с подпроцессами имеет вид рис. 10.4.
В простейшем варианте взаимодействия используется процесс и один подпроцесс.
Выбор метода решения для процессов с подпроцесами, как правило, трудности не представляет. Он предписывает использование процесса с требуемым количеством подпроцессов и числом обращений к каждому из них.
Алгоритмизация процессов с подпроцессами имеет две специфические особенности. Первая – создание нескольких отдельных алгоритмов (основного и вспомогательных).
Рис. 10.4. Схема взаимодействия процесса с подпроцессами
Основной – алгоритм реализации главного вычислительного процесса.
Вспомогательный (дополнительный) – алгоритм реализации конкретного вычислительного подпроцесса.
Внимание! Алгоритмизации подлежат индивидуальные подпроцессы. Стандартные подпроцессы пользовательской алгоритмизации не требуют.
Вспомогательные алгоритмы выполняются в виде отдельных схем. Их особенностями являются:
· надписи «вход» («наименование») в начале алгоритма и «выход» («возвращаемое значение») – в конце;
· использование в качестве операндов запланированных формальных параметров и собственных локальных, если это необходимо.
Вторая – организация взаимодействий алгоритмов с помощью обращений.
Обращения основного алгоритма к вспомогательному выполняются в соответствии со сложностью (спецификой) выносимых в подпроцесс вычислений:
непосредственно из блока, используемого для вычислений (простейший подпроцесс);
специальным блоком «Предопределённый процесс» (подпроцесс с несколькими фактическими параметрами).
Фрагменты основного алгоритма и требуемых ему дополнительных представлены на рис. 10.5.
Блок 3 основного алгоритма содержит два обращения – cos(a) и fakt(c). Первое – стандартное – будет реализовано соответствующей системной подпрограммой. Второе – индивидуальное – реализовано дополнительным алгоритмом именованным fakt (f), где «f» – формальный параметр, принимающий численное значение фактического – «с» – целой положительной константы.
Блок 4 организует из оператора присваивания одно обращение sum(Y(n)), для расчета суммы элементов одномерного массива Y(n) к дополнительному алгоритму 2, именованному sum(T(k)), определяя формальные параметры – одномерный массив Т размером k единиц.
Основной Дополнительный 1 Дополнительный 2
Рис. 10.5. Пример алгоритмизации процесса с двумя подпроцессами
Первый дополнительный алгоритм реализует вычисления факториала по заданному в обращении (блок 3) фактическому параметру «с».
Подразумевается, что результаты проведённых в дополнительном алгоритме расчётов будут возвращены в основной.
В простейшем варианте процесс с подпроцессами использует основной и один вспомогательный алгоритмы.
Программирование процесса с подпроцессами реализуется созданием головной программы и подпрограмм.
Головная (главная) программа – программный модуль, реализующий процесс (основной алгоритм).
Подпрограмма – программный модуль, реализующий конкретный подпроцесс (дополнительный алгоритм).
Внимание! Подпрограмма работает только по вызову головной программы или другой подпрограммы.
Для головной программы и подпрограмм сохраняется соглашение о фактических и формальных параметрах. Головная программа содержит обращения к подпрограмме с указанием её имени и списка передаваемых фактических параметров. Подпрограмма должна иметь имя, указанное в обращении, а в качестве аргументов – формальные параметры, принимающие переданные численные значения для расчёта вынесенных в подпрограмму вычислений.
Подпрограммы, как и подпроцессы, условно делятся на:
стандартные;
индивидуальные.
Стандартные – заранее составлены программистами-профессионалами и вынесены в библиотеки, а пользователь организует только их вызов. Типичные примеры стандартных– подпрограммы вычисления тригонометрических и других функций, размещенные в стандартных библиотеках. Для обращения к ним, в головной программе достаточно указать имя требуемой подпрограммы и фактические параметры, выполняющие роль аргументов. Индивидуальные – составляются самим пользователем по вспомогательному алгоритму с учетом обращения к ней из основного.
В языке Си/Си++ основная базовая конструкция – функция.
Функция – программный модуль, реализующий некоторый обособленный участок вычислений, оформленный отдельным алгоритмом.
Функция – универсальная конструкция программирования как головных, так и дополнительных алгоритмов (рис. 10.6).
Рис. 10.6. Классификация функций Си/Си++ по назначению
Головная функция – основной программный модуль, из которого организуется вызов дополнительных функций.
Дополнительная функция – вспомогательный программный модуль, реализующий конкретный подпроцесс (дополнительный алгоритм).
Вызов функции – обращение к ней для передачи значений фактических параметров и получения результатов её работы.
По критерию взаимосвязь все функции Си/Си++ можно подразделить на вызывающие и вызываемые (рис. 10.7).
Рис. 10.7. Классификация функций Си/Си++ по взаимосвязи
Вызывающая – функция, содержащая вызов (вызовы) любой другой.
Вызываемая – функция, к которой обращен вызов (активизируемая им).
Головная функция всегда вызывающая. Дополнительная – может быть одновременно как вызываемой, так и вызывающей (для других функций).
Дополнительная функция может быть стандартной или пользовательской (рис. 10.8).
Рис. 10.8. Виды дополнительных функций
Стандартная – функция, созданная профессионалами для выполнения типовых вычислений (действий) и хранящаяся в одной из библиотек языка программирования (объектным модулем в машинных кодах).
Пользовательская – функция, составленная им самим на входном языке программирования для компактного оформления некоторого участка вычислений, желательно, многократного использования.
Каждая функция имеет заголовок. Заголовок определяет её основные элементы:
название (назначение);
формальные параметры;
тип возвращаемого результата.
Внимание! Программа в Си/Си++ есть совокупность последовательно расположенных пользовательских функций (головной и дополнительных), в любом варианте их взаимного расположения.
Стиль нисходящего (сверху вниз) программирования рекомендует расположение дополнительных функций под головной в порядке их вызова. В тоже время правила машинной обработки рекомендуют расположение вспомогательных функций надвызывающей, гарантируя безошибочность их использования. Возникающее противоречие устраняется использованием специальной конструкции – прототипа функции.
Прототип (описание) функции – структура, аналогичная заголовку, позволяющая определить основные элементы функции (наименование, формальные параметры, тип возвращаемого результата).
Прототипы вспомогательных пользовательских функций размещаются над вызывающей функцией, позволяя располагать сами функции в любом месте программы. Прототипы стандартных функций находятся в стандартных заголовочных файлах.
С учетом изложенного, программная реализация вычислительного процесса с подпроцессами на алгоритмическом языке Си/Си++ представлена на рис.10.9.
Программирование вычислительных процессов с подпроцессами (вспомогательными функциями) выполняются по-разному, в зависимости от сложности выносимого в подпроцесс участка вычислений. Критерий сложности – количество и структура используемых формальных параметров и результатов, возвращаемых в головную программу (функцию) (рис. 10.10).
Рис. 10.10. Структура фактических параметров
Рассмотрим программирование с использованием подпрограмм различной сложности на конкретных примерах.