Рис. 1



На рис. 2 представлен алгоритм оператора PERFORM (ВЫ­ПОЛНИТЬ) с фразой VARYING (МЕНЯЯ), фразой TEST BEFORE (С ПРОВЕРКОЙ В НАЧАЛЕ) и двумя условиями.

По окончании выполнения оператора PERFORM (ВЫПОЛ­НИТЬ) данное, представленное идентификатором-5, содержит литерал-3 или текущее значение данного, представленного иден­тификатором-6. і

Данное, представленное идентификатором-2, содержит значение, которое отличается от последнего используемого зна­чения на величину приращения (положительную или отрица­тельную), кроме случая, когда условие-1 было истинно в нача­ле выполнения оператора PERFORM (ВЫПОЛНИТЬ); в ука­

занном случае данное, представленное идентификатором-2, со­держит литерал-1 или текущее значение данного, представлен­ного идентификатором-3.

Рис. 2



  1. Если фраза TEST AFTER (С ПРОВЕРКОЙ В КОНЦЕ) указана или подразумевается.

При изменении данного, представленного одним идентифи­катором, в начале выполнения оператора PERFORM (ВЫПОЛ­НИТЬ) содержимому данного, представленного идентифика­тором-2, присваивается значение литер ала-1 или текущее зна­чение данного, представленного идентификат®ром-3; затем один раз выполняется указанное множество операторов и про­веряется условие-1 из фразы UNTIL (ДО).. Если условие лож­но, значение данного, представленного идентификатором-!, из­меняется на величину приращения (положительного или от­рицательного), заданного литералом-2 или значение.м данно­го, представленного идентификатором-4; затем опять выпол­няется указанное множество операторов. Цикл повторяется, по­ка условие-1 не станет истинным,, после чего управление пере­дается на конец оператора PERFORM (ВЫПОЛНИТЬ).

На рис. 3 представлен алгоритм оператора PERFORM (ВЫ­ПОЛНИТЬ) ^с фразой VARYING (МЕНЯЯ) и фразой TEST AFTER (С ПРОВЕРКОЙ В КОНЦЕ) и одним условием.

При изменении данных, представленных двумя идентифика­торами, содержимому данного, представленного идентифика­тором-2, присваивается значение литерала-1 или текущее зна­чение данного, представленного- идентификатором-3, затем со­держимому данного, представленного идентификатором-5, при­сваивается значение литерала-3 или текущее значение данного, представленного идентификатором-6; после этого выполняет­ся указанное множество операторов. Затем вычисляется усло­вие-2; если оно ложно, содержимое данного, представленного идентификатором-5, изменяется на величину литерала-4 или содержимого данного, представленного идентификатором-?; далее опять выполняется указанное множество операторов. Цикл продолжается до тех пор, пока условие-2 не окажется ис­тинным в момент вычисления условия-2 и не потребуется вычис­лять условие-1. Если же оно ложно, содержимое данного, пред­ставленного идентификаторо.м-2,. изменяется на величину лите­рала-2 или содержимого данного, представленного иденти­фикатором-!, а содержимому данного, представленного иденти­фикатором-5, присваивается значение литерала-3 или текущее значение данного, представленного идентификатором-6; затем опять выполняется указанное множество операторов. Этот цикл повторяется до тех пор, пока вновь вычисленное условие-1 не станет истинным, тогда управление передается на конец опера­тора PERFORM (ВЫПОЛНИТЬ).

После завершения выполнения оператора PERFORM (ВЫ­ПОЛНИТЬ) каждое данное, измененное фразами AFTER (ЗА­ТЕМ) и VARYING (МЕНЯЯ), содержит то значение, которое оно получило в результате последнего выполнения указанного множества операторов.

На рис. 4 представлен алгоритм оператора PERFORM (ВЫ­ПОЛНИТЬ) с фразой VARYING (МЕНЯЯ) и фразой TEST AFTER (С ПРОВЕРКОЙ В KQH1IE) и двумя условиями.I

Рис. З



Во время выполнения соответствующего оператору PER­FORM (ВЫПОЛНИТЬ) указанного множества операторов следует учитывать изменение переменных, указанных во фразе VARYING (МЕНЯЯ) (данного, представленного идентифика­тором-2, и имени-индекса-1), во фразе BY (НА) (данного, пред­ставленного идентификатором-4), во фразе AFTER (ЗАТЕМ) (данного, представленного идентификатором-5, и имени-индек- са-3), во фразе FROM (ОТ) (данного, представленного иден­тификатором-3, и имени-индекса-2); эти изменения будут влиять на выполнение оператора PERFORM (ВЫПОЛНИТЬ).

