|
Раздел для начинающих - работа с операторами БЕЙСИКа READ и DATA.
|
Мы знаем, что особую сложность для начинающих представляет работа с операторами БЕЙСИКа READ и DATA, не говоря уже о RESTORE. Профессионалы, если вспомнят свои первые шаги, конечно с нами согласятся, причин здесь две. Во-первых работа этих операторов неочевидна, то есть требует специальных разъяснений, а во-вторых в БЕЙСИКе есть замечательный оператор INPUT, который позволяет удобно организовывать ввод данных, и начинающие предпочитают пользоваться им.
Сегодня мы предлагаем Вашему вниманию несложную программу, позволяющую воспроизвести на компьютере несколько простых мелодий. Работа звукового динамика здесь основывается на использовании оператора ВЕЕР m, n. Параметр m означает продолжительность звукового сигнала в секундах, а параметр n - высоту тона (частоту звукового сигнала).
Эти параметры вводятся с помощью операторов READ и DATA. Они хранятся в строках DATA и считываются оттуда оператором READ. Операторы READ и DATA работают в паре. Когда программа встречает очередной оператор READ, например READ Q, R, S - она обращается к ближайшему неиспользованному до сих ПОР оператору DATA и вводит из него столько чисел, сколько нужно оператору READ, в нашем случае - три (Q, R и S). Если в строке DATA стольких чисел нет, то программа идет к следующему блоку DATA и читает данные из него. После того, как данные прочитаны, они считаются использованными и больше к ним так просто не вернуться.
После совместной работы READ и DATA возможны три варианта. Первый, когда сколько данных потребовалось для READ, столько и нашлось в DATA, это нормальный вариант, все в порядке. Бывает, что операторы READ уже взяли все, что им надо, а в строках DATA еще не все данные использованы. Это возможно, никакой ошибки здесь нет. Хуже, когда READ просит какие-то данные, а строки DATA уже исчерпаны, в этом случае появляется сообщение типа 80 OUT OF DATA. Оно означает, что тому оператору READ, который стоит в 80-й строке, не хватило данных в DATA. Скорее всего причина ошибки в той, что Вы по невнимательности пропустили какое-то число, набирая строку DATA.
Если Вы подумали, что данные в строках DATA могут быть использованы только раз и потом они недостижимы, то это не совсем так. Дело может поправить оператор RESTORE NNNN, где NNNN - номер строки, например RESTORE 2500. Этот оператор "восстанавливает" строки DATA, начиная со строки NNNN, после чего следующий оператор READ будет читать данные из этой строки и последующих и т. д.
С помощью оператора RESTORE можно не только "восстанавливать" строки DATA, но с тем же успехом и вообще манипулировать данными, определяя какая строка когда будет вводиться.
Предлагаемая программа даст Вам представление о том, как все это происходит.
* * *
Введите программу и нажмите RUN и ENTER. Вы можете остановить программу с помощью CAPS SHIFT + SPACE (или клавиши BREA^.
10 LET menu = 40 : LET dstart = 300 : LET dplay = 400
Здесь мы присвоили переменным значения номеров часто использующихся строк, чтобы потом обращаться к строкам не по номеру, а по имени. Все-таки в имени есть какая-то информация, и если так делать почаще, то программа становится понятнее. Бывает трудно разобраться в своей же программе, написанной пару месяцев назад. 20 BORDER 4: PAPER 3: INK 9 30 BRIGHT 1: CLS Выставили цвета экрана. 40 REM menu 50 RESTORE dstart 55 FOR n = 1 TO 4: READ a$
Прочитали из строки DATA названия четырех мелодии. 60 PRINT AT 5 + 2*n, 1; PAPER 7; n;"="; а$;
Распечатали их на экране. 70 NЕХТ n 90 INPUT p
Запрос номера мелодии, которую Вы хотите прослушать.
100 IF p<1 OR p>4 THEN CLS: GO TO menu
В программе всего 4 мелодии и если нажата клавиша с номером, которого нет, возврат в меню.
110 IF p<>INT(p) THEN CLS: GO TO menu
Если введено не целое число, то тоже возврат в меню.
114 LET p$=STR$(p)
115 IF CODE(p$)<48 OR CODE(p$)>57 THEN CLS: GO TO menu
Если нажата не цифра, а иная клавиша, то тоже возврат. Коды цифр лежат в интервале от 46 до 57. Остальные символы - не цифры.
130 CLS
140 INPUT PAPER 7;"how many?"; v
Сколько раз повторить мелодию? 150 LET v = INT v 160 IF v<1 THEN GO то menu 180 RESTORE dstart + p
Очередной READ устанавливается на название избранной мелодии. 190 READ a$:
Теперь рассчитаем величину "k", необходимую для центрирования названия мелодии на экране.
200 LET b$ = "□"
Это графический символ. Он вводится в графическом режиме нажатием CAPS SHIFT+8. Переход в графический режим выполняется нажатием CAPS SHIFT + 9 (появятся курсор G).
310 LET k=INT((32-LEN a$)/2): 315 LET s$=" "
Здесь один пробел, 220 PRINT AT 11,k-2; PAPER 7; b$; s$;; а$; s$; s$; b$
Нарисуем рамку вокруг названия. 240 FOR n = k-1 ТО LEN а$+k+2 250 PRINT AT 10,n; PAPER 7; s$;
AT |
12, |
n; s$; |
AT |
10, |
k-2; b$; |
AT |
12, |
k-2; b$; |
AT |
10, |
LEN a$+k+2 |
AT |
12, |
LEN а$+к+2 |
255 NEXT n
260 FOR п=к-2 TO LEN а$+к+2: PRINT AT 9,n; INK 0; b$; AT 13, n; b$ 265 NEXT n
270 RESTORE dplay + p 275 READ q, r, s Ввели параметры мелодий: q - количество нот; r - ритм (темп); s - пауза между повторами.
Далее идет само исполнение избранной мелодии,
280 FOR m = 1 TO v
281 RESTORE dplay + P*100
282 FOR n = 1 TO q
283 READ a,b
284 ВЕЕР a/r,b
285 NEXT n
286 PAUSE S 290 NEXT m
299 RUN
300 REM -----------------------
301 DATA "Melody one"
302 DATA "Melody two"
303 DATA "Melody three"
304 DATA "Melody four"
400 REM -----------------------
401 DATA 23,6, 16
402 |
DATA |
73,4,75 |
403 |
DATA |
36,3,1 |
404 |
DATA |
33,3,33 |
490 |
REM |
--- |
Melody one---- |
500 |
DATA |
2, |
0,2,0,2,4,2,7 |
501 |
DATA |
6, |
12,10,9,2,9,8,5 |
502 |
DATA |
2, |
7,2,9,16,7,2,0 |
503 |
DATA |
2, |
0,2,4,1,7,1,7 |
504 |
DATA |
6, |
7,10,2,2,4,2, 5 |
505 |
DATA |
2, |
4,2,2,14,0 |
590 |
REM |
-- |
Melody two---- |
600 |
DATA |
2, |
2,2,7,3,7,1,7 |
601 |
DATA |
1, |
7,3,11,2,7,2,9 |
602 |
DATA |
3, |
9,1,9,1,9,3,12 |
603 |
DATA |
2, |
9,2,11,2,9,2,7 |
604 |
DATA |
2, |
14,2,12,2,11,2,11 |
605 |
DATA |
3, |
9,1,9,4,9,1,2 |
606 |
DATA |
1, |
2,2,7,2,7,2,7 |
607 |
DATA |
1, |
7,3,11,2,7,2,9 |
608 |
DATA |
3, |
9,1,9,1,9,3,12 |
609 |
DATA |
1, |
9,1,9,1,11,3,14 |
610 |
DATA |
2, |
12,1,11,3,14,2,12 |
611 |
DATA |
3, |
11,1,7,2,9,4,7 |
612 |
DATA |
2, |
2,3,7,1,7,3,7 |
613 |
DATA |
1, |
7,3,11,2,7,3,9 |
614 |
DATA |
1, |
9,2,9,1,9,3,12 |
615 |
DATA |
1, |
9,1,9,1,11,3,14 |
616 |
DATA |
2, |
12,1,11,3,14,2,12 |
617 |
DATA |
3, |
11,1,7,2,9,4,7 |
690 |
REM |
-- |
-Melody three---- |
700 |
DATA |
1, |
0,1,0,2,5,2,5 |
701 |
DATA |
2, |
9,1,0,1,9,2,10 |
702 |
DATA |
2, |
10,2,14,1,10,1,10 |
703 |
DATA |
2, |
9,2,9,2,12,1,9 |
704 |
DATA |
1, |
5,2,7,2,7,2,12 |
705 |
DATA |
2, |
0,2,5,1,5,1,5 |
706 |
DATA |
2, |
9,1,12,1,9,2,10 |
707 |
DATA |
2, |
10,2,14,2,10,2,9 |
708 |
DATA |
1, |
9,1,9,1,0,2,9 |
709 |
DATA |
2, |
7,2,5 |
790 |
REM |
-- |
-Melody four---- |
600 |
DATA |
2, |
7,2,11,2,11,6,11 |
601 |
DATA |
2, |
7,2,9,1,11,1,9 |
602 |
DATA |
6, |
7,2,7,2,11,2,14 |
603 |
DATA |
6, |
14,2,9,2,11,8,14 |
604 |
DATA |
2, |
14,2,16,2,14,6,11 |
605 |
DATA |
1, |
9,1,7,2,14,2,11 |
606 |
DATA |
6, |
2,1,2,1,2,2,4 |
607 |
DATA |
2, |
7,6,9,2,2,2,4,6,7 |
|
|