Работа с ZX-Spectrum 1993 г.

Глава 18 - указания.


ГЛАВА 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 ждать Вас. Если
Вы не выполните ввод, то считайте, что Ваш шанс упущен.




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Moзаика - О секретах в играх "48 Утюгов" и "Поле чудес".
Начало - Вот ведь, блядь, как плохо на душе!
Demo Party - SerzhSoft: сказание о CC'999.
Вступление - читайте предюбилейный, девятый номер ZX-CITY !
От автора - Привет всем! Вопреки моим-же утверждением о загнутом положении этой газеты - Eхрlоrеr 4 все-таки вышел.

В этот день...   25 апреля