Программирование на Бейсик 48/128 для ZX-Spectrum 1993 г.

SPECTRUM-бейсик - программные циклы. Пауза. Опрос клавиатуры. Звук.


Программные циклы

FOR, ТО, STEP, NEXT

Введем переменную i, называемую счетчиком цикла, присвоим
ей значение 1 и подставим в строку 45 для выделения первого

символа переменной — R$(i). После проверки кода символа увели-
чим значение i на 1 и сравним его с длиной переменной R$
(предполагается, что R$ не равна «пустой строке»). Если i еще не
превысила LEN R$, то перейдем снова на строку 45, выделим из R$
следующий символ (ведь i увеличилась на 1) и проверим его код:

40 LET i=1

45 IF CODE R$(i)<48 OR CODE R$(i)>57 THEN GO TO 100

48 LET i=i+1

50 IF i<=LEN R$ THEN GO TO 45

Выход из цикла произойдет, когда i превысит количество симво-
лов во введенной строке (i>LEN R$).

Конструкция, подобная построенному нами циклу, настолько
часто применяется в программировании, что для ее организации в
Бейсик введены специальные операторы FOR и NEXT. С их по-
мощью наш цикл запишется следующим образом:

40 FOR i=1 ТО LEN R$

45 IF CODE R$(i)<48 OR CODE R$(i)>57 THEN GO TO 100

50 NEXT i

Следом за ключевым словом FOR следует операция присвоения
переменной i. начального значения — эквивалент LET i=1. После
знака равенства может стоять числовое выражение. Переменная,
использующаяся в цикле FOR...NEXT в качестве счетчика, носит
специальное название — управляющая переменная цикла. Это обыч-
ная числовая переменная, но с единственным ограничением: ее
имя должно состоять из одной буквы.

За ключевым словом ТО указывается конечное значение перемен-
ной цикла (число либо числовое выражение). Сравнение перемен-
ной цикла и предельного значения осуществляет оператор NEXT,
который ставится в конце цикла с указанной вслед за ним управ-
ляющей переменной. Строка с NEXT i аналогична прежним строкам

48 и 50. NEXT увеличивает переменную цикла и сравнивает ее с
предельным значением. Если значение переменной цикла превы-
сило конечное значение, то выполнение программы продолжается
с оператора, следующего за NEXT. Иначе делается еще один «ви-
ток»: повторяются все операторы после FOR .

В нашем примере переменная цикла с каждым проходом уве-
личивается на 1, но значение шага цикла можно варьировать, введя
ключевое слово STEP и указав за ним значение, на которое следует
увеличивать переменную цикла при выполнении оператора NEXT.

Строку 40 можно записать и так:
40 FOR i=1 ТО LEN R$ STEP 1

Правильность набора нужно проверить не только при вводе
суммы, но и при вводе значения курса доллара. Придется ор-
ганизовать еще один цикл, подобный уже описанному. Включим в
программу и строку 100, выводящую сообщение о допущенной
ошибке, и строку 105, «отсылающую» к строкам с оператором
INPUT, в которых была допущена ошибка ввода. Номер строки, на
которую следует перейти, заносится в переменную N.

5 REM Программа пересчета рублей в доллары
10 INPUT "Текущий курс (руб. за 1$): "; LINE К$
13 IF LEN К$=0 THEN GO ТО 10
15 FOR i=1 TO LEN K$

20 IF CODE K$(i)<48 OR CODE K$(i)>57 THEN LET N=10: GO TO 100
25 NEXT i

30 LET Kurs=VAL K$

33 PRINT AT 0,1; "Текущий курс: "; Kurs; " рублей за 1$"

34 PRINT AT 15, 0; "Для окончания работы введите 0"

35 INPUT "Сумма (руб.): "; LINE R$
37 IF LEN R$=0 THEN GO TO 35

40 FOR i=1 TO LEN R$

45 IF CODE R$(i)<48 OR CODE R$(i)>57 THEN LET N=10: GO TO 100
50 NEXT i

60 LET Rub=VAL R$
65 IF Rub=0 THEN STOP

70,LET Dol=INT(Rub/Kurs*100+0.5)/100: REM Расчет
75 PRINT AT 1, 1; Rub; " руб. - ";"$"; Dol:"
80 GO TO 35

100 PRINT AT 10, 0;"Извините. Вы ошиблись в наборе."

101 PAUSE 50

103 PRINT AT 10, 0;"
105 GO TO N

Вот теперь компьютер прервет выполнение программы только
тогдаг когда мы введем сумму 0 руб. (либо оператор STOP). При
ошибочном вводе компьютер извинится и предложит повторить
набор.

Строки 13 и 37 предохраняют от ввода «пустой строки», то есть
от нажатия Enter без ввода символов. Если их пропустить, то в
строках 30 и 60 программа «вылетит» по ошибке, не сумев выпол-
нить VAL от «пустой строки».

