Глава 18
Указания
Краткое содержание: PAUSE, INKEYO, РЕЕК.
Если Ьы решили задержать выполнение программы иа некоторое
время, то вам следует использовать оператор: PAUSE N, который
останавливает выполнение программы и отображает картину в течение
"N" телевизионных кадров (50 кадров в Европе или 60 а Америке).
nN" может быть вплоть до 65535, что составляет 22 минуты. Если
N«0, то это означает, что оператор PAUSE ие имеет ограничений по
времени. Выполнение программы всегда может быть возобновлено до
окончания времени, определенного в операторе PAUSE, нажатием лю-
бой клавиши ( надо помнить, что CAPS SHIFT будет вызывать преры-
вание). Пример программы моделирования секундной стрелки часов:
10 REM FIRST WE DRAW THE CLOCK FACE
20 FOR N»1 TO 12
30 PRINT AT Ю-IOOCOS (N/6»PI),16+10*SI N (N/6»PI); N
40 NEXT N
50 REM NOW WE START THE CLOCK
60 FOR T»0 TO 200000: REM T IS THE TIME IN SECONDS
70 LET A«T/30»PI: REM A IS THE ENGLE OF THE SECOND
HAND IN RADIANS
80 LET SX*8 0 *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 час. Это
задается в операторе с номером 60. Оператор 210 производит отсчет
времени. Казалось бы здесь должен быть оператор PAUSE SO (Евро-
па), для точного отсчета одной секунды, но тогда бы мы ие учли
время, затрачиваемое на выполнение остальных операторов програм-
мы. рассматриваемый вариант часов обеспечивает 2-х процентную
точность или, иными словами уход на полчаса в день. Возможны и
более точные способы измерения времейи, для этого можно использо-
вать содержимое специальных областей памяти. В этом случае данные
из памяти могут быть вызваны с по мощью функции реек, подробно
это рассмотрено в главе 25. Здесь же в качестве примера рассмот-
рим выражение:
(65536*РЕЕК 23674+256*РЕЕК 23673+РЕЕК 26672) /50
оно дает количество секунд, прешедших с тех пор, как компьютер
был включен (вплоть до 3-х суток и 21 часа). ниже приводится мо-
дифицированная программа моделирования часов:
10 REM FIRST WE DRAW THE CLOCK FACE
20 FOR N«1 TO 12
30 PRINT AT lO-lO^COS (N/6*P1).16+10*SI N (N/6*PI); N
4 0 NEXT N
50 DEF FN T () »I NT ( (65536*PEEK 23674 + 256»PEEK 23673 +
PEEK 23672) /50): REM NUMBER OF SECOND SINCE
START
100 REM NOW WE START THE CLOCK
110 LET Tl-FN T ()
120 LET A*T1/30*PI: REM A IS THE ANGLE OF SECOND
HAND IN RADIANS
130 LET SX* 72 *S1N A: LET SY*72*COS A
140 PLOT 131,91: DRAW OVER 1; SX, SY: REM DRAW HAND
200 LET T*FN T ()
210 IF T<*T1 THEN GO TO 200: REM WAIT UNTIL TIME FOR
NEXT HAND
220 PLOT 13 1,91: DRAW OVER 1; SX, SY: REM RUB OUT OLD
HAND
2 30 L£T T1=T: GO TO 120
Эти часы обеспечивают точность 0,01% или уход на 10 секунд в
день. Однако, это возможно при условии, что вы не использовали
оператор ВЕЕР, ввод/вы^од на магнитофон и принтер. Все эти опера-
ции увеличивают погрешность. Числа реек 23674, РЕЕК 23673 и реек
23672 выделяют адреса ячеек памяти компьютера и используемых для
подсчета 1/50 долей секунды. В каждой из ячеек подсчитывается
сумма от 0 до 255, после достижения величины 255 в любой из яче-
ек, она сбрасывается в ноль. Первой начинает отсчитывать ячейка
реек 23672, каждые 1/50 сек. Ее содержимое увеличивается на 1.
Когда в ячейке накопится величина, равная 255, то она сбрасыва-
ется в ноль а значение ячейки реек 23673 увеличивается на 1. Че-
рез каждые 256/50 сек. содержимое этой ячейки переходит из состо-
яния 255 в ноль, а содержимое ячейки реек 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,
что безнадежно неверно. Простое правило позволяет решить эту
проблему: "следует вычислять выражение дважды в некоторой после-
довательности и использовать сохраненный ответ". Пример:
10 DEF FN М (X, Y) * (X+Y+ABS (Х-Y)) /2: REM THE LARGER OF X
AND Y
20 DEF FN U () * (65536*PEEK 23674 + 256*PEEK 23673 +
PEEK 23 672) /50: REM TIME, MAY BY WRONG
30 DEF FN T () *FN M (FN U (), FN U ()): REM TIME RIGHT
Вы можете изменять значения числовых счетчиков так, чтобы По-
лучать реальное время того момента, когда компьютер был включен.
Например, надо установить 10 часов вечера. Вы посчитали, что это
10*60*60*50*1800000 50-х Долей секунды и значит
18 00000*65536*27+2 56*119+64.
Для присвоения трем ячейкам значений 27,119 и 64 необходимо вы-
полнить :
Роке 23674,27: РОКЕ 23673,119: РОКЕ 23672,64
Функция INKEY* (без аргументов) считывает с клавиатуры. Если
вы нажали некоторую клавишу (или SHIFT и какую-нибудь клавишу),
результатом будет символ, который дает эта клавиша в режиме мар-
кера <L>, или пустая строка.
Выполните программу, которая использует эту функцию:
10 IF INKEYB о" " THEN GO ТО 10
20 IF INKEY* H THEN GO TO 20
30 PRINT INKEY*;
40 GO TO 10
Помните, что функция INKEY* не будет подобно INPUT ждать рас.
Если вы не выполните ввод, то считайте, что ваш шанс упущен.