При изменении данных, представленных двумя идентифика­торами, каждый раз, когда изменяется содержимое данного, представленного идентификатором-2, данное, представленное идентификатором-5, проходит полный цикл (с учетом фраз FROM (ОТ), BY (НА), UNTIL (ДО)).

При изменении трех или более данных, представленных идентификаторами, обработка происходит так же, как и в слу­чае двух идентификаторов, за исключением того факта, что дан­ное, изменяемое каждой фразой AFTER (ЗАТЕМ), проходит полный цикл всякий раз, когда добавляется приращение (поло­жительное или отрицательное) к данному, измененному преды­дущей фразой AFTER (ЗАТЕМ).

Рис. 4

  1. Область действия оператора PERFORM (ВЫПОЛНИТЬ) логически состоит из всех тел операторов, которые выполняются в результате выполнения оператора PERFORM (ВЫПОЛНИТЬ) вплоть до выполнения неявной передачи управления на конец опе­ратора PERFORM (ВЫПОЛНИТЬ).

Область действия включает все операторы, на которые пере­дается управление операторами GO ТО (ПЕРЕЙТИ К), EXIT (ВЫЙТИ), CALL (ВЫЗВАТЬ), PERFORM (ВЫПОЛНИТЬ), вхо­дящими в область действия оператора PERFORM (ВЫПОЛ­НИТЬ), а также все операторы в декларативных процедурах, ко­торые выполняются как результат выполнения операторов, при­надлежащих области действия оператора PERFORM (ВЫПОЛ­НИТЬ). Операторы, принадлежащие области действия операто­ра PERFORM (ВЫПОЛНИТЬ), не обязательно должны следо­вать друг за другом в тексте исходной программы.

  1. Операторы, выполняемые в результате передачи управ­ления по оператору EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАМ­МЫ), не принадлежат области действия оператора PERFORM (ВЫПОЛНИТЬ) в том случае, когда:

  1. оператор EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ) определен в той же программе, что и оператор PERFORM (ВЫ­ПОЛНИТЬ);

  2. оператор EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ) принадлежит области действия оператора PERFORM (ВЫПОЛ­НИТЬ).

  1. Имя-процедуры-1 и имя-процедуры-2 не должны быть име­нами секций или параграфов в любой другой программе данной единицы исполнения независимо от того, содержит ли другая про­грамма программу, включающую оператор PERFORM (ВЫПОЛ­НИТЬ), или сама содержится в ней. Операторы из других прог­рамм в единице исполнения могут быть доступны только в резуль­тате выполнения оператора PERFORM (ВЫПОЛНИТЬ), область действия которого включает операторы CALL (ВЫЗВАТЬ) и EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ) (ч. 10, п. 1.3.8).

  2. Если область действия оператора PERFORM (ВЫПОЛ­НИТЬ) включает другой оператор PERFORM (ВЫПОЛ­НИТЬ), то последовательность процедур, связанная с внутренним оператором PERFORM (ВЫПОЛНИТЬ), должна полностью вклю­чаться в логическую последовательность, определяемую первым оператором PERFORM (ВЫПОЛНИТЬ), или полностью находи­ться вне этой последовательности. Таким образом, активный опе­ратор PERFORM (ВЫПОЛНИТЬ), выполнение которого начина­ется внутри области действия другого активного в данный момент оператора PERFORM (ВЫПОЛНИТЬ), не должен передавать управление на точку выхода последнего; более того, несколько та-

ких активных операторов PERFORM (ВЫПОЛНИТЬ) не могут иметь общую точку выхода. Ниже приведены примеры возможных комбинаций областей действия нескольких операторов PERFORM (ВЫПОЛНИТЬ).

x PERFORM a THRU m ВЫПОЛНИТЬ а ПО m

a

d PERFORM f THRU j ВЫПОЛНИТЬ f ПО j

h

m


Л PERFORM f THRU j

ВЫПОЛНИТЬ f ПО j f

j I

m

:x PERFORM a THRU m

ВЫПОЛНИТЬ а ПО m

;a

f

m

j

Л PERFORM f THRU j

ВЫПОЛНИТЬ f HO j


