Перейти до вмісту
ГОСТ 22558-89
/ 116

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

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

Фраза END-PERFORM (КОНЕЦ-ВЫПОЛНИТЬ) ограни­чивает область действия оператора PERFORM (ВЫПОЛНИТЬ) со встроенной областью действия (см. ч. 4, п. 6.4.3).

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

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

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

если имя-процедуры-1 является именем-лараграфа и имя- процедуры-2 в операторе не указано, возврат производится после выполнения последнего оператора имени-процедуры-1;

если имя-процедуры-1 есть имя-секции и имя-процедуры-2 не указано, возврат производится после выполнения последнего оператора последнего параграфа имени-процедуры-1;

если указано имя-процедуры-2 и оно является именем- пара­графа, возврат производится после выполнения последнего опера­тора этого параграфа;

если указано имя-процедуры-2 и оно является именем-сек- ции, возврат производится после выполнения последнего операто­ра последнего параграфа этой секции;

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

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

Если имеется два или больше путей, ведущих к точке возвра­та, то имя-процедуры-2 может быть именем-параграфа, состояще­го из оператора EXIT (ВЫЙТИ), к которому должны вести все эти пути.

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

Операторы PERFORM (ВЫПОЛНИТЬ) действуют сле­дующим образом:

формат 1 является основным форматом оператора PERFORM (ВЫПОЛНИТЬ). Указанное множество операторов выполняется один раз, и затем управление передается на конец оператора PERFORM (ВЫПОЛНИТЬ);

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

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

формат 3 указывает выполнение указанного множества опе­раторов до тех пор, пока условие, указанное фразой UNTIL (ДО), не станет истинным. Если условие истинно, управление переда­ется на конец оператора PERFORM (ВЫПОЛНИТЬ). Если в мо­мент начала выполнения оператора PERFORM (ВЫПОЛНИТЬ) условие истинно и фраза TEST BEFORE (С ПРОВЕРКОЙ В | НАЧАЛЕ) указана или подразумевается, указанные процеду­ры не выполняются и управление передается на конец оператора PERFORM (ВЫПОЛНИТЬ).

Если указана фраза TEST AFTER (С ПРОВЕРКОЙ В КОН­ЦЕ), оператор PERFORM (ВЫПОЛНИТЬ) выполняется так же, как и в случае, когда указана фраза TEST BEFORE (С ПРОВЕРКОЙ В НАЧАЛЕ) с тем отличием, что условие прове­ряется после выполнения указанного множества операторов.

Индексирование и модификация ссылок, имеющие отноше­ние к операндам, указанным в условии-1, вычисляются при каждой проверке условия;

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

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

фикатором. Индексирование и модификация ссылок, соответст­вующие операндам, указанным в условии-1 или условии-2, вы­полняются при каждой проверке условия.

Далее представлены схемы выполнения нескольких типов оператора PERFORM (ВЫПОЛНИТЬ) формата 4, которые не должны рассматриваться как предписания по их реализации.

Если фраза TEST BEFORE (С ПРОВЕРКОЙ В НАЧА­ЛЕ) указана или подразумевается.

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

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

Если условие-1 истинно в начале выполнения оператора PERFORM (ВЫПОЛНИТЬ), то управление передается на ко­нец оператора PERFORM (ВЫПОЛНИТЬ).

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

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

Рис. 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

Рис. З

Во время выполнения соответствующего оператору PER­FORM (ВЫПОЛНИТЬ) указанного множества операторов следует учитывать изменение переменных, указанных во фразе 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 (ВЫПОЛНИТЬ), не обязательно должны следо­вать друг за другом в тексте исходной программы.

Побачили розбіжність з офіційним текстом?

Повідомити про неточність

Напишіть, що саме розходиться з офіційною публікацією. Код документа вкажіть у повідомленні — так ми швидше знайдемо потрібне місце.

Перейти до форми зворотного зв'язку

Дивіться також

Весь розділ →