Главная » Basic » ОПЕРАТОРЫ GOSUB И RETURN

0

Подпрограмма представляет собой набор операторов программы, к которому можно обратиться  с помощью  оператора  GOSUB   из   любой  строки  программы.  Когда  операторы   подпрограммы исполнены  и  достигнут  оператор  RETURN,  управление  автоматически   передается  обратно,  к оператору в строке, непосредственно следующей за GOSUB. На рис. 5.1  строки с 500-й по 600-ю представляют собой подпрограмму, которая первый раз вызывается из строки 100; после исполнения подпрограммы управление возвращается к строке 110. Вслед за  этим подпрограмма вызывается из строки 200, и после ее исполнения управление возвращается  к  строке 210. Обратите внимание на оператор STOP в конце основной программы: если бы он отсутствовал, управление передавалось бы строке 500 и исполнение программы продолжалось  бы до строки 600, при попытке исполнения которой  была  бы  зафиксирована  ошибка  с   выдачей  соответствующего  сообщения,  например RETURN   STATEMENT   FOUND   WITHOUT   A   GOSUB   (обнаружен   оператор   RETURN   без предшествующего GOSUB).

Рис. 5.1. Процесс передачи управления при двух вызовах подпрограммы

Работа с подпрограммами обеспечивается операторами GOSUB и RETURN, указываемыми в разных местах программы. Для обозначения начала подпрограммы специального оператора нет,  поэтому обязательно отмечайте начало подпрограммы с помощью комментария в операторе REM. Служебное слово GOSUB, за которым следует номер оператора, вызывает передачу управления подпрограмме, начинающейся оператором с этим номером. Оператор RETURN, являющийся последним оператором подпрограммы, вызывает передачу управления обратно, к оператору, непосредственно следующему за оператором GOSUB, вызвавшим переход к подпрограмме.

В  действительности, эффект  применения  подпрограммы  тот  же,  как  если  бы  каждый  оператор GOSUB  был  заменен  на  совокупность  всех  операторов  подпрограммы.  Рассмотрим   несколько следующих операторов:

210   FOR L=1 TO N 220      PRINT"-"; 230   NEXT L 240   PRINT

Они обеспечивают печать строки, состоящей из N знаков минуса (-), и используются в  качестве подпрограммы в следующей программе:

10 КЕМ ОСНОВНАЯ ПРОГРАММА

20 PRINT "ДЛИННЫЙ ЗАГОЛОВОК"

30 N=17

40 GOSUB 200

5В PRINT "ЕЩЕ РАЗ"

60 N=7

70 GOSUB 200

88 FOR I=1 ТО 5

90   N=I

100   GOSUB 200

110 NEXT I

120 STOP

200 REM ПОДПРОГРАММА ДЛЯ ПОДЧЕРКИВАНИЯ N СИМВОЛОВ

210 FOR L=1 TO N

220   PRINT "-";

230 NEXT L

240 PRINT

250 RETURN

260 END RUN

ДЛИННЫЙ ЗАГОЛОВОК

—————–

ЕЩЕ" РАЗ

END AT LINE 120

Операторы с 200-го по 250-й изображают строку из N символов и используются в данном примере для подчеркивания текста, выдаваемого операторами в строках 20 и 50. Обратите внимание на то, что значение N устанавливается перед GOSUB и доступно (наряду со значениями всех других переменных) в подпрограмме. Треугольная фигура формируется обращениями к подпрограмме из цикла FOR в  строке 80.  Так как L используется и  изменяется в  подпрограмме, то  этой  переменной нельзя пользоваться как управляющей в цикле FOR в строке 80.

Может оказаться полезной приведенная ниже подпрограмма. Она способна напечатать N повторений символа, имеющего код ASCII, равный М:

200 REM ПОДПРОГРАММА ПЕЧАТИ

210 REM N ПОВТОРЕНИЙ

220 REM СИМВОЛА С КОДОМ ASCII M

230 FOR L=1 TO N

240   PRINT CHR$(M);

250 NEXT L

260 PRINT

270 RETURN

Операторы GOSUB и RETURN

Общая форма записи: GOSUB s

где s номер оператора. Общая форма записи:

RETURN 147

Управление  передается  подпрограмме,  начинающейся  с  оператора,  имеющего  номер  s.  Затем операторы выполняются по порядку до тех пор, пока не встретится оператор  RETURN, После этого   управление  передается  строке,   следующей  непосредственно  за   оператором  GOSUB, вызвавшим подпрограмму.

В некоторых версиях Бейсика предусмотрен оператор выбора одной подпрограммы из совокупности подпрограмм,  аналогичный  оператору  ON-GOTO,  обсуждавшемуся  в  подразд.  4.3.1,  в  котором GOTO заменяется на GOSUB. Любой оператор RETURN возвращает управления обратно к строке, следующей непосредственно за ON-GOSUB.

При применении подпрограмм Бейсика придерживайтесь следующих правил:

(а)    Четко обозначайте начало и конец каждой подпрограммы. Если это возможно, выделяйте  их путем отступа операторов вправо.

(б)   Никогда не пользуйтесь оператором GOTO для входа в подпрограмму и для выхода из  нее.

Каждую подпрограмму надо рассматривать как независимый логически завершенный модуль.

(в)    Имейте под рукой список глобальных входных переменных и выходных результатов  каждой подпрограммы. Лучше всего оформить его комментариями к  программе с  помощью  операторов REM.

(г)        Обязательно  убедитесь,  что  в  подпрограмме  не  изменяются  значения  таких   внешних переменных,  как  счетчики  циклов.  Если  это  возможно,  в  каждой  подпрограмме  вводите  свой принцип именования внутренних переменных.

(д)   В отличие от функций, подпрограммы не появляются в программе до того, как ими  будут пользоваться,  поэтому   полезно   группировать   подпрограммы  вместе   после   оператора   STOP, указанного в конце основной программы.

Источник: Уолш Б.    Программирование на Бейсике: Пер. с англ. М.: Радио и связь, 1988. 336 с: ил.

По теме:

  • Комментарии