ZX Format
#06
29 июля 1997 |
|
Программистам - Beta Basic: продолжение разговора о бейсике (часть 2).
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. _______________________________
Другие статьи номера:
Похожие статьи:
В этот день... 21 ноября