Глава 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. Структура фактических параметров

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