х PERFORM a THRU m
ВЫПОЛНИТЬ а ПО m



  1. Оператор PERFORM (ВЫПОЛНИТЬ), который появля­ется в секции, не являющейся независимым сегментом, может иметь внутри своей области действия кроме декларативных сек­ций, вызываемых из его области действия, только следующие про­цедуры:

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

  2. секции и (или) параграфы, полностью содержащиеся в од­ном независимом сегменте.

<(16) Оператор PERFORM (ВЫПОЛНИТЬ), который появля­ется в независимом сегменте, может иметь внутри своей области действия кроме декларативных секций, вызываемых из области действия, только следующие процедуры:

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

  2. секции и (или) параграфы, полностью содержащиеся в том же независимом сегменте, что и оператор PERFORM (ВЫПОЛ­НИТЬ).

  1. Оператор SEARCH (ИСКАТЬ)

    1. Назначение

Оператор SEARCH (ИСКАТЬ) используется для поиска в таблице некоторого элемента таблицы, который удовлетворяет заданному условию, и установления соответствующего значения индекса, указывающего этот элемент таблицы.

  1. Общий формат

Формат 1

SEARCH идентификатор-1 [VARYING ( илентификатор-2 I ]

| имя-индекса-1 |

[AT END повелительный-оператор-1]

(

WHEN условие-1

повелительный-оператор-2 ]]

I NEXT SENTENCE )/ • • ■

[END-SEARCH]

МЕНЯЯ |™"T"*"KaTT’2!

[ имя-индекса-1 |


ИСКАТЬ В идентификатор-1



[В КОНЦЕ повелительный-оператор-1]

|..лгп. , Iповелительный-оператор-2 1]

