ZX Format #06
29 июля 1997

Программистам - Beta Basic: продолжение разговора о бейсике (часть 2).

<b>Программистам</b> - 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.

_______________________________



Другие статьи номера:

Сегодня в номере - содержание журнала.

Авторы - авторы журнала ZX-Format No.6

От авторов - свершилось давно ожидаемое событие...

Игрушки - Последний утюг (новелла по игре 48 утюгов).

Игрушки - Приключения Винни Пуха. Часть вторая.

Игрушки - описание игры The Crypt (Castle Master 2).

Игрушки - описание редактора Адевентюр - PAW (часть 1).

Игрушки - описание редактора Адевентюр - PAW (часть 2).

Игрушки - описание редактора Адевентюр - PAW (часть 3).

Игрушки - описание редактора Адевентюр - PAW (часть 4).

Игрушки - описание редактора Адевентюр - PAW (часть 5).

Программистам - Beta Basic: продолжение разговора о бейсике (часть 2).

Программистам - General Sound: Руководство по программированию.

Программистам - MMD - драйвер. Описание структуры драйвера модема для терминальной программы MMD.

Программистам - AI от В.Медноногова. Подробное описание "волнового алгоритма" трассировки (автоматического рассчета оптимального) пути, с примером реализации на Basic.

Программистам - Искуственный интеллект. Продолжение цикла статей об "AI". Общие основы нахождения пути к цели.

Программистам - Тr-Dos для программистов. Макс Петров завершает свой рассказ о нетрадиционых методах работы с диском.

Программистам - обмен опытом: "3-colour". Описание эффекта "8-цветов на точку", хелп к вьюверу и сколько слов о конвертации картинок в формат "3-colour".

Программистам - обмен опытом: "3-colour". Несколько слов о конвертации картинок в формат RGB.

Программистам - обмен опытом: программирование мультиколорных эффектов.

IS-DOS - пользователям: как выполнить индивидуальную настройку системы IS-DOS на конкретную модель ZX Spectrum-совместимого компьютера и на выполнение Ваших задач.

IS-DOS - пользователям: как скопировать системный диск IS-DOS и остаться при этом в живых.

IS-DOS - программистам: краткий курс - программирование в среде IS-DOS.

IS-DOS - news: новые программы IS-DOS.

Железо - Краткий рассказ о возможностях процессора Z-180.

Железо - Multiviewer. Описание доработочки, позволяющей мерять скорость программ по бордюру без влезания в коды - легким нажатием кнопки.

Железо - о новом проекте фирмы Peters - "Sprinter". Новый Spectrum-совместимый компьютер нового поколения Speccy.

Железо - Мнение пользователя о скорпионовском контроллере IDE HDD - SMUC.

Железо - SuperSpectrum: об одном проекте Spectrum-совместимой машины. Её особенностью является совместимость с PC.

Железо - X-Trade FAQ. Ответы на наиболее часто задаваемые вопросы по GS и XTR-модему.

Премьера - Flash tracker. Описание 4-х канального редактора цифровой музыки, работающего с SoundDrive, от самого автора SoundDrive - Flash Inc.

Премьера - Описание последней версии универсальной терминальной программы, используемой в SpbZxNet.

Премьера - Mortal Kombat: что ждёт Вас в полной версии игры и некоторые коментарии к demo версии.

Премьера - XReversy: презентация новой игрушки, из популярного семейства "реши задачку - посмотри картинку".

Интервью - Интервью с одним из известнейших спектрумистов - Андреем Ларченко.

Здесь был ты - Рассказ "Абсолютная власть".

Здесь был ты - Рассказ "Дорога".

Здесь был ты - Повелитель зубов: пародия на одну популярную трилогию...

Почта - Обратная связь: ответное письмо Alex'а из Нижнего Тагила, выставленного в прошлом номере в "Уголок ламера".

Почта - Письма читателей: Андрей Яковлев, Денис Токарчук, Алексей Гаркулим, Александр Гордеев, Евгений Шумилов, Ниточкин Вадим, Михаил Ларкин.

Почта - бесплатная реклама и обьявления.

Разное - Страшилка.: Nemo рассуждает о месте PC и Spectrum'а в современной России.

Разное - Рецензия Nemo на книжку по цифровой схемотехнике. Для всех, кто хоть когда-нибудь испытывал желание включить паяльник и...

Разное - анкета: Результаты нашего социологического опроса спектрумистов.

Разное - Конкурс. Краткий отчет о наших конкурсах.

Разное - Проблемы рынка ПО: когда загнется Спектрум. Во всем ли виноваты Хакеры?

Разное - Перспективы ПО. Краткий обзор готовящегося к выходу ПО: Fast Tracker, Pro Sound Creator, Чёрный Ворон.

Разное - Перспективы ПО. Адвентюра From Beyond или "Извне".

Разное - мемуары о Питерской модемной сети для ZX Spectrum - SPbZXNet.

Amiga Club - Между нами, пользователями: сравнение характеристик Amiga 1200 с IBM PC.

Amiga Club - сравниваем производительность Амиг и PC. Насколько Амига актуальна в современных играх?


Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Календарь - Календарик юного любителя слушать что попало.
BBS news - График работы BBS'oк.
Gameland - о пройденных играх: Imperia 2, Hexagonal Filler, From Beyond.
Планета шелезяка - Буфер шины адреса CPU Z80 (продолжение).
Железо - меня спек с писишным блоком питания. честно сказать, шум его вентилятора меня порядком достал.

В этот день...   21 ноября