ГЛАВА 18
УКАЗАНИЯ
Краткое содержание: PAUSE, INKEY$, PEEK
Если Вы решили задержать выполнение программы на некоторое время,
то Вам следует использовать оператор:
PAUSE N,
который останавливает выполнение программы и отображает картину в
течении N' телевизионных кадров (50 кадров в секунду). 'N* может быть
вплоть до 65535, что составляет около 22-х минут. Если N - б, то это означа-
ет, что оператор PAUSE не имеет ограничений во времени.
Выполнение программы всегда может быть возобновлено до окончания
времени, определённого в операторе PAUSE, нажатием любой клавиши (на-
до помнить, что нажатие CAPS SHIFT и SPACE будет вызывать прерывание).
Пример программы моделирования секундной стрелки часов:
10 REM first we draw the clock face
20 FOR N-l TO 12
30 PRINT AT lO-lO'COS (N/6*PI),16+K)*SIN (N/6*PI);N
40 NEXT N
50 REM now we start the clock
60 FOR T-0 TO 20000: REM T is the time in seconds
70 LET A«T/30*PI: REM A is the angle of the second hand in
radians
80 LET SX»80*SIN A: LET SY«80*COS A
200 PLOT 128,88: DRAW OVER 1;SX,SY: REM draw second hand
210 PAUSE 42
220 PLOT 128,88: DRAW OVER 1;SX,SY: REM erase second hand
400 NEXT T
Эти часы остановятся, проработав приблизительно 55.5 часов, что за-
даётся в операторе с номером 0. Оператор 210 производит отсчёт времени.
Казалось бы, здесь должен быть оператор PAUSE 50 для точного отсчёта
одной секунды, но тогда б мы не учли время, затрачиваемое на выполнение
остальных операторов программы. Рассматриваемый вариант часов обес-
печивает 2%-ю точность или иными словами уход на полчаса в день.
Возможны и более точные способы измерения времени. Для этого мож-
но использовать содержимое специальных областей памяти. В этом случае
данные из памяти могут быть вызваны с помощью функции РЕЕК. Подробно
это рассмотрению в главе 25. Здесь же в качестве примера рассмотрим вы-
ражение:
(65536*РЕЕК 23674+256*РЕЕК 23673+РЕЕК 23672)/50
оно даёт количество секунд, прошедших с тех пор как компьютер был
включен (вплоть до 3-х суток и 21-го часа).
Ниже приводится модифицированная программа моделирования часов:
10 REM first we draw the clock face
20 FOR N-l TO 12
30 PRINT AT 10-10*(X)S (N/6*PI),16+10*SIN (N/6*PI);N
40 NEXT N
50 DEF FN T()eINT ((65536*PEEK:23674+256*PEEK
23673+PEEK 23672) /50): REM number of second since start
100 REM now we start the clock
110 LET TleFN T()
120 LET A"T1/30*PI: REM A is angle of the second hand in radians
130 LET SX«72*SIN A: LET SY«72*COS A
140 PLOT 131,91: DRAW OVER 1;SX,SY: REM draw hand
200 LET T=FN TO
210 THEN GO TO 200: REM wait until time for next hand
220 PLOT 131,91: DRAW OVER 1;SX,SY: REM rub out old hand
230 LET T1=T: GO TO 120
Эти часы обеспечивают точность 0.01% или уход на 10 секунд в сутки.
Однако это возможно при условии, что Вы не использовали оператор ВЕЕР,
ввод-вывод на магнитофон и принтер. Все эти операции увеличивают пог-
решность.
Числа РЕЕК 23674, РЕЕК 23673 и РЕЕК 23672 выделяют из адресов яче-
ек памяти компьютера, используемых для подсчёта 1/50 долей секунды. В
каждой из ячеек подсчитывается сумма от 0 до 255, после достижения
величины 255 в любой из ячеек, она сбрасывается в 0. Первой начинает
отсчитывать ячейка РЕЕК 23672. Каждые 1/50 сек её содержимое увеличива-
ется на 1.
Когда в ячейке накопится величина, равная 255, то она сбрасывается в 0,
а значение ячейки РЕЕК 23673 увеличивается на 1. Через каждые 256/50 сек
содержимое этой ячейки переходит из состояния 255 в 0, а содержимое
ячейки РЕЕК 23674 увеличивается на 1.
При значениях 0 для ячейки РЕЕК 23674 и 255 для ячеек РЕЕК 23673 и
РЕЕК 23672 (этот момент наступит через 21 минуту) наше выражение примет
значение'
(65536*0 + 256*255 + 255)/50 = 1310.7
но здесь имеется скрытая опасность. Через следующую 1/50 сек ячейки
будут содержать, соответственно, следующие значения: 1, 0, 0. Пока
производится вычисление выражения, компьютер может оценить значение
ячейки РЕЕК 23674 как 0 до завершения циклического переноса. В результа-
те получим:
(65536*0 + 256*0 + 0) /50 - 0
что безнадёжно неверно.
Простое правило позволяет решить эту проблему: "следует вычислять
выражение дважды в некоторой последовательности и использовать сох-
ранённый ответ".
Пример:
Ю DEF FN M(X,Y)-(X+Y+ABS (X-Y))/2:
REM the larger of X and Y'
20 DEF FN U()=s(PEEK 23674+256*PEEK 23673+PEEK
23672)/50: REM time, may be wrong
30 DEF FN T()=FN M(FN U(),FN U()>: REM time right
Вы можете изменять значения числовых счётчиков так, чтобы получать
реальное время того момента, когда компьютер был включен.
Например, надо установить 10 часов вечера. Вы посчитали, что это:
10 * 60 * 60 * 50 - 1800000 50-х долей сек
и значит:
1800000 - 65536 * 27 + 256 * 119 + 64
Для присвоения трём ячейкам значений 27, 119 и 64 необходимо вы-
полнить:
РОКЕ 23674,27: РОКЕ 23673,119: РОКЕ 23672,64
Функция INKEY$ (без аргументов) считывает с клавиатуры. Если Вы на-
жали некоторую клавишу (или SHIFT и какую-нибудь клавишу), результатом
будет символ, который даёт эта клавиша в режиме маркера [LJ или пустая
строка.
Выполните программу, которая использует эту функцию:
10 IF INKEY$"" THEN GO TO 10
20 IF INKEY$="" THEN GO TO 20
30 PRINT INKEY$',
40 GO TO 10
Помните, что функция INKEY$ не будет подобно INPUT ждать Вас. Если
Вы не выполните ввод, то считайте, что Ваш шанс упущен.