[]$2ГДА Условие-1 )СЛЕдуЮщЕЕ ПРЕДЛОЖЕНИЕ) )'''

[КОНЕЦ-ИСКАТЬ]

Формат 2

SEARCH ALL идентификатор-1

[AT END повелительный-оператор-1]

WHEN

( IS EQUAL ТО ]

имя-данного-1 _ >

идентификатор-3 )

литерал-1 арифметическое- выражение-1

имя-условия-1

ч



п [ IS EQUAL ТО ) имя-данного-2 j — і

и

AND

дентификатор-4 литерал-2 арифметическое- выражение-2

имя условия-2

І повелительный-оператор-2 ( NEXT SENTENCE

[END-SEARCH]

ИСКАТЬ ОСОБО В идентификатор-1 [В КОНЦЕ

повелительный-опер атор-1 ]

и

идентификатор-3 ' ] литерал-1 арифметическое- [

выражение-1 J

I >

1 - I I


n (РАВНО имя-данного-2 [


РАВНО


имя-данного-1

| имя-условия-1


КОГДА


дентификатор-4 литерал-2 арифметическое- выражение-2

имя-условия-2

[ повелительный-оператор-2

I СЛЕДУЮЩЕЕ ПРЕДЛОЖЕНИЕ

[КОНЕЦ-ИСКАТЬ]

  1. С и н т а к с и ч е с к и е правила

  1. В форматах 1 и 2 идентификатор-1 не должен быть ин­дексирован или представлять модифицированную ссылку, но его описание должно содержать фразу OCCURS (ПОВТОРЯ­ЕТСЯ) с вариантом INDEXED (ИНДЕКСИРУЕТСЯ). Описа­ние идентификатора-1 в формате 2 должно содержать также ва­риант ASCENDING (DESCENDING) KEY (ПО ВОЗРАСТА­НИЮ (УБЫВАНИЮ) КЛЮЧА) во фразе OCCURS (ПОВТО­РЯЕТСЯ).

  2. Идентификатор-2 должен ссылаться на данное, опи­санное с фразой USAGE IS INDEX (ДЛЯ ИНДЕКСА) или как числовое элементарное данное, не имеющее позиций справа от подразумеваемой десятичной точки. Идентификатор-2 не может индексироваться первым (или единственным) именем-индекса, определенным вариантом INDEXED BY (ИНДЕКСИРУЕТСЯ) во фразе OCCURS (ПОВТОРЯЕТСЯ), соответствующей иден­тификатору-1.

  3. В формате 1 условие-1 может быть любым допустимым в Коболе условием (см. п. 6.3 настоящей части).

  4. В формате 2 все упоминаемые имена-условий должны быть определены как имеющие только одно значение. Имя-дан- ного, связанное с именем-условия, должно быть указано во фразе ASCENDING (DESCENDING) KEY (ПО ВОЗРАСТА­НИЮ (УБЫВАНИЮ) КЛЮЧА) идентификатор а-1. Каждое имя-данного-1, имя-данного-2 может уточняться. Каждое имя- данного-1, имя-данного-2 должно быть индексировано первым именем-индекса, связанным с идентификатором-1, вместе с дру­гими требующимися индексами и должно быть указано во фразе ASCENDING (DESCENDING) KEY (ПО ВОЗРАСТА­НИЮ (УБЫВАНИЮ) КЛЮЧА) идентификатора-1. Иденти­фикатор-3, идентификатор-4 или идентификаторы, задаваемые в арифметическом-выражении-1, арифметическом-выражении-2 не должны быть указаны во фразе ASCENDING (DESCEN­DING) KEY (ПО ВОЗРАСТАНИЮ (УБЫВАНИЮ) КЛЮЧА) идентификатора-1 или индексироваться первым именем-индек­са, связанным с идентификатором-1.

Если в формате 2 ссылаются на некоторое имя-данного, ука­занное в варианте ASCENDING (DESCENDING) KEY (ПО ВОЗРАСТАНИЮ (УБЫВАНИЮ) КЛЮЧА) для данного, пред­ставленного идентификатором-1, или на связанное с ним имя- условия, то все предшествующие имена-данных, указанные во фразе ASCENDING (DESCENDING) KEY (ПО ВОЗРАСТА­НИЮ (УБЫВАНИЮ) КЛЮЧА) для данного, представленного идентификатором-1, или соответствующие им имена-условий то­же должны быть указаны.

  1. Если указана фраза END-SEARCH (КОНЕЦ-ИСКАТЬ), то нельзя указывать фразу NEXT SENTENCE (СЛЕДУЮЩЕЕ ПРЕДЛОЖЕНИЕ).

  1. Общие правила

  1. Оператор SEARCH (ИСКАТЬ) может завершаться:

  1. фразой END-SEARCH (КОНЕЦ-ИСКАТЬ) на соответст- ■; вующем уровне вложенности;

  2. разделителем точка; ’

  3. фразами ELSE (ИНАЧЕ) и END-IF (КОНЕЦ-ЕСЛИ), соответствующими предшествующему оператору IF (ЕСЛИ) (см. Ч. 4, П. 6.4.3) . :

  1. Если используется формат 1 оператора SEARCH (ИС- ; КАТЬ), то имеет место последовательный тип поиска (перебор), ; начиная с текущей установки индекса.

а) Если в начале выполнения оператора SEARCH (ИС­КАТЬ) имя-индекса, связанное с идентификатором-1, содержит ! значение, которое соответствует номеру вхождения, большему чем наибольший допустимый номер вхождения для идентифика- і тора-1, то оператор SEARCH (ИСКАТЬ) сразу завершается. , Наибольший допустимый номер вхождения определяется во фразе OCCURS (ПОВТОРЯЕТСЯ) (см. п. 5.8 настоящей час­ти). Тогда, если в операторе указана фраза AT END (В КОН- ЦЕ), выполняется повелительный-оператор-1, иначе управле­ние передается на конец оператора SEARCH (ИСКАТЬ).

б) Если в начале выполнения оператора SEARCH (ИС­КАТЬ) имя-индекса, связанное с идентификатором-1, содержит значение, которое соответствует номеру вхождения, не превос­ходящему наибольший допустимый номер вхождения для идеи- тификатора-1, то оператор SEARCH (ИСКАТЬ) вычисляет ус- ( ловия в том порядке, в каком они написаны, используя установ- . ленные индексы, чтобы определить вхождения проверяемых дан- , ных. Если ни одно из условий не удовлетворено, имя-индекса ’ для идентификатора-1 увеличивается, чтобы обеспечить ссыл­ку на следующее вхождение. Этот процесс повторяется с ис­пользованием вновь установленного имени-индекса до тех пор, пока очередное значение имени-индекса для идентификатора-1 не превзойдет наибольшего допустимого. В этом последнем случае поиск заканчивается как указывалось выше. Если одно из условий удовлетворено при его вычислении, поиск заканчива- ‘ ется и управление передается на повелительный оператор, свя­занный с этим условием, если он указан, или на следующее вы­полнимое предложение, если указана фраза NEXT SENTENCE (СЛЕДУЮЩЕЕ ПРЕДЛОЖЕНИЕ); имя-индекса остается ус­тановленным на тот номер вхождения, при котором удовлетво- . рилось условие.