ШШЮПРУМ Ж «МНЕ
© Ю. Пензин, г. Самара,1994.
Предлагаю несколько программ для старшеклассников. Темы программ "MADNESS", "TCHIRNHAUSEN", "CHAOS", "OBOI" взяты из журналов "В мире науки" (SCIENTIFIC AMERICAN) № 11 1986 г. № 9 1987 г., № 7 1988 г. Это оригинальные графические композиции. В свою очередь программы "PLANETS" и "MOON" могут быть полезны на уроках астрономии.
MADNESS.
10 BORDER 0: PAPER 0: INK 4: CLS 20 PRINT #0; INK 1;"MADNESS" 30 FOR t=1 TO 1E30 STEP 0.5
40 LET x=SIN (0.99*t/180*PI)-0.7*COS (3.01*t/180*PI) 50 LET y=COS (1.01*t/180*PI)+0.1*SIN (15.03*t/180*PI) 60 PLOT x*75+127,y*75+87 70 NEXT t
10 BORDER 4: PAPER 1: CLS
20 PRINT AT 20,1; INK 7;"TSCHIRNHAUSEN"
30 FOR a=.2 TO 2 STEP .25
10 BORDER 0: PAPER 0: INK 4: CLS
20 PRINT #0; INK 1;"CHAOS-1"
30 LET x=.3: LET z=0
40 FOR r=2.9 TO 4 STEP .0063
50 LET z=z+1
60 FOR i=1 TO 80
70 LET x=r*x*(1-x)
80 NEXT i
90 FOR i=1 TO 80
100 LET x=r*x*(1-x)
110 PLOT 200*x,175-z
120 NEXT i
130 NEXT r
4 0 BRIGHT 1: INK 2: BEEP .1,1 50 FOR t=-4.4 TO 4.4 STEP .02 60 LET x=a*5*(t*t-7)+120 70 LET y=.7*a*t*(t*t-7)+86 80 PLOT x,y 90 NEXT t 100 NEXT a 110 BEEP .2,3
OBOI.
10 REM : LET a=10,b=10,s=11
20 BORDER 0: PAPER 2: CLS
30 INPUT "a=",CORNa,"b=",CORNb
40 INPUT "s=",side
50 PRINT #0;AT 1,13,-"OBOI"
60 FOR i=0 TO 255
70 FOR j=0 TO 175
80 LET x=CORNa+(side*i/100)
90 LET y=CORNb+(side*j/100)
100 LET z=x*x+y*y
110 LET c=INT z
120 LET d=c/2
130 LET e=INT d
140 LET f=d-e
150 IF f=0 THEN PLOT INK 1;i,j 160 NEXT j 170 NEXT i
Изменение параметров a, b, s в программе "OBOI" изменяет масштаб и рисунок.
Математическая основа следующих программ "PLANETS" и "MOON" взята из книги: П. Даффет-Смит "Практическая астрономия с калькулятором".
ИФК: В оригинале программы, присланные Юрием, были русифицированы при помощи UDG-символов. Учитывая то, что наши читатели привыкли уже к более сложному, но и более совершенному способу русификации с помощью догружаемого символьного набора, мы провели такую адаптацию, после чего и предлагаем программы читателям РЕВЮ. Думаем, что Юрий не осудит нас за это.
Программа предназначена для работы с дисководом. Тем, у кого его пока еще нет, несколько слов скажем
позже.
PLANETS.
1 GO TO 20
10 BORDER 1: PAPER 1: INK 4: CLEAR 64599 15 RANDOMIZE USR 15619: REM : LOAD "chr"CODE 64600
20 POKE 23606,88: POKE 23607,251
21 PRINT AT 8,7; INK 6;"КАЛЕНДАРЬ ПЛАНЕТ"
22 PRINT AT 10,2; INK 4;"ПРОГРАММИРОВАЛ И АДАПТИРОВАЛ";AT 11,9 ;"ДЛЯ СПЕКТРУМА";AT
13,10;"ЮРИЙ ПЕНЗИН"
23 PRINT AT 17,5; INK 3;"© 1993 ASTRO-SOFTWARE"
2 4 PRINT AT 21,5; INK 2;"НАЖМИТЕ ЛЮБУЮ КЛАВИШУ": PAUSE 0: BEEP .1,7 2 5 LET GR=PI/180
30 LET DATA=1000
40 LET CONV=1500
5 0 LET ATN=2 000
100 LET INORBIT=4 5 0 0
105 LET STAR=4 600
110 LET ROUND=9500
115 LET RD=10
200 CLS : GO SUB DATA
210 RESTORE 250
220 FOR N=1 TO 7: READ A$
230 PRINT AT 4 + 2 *N,3; INK 4;N;"-";A$
240 NEXT N
250 DATA "МЕРКУРИЙ","ВЕНЕРА" 260 DATA "МАРС","ЮПИТЕР" 270 DATA "САТУРН","УРАН" 280 DATA "НЕПТУН"
2 90 INPUT AT 0,3; INK 3;"ВВЕДИТЕ НОМЕР:";N: BEEP .1,7 2 92 PRINT AT 5,0;: INPUT AT 17,0 294 RESTORE 250
2 95 FOR I=1 TO N: READ A$: NEXT I: PRINT AT 4,1; INK 3;A$
300 LET PAR=30 0: RESTORE PAR+N
301 DATA 0.24085, 231.2973, 77.1442128, 0.2056306, 0.3870986, 7.0043579, 48.0941733, 6.74,1.918E-6
302 DATA 0.61521, 355.73352, 131.2895792, 0.0067826, 0.7233316, 3.394435, 76.4997524, 16.92,1.721E-5
303 DATA 1.88089, 126.30783, 335.6908166, 0.0933865, 1.5236883, 1.8498011, 49.4032001, 9.36,4.539E-6
304 DATA 11.86224, 146.966365, 14.00095493, 0.0484658, 5.202561, 1.3041819, 100.2520175, 196.74, 1.994E-4
305 DATA 29.45771, 165.322242, 92.6653974, 0.0556155, 9.554747, 2.4893741, 113.4888341, 165.6, 1.74E-4
306 DATA 84.01247, 228.0708551, 172.7363288, 0.0463232, 19.21814, 0.7729895, 73.8768642, 65.8, 7.7 68E-5
307 DATA 164.79558, 260.3578998, 47.8672148, 0.0090021, 30.10957, 1.7716017, 131.5606494, 62.2, 7.597E-5
308 READ TP,EP,W,EC,AE,I,LV,DR,BL
310 GO SUB INORBIT: LET PLLP=LP: LET PLRV=RV: LET PLAE=AE 315 REM ДЛЯ ЗЕМЛИ
320 RESTORE 325: READ TP,EP,W,EC,AE
325 DATA 1.00004, 98.83354, 102.596403, 0.016718,1
330 GO SUB INORBIT
340 LET RZ=(PLLP-LV): LET PLJ=(ASN (SIN (RZ*GR)*SIN (I*GR)))/GR
350 LET Y=SIN (RZ*GR)*COS (I*GR): LET X=COS (RZ*GR)
360 GO SUB ATN: LET DS=Z+LV: LET MS=LP-DS
370 LET ERV=PLRV*COS (PLJ*GR): IF PLAE>1 THEN GO TO 9000
380 LET CPL=(ATN (ERV*SIN (MS*GR)/(RV-ERV*COS (MS*GR))))/GR: LET CPL=180+LP+CPL: LET ANG=CPL: GO SUB CONV: LET CPL=ANG
381 REM CPL-ГЕОЦЕНТРИЧ.ДОЛГОТА-ЛЯМБДА 390 GO SUB 9200
3 91 REM UPL-ГЕОЦЕНТРИЧ. широта-бэта
400 LET MK=COS (23.441884*GR): LET NK=SIN (23.441884*GR): LET QK=SIN (CPL*GR)
410 LET VK=(ASN (SIN (UPL*GR)*MK+COS (UPL*GR)*NK*QK))/GR
411 REM VK-ДЕЛЬТА
415 PRINT AT 7,1;"ДЕЛЬТА:";: IF SGN VK=-1 THEN PRINT "-";
420 PRINT INT ABS VK;" ГРАД. ";
425 LET XR=(ABS VK-INT ABS VK)*60: LET X=XR: GO SUB ROUND: LET XR=X: PRINT XR;" МИН." 430 LET Y=QK*MK-TAN (UPL*GR)*NK 435 LET X=COS (CPL*GR)
440 GO SUB ATN: LET SK=Z
441 REM SK-АЛЬФА
445 LET SK=SK/15: PRINT AT 9,1; "АЛЬФА:",•INT ABS SK; " ЧАС. ";
450 LET SKR=(ABS SK-INT ABS SK)*60: LET X=SKR: GO SUB ROUND: LET SKR=X
455 PRINT SKR;" МИН."
460 LET DIA=SQR (RV*RV+PLRV*PLRV-2*PLRV*RV*COS ((PLLP-LP)*GR)) 4 65 LET DIAM=DR/DIA: LET X=DIAM: GO SUB ROUND: LET DIAM=X 470 PRINT AT 11,1;"ДИАМЕТ Р:";DIAM;" СЕК."
480 LET FAZ=(1+COS ((CPL-PLLP)*GR))/2: LET X=FAZ: GO SUB ROUND: LET FAZ=X 485 PRINT AT 13,1;"ФАЗА:";FAZ 487 IF FAZ=0 THEN GO TO 510
490 LET MST=(5*(LN (PLRV*DIA/(BL*SQR FAZ)))/LN 10)-27.6
4 95 LET X=MST: GO SUB ROUND: LET MST=X 500 PRINT AT 15,1;"БЛЕСК:";MST; " ЗВ.ВЕЛ."
510 LET NSAN=3 60*R/3 65.2422: LET ANG=NSAN: GO SUB CONV: LET NSAN=ANG 515 LET MSAN=NSAN-3.762863: LET ANG=MSAN: GO SUB CONV: LET MSAN=ANG 520 LET ESAN=360/PI*0.016718*SIN (MSAN*GR)
525 LET ASAN=NSAN+ESAN+2 7 8.83354: LET ANG=ASAN: GO SUB CONV: LET ASAN=ANG 530 LET X=COS (ASAN*GR) 535 LET Y=MK*SIN (ASAN*GR)
540 GO SUB ATN: LET SDELTA=Z: LET X=SDELTA: GO SUB ROUND: LET SDELTA=X
545 LET BSAN=(ASN (NK*SIN (ASAN*GR)))/GR: LET X=BSAN: GO SUB ROUND: LET BSAN=X
550 PRINT AT 17,1;"ДЕЛЬТА СОЛНЦА:";BSAN;" ГРАД."
560 LET SKE=SK*15: LET ELONG=(ACS (SIN (VK*GR)*SIN (BSAN*GR)+COS ((SKE-SDELTA)*GR)*COS (VK*GR)*COS (BSAN*GR)))/GR
5 65 LET X=ELONG: GO SUB ROUND: LET ELONG=X
57 0 PRINT AT 19,1;"ЭЛОНГАЦИЯ:";ELONG;" ГРАД."
580 IF SDELTA<SKE THEN PRINT AT 21,1; INK 2;"ВЕЧЕРНЯЯ ВИДИМОСТЬ" 590 IF SDELTA>SKE THEN PRINT AT 21,1; INK 2;"УТРЕННЯЯ ВИДИМОСТЬ"
600 IF ELONG<=10 THEN PRINT AT 21,1; BRIGHT 1; FLASH 1; INK 2;"СОЕДИНЕНИЕ С СОЛНЦЕМ" 700 BEEP .7,7: PAUSE 0: BEEP .1,7: CLS : GO SUB STAR 900 GO TO 115
1000 REM ЧИСЛО СУТОК С 0.0.1980 1010 DIM D(31)
1020 CLS : LET K=31: LET M=12: LET G=1979: GO SUB 1070: LET D(1)=D 1030 INPUT "ГОД ?",G: BEEP .1,7
1040 INPUT "МЕСЯЦ(1-12) ?",M: BEEP .1,7: INPUT "ЧИСЛО ?",K: BEEP .1,7 1045 LET ME=M: LET GO=G
1050 PRINT AT 3,21; INK 6;K;".";M;".";G: GO SUB 1070 1060 LET R=D-D(1): GO TO 1100 1070 IF M>=3 THEN GO TO 1090 1080 LET M=M+12: LET G=G-1
1090 LET M=M+1: LET C=INT (M*30.6): LET U=INT (G*365.25): LET D=C+U+K-114: RETURN
1100 LET C=INT (D/7): LET DAY=1+D-C*7
1115 RESTORE 1120
1120 DATA "ВОСКРЕСЕНЬЕ"
1130 DATA "ПОНЕДЕЛЬНИК"
114 0 DATA "ВТОРНИК","СРЕДА"
1150 DATA "ЧЕТВЕРГ","ПЯТНИЦА"
1160 DATA "СУББОТА"
1165 LET NK=7: IF DAY=1 OR DAY=7 THEN LET NK=2
1170 FOR J=1 TO DAY: READ D$: NEXT J: PRINT AT 4,21; INK NK;D$
1180 POKE 23658,8: INPUT AT 0,4; INK 3;"ИЗМЕНИТЬ ДАТУ ?(Y/N)";A$: BEEP .1,7
1190 IF A$="y" OR A$="Y" THEN GO TO 1020
1200 RETURN
1500 REM CONV - ПЕРЕВОД УГЛА В 0-360 1510 IF ANG>=0 AND ANG<=360 THEN RETURN 1520 LET ANG=ANG-SGN ANG*360: GO TO 1510 2 000 REM ATN-НЕОПРЕДЕЛЕННОСТЬ ПО ATN
2010 LET Z=(ATN (Y/X)+ACS SGN AT N (Y/X)+ACS SGN Y)/GR: RETURN 4500 REM INORBIT-ПОЛОЖЕНИЕ В ПЛ-ТИ СВОЕЙ ОРБ.
4505 LET NP=360*R/(365.2422*TP): LET ANG=NP: GO SUB CONV: LET NP=ANG: LET SM=NP+EP-W 4510 LET LP=NP+360*EC*SIN (SM*GR)/PI+EP: LET ANG=LP: GO SUB CONV: LET LP=ANG: LET V=LP-W
4515 LET RV=AE*(1-EC*EC)/(1+EC*COS (V*GR)): RETURN
4600 IF SK>=21 AND SK<24 THEN LET U$="Chart1"
4605 IF SK>=0 AND SK<3 THEN LET U$="Chart1"
4610 IF SK>=3 AND SK<9 THEN LET U$="Chart2"
4615 IF SK>=9 AND SK<15 THEN LET U$="Chart3"
4620 IF SK>=15 AND SK<21 THEN LET U$="Chart4"
4625 IF SK>=21 AND SK<24 THEN LET VS=(12 0+(2 4-SK)*4 0)+7
4630 IF SK>=0 AND SK<3 THEN LET VS=((3-SK)*40)+7
4635 IF SK>=3 AND SK<9 THEN LET VS=((9-SK)*40)+7
4640 IF SK>=9 AND SK<15 THEN LET VS=((15-SK)*40)+7
4645 IF SK>=15 AND SK<21 THEN LET VS=((21-SK)*40)+7
4 650 IF VK=0 THEN LET VV=85 4655 LET VV=85+VK*3.15
5000 BORDER 0: RANDOMIZE USR 15619: REM : LOAD U$ CODE 16384 5010 LET G1=255: LET G2=247: LET V1=175: LET V2=171
5 02 0 PLOT 0,0: DRAW G1,0: DRAW 0,V1: DRAW -G1,0: DRAW 0,-V1 5030 PLOT 4,2: DRAW G2,0: DRAW 0,V2: DRAW -G2,0: DRAW 0,-V2 5040 FOR I=47 TO 207 STEP 40: PLOT I,1: PLOT I,174: NEXT I
5050 FOR J=19 TO 151 STEP 33: PLOT 3,J: PLOT 2,J: PLOT 252,J: PLOT 253,J: NEXT J:
PLOT 1,85: PLOT 254,85 5060 LET RD=1: LET X=VS: GO SUB round: LET VS=X 5 07 0 LET X=VV: GO SUB ROUND: LET VV=X 5080 PLOT VS,VV: CIRCLE VS, VV, 2
5990 INPUT "": PRINT #0; INK 4;AT 1,2;A$;"-";K;".";ME;".";GO: BEEP .7,7: PAUSE 0:
BEEP .1,7: BORDER 1 6000 RETURN
9000 REM ВНЕШНЯЯ ПЛАНЕТА
9010 LET MJ=DS-LP: LET CPL=(ATN (RV*SIN (MJ*GR)/(ERV-RV*COS (MJ*GR))))/GR+DS: LET
ANG=CPL: GO SUB CONV: LET CPL=ANG 9020 GO SUB 9200: GO TO 400 92 00 REM ВНУТРЕННЯЯ ПЛАНЕТА
9210 LET UPL=(ATN (ERV*TAN (PLJ*GR)*SIN ((CPL-DS)*GR)/(RV*SIN ((DS-LP)*GR))))/GR:
RETURN 9500 REM ROUND
9505 LET Y=SGN X: LET Z=ABS X*RD*RD+0.5 9510 LET X=INT Z/(RD*RD)*Y: RETURN 9900 RANDOMIZE USR 15619: REM : ERASE "PLANETS" 9910 RANDOMIZE USR 15619: REM : SAVE "PLANETS" LINE 10 Некоторые комментарии:
Самозапись программы происходит по команде RUN 9900 с автостартом со строки 10. При остановке программы во время работы запустить её повторно можно командой RUN.
В строке 15 загружается символьный набор, а переключение на него выполняется в строке 20. Несколько слов о символе "копирайт" (буква 'С' в кружочке). В последнее время мы пользуемся утолщенным русско-латинским символьным набором с некоторыми усовершенствованиями. Дело в том, что по стандарту ASCII в символьном наборе "НС" таблицы КОИ-7 символу "копирайт" соответствует "твердый знак". Поэтому приходится либо иметь в загружаемом символьном наборе "твердый знак" на месте "копирайта", а для печати последнего подключать опять символьный набор ПЗУ, либо отказаться от "твердого знака", заменяя его апострофом (').
Удобным оказался вариант, когда "твердый знак" все же закреплен за "копирайтом" (символом с кодом 127), а образ символа "копирайт" - закреплен за символом с кодом 64 - "@". Последний гораздо реже используется в текстовых сообщениях. Поэтому в листинге программы PLANETS в строке 23 Вы можете видеть символ "@", но при работе программы на экране будет напечатан "копирайт".
Программа снабжена четырьмя графическими экранами, которые мы приводим ниже (они даны в негативном изображении). Вы можете воспроизвести их при помощи ART-STUDIO. В зависимости от результата расчета в строке 5000 происходит загрузка одного из четырех экранов, записанных на диске в виде четырех файлов стандартного для экрана формата (Chart1 - Chart4). Для дисковой версии программы такой вариант еще приемлем, но для кассетной -абсолютно не подходит. Поэтому для обеих версий можем порекомендовать воспользоваться компрессором, который мы приводили в РЕВЮ-93 № 3-4, стр. 61. В результате будем иметь один компактный блок, содержащий четыре скомпрессированных экрана. После выполнения компрессии четырех экранов длина кодового блока вместе с декомпрессором (назовем этот файл: "Chart"CODE) составила всего 3.6 Кб. Это вдвое меньше одного экрана в
обычном формате! Существенная экономия как для дисковой, так и для кассетной версий программы. Для вызова любого экрана надо будет предварительно в ячейку памяти занести его номер.
Для реализации этого способа необходимо изменить Бейсик-строки (см. на следующей странице). "Chart1". "Chart3".
Волопдс * -
+
" » |
♦ " * ■ь
Лее:
№ |
* -t
+
+ + " *
Девд |
|
к |
* |
Ворон |
♦ * * ГиЭрд |
|
|
нЧТелец
** S Змееносец.
Щит-"
, Большой •
Пес ^ **
, Стрелец.
10 BORDER 1: PAPER 1: INK 4: CLEAR 4 9999 12 RANDOMIZE USR 15619: REM : LOAD "Chart"CODE 50000 4600 IF SK>=21 AND SK<24 THEN LET U=1 4 605 IF SK>=0 AND SK<3 THEN LET U=1 4610 IF SK>=3 AND SK<9 THEN LET U=2 4615 IF SK>=9 AND SK<15 THEN LET U=3 4620 IF SK>=15 AND SK<21 THEN LET U=4 5000 BORDER 0: POKE 50001,U: RANDOMIZE USR 50000
В строке 12 загружается скомпрессированный блок с четырьмя экранами.
задание номера экрана, а в строке 5000 - декомпрессия экрана.
* * *
И, в заключение, еще одна программа по астрономии, присланная Юрием Пензиным.
MOON.
1 GO TO 2 0
10 BORDER 1: PAPER 1: INK 6: CLEAR 49999: RANDOMIZE USR 15619: REM
64600
20 POKE 23606,88: POKE 23607,251
22 PRINT AT 7,5; INK 6;" КАЛЕНДАРЬ И ФАЗЫ ЛУНЫ"^ 9,2; INK 4;" ПРОГРАММИРОВАЛ И
АДАПТИРОВАЛ";AT 10,9;"ДЛЯ СПЕКТРУМА",•AT 12,10;"ЮРИЙ ПЕНЗИН"^ 16,5; INK 3;"@ 1993 ASTRO-SOFTWARE" 24 PRINT AT 21,5; INK 2;"НАЖМИТЕ ЛЮБУЮ КЛАВИШУ": PAUSE 0 30 CLS : DIM D(31) 32 LET ROUND=9500
40 LET K=31: LET M=12: LET G=1979: GO SUB 80: LET D(1)=D 50 INPUT "ГОД ?",G
60 INPUT "МЕСЯЦ (1-12) ?",M: INPUT "ЧИСЛО ?",K: INPUT '^^GMT^ МЕСТНОЕ+4 ЧАС,)?";H
строках 4600.. .4620 производится
";G;AT 4,21,•,•H,•"ЧАС .(GMT)": GO SUB 80
(M*30.6): LET U=INT (G*365.25): LET D=C+U+K-114: RETURN
65 PRINT AT 3,21; INK 6;K;".";M;" 7 0 LET R=D-D(1): GO TO 110 80 IF M>=3 THEN GO TO 100 90 LET M=M+12: LET G=G-1 100 LET M=M+1: LET C=INT 110 LET C=INT (D/7): LET DAY=1+D-C*7 120 DATA "ВОСКРЕСЕНЬЕ" 130 DATA "ПОНЕДЕЛЬНИК" 14 0 DATA "ВТОРНИК","СРЕДА"
150 DATA "ЧЕТВЕРГ","ПЯТНИЦА" 160 DATA "СУББОТА" 175 RESTORE 120
180 LET NK=7: IF DAY=1 OR DAY=7 THEN LET NK=2
185 FOR J=1 TO DAY: READ D$: NEXT J: PRINT AT 5,21;" ";: PRINT AT 5,21; INK
NK;D$
190 POKE 23658,8: INPUT AT 0,4; INK 3;"ИЗМЕНИТЬ ДАТУ ?(Y/N)";A$ 200 IF A$="y" OR A$="Y" THEN GO TO 50
210 LET F=R+(H+0.016666)/24: LET N=3 60*F/3 65.2 422: LET ANGLE=N: GO SUB 400: LET N=ANGLE
220 LET M=N-3.762863: LET ANGLE=M: GO SUB 400: LET M=ANGLE 230 LET E=360*0.016718*SIN (M/180*PI)/PI
240 LET J=N+E+2 7 8.83354: LET ANGLE=J: GO SUB 400: LET J=ANGLE 250 LET L=13.176396*F+64.975464: LET ANGLE=L: GO SUB 400: LET L=ANGLE 260 LET K=L-0.111404*F-349.383063: LET ANGLE=K: GO SUB 400: LET K=ANGLE 270 LET Q=151.950429-0.0529539*F: LET ANGLE=Q: GO SUB 400: LET Q=ANGLE 280 LET W=1.2 7 3 9*SIN ( (2*(L-J)-K)/180*PI): LET I = 0.1858*SIN (M/180*PI): LET S=0.37*SIN (M/180*PI)
290 LET V=K+W-I-S: LET A=6.2886*SIN (V/180*PI): LET T=L+W+A-I+0.214*SIN (2*K*PI/180) 300 LET Y=T+0.6583*SIN ((2*(T-J)/180*PI)): LET D=Y-J: LET ANGLE=D: GO SUB 400: LET D=ANGLE
305 LET X=D: GO SUB ROUND: LET D=X
310 PRINT AT 18,0; INK 4;"ВОЗРАСТ=",^;" ГРАД."
320 IF D>=0 AND D<90 THEN PRINT ; FLASH 1; FLASH 1; BRIGHT 1; INK 2;"НОВОЛУНИЕ"
330 IF D>=90 AND D<180 THEN PRINT ; FLASH 1; BRIGHT 1; INK 2;"ПЕРВАЯ ЧЕТВЕРТЬ"
340 IF D>=180 AND D<2 70 THEN PRINT ; FLASH 1; BRIGHT 1; INK 2;"ПОЛНОЛУНИЕ"
350 IF D>=270 AND D<360 THEN PRINT ; FLASH 1; BRIGHT 1; INK 2;"ПОСЛЕДНЯЯ ЧЕТВЕРТЬ"
360 LET MOON=(1-COS (D/180*PI))/2:
3 65 LET X=MOON: GO SUB ROUND: LET MOON=X
370 PRINT ; INK 4;"ФАЗА =";MOON
375 GO TO 1020
400 IF ANGLE>=0 AND ANGLE<=360 THEN RETURN 410 LET ANGLE=ANGLE-SGN ANGLE*3 60: GO TO 400 1020 IF D>=0 AND D<=180 THEN LET SN=1 1030 IF D>180 AND D<=3 60 THEN LET SN=-1 1040 LET PR=2*MOON-1
1050 IF D>=0 AND D<=180 THEN LET FAZ=PR 1060 IF D>180 AND D<=360 THEN LET FAZ=-PR 2 97 0 LET NOV=7
2980 IF D>345 AND D<=360 THEN LET NOV=0 2990 IF D>=0 AND D<15 THEN LET NOV=0 3000 PLOT 225,10: DRAW INK NOV;0,5 0,SN*PI 3010 DRAW INK NOV;0,-5 0,FAZ*PI 3020 PRINT INK 3;"НАЖМИТЕ ЛЮБУЮ КЛАВИШУ" 3030 PAUSE 0: GO TO 30 9500 REM ROUND
9505 LET Y=SGN X: LET Z=ABS X*10*10+0.5
9510 LET X=INT Z/(10*10)*Y: RETURN
9900 RANDOMIZE USR 15619: REM : ERASE "MOON"
9910 RANDOMIZE USR 15619: REM : SAVE "MOON" LINE 10
Структура и русификация программы точно такая же, как и PLANETS. Если будете пользоваться иным способом русификации, то вместо символа "@" в строке 22 наберите "копирайт". Фрагмент работы программы:
18.3.1994 1йчнс.cgmt) ПЯТНИЦЙ
возрнст=67.75
НОВОЛУНИЕ
фпзй = о.31
НАЖМИТЕ ЛЮБУЮ
ОТ РЕДАКЦИИ
Тестируя присланные Юрием программы, мы особенно остро ощутили низкое быстродействие интерпретатора Спектрум-Бейсика. Поэтому со своей стороны можем порекомендовать эти программы не только для получения оригинальных эффектов на экране, но и как наглядное пособие по другой теме - компиляция программ. Компиляция позволяет во много раз поднять быстродействие и ожидание результата у экрана не станет столь томительным.
Надо также сказать, что для компиляции предложенных программ не годятся целочисленные компиляторы (ZX-COMPILER, MCODER-2 и др.), так как вычисления в программах не укладываются в рамки целых чисел. Мы пользовались компилятором TOBOS-FP, который рассчитан на вычисления с плавающей запятой. При этом вся процедура предельно проста: загружаем, компилятор TOBOS, затем Бейсик-программу, затем запускаем компилятор в работу RANDOMIZE USR 53000 - и все. После сообщения "0 0К" можно запускать скомпилированный блок: RANDOMIZE USR 40000. Замеры показывают, что скорость выполнения программ увеличивается более чем в десять раз.
* * *