Рис. 1
На рис. 2 представлен алгоритм оператора PERFORM (ВЫПОЛНИТЬ) с фразой VARYING (МЕНЯЯ), фразой TEST BEFORE (С ПРОВЕРКОЙ В НАЧАЛЕ) и двумя условиями.
По окончании выполнения оператора PERFORM (ВЫПОЛНИТЬ) данное, представленное идентификатором-5, содержит литерал-3 или текущее значение данного, представленного идентификатором-6. і
Данное, представленное идентификатором-2, содержит значение, которое отличается от последнего используемого значения на величину приращения (положительную или отрицательную), кроме случая, когда условие-1 было истинно в начале выполнения оператора PERFORM (ВЫПОЛНИТЬ); в ука
занном случае данное, представленное идентификатором-2, содержит литерал-1 или текущее значение данного, представленного идентификатором-3.
Рис. 2
Если фраза 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
Рис. З
Во время выполнения соответствующего оператору PERFORM (ВЫПОЛНИТЬ) указанного множества операторов следует учитывать изменение переменных, указанных во фразе VARYING (МЕНЯЯ) (данного, представленного идентификатором-2, и имени-индекса-1), во фразе BY (НА) (данного, представленного идентификатором-4), во фразе AFTER (ЗАТЕМ) (данного, представленного идентификатором-5, и имени-индек- са-3), во фразе FROM (ОТ) (данного, представленного идентификатором-3, и имени-индекса-2); эти изменения будут влиять на выполнение оператора PERFORM (ВЫПОЛНИТЬ).
При изменении данных, представленных двумя идентификаторами, каждый раз, когда изменяется содержимое данного, представленного идентификатором-2, данное, представленное идентификатором-5, проходит полный цикл (с учетом фраз FROM (ОТ), BY (НА), UNTIL (ДО)).
При изменении трех или более данных, представленных идентификаторами, обработка происходит так же, как и в случае двух идентификаторов, за исключением того факта, что данное, изменяемое каждой фразой AFTER (ЗАТЕМ), проходит полный цикл всякий раз, когда добавляется приращение (положительное или отрицательное) к данному, измененному предыдущей фразой AFTER (ЗАТЕМ).
Рис. 4
Область действия оператора PERFORM (ВЫПОЛНИТЬ) логически состоит из всех тел операторов, которые выполняются в результате выполнения оператора PERFORM (ВЫПОЛНИТЬ) вплоть до выполнения неявной передачи управления на конец оператора PERFORM (ВЫПОЛНИТЬ).
Область действия включает все операторы, на которые передается управление операторами GO ТО (ПЕРЕЙТИ К), EXIT (ВЫЙТИ), CALL (ВЫЗВАТЬ), PERFORM (ВЫПОЛНИТЬ), входящими в область действия оператора PERFORM (ВЫПОЛНИТЬ), а также все операторы в декларативных процедурах, которые выполняются как результат выполнения операторов, принадлежащих области действия оператора PERFORM (ВЫПОЛНИТЬ). Операторы, принадлежащие области действия оператора PERFORM (ВЫПОЛНИТЬ), не обязательно должны следовать друг за другом в тексте исходной программы.
Операторы, выполняемые в результате передачи управления по оператору EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ), не принадлежат области действия оператора PERFORM (ВЫПОЛНИТЬ) в том случае, когда:
оператор EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ) определен в той же программе, что и оператор PERFORM (ВЫПОЛНИТЬ);
оператор EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ) принадлежит области действия оператора PERFORM (ВЫПОЛНИТЬ).
Имя-процедуры-1 и имя-процедуры-2 не должны быть именами секций или параграфов в любой другой программе данной единицы исполнения независимо от того, содержит ли другая программа программу, включающую оператор PERFORM (ВЫПОЛНИТЬ), или сама содержится в ней. Операторы из других программ в единице исполнения могут быть доступны только в результате выполнения оператора PERFORM (ВЫПОЛНИТЬ), область действия которого включает операторы CALL (ВЫЗВАТЬ) и EXIT PROGRAM (ВЫЙТИ ИЗ ПРОГРАММЫ) (ч. 10, п. 1.3.8).
Если область действия оператора 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
Оператор PERFORM (ВЫПОЛНИТЬ), который появляется в секции, не являющейся независимым сегментом, может иметь внутри своей области действия кроме декларативных секций, вызываемых из его области действия, только следующие процедуры:
секции и (или) параграфы, содержащиеся полностью в одном или в нескольких сегментах, не являющихся независимыми;
секции и (или) параграфы, полностью содержащиеся в одном независимом сегменте.
<(16) Оператор PERFORM (ВЫПОЛНИТЬ), который появляется в независимом сегменте, может иметь внутри своей области действия кроме декларативных секций, вызываемых из области действия, только следующие процедуры:
секции и (или) параграфы, полностью содержащиеся в одном или нескольких сегментах, не являющихся независимыми;
секции и (или) параграфы, полностью содержащиеся в том же независимом сегменте, что и оператор PERFORM (ВЫПОЛНИТЬ).
Оператор SEARCH (ИСКАТЬ)
Назначение
Оператор SEARCH (ИСКАТЬ) используется для поиска в таблице некоторого элемента таблицы, который удовлетворяет заданному условию, и установления соответствующего значения индекса, указывающего этот элемент таблицы.
Общий формат
Формат 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
КОГДА
имя-условия-2
[ повелительный-оператор-2
I СЛЕДУЮЩЕЕ ПРЕДЛОЖЕНИЕ
[КОНЕЦ-ИСКАТЬ]
С и н т а к с и ч е с к и е правила
В форматах 1 и 2 идентификатор-1 не должен быть индексирован или представлять модифицированную ссылку, но его описание должно содержать фразу OCCURS (ПОВТОРЯЕТСЯ) с вариантом INDEXED (ИНДЕКСИРУЕТСЯ). Описание идентификатора-1 в формате 2 должно содержать также вариант ASCENDING (DESCENDING) KEY (ПО ВОЗРАСТАНИЮ (УБЫВАНИЮ) КЛЮЧА) во фразе OCCURS (ПОВТОРЯЕТСЯ).
Идентификатор-2 должен ссылаться на данное, описанное с фразой USAGE IS INDEX (ДЛЯ ИНДЕКСА) или как числовое элементарное данное, не имеющее позиций справа от подразумеваемой десятичной точки. Идентификатор-2 не может индексироваться первым (или единственным) именем-индекса, определенным вариантом INDEXED BY (ИНДЕКСИРУЕТСЯ) во фразе OCCURS (ПОВТОРЯЕТСЯ), соответствующей идентификатору-1.
В формате 1 условие-1 может быть любым допустимым в Коболе условием (см. п. 6.3 настоящей части).
В формате 2 все упоминаемые имена-условий должны быть определены как имеющие только одно значение. Имя-дан- ного, связанное с именем-условия, должно быть указано во фразе ASCENDING (DESCENDING) KEY (ПО ВОЗРАСТАНИЮ (УБЫВАНИЮ) КЛЮЧА) идентификатор а-1. Каждое имя-данного-1, имя-данного-2 может уточняться. Каждое имя- данного-1, имя-данного-2 должно быть индексировано первым именем-индекса, связанным с идентификатором-1, вместе с другими требующимися индексами и должно быть указано во фразе ASCENDING (DESCENDING) KEY (ПО ВОЗРАСТАНИЮ (УБЫВАНИЮ) КЛЮЧА) идентификатора-1. Идентификатор-3, идентификатор-4 или идентификаторы, задаваемые в арифметическом-выражении-1, арифметическом-выражении-2 не должны быть указаны во фразе ASCENDING (DESCENDING) KEY (ПО ВОЗРАСТАНИЮ (УБЫВАНИЮ) КЛЮЧА) идентификатора-1 или индексироваться первым именем-индекса, связанным с идентификатором-1.
Если в формате 2 ссылаются на некоторое имя-данного, указанное в варианте ASCENDING (DESCENDING) KEY (ПО ВОЗРАСТАНИЮ (УБЫВАНИЮ) КЛЮЧА) для данного, представленного идентификатором-1, или на связанное с ним имя- условия, то все предшествующие имена-данных, указанные во фразе ASCENDING (DESCENDING) KEY (ПО ВОЗРАСТАНИЮ (УБЫВАНИЮ) КЛЮЧА) для данного, представленного идентификатором-1, или соответствующие им имена-условий тоже должны быть указаны.
Если указана фраза END-SEARCH (КОНЕЦ-ИСКАТЬ), то нельзя указывать фразу NEXT SENTENCE (СЛЕДУЮЩЕЕ ПРЕДЛОЖЕНИЕ).
Общие правила
Оператор SEARCH (ИСКАТЬ) может завершаться:
фразой END-SEARCH (КОНЕЦ-ИСКАТЬ) на соответст- ■; вующем уровне вложенности;
разделителем точка; ’
фразами ELSE (ИНАЧЕ) и END-IF (КОНЕЦ-ЕСЛИ), соответствующими предшествующему оператору IF (ЕСЛИ) (см. Ч. 4, П. 6.4.3) . :
Если используется формат 1 оператора SEARCH (ИС- ; КАТЬ), то имеет место последовательный тип поиска (перебор), ; начиная с текущей установки индекса.
а) Если в начале выполнения оператора SEARCH (ИСКАТЬ) имя-индекса, связанное с идентификатором-1, содержит ! значение, которое соответствует номеру вхождения, большему чем наибольший допустимый номер вхождения для идентифика- і тора-1, то оператор SEARCH (ИСКАТЬ) сразу завершается. , Наибольший допустимый номер вхождения определяется во фразе OCCURS (ПОВТОРЯЕТСЯ) (см. п. 5.8 настоящей части). Тогда, если в операторе указана фраза AT END (В КОН- ЦЕ), выполняется повелительный-оператор-1, иначе управление передается на конец оператора SEARCH (ИСКАТЬ).
б) Если в начале выполнения оператора SEARCH (ИСКАТЬ) имя-индекса, связанное с идентификатором-1, содержит значение, которое соответствует номеру вхождения, не превосходящему наибольший допустимый номер вхождения для идеи- тификатора-1, то оператор SEARCH (ИСКАТЬ) вычисляет ус- ( ловия в том порядке, в каком они написаны, используя установ- . ленные индексы, чтобы определить вхождения проверяемых дан- , ных. Если ни одно из условий не удовлетворено, имя-индекса ’ для идентификатора-1 увеличивается, чтобы обеспечить ссылку на следующее вхождение. Этот процесс повторяется с использованием вновь установленного имени-индекса до тех пор, пока очередное значение имени-индекса для идентификатора-1 не превзойдет наибольшего допустимого. В этом последнем случае поиск заканчивается как указывалось выше. Если одно из условий удовлетворено при его вычислении, поиск заканчива- ‘ ется и управление передается на повелительный оператор, связанный с этим условием, если он указан, или на следующее выполнимое предложение, если указана фраза NEXT SENTENCE (СЛЕДУЮЩЕЕ ПРЕДЛОЖЕНИЕ); имя-индекса остается установленным на тот номер вхождения, при котором удовлетво- . рилось условие.