Beta-Basic
Часть II
music by DNK
(C) Д.Рудовский
_______________________________
Процедуры и функции.
Для тех, кто работает на бейсике, уже
знакомо понятие функции, хотя понятие
процедура и представляется, наверное,
несколько абстрактно. Поэтому я и начну
описание именно с процедур.
Процедура Spectrum-бейсикa была упро-
щена до подпрограммы, которая не имеет к
процедурам практически никакого отноше-
ния.
Отличительной особенностью процедуры
является наличие имени, по которому и
происходит ее вызов. Сейчас я приведу две
программы иллюстрирующие сказанное мной
выше, первая из которых написана под
Spectrum бейсик, а вторая под ВВ:
I:
10 LET PRIVET=100: LET I=0
20 LET N=3: GO SUB PRIVET
30 PRINT "I=";I,"N=";N
40 STOP ""
100 FOR I=1 TO N
110 PRINT "HELLO!"
120 NEXT I
130 RETURN
Результат:
HELLO!
HELLO!
HELLO!
I=4 N=3
II:
10 LET I=7: LET N=18
20 PRIVET 3
30 PRINT "I=";I,"N=";N
40 STOP
100 DEF PROC PRIVET N
110 LOCAL I
120 FOR I=1 TO N
130 PRINT "HELLO!"
140 NEXT I
150 END PROC
Результат:
HELLO!
HELLO!
HELLO!
I=7 N=18
Посмотрев на результаты начинаешь ис-
пытывать чувство сильного удивления: Ведь
I, как переменная цикла должна иметь зна-
чение на 1 большее чем N, да и надпись
"HELLO!" должна была появиться по крайней
мере 18 раз, а не 3. Правда немного сму-
щают строки 100 и 110, да еще какой то
бред в 20 строке программы написанной на
ВВ. Попробуем разобраться, сравнивая эти
два примера.
Итак, в 10 строке СБ (Спектрум бей-
сик) переменной PRIVET присваивается зна-
чение 100, т.е. номер строки подпрограм-
мы, а также переменной I присваивается
значение 0. В этой же строке ВВ перемен-
ным I и N присваиваются значения 7 и 18
оответственно.
В 20 строке СБ переменной N присваи-
вается значение 3 и вызывается подпрог-
рамма, находящаяся в строке, адресуемой
переменной PRIVET. 20 строка ВВ представ-
ляет для нас очень большой интерес, так
как на первый взгляд в ней нет ни одного
оператора. На самом же деле это не совсем
так, потому что здесь просто опущен опе-
-ратор PROC. Но тогда вы спросите: Как это
опущен? Да, в этом смысле СБ более кон-
сервативен и он не допускает таких вещей.
ВВ более гибок, поэтому понятие "по умол-
чанию" встретится нам еще не раз. Для
дальнейших объяснений нам придется перей-
ти сразу к 100 строке.
Итак, 100 строка ВВ:
100 DEF PROC PRIVET N
По аналогии с DEF FN можно сказать, что
,DEF PROC есть определение процедуры, тог-
да PRIVET можно расценить как ее имя, а N
как формальный параметр. Формальным он
называется потому, что как и в функциях
вне процедуры не существует и поэтому,
вернувшись к 20 строке ВВ мы видим, что
имеет место вызов процедуры PRIVET с па-
раметром 3.
Следующая строка в ВВ тоже представ-
ляет некоторый интерес, так как в ней по-
падается команда LOCAL и в связи с ней
надо вспомнить еще одну особенность про-
цедур, ради которой, собственно, и зате-
вался весь этот сыр-бор с примерами. Про-
цедура является независимым блоком прог-
раммы за счет того, что она имеет так на-
зываемые локальные переменные т.е. пере-
менные действующие только в пределах дан-
ной процедуры. Имена локальных и глобаль-
ных (общих) переменных могут совпадать,
но изменения локальных переменных никак
не отражаются на изменении глобальных пе-
ременных. Таким образом, вам не надо все
время помнить какие переменные вы уже ис-
пользовали в программе.
Возвращаясь к примерам можно сказать,
,что команда END PROC практически эквива-
лентна команде RETURN, но это не значит,
что можно произвольно менять их местами,
так как в ВВ понятие процедуры отличается
от понятия подпрограмма.
Теперь, объяснив понятие процедур,
перейдем к их использованию, т.е. сейчас
я попытаюсь рассказать, как можно более
эффективно использовать возможности ВВ в
этой области.
Начнем сначала, т.е. с параметров.
Правила ввода параметров в процедуру ана-
логичны правилам ввода параметров в функ-
ции в СБ, за исключением тех случаев,
когда ввод параметров оговорен отдельно
специальными командами ВВ. Первая из них:
.REF a, или передача параметров по ссылке,
где а - имя переменной. Данный способ как
бы переименовывает глобальную переменную
на время работы процедуры и позволяет по-
лучать результат работы процедуры в гло-
бальной переменной. Приведу пример из
ZX-РЕВЮ N1 за 1992 год:
10 LET X$="H1":
LET Y$="GOODBYE"
20 SWOP X$,Y$
30 PRINT X$,Y$
100 DEF PROC SWOP REF A$,
REF B$
110 LOCAL T$
120 LET T$=A$: LET A$=B$:
LET B$=T$
130 END PROC
Результат:
GOODBYE H1
Ссылка используется также для переда-
чи в качестве параметра массива, так как
передача массивов в качестве параметров
непосредственно запрещена.
Еще одна команда, позволяющая упрос-
тить работу с процедурами, выглядит так:
/DEFAULT a=... , где а - формальный пара-
метр. Эта команда позволяет опускать па-
раметр a при вызове процедуры, т.е. поз-
воляет устанавливать значение какого либо
параметра "по умолчанию". Так как, воз-
можно, понять это может быть довольно
сложно, то я опять обращусь к примерам:
10 MULT 10,5
20 MULT 10
30 MULT ,5
50 STOP
100 DEF PROC A,B
110 DEFAULT B=A: DEFAULT A=B
120 PRINT A*B
130 END PROC
Результат:
50
100
25
В данном случае при отсутствии одного
параметра ему по умолчанию присваивается
значение другого параметра.
Ну и закончить рассказ о параметрах
можно понятием списка. Для указания на
то, что параметры передаются списком ис-
пользуется ключевое слово DATA.
Что же такое список параметров и за-
чем он нужен? Бывают ситуации в которых
мы не знаем заранее количества парамет-
ров, в этом случае и применяется список
параметров. Использовать параметры из
этого списка не просто, а очень просто.
Но в начале как всегда пример:
10 SUMMA 1,2,3
20 SUMMA 3,4,5,6,9
30 SUMMA 1
40 STOP
100 DEF PROC SUMMA DATA
110 S=0
120 IF ITEM()=0 THEN GO TO 160
130 READ A
140 S=S+A
150 GO TO 120
160 PRINT "SUMMA=";S
170 END PROC
Результат:
SUMMA=6
SUMMA=27
SUMMA=1
Здесь использовалась функция ITEM(),
которая определяет следующий элемент
списка, т.е. ITEM()=0, если список исчер-
,пан; ITEM()=1, если следующий параметр -
-число; ITEM()=2,если следующий параметр -
строка.
Оператор DATA в данном случае исполь-
зовался для извлечения параметров из
списка.
В использовании функций в ВВ никаких
значительных изменений по сравнению с СБ
не произошло, хотя количество встроенных
функций значительно возросло.
Условные операторы.
В СБ имеется лишь одна конструкция
,условного оператора IF ... THEN, В ВВ эта
,конструкция была расширена оператором EL-
SE:
IF условие THEN K1 ELSE K2
Где K1 и K2 группы операторов. В слу-
чае выполнения условия выполняется K1,
иначе K2 Оператор
GO TO ON a,n1,n2,n3,...
GO SUB ON a,n1,n2,n3,...
используется для выбора номера строки пе-
рехода т.е. при а=1 переход на строку n1;
при а=2 на строку n2 и т.д.
Вторая форма этого оператора:
. ON a,k1,k2,k3,... используется для вы-
полнения операторов из списка. После вы-
полнения оператора управление передается
на следующую строку.
Кроме вышеперечисленных форм есть еще
одна специфическая форма:
ON ERROR n
ON ERROR: k1:k2:...
Эта команда позволяет перехватывать
практически все сообщения об ошибке, кро-
ме:
0: ОК.
9: STOP statement.
При использовании первой формы при
ошибке происходит переход на строку n.
Во втором случае выполняется последо-
вательность операторов k1, k2, ...
Отключается режим командой:
ON ERROR 0
При обработке ошибки могут быть по-
лезны три специальные переменные:
LINO - номер строки в которой
произошла ошибка.
STAT - номер оператора в этой
строке.
ERROR - код ошибки.
После выполнения оператора ON ERROR
перехват ошибки отключается, поэтому если
вы хотите постоянно контролировать ошиб-
ки, то не забудьте вставить восстановле-
ние режима после обработки ошибки.
Циклы.
Перед тем, как начать рассказывать об
использовании циклов в ВВ мне придется
отклониться и рассказать о видах циклов.
Те, кто знает, что такое циклы с предус-
ловием и постусловием могут смело пропус-
тить следующие несколько абзацев.
В цикле с предусловием в начале про-
веряется условие и, в зависимости от его
выполнения тело цикла либо выполняется,
либо происходит выход из цикла. На СБ
цикл с предусловием можно представить
так:
10 LET I=1: LET N=10
20 IF I>=N THEN GO TO 50
30 PRINT I: LET I=I+1
40 GO TO 20
50 PRINT I: STOP
Результат:
1
2
3
4
5
6
7
8
9
10
В случае, когда условие не выполняет-
ся сразу, тело цикла тоже не будет выпол-
нено.
Цикл с постусловием всегда выполняет-
я хотя бы раз.
10 LET I=1: LET N=10
20 PRINT I: LET I=I+1
30 IF I<N THEN GO TO 20
40 PRINT I: STOP
Результат:
1
2
3
4
5
6
7
8
9
10
Как вы видите результаты работу того
и другого типов цикла одинаковы, однако,
если условие в цикле с постусловием не
будет выполнено сразу, то тело цикла все
равно будет выполнено хотя бы раз.
В ВВ введена новая конструкция цикла:
DO
...
LOOP
При встрече команды LOOP ВВ ищет
,предшествующий ей DO и передает управле-
ние на оператор следующий за DO. При ис-
-пользовании только операторов DO и LOOP
мы получаем так называемый бесконечный
цикл. Поэтому введены дополнительные ко-
манды:
WHILE условие
UNTIL условие
Эти операторы ставятся после операторов
.DO и LOOP, определяя условия выхода из
цикла. Если они стоят после DO, то это
цикл с предусловием, если после LOOP, то
это цикл с постусловием.
WHILE указывает на то, что цикл будет
выполняться до тех пор, пока условие вы-
полняется, а UNTIL указывает, что цикл
выполняется пока условие не будет выпол-
нено.
Пример:
I.
10 LET I=1: LET N=10
20 DO
30 PRINT I: LET I=I+1
40 LOOP
50 STOP
II.
10 LET I=1: LET N=10
20 DO WHILE I<N
30 PRINT I: LET I=I+1
40 LOOP
50 STOP
III.
10 LET I=1: LET N=10
20 DO UNTIL I>=N
30 PRINT I: LET I=I+1
40 LOOP
50 STOP
IV.
10 LET I=1: LET N=10
20 DO
30 PRINT I: LET I=I+1
40 LOOP WHILE I<N
50 STOP
V.
10 LET I=1: LET N=10
20 DO
30 PRINT I: LET I=I+1
40 LOOP UNTIL I>=N
50 STOP
В отличии от цикла FOR ... NEXT здесь
запрещено перекрывание циклов.
Для досрочного выхода из цикла пре-
дусмотрен оператор:
EXIT IF условие
При выполнении условия происходит пе-
реход на оператор следующий за LOOP.
_______________________________