Пауза

PAUSE

В строке 101 программы использован оператор PAUSE. Он при-
останавливает выполнение программы. Длительность паузы зада-
ется параметром оператора в 1/50 долях секунды. Оператор
PAUSE 0 задает бесконечную паузу. Прервать паузу можно и рань-
ше установленного срока, нажав любую клавишу.

В нашей программе пауза нужна для того, чтобы пользователь
успел прочитать сообщение об ошибке. После чего сообщение
затирается пробелами (строка 103).

Опрос клавиатуры

INKEY$

Есть еще одна возможность сделать нашу программу более при-
ятной в общении. При выходе из программы принято запрашивать
подтверждение желания пользователя закончить работу. Ведь воз-
можна ситуация, когда на запрос случайно будет введен ноль.
Программа прервется, хотя мы этого и не хотели.

Обычно, при необходи-
мости запросить подтвержде-
ние какого-либо действия,
программу «зацикливают»
на опросе клавиатуры. Реше-
ние «что делать» принимает-
ся в зависимости от того, ка-
кая нажимается клавиша.
Для опроса клавиатуры при-
меняется функция INKEY$.
Она не требует аргумента и
возвращает символ, соответ-
ствующий клавише, нажатой
в данный момент. Если ника-
кая клавиша не была нажата,
функция возвращает значе-
ние «пустая строка».

Без предисловий напишем
необходимый нам фрагмент
программы:

120 PRINT AT 10f 5; "Вы действительно хотите закончить работу? Y/N

(Да/Нет)"
140 IF INKEY$="" THEN GO TO 140
145 IF INKEY$="Y" OR INKEY$="y" THEN STOP
150 CLS: GO TO 5

Пока никакая клавиша не нажата, программа «зациклена» на
строке 140. Если нажата клавиша Y (с Caps Shift или без нее),

программа останавливается. По любой другой клавише осуществ-
ляется переход к началу программы.

Звук

ВЕЕР

Никогда нелишне украсить программу одной-двумя музыкаль-
ными фразами.

Spectmm-Бейсик не позволяет создать многоголосое музыкаль-
ное сопровождение, но «насвистеть» мелодию сумеет. Для этого
имеется специальный оператор веер. Наберем ключевое слово
ВЕЕР, вслед за ним через запятую два числа, скажем, 1 и 0:

ВЕЕР 1, 0

В течение одной секунды мы
будем слышать звук с частотой,
соответствующей ноте ДО пер-
вой октавы. Меняя первое чис-
ло, можно регулировать про-
должительность звучания ноты
(значение задается в секундах).
Второе число определяет высо-
ту звука: увеличение числа на
1 соответствует переходу на
пол тона выше, уменьшение на
1 — на пол тона ниже. Для
поднятия ноты на октаву ко
второму параметру ВЕЕР следу-
ет прибавить 12.

Указанный принцип отсчета параметра ВЕЕР не точен: высоты
нот при его использовании не будут совпадать /с принятыми в
музыке. Чтобы не травмировать слух окружающих, необходимо
использовать более точные параметры. На рис. 4 приведено точное
соответствие значений второго параметра оператора ВЕЕР нотам
первой октавы.

Для проигрывания мелодии, естественно, нужно написать про-
граммку, состоящую из последовательности ВЕЕР. Вот как, к приме-

:ss:

TS5I

до ре ми фа соль ля си до

(0) (2.039) (3.86) (4.98) (7.02) (8.84) (10.88) (12)

Рис. 4. Точные параметры ВЕЕР для средней октавы.

ру, запишется фрагментик из популярной когда-то песни квартета
ABBA «Money, money...»:

10 ВЕЕР 0.15,7.02: ВЕЕР 0.15,8.84: ВЕЕР 0.15,10.88
20 ВЕЕР 0.15,7.02: ВЕЕР 0.15,10.88: ВЕЕР 0.75,8.84
30 ВЕЕР 0.15,8.84: ВЕЕР 0.15,8.84: ВЕЕР 0.15,10.88
40 ВЕЕР 0.3,10.88: ВЕЕР 0.6,7.02

Конечно, мы не стали бы занимать место под эту примитивней-
шую программу, если бы не задались целью показать, как ее
можно модифицировать с помощью какого-нибудь, еще не изучен-
ного нами средства.




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



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

Похожие статьи:
Rants & Raves - О результатах исследований в области паковки программ.
График - принцип Гейтование почты.
Семь и 1/2 - Virtual'но Амижный синдром.
Музобоз - Описание трех конкурсных работ.
О софте - свежий warez: ZX Time 7, Body 35-36, Adventurer 13, Открывашка, Hewly Font Editor, Target 10, ACedit 0.60, Moorhuhn, MSF 23.

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