УДК 519.175:519.683.2
ГРАФЫ АЛГОРИТМОВ. I. СТРУКТУРА И ФУНКЦИИ
© Д.Я. Брюске, Я.Э. Брюске
D.Y. Brtlske & Y.E. BrUske. The graphs of algorithms. I. Structure and functions. The flowcharts of algorithms are transformed into simple directed graphs. Such graphs occupy a considerably smaller place, retaining the clearness of the algorithm structure and the order of the algorithm process control transfer. The step of the algorithm is represented by means of one graph vertex uniting operations of the same type accomplished in the natural way. The steps (vertices) determining different forms of controlling operations are lettered differently. The numbering of vertices is common and realised in the natural succession of algorithm steps. Lettering and numbering give the possibility to form the linear algorithm graph record and process it. The accompanying record is enclosed to describe algorithm actions. It includes the designation of graph steps with the description of concrete actions in each of them. The language of the accompanying record does not contain any reserved words because the order of the algorithmic operations execution and that of control transfer are completely determined by the graph.
Совокупность правил (предписаний) алгоритма определяет последовательность действий, которая преобразует исходные объекты (данные) в конечные (результаты) [1 - 4]. Обычно эти действия выполняются в порядке простого следования друг за другом без какого-либо специального указания (команды) о передаче управления алгоритмическим процессом. Такой порядок называют естественным [5], а всю последовательность, в которой действия осуществляются в естественном порядке - естественной [11]. Естественная последовательность начинается с действий над исходными данными и заканчивается получением необходимых результатов.
Иногда, в зависимости от характера объектов и (или) результатов предшествующих действий с ними, появляется необходимость отклонения от (выхода из) естественной последовательности, чтобы выполнить другой ряд действий, в ней не содержащихся. На необходимость такого выхода нужно указание о передаче управления, которым является некоторое суждение (условие) о свойствах и отношениях объектов, с которыми «работает» алгоритм, выход из последовательности с действиями вне ее осуществляется при истинности значения условия, после чего происходит возврат в естественную последовательность [3]. Чаще имеют место некоторые дополнительные к этим действия, которые выполняются только при ложном значении условия [3, 5,
6]. При истинном значении условия они пропускаются при возврате в естественную последовательность, т.е., также находятся вне ее. Ряд действий, выполняющихся при выходе из естественной последовательности, образует свою естественную последовательность, которую целесообразно назвать (естественной) подпоследовательностью. Иногда необходимо повторить выполнение такой подпоследовательности несколько (много) раз, это повторение организуется специальными приемами (циклы [3, 5, 6]).
Ввиду того, что здесь предлагается новая форма описания алгоритмов, необходимо коротко рассмотреть некоторые существующие формы такого описания. Эти формы обычно используются при
составлении программы для ЭВМ, когда непосредственно составить программу по содержательному описанию задачи и (или) математической модели ее решения трудно. Исходя из описания задачи и математической модели, рисуют схему алгоритма, раскрывающую в той или иной степени его структуру. Эта схема является ориентированным графом [2, 7], вершины которого изображают в виде геометрических фигур, блоков (блок-схемы [1]). Размеры блоков почти всегда позволяют описать в них необходимые действия [6], дуги блок-схемы показывают и порядок выполнения действий в естественной последовательности и направления отклонений от нее. Блоки, показывающие начало и конец действий, условия отклонения от естественной последовательности, отдельные действия, ввод-вывод обозначают различными геометрическими фигурами. На рис. 1 (к первым девяти рисункам пояснения в тексте) показан общий вид блок-схемы алгоритма. Номерами обозначены блоки, входящие в естественную последовательность, блоки а, Ь и с, с! и е образуют три подпоследовательности.
Существенным недостатком блок-схем является их громоздкость, из-за чего они становятся неудобными для описания больших алгоритмов [3]. В таком случае переходят к описанию алгоритма на псевдокоде, представляющем собой в некоторой степени произвольный язык, промежуточный между
д
(началоWbboJt /[дейст /данныхЛ| вие
d дейс е дейс
твие твие
Рис. 1.
естественным языком и языком программирования [3, 8]. По мере приближения разработки к составлению программы элементы естественного языка заменяются элементами алгоритмического языка, представляющего собой сочетание арифметическо-алгебраической символики и элементов языков программирования типа языка Паскаль (на таком языке описывает свои алгоритмы автор [9]), а затем и эти элементы заменяют элементами того языка, на котором будет написана программа для ЭВМ.
Предлагаемые в настоящей работе вместо блок-схем «обыкновенные» ориентированные графы алгоритмов, сохраняя присущую блок-схемам наглядность представления структуры алгоритма, не имеют основного их недостатка - громоздкости - и их можно свободно применять для описания больших алгоритмов.
Строение ор1рафа алгоритма. В блок-схеме рис. 1 можно определить пять типов вершин (блоков), различающихся числом и направлением их дуг. Вершина 1 имеет только одну выходящую дугу (ее стрелка направлена от вершины) и как бы дает указание (команду) о начале работы алгоритма, а вершина 9, имея одну входящую дугу (стрелка идет к вершине), сигнализирует об окончании работы алгоритма. Эти вершины можно назвать начальной и конечной. Вершины 2, 3, 4, 7, а, в, с, (3, е, 8, несмотря на возможное различие в характере совершающихся действий, описанных в их блоках, имеют принципиальное сходство в том, что, принимая управление действиями от предшествующей вершины, каждая из них, произведя описанные в ее блоке действия, передает управление, с результатами этих действий, последующей вершине. Передача происходит по естественному порядку. Такие вершины называются операторными или функциональными [2]. У каждой из них - одна входящая и одна выходящая дуга. Следующий тип - вершины 5 и 6: в каждую входит одна дуга, а выходят две. Это условные (предикатные [2]) вершины: вершина 5 при истинности значения содержащегося в ее блоке условия передает управление вершине Ь, а при ложности -вершине а; вершина 6 при истинности или ложности значения условия передает управление соответственно вершине с! или 7. Две вершины последнего типа обозначены точками и не имеют номеров. Имея две входящие и одну выходящую дугу, они показывают место, куда должен произойти возврат управления в естественную последовательность после выхода из нее. Такие вершины называются объединяющими [2]. Их можно также назвать точками (местами) возврата.
В отличие от блок-схемы, в предлагаемых здесь графах все вершины обозначают точками и, вместе с точками возврата, помечают буквами с номерами. Буквы служат для различения вершин различных типов, а номера обозначают порядок их следования. На рис. 2 показан граф, соответствующий блок-схеме рис. 1. По сравнению с блок-схемой граф выглядит компактнее и будет занимать относительно нее тем меньше места, чем больше будет соответствующий ему алгоритм. Однако описать необходимые алгоритмические действия в самом графе теперь невозможно, и это описание переносится в сопровождающую запись к графу. Следующее упрощение заключается в том, что все операторные (функциональные) вершины, идущие в естественной
последовательности и не разделенные вершинами других типов, объединяют в одну (рис. 3). Обозначения вершин В и 5 заимствованы у [1, 5], А - от слова «алгоритм», Е - от «ЕпсЬ, V - обычное обозначение вершины в графе [7]. Обозначение начальной вершины является заголовком графа, поэтому ее не нумеруют. Для различения графов в заголовке после А пишут другие буквы и (или) слова (русские, английские). Заголовок может совпадать с названием (или частью) алгоритма.
Еще одно упрощение осуществляется в случае отсутствия действий вне естественной последовательности при невыполнения условия (рис. 4). Для этого треугольник В256УЗ заменяют одной вершиной ВБ2 (рис. 5). Она передает управление по естественному порядку, но действия в ней выполняются не всегда, а только при истинном значении содержащегося в ней же условия.
В графе можно выделить части (подграфы [7]), являющиеся структурами управления. Структура, передающая управление между функциональными вершинами по естественному порядку, является простой ориентированной цепью (орцепь или пугь [7]). Она отражена на рис. 2 вершинами Б1 - БЗ, Б8 и Ё9, Б12 и Б13, Б14 и Б15 и «спрятана» в вершинах 51, Б6, Б8, 89 и Б10 на графе рис. 3. Такая управляющая структура называется композицией [2], так как функция в Б2 обычно является аргументом функции в БЗ (рис. 2). Таким образом, композиция, как управляющая структура, находится «внутри» одной вершины (рис. 3). Управляющая структура, представленная на рис. 3 подграфом с вершинами В2, Б8, Б9, УЗ, называется выбором или альтернативой [2]. Нумерация этих вершин производится так, что при выполнении (истинности значения) условия управление передается вершине с ббльшим номером, и поэтому отметки «да» и «нет», как это делают на
Рис. 2.
АБ Э1 В2 88 УЗ У4 В5 Б6 Е7
\/ V
Б9 Б10
Рис. 3.
АВ 81 В2 УЗ 84 Е5
Рис. 4.
АГ Б1 ВБ2 БЗ Е4 »—» « » |
Рис. 5.
блок-схемах, здесь не нужны. Следующая управляющая структура представлена на рис. 3 подграфом с вершинами У4, В5, Б10. Здесь точка возврата в естественную последовательность находится до соответствующего условия и при его выполнении проверка и действия в Б10 повторятся. Это - итерация [2], являющаяся циклом с предусловием, так как условие проверяется перед первым же входом в цикл. На графе цикл этой структуры можно полностью обойти по дугам в одном и том же направлении, такой цикл называется ориентированным циклом (орцикл) или контуром [7]. Рассмотренная перед этим управляющая структура выбора также имеет цикл, но его невозможно обойти в одном и том же направлении по дугам, поэтому он не является контуром. Наличие контура является неотъемлемым признаком циклической управляющей структуры. Предложенная здесь управляющая структура ВБ (граф рис. 5) является частью альтернативы [2]: отсутствуют действия вне естественной последовательности при ложном значении условия. Это и дало возможность осуществить здесь передачу управления в естественном порядке, наличие «скрытого» в вершине ВБ ветвления отличает эту управляющую структуру от композиции.
На рис. 3 не представлена еще одна управляющая структура, которая также является итерацией (циклом), но в нем условие проверяется не до, а после первого входа в цикл. Это - цикл с постусловием (рис. 6). Вход в него - естественный, и действия в БЗ обязательно выполнятся один раз, тогда как в цикле с предусловием действия в Б10 (рис. 3) могут не выполниться ни разу. Поэтому действия в цикле с постусловием входят в естественную последовательность, а выход из такого цикла осуществляется при истинном значении его условия.
Еще одним, кроме контура, неотъемлемым признаком обеих циклических структур является непосредственное соединение (смежность [7]) на графе входа в цикл (всегда - объединяющая вершина) и предикатной вершины этого же цикла. Этот признак показывает, что ничто не мешает возврату управления к условию или от него после каждого прохода цикла.
Рассмотренных выше четырех управляющих структур достаточно, как утверждают авторы [2], для разработки любого алгоритма.
На рис. 7 приведена структура с контуром, отличающаяся от рассмотренных циклических структур. В этой структуре вершина Б6 не может возвратить управление в В4, так как отделена от нее БЗ, а непо-
АД Б1 М2 В4 85 Е6
Э6
Рис. 7.
средственно передать управление 83 также не может, так как не находится в ней в естественном порядке. Поэтому для передачи управления от Б6 БЗ необходимо применить указание (команду), которое можно включить в число действий Б6. Команда (переход) должна отсылать к вершине У2, которая в этом случае играет роль метки и находится с БЗ в естественном порядке. После этого алгоритм рис. 7 «заработает», как цикл с постусловием по отношению к БЗ и как цикл с предусловием по отношению к Бб. В [2] показано, как можно преобразовать эту структуру в стандартный цикл с предусловием. Контур рис. 7 относят к числу неструктурированных, имея в виду структурное программирование [3, 6, 10].
Подпоследовательности (вложения). При помощи альтернативы можно вывести некоторые действия и из подпоследовательности. Такой процесс может повториться при действии одной управляющей структуры «внутри» другой. В этом случае говорят о вложенных условиях [2, 3] и вложенных циклах [3, 11]. На рис. 8 штриховыми линиями обведены вложения, образованные различными управляющими структурами. Римскими цифрами отмечена глубина (уровень) вложения (вложение во вложение). Номером 1 отмечены вложения в естественную последовательность, которые обычно таковыми не считаются [2].
Шаг в графе алгоритма. Понятие шага является важным понятием в теории алгоритмов, но содержание его определяют неоднозначно. Наиболее просто шаг определяется как одно какое-либо действие [12]. В [1] шаг определяют как процесс смены одного (конструктивного) объекта другим, причем изменению подвергается небольшая (локальная) его часть. Авторы [4] определяют шаг как «непосредственную переработку» одного состояния в другое, и здесь указывается, что смена состояний носит локальный характер и ограничивается «активной» частью. В [2] шаг определяется как «смысловая логическая единица в детализированном изложении алгоритма», при этом ясно видно, что эту «единицу» при необходимости можно разделить на более мелкие, что иногда и делают сами авторы [2]. Автор [13] включает в один шаг такие большие «смысловые единицы», которые явно можно разделить.
Первые три определения отождествляют шаг с некоторым «единичным действием», а в двух последних «активная» часть занимает не весь шаг, а «перемещается» по нему в процессе выполнения действий. Определить понятие единичного действия, по-видимому, невозможно, например, определение
его как некоторого элементарного процесса является, скорее, тавтологией, чем определением. К элементарной, простой, операции авторы [4] относят непосредственную переработку.
На графе шаги алгоритма определяются легко и однозначно: шагом в графе алгоритма являются все действия, «содержащиеся» в одной его вершине. В объединяющей вершине шаг состоит из одной «активной» части. В операторной вершине (5: см. графы рис. 2 и 3) «активная» часть занимает не весь шаг. Возможность объединения многих действий в один шаг дает последовательность однотипных безусловных действий, которая не должна прерываться ни ветвлением, ни возвратом. Можно показать, что в один шаг (предикатную вершину) можно «поместить» последовательность условных выражений. Они могут включать в себя «обычные» функции, однако последние обязательно должны «оцениваться» операциями свойства или отношения и (или) логическими функциями. Важно только, чтобы у этой последовательности был один результат: «да - нет». Если последнее не так, тогда и применяют вложения, которые были рассмотрены выше. Введенную нами вершину типа ВБ (рис. 4 и 5) нельзя объединять в одну ни с вершиной типа Б, ни с другой вершиной ВБ, так как условное и безусловное действия в ней не однотипны.
Нумерация шагов сплошная, единая, она идет по естественной последовательности от вершины после начальной и до конечной. Затем продолжают нумерацию подпоследовательностей первого уровня вложения, начиная это продолжение от меньших номеров естественной последовательности. После этого таким же образом продолжают нумерацию подпоследовательностей всех вторых, затем третьих уровней и т.д. При ветвлении вершины, которым передается управление при истинном значении условия, получают, как это было определено выше, ббльшие номера. Наиболее наглядно эти правила представлены в нумерации вершин графа рис. 8 и рис. 9 (см. ниже).
Вспомогательные алгоритмы. Если у алгоритма имеется (один или больше) вспомогательный алгоритм [1], то на каждый из них составляют отдельный граф. Вспомогательный алгоритм имеет две существенно различные формы: процедура и функция [1, 3]. В те места основного алгоритма, где должна «работать» процедура, включают в виде отдельного шага обозначающую ее вершину, которая получает соответствующий порядковый номер. Функцию всегда можно включить в число действий той вершины, где в ней есть необходимость, и выделять для нее отдельный шаг не нужно. На рис. 9а приведен граф алгоритма, использующего две процедуры (б и
в) и одну функцию (г). Графы процедур и функций помещают после графа основного алгоритма.
В обозначении (заголовке) процедуры после буквы А следует порядковый номер самой процедуры и буква Б, так как вершина, обозначающая ее место в графе основного алгоритма, по передаче управления однотипна с функциональной (5) вершиной. В заголовке графа функции после буквы А пишут букву И и порядковый номер функции в ряду вспомогательных алгоритмов, мешлпие порядковые номера в этом ряду дают процедурам. Нумерации остальных
вершин в графе каждого вспомогательного алго-
ритма независимые (автономные), во всем остальном выполняются правила нумерации графа основного алгоритма.
Можно отмечать в заголовке вспомогательного алгоритма соответствующими буквами (словами) как принадлежность его данному основному алгоритму, так и его собственные особенности, например, для процедур рис. 9: А1И5 (б) и А2И5 (в), для функции: АИЕЗ (г). На графе основного алгоритма эти дополнительные отметки можно не ставить.
В графе основного алгоритма в месте (вершине) действия процедуры к обозначению ее начальной вершины добавляют порядковый номер самой вершины (рис. 9а). Функция может быть включена в действия любого из шагов, кроме точек возврата, и на графе места включения функций не отражаются. Поэтому обозначения начальных вершин функций помещают после обозначения начальной вершины самого графа.
Линейная запись графа алгоритма. Граф алгоритма можно, вместо рисунка, представить в виде линейной записи его шагов. Приведена линейная запись графа АЖ (рис. 8):
АЖБ1 У2ВЗ(57В8(У 17В18(Б22У 17) У9Б16) У9 У2)В4(В 11 (Б20 V
1 2 3 3 2 112
12Б19) V12У13В14(Э21V13)Б 15У5Б10) У5Е6 2 2 2 1
Обозначения вершин пишут без пробелов, так как границы между ними хорошо различимы. После каждой предикатной вершины открывают скобки, внутри которых помещают шаги (вершины), находящиеся во вложении к ней. Точку возврата записы-
А1э в1 В2 Э6 УЗ Б4 Е5
87
А28 в! В2 Э7 УЗ ВЭ4 85 Е6
В8 813 В11 814
в 812 /
АГЗ Б1 Ввг эз Е4
г
Рмл О
вают два раза. У альтернативы внутри скобок она разделяет ее ветви, а второй раз ее помещают после закрывающей, правой, скобки. У цикла с предусловием точка возврата первый раз предшествует предикатной вершине, а второй раз она находится непосредственно перед правой скобкой, т.е., «замыкает» цикл. Номера под скобками линейной записи графа АЖ и римские цифры в штриховых рамках на рис. 8 показывают соответствие глубин вложений.
Для графов рис. 9 линейная запись имеет следующий вид:
а: АИАР351А152УЗА254У5В6(У12В13(516У17В18(521У17)У12)В14 12 3 3 2
(А 1Б20 V15Б19)У 15 У5)В7(УЗ)А258В5951ОЕ11
2 2 111
б: А1551 В2(57У356)У354Е5
в: А25Б1 В2(В8(513У9Б12)У9V1ОВ11 (Б 14У10) УЗБ7) УЗВ5485Е6 12 2 2 2 1
г: АР351В5253Е4
В графе рис. 9а вершина УЗ является входом в ту часть естественной последовательности, которая является циклом с постусловием. Второй раз ее обозначение стоит в скобках после той предикатной вершины, которая управляет этим циклом.
Авторы [2, 3] утверждают, что когда глубина вложений структур управления равна или больше трех, вероятность совершения ошибки при составлении алгоритма (программировании) очень сильно возрастает. Приведенный выше принцип последовательности нумерации шагов графа по вложениям, наряду с изложенным ниже способом определения глубины вложений по линейной записи, может, по-видимому, уменьшить эту вероятность. Для такого определения линейную запись просматривают в порядке написания и, встретив первую левую (открывающую) скобку, ставят под (над) ней номер 1. При повторном появлении подряд левых скобок номер каждый раз увеличивают на единицу, а если после левой скобки появляется правая (закрывающая) или, наоборот, после правой появляется левая скобка, то под такой скобкой каждый раз повторяют номер, стоящий под предшествующей скобкой. При появлении подряд нескольких правых скобок, номер уменьшают на единицу при каждом таком появлении. При правильной записи последняя правая скобка должна иметь номер 1. Применение этого подсчета к линейным записям графов АЖ, АИ и А2Б показывает, что наибольшая глубина (уровень) вложений управляющих структур у графов АЖ и АИ равна трем, а у графа А2Ё - двум.
Язык сопровождающей записи к графу алгоритма. Выше была отмечена необходимость приложения сопровождающей записи к графу алгоритма. Ее язык не является новым: он включает псевдокод [3, 8], алгоритмический язык [1], заимствования из таких языков программирования, как Бейсик, РЬ-1 и Паскаль.
Используют общепринятые математические знаки, но из знаков одинакового назначения и различного написания выбирают один. Для изменения порядка выполнения операций используют круглые
скобки. Операторы сравнения используют только в условных действиях.
Операция присваивания «вбирает в себя едва ли не всю премудрость программирования» [3]. В языках Фортран, РЬ-1, Бейсик ее обозначают знаком равенства. В Паскале ее передают знаком :=, чтобы отличить от знака равенства как оператора сравнения. Здесь используется применяющаяся в [2] стрелка, направленная справа налево: левая стрелка, например, Х<-У, т.е. переменной X присваивается значение, содержащееся в У. Если справа от левой стрелки ничего нет: Х<-, то это означает, что X вводится в алгоритм извне - операция ввода. Стрелка, направленная слева направо, - правая стрелка - описывает переход в шаге ВБ при истинном значении условия к действиям в этом же шаге, а также переход к номеру точки возврата по команде. Если справа от правой стрелки ничего нет: У-», то это означает вывод результатов, содержащихся в У. Верхняя Т стрелка применяется в Паскале для обозначения ссылки и в Бейсике для обозначения возведения в степень. Для возведения в степень ее используют в этом языке. Нижнюю 4 стрелку можно применить для обозначения индексов в рядах и массивах. Из других знаков используют точку с запятой для разделения отдельных действий в пределах одного шага и две точки в строке для выделения диапазона от .. до при операциях с массивами и в циклах с управляющей переменной (из Паскаля). Запятая разделяет переменные, с которыми производят одно и то же действие и отделяет переменные друг от друга и от слов при выводе (заимствовано из нескольких языков).
Переменные величины обозначают большими латинскими буквами и сочетаниями букв и цифр, начинающихся с буквы. Буквы А, В, Е, Р, Б, V и двоеточие, которые применяются в обозначениях вершин графов, в других местах надо применять осмотрительно, чтобы не получилось случайного отождествления с одним из таких обозначений.
Если в вспомогательный алгоритм необходимо передать из основного алгоритма какие-либо данные, это делают, как в РЬ-1 и в Паскале. Места, где пишут формальные и фактические параметры, приведены в описании формы сопровождающей записи.
Слова пишут малыми буквами (русские, английские). Сообщения алгоритма ограничивают апострофами, комментарии заключают в фигурные или круглые скобки со звездочкой, слова псевдокода не ограничивают. Служебные слова в языке отсутствуют. Обозначения в графе и в сопровождающей записи достаточно полно описывают управляющие действия, поэтому в служебных словах нет необходимости.
Форма сопровождающей записи к графу алгоритма. Рассматриваемые здесь графы даны в виде схем, отражающих только структурные формы алгоритмов [1]. Поэтому сопровождающие записи к графам рис. 9 также приведены в абстрактной форме.
ОСНОВНОЙ АЛГОРИТМ
АИ: АИЗ: (* обозначение вспомогательного алго-ритма-функции в заголовке; краткое описание назначения алгоритма*)
81: ввод, начальные расчеты А152: фактические параметры УЗ: (*начало цикла с постусловием*)
А254: фактические параметры
У5В6: В6 (*если В6, то вход в цикл с предусловием*)
V12В13: В13 (*вход в цикл внутри цикла У5В6*)
Б16: действия (*в цикле V12В13*)
V17В18: В18 (*вход в цикл внутри цикла V12В13*) 521: действия (*в цикле V17В18*)
V17: (*возврат к В18*)
VI2: (*возврат к В13*)
В14: В14 (*альтернатива внутри цикла У5В6*)
А1520: фактические параметры (*если В14*)
VI5: (*разделение ветвей и возврат из В14*)
519: действия (*если не В14*)
VI5: (*возврат из не В14*) У5: (*возврат к В6*)
В7УЗ: В7 (*если В7, то окончание цикла с постусловием*)
А258: фактические параметры В59: если В9, то действия
510: заключительные действия (*вывод результатов*)
Е11: (*конец*)
Процедура А15 А15: формальные параметры (*описание назначения процедуры*)
51: действия ^предварительные*)
В2: В2
57: действия (*если В2*)
УЗ: (*разделение ветвей и возврат из В2*)
Бб: действия (*если не В2*)
УЗ: (*возврат из не В2*)
54: действия (*подготовка к возврату в основной алгоритм*)
Е5: (*окончание: возврат в основной алгоритм*) Процедура А25 А2Б: формальные параметры (*описание*)
51: действия
В2: В2
В8: В8 (*если В2*)
513: действия (*если В8*)
У9: (*разделение ветвей и возврат из В8*)
512: действия (*если не В8*)
У9: (*возврат из не В8*)
V10В11: В11 (*условия входа в цикл*)
Б14: действия V10: (*возврат к В11 *)
УЗ: (*разделение ветвей и возврат из В2*)
57: действия (*если не В2*)
УЗ: (*возврат из не В2*)
В54: условие и действия (*при В54*)
55: действия (*подготовка к возврату*)
Е6: (* возврат*)
Функция АРЗ АРЗ(формальные параметры): (*пишут в скобках перед двоеточием*)
51: действия
В52: В52 и действия
БЗ: Р3<-значение функции
Е4: (* возврат РЗ к месту действия*)
ЗАДАЧИ
Для иллюстрации некоторых возможностей графов алгоритмов приводятся алгоритмы решения конкретных простых задач.
Задача 1. Нахождение решений системы двух уравнений с двумя неизвестными. Чтобы показать применение процедур и функций, даны два варианта решения, хотя здесь можно обойтись и без них.
Уравнения: А 1*Х+В1*У = С1; А2*Х+В2*У = С2 А. Графы:
АУА Б1 А1£32 ВЗ А186 А1Б7 Б8
б
Рис. 10. Графы к задаче 1А. а) основной алгоритм; б) граф процедуры.
Линейные записи графов
основной алгоритм: АиАБ1А1Б2ВЗ(59 У4А1Б6А157Б8)У4Е5 процедура: А1 и551Е2 Сопровождающие записи Основной алгоритм:
А11А: (*определители вычисляют в процедуре*)
51: А1,В1,С1,А2,В2,С2<-(*после последнего действия в шаге точку с запятой не ставят*)
А1Ш2: А1 ,В 1 ,А2,В2,0 (*фактические параметры*) ВЗ: 0=0
59: ‘решений нет’—>
У4:
АШБб: С1,В1,С2,В2,01 АШ57: А1,С1,А2,С2,02 58: ‘Х=’,01/0->;Т=\02/0->
У4:Е5:
процедура:
А1Ш: М1,Ы1,М2^2,00 (*Формальные параметры*)
Б1: 00<-М1*Ы2-М2*Ы1
Е2:
Б. Графы:
А1ШАИ Б1 В2 Б5 УЗ Е4
*— ■»> ---—е—» 1 > > > ■
Б6 АН Б1 Е2 б
Рис. 11. Графы к задаче 1Б. а) основной алгоритм; б) граф функции.
Линейные записи графов
основной алгоритм: АиБАУР151 В2(56У355)УЗЕ4 функция: АиР151Е2 Сопровождающие записи основной алгоритм:
АиБ:АиР1: (*определители вычисляют в функции*) 51: А1 ,В 1 ,С 1 ,А2,В2,С2<—;0<—Р1 (А 1 ,В 1 ,А2,В2) (*в действие включают часть заголовка функции, начи-
І
нающуюся с И, поэтому в заголовке основного алгоритма пишут полное обозначение заголовка функции *)
В2: 0=0
56: ‘решений нет’—>
УЗ:
55: ‘X = ’, И1 (С 1 ,В 1 ,С2,В2)/0, ‘У = Р1(А1,С1,А2,С2)Ю-> УЗ:Е4:
Функция:
АиР1(М1,М 1,М2,Ы2): (*формальные параметры*)
51: Р1<-М1*Ы2-М2*Ы1
Е2: (*возврат значения Р1 к месту действия*)
Задача 2. Нахождение максимального числа в последовательности Граф:
Ш
БІ У2
ВЗ
&4
Е5
ВБ7
Рис. 12. Граф к задаче 2.
Б6
Линейная запись графа: АМФ51У2ВЗ(56В57У2)54Е5 Сопровождающая запись:
АМФ: (*числа из файла вводятся по одному*)
51: МАХ,М,К<-0 ^присвоение начальных значений*)
У2ВЗ: пока есть очередное число (*запись условного действия на псевдокоде*)
56: N<-N + 1; МА<-
В57: МА>МАХ—>МАХ<—МА;
У2: (*возврат к условию входа в цикл*)
54: К, '-е число максимально и равно’, МАХ, ‘, всего чисел’, Ы->
Е5:
Задача 3. Вычисление факториала числа.
Граф:
Рис. 13. Граф к задаче 3.
Линейная запись графа: АФАКЗ1 В2(У6В7(58У6)УЗ)У354Е5 Сопровождающая запись:
АФАК:
51: РАС<-1;
В2: N>0 (*алгоритм будет работать и без этого условия, здесь оно дано для иллюстрации вложений*) У6В7: 1=1..И (*если управляющая переменная I равна 1, 2 .. N. то действия, если 1<1, то входа в цикл нет*)
58: РАС<—РАС*1
У6: (*возврат к последующему значению управляющей переменной*)
УЗ: (*возврат из В2 и из не В2*)
54: N,’!=’, РАС—>
Е5:
ВЫВОДЫ
1. Преимуществом простых орграфов алгоритмов по сравнению с блок-схемами является меньшая площадь занимаемого места и меньшая сложность описания больших алгоритмов.
2. Естественная последовательность действия выделена в качестве стержня алгоритмического процесса.
3. Шагом в графе алгоритма являются все действия, описанные при одной его вершине. В одном шаге объединены однотипные действия с функциональной передачей управления в естественном порядке.
4. В случае отсутствия действий при невыполнении условия альтернатива объединена в один шаг с истинностной ветвью, с функциональной передачей управления.
5. Шаги, содержащие действия, определенные альтернативой и циклом с предусловием, выведены в подпоследовательности в качестве вложений. Шаги цикла с постусловием введены в естественную последовательность.
6. Шаги различных типов помечают различными буквами и нумеруют. Подпоследовательности каждого уровня вложения нумеруют в естественном порядке после окончания нумерации шагов естественной последовательности и шагов подпоследовательностей предшествующего уровня.
7. Предложена линейная запись графа, дающая возможность ввода его в ЭВМ, с приемом определения глубины всех вложений.
8. В языке сопровождающей записи к графу алгоритма отсутствуют служебные слова, так как все способы и пути передачи управления определяются самим графом.
ЛИТЕРАТУРА
4.
5.
6.
7.
Математический энциклопедический словарь. М.: Совет, энциклопедия, 1988. 848 с.
ГуОман С., Хидетниеми С. Введение в разработку и анализ алгоритмов. М.: Мир, 1981. 386 с.
Джонс Ж.. Харроу К. Решение задач в системе Турбо-Паскаль. М.: Финансы и статистика, 1991. 720 с.
Успенский В.А.. Семенов А.Л. Теория алгоритмов: основные открытия и приложения. М.: Наука, 1987. 288 с.
Фролов Г.Д.. Олюнип В.Ю. Практический курс программирования на языке PH. М.: Наука, 1987. 384 с.
Докукина Т.К. Программирование и алгоритмические языки. М.: Машиностроение, 1988. 496 с.
Харари Ф. Теория графов. М.: Мир, 1973. 302 с.
8. Терминологический словарь по информатике, автоматике и вычислительной технике. М.: Высш. шк., 1989. 192 с.
9. Липский В. Комбинаторика для программистов. М.: Мир, 1988. 216с.
10. Дал У.. Дейкстра Э., Хоор К. Структурное программирование. М.: Мир, 1975. 248 с.
11. Пярнпуу А.А. Программирование на современных алгоритмических языках. М.: Наука, 1990. 384 с.
12. Криницкий Н.А. Алгоритмы вокруг нас. М.: Наука, 1977. 224 с.
13. КристофиОес Н. Теория графов. Алгоритмический подход. М.: Мир, 1978.432 с.
Поступила в редакцию 12 января 1998 г.