Два года назад собрал с учениками "Спектрум" версии "Ленинград-2" и с тех пор влюблен в эту замечательную маленькую ЭВМ. Как учитель физики не могу не сказать Вам слов глубокой благодарности за этот, по-моему, самый важный раздел "ZX-РЕВЮ". Предлагаю программы, написанные в Бейсике для уроков математики и физики. Они одинаково хорошо работают и на уроке и дома, отличия несущественны. В программе "GRAPHIC" значения функций организованы в массивы, в программе "V.P.GRAPH" вычисления производятся непосредственно перед выдачей точки на экран. Для обеспечения крупного масштаба все сообщения выводятся на служебный экран. Программы позволяют строить до двух графиков в одном координатном поле.
X-coordinat Y-coordinat С-са Leu Late
R-restart G-graphiс S-s cane г
1-Function S-function I-in former
|
|
|
|
|
/ '■ |
/ |
|
|
. V |
|
|
4- |
|
|
X=0.992 |
Y 1 =0 |
832754-24- |
|
Y2 = - |
015936003 |
Управление в программах. X - задание области изменения аргумента. Y - задание области наблюдения функций.
С - калькулятор - позволяет ввести произвольное значение X и получить значения функций. S - сканер - дает 245 значений X, Y1, Y2 в пределах экрана. Перемещается курсорными клавишами. Для выхода из этого режима -повторно нажать S.
1 - ввод первой функции.
2 - ввод второй функции.
I - вывод информации о введенных функциях и областях изменения X и Y. G - режим вычерчивания графиков. R - рестарт.
GRAPHIC.
5 CLEAR 3 9999 10 FOR i=1 TO 30 2 0 READ p: POKE 63 999+i,p 30 NEXT i
4 0 DATA 33,0,64,1,0,27,17,64,156,237,176,201,33,64,156,1,0,27,17,0,64,237,176,201,6,
21,205,68,14,201 50 DIM A(250): DIM B(250): LET t$=CHR$ 32: LET u$=CHR$ 32:
60 BORDER 6: BRIGHT 1: CLS : LET k=128: LET x0=0: LET xn=0: LET y0=0: LET yn=0 70 PRINT AT 0,0; PAPER 5; "X-coordinat R-restart 1-functionY-coordinat G-graphic 2-functionC-calculate S-scaner I-informer"
100 |
IF |
INKEY$= |
"1" |
THEN |
GO |
SUB |
260 |
110 |
IF |
INKEY$= |
"2" |
THEN |
GO |
SUB |
300 |
120 |
IF |
INKEY$= |
"x" |
THEN |
GO |
SUB |
200 |
130 |
IF |
INKEY$= |
"y" |
THEN |
GO |
SUB |
230 |
140 |
IF |
INKEY$= |
"i" |
THEN |
GO |
SUB |
330 |
150 |
IF |
INKEY$= |
"g" |
THEN |
GO |
SUB |
400 |
160 |
IF |
INKEY$= |
"c" |
THEN |
GO |
SUB |
600 |
170 |
IF |
INKEY$= |
"s" |
THEN |
GO |
TO |
800 |
180 |
IF |
INKEY$= |
"r" |
THEN |
CLS |
: GO TO 5 0 |
190 |
GO |
TO 100 |
|
|
|
|
|
200 PRINT AT 0,0; PAPER 6; BRIGHT 1;"X" 210 INPUT "X(min)=";x0,"X(max)= ";xn
220 LET a=250/(xn-x0): LET OX=a*x0: GO SUB 1900: BEEP .2,9: RETURN 230 BEEP .2,7: PRINT AT 1,0; PAPER 6; BRIGHT 1;"Y"
ШШЮПРУМ
ЖШПЕ
© Василий Марков, г. Люберцы, 1994 г.
240 INPUT "Y(min)=";y0,"Y(max)=";yn
250 LET b=140/(yn-y0): LET OY=b*y0: GO SUB 1900: BEEP .2,7: RETURN
260 BEEP .2,5: PRINT AT 0,22; PAPER 6; BRIGHT 1;"1"
270 INPUT "Y1=";y$
280 LET t$=y$: DEF FN t(x)=VAL t$: GO SUB 1900: BEEP
300 BEEP .2,3: PRINT AT 1,22; PAPER 6; BRIGHT 1;"2"
310 INPUT "Y2=";y$
320 LET u$=y$: DEF FN u(x)=VAL u$: GO SUB 1900: BEEP
330 BEEP .1,8: PRINT AT 2,22; PAPER 6; BRIGHT 1;"I":
340 IF xn>x0 AND yn>y0 THEN PRINT #1;AT 0,0;x0; INVERSE 1;"<X<"; INVERSE 0;xn,y0;
INVERSE 1;"<Y<"; INVERSE 0;yn: GO TO 360
350 PRINT #1;AT 0,6; PAPER 3; BRIGHT 1;" NO THE COORDINATS !"
360 IF t$<>CHR$ 32 OR u$<>CHR$ 32 THEN PRINT #1;AT 1,0;"Y1=";t$,"Y2=";u$: GO TO 380
370 PRINT #1;AT 1,6; PAPER 2; BRIGHT 1;" NO THE FUNCTIONES !"
380 GO SUB 1900: RETURN
400 BEEP .2,1: PRINT AT 1,12; PAPER 6; BRIGHT 1;"G": RANDOMIZE USR 64024
410 IF xn<=x0 OR yn<=y0 THEN PRINT #1;TAB 6; PAPER 3; BRIGHT 1;" NO THE COORDINATS
!": GO SUB 1900: RETURN
420 IF t$=CHR$ 32 AND U$=CHR$ 32 THEN PRINT #1;TAB 6; PAPER 2; BRIGHT 1;" NO THE
FUNCTIONES !": GO SUB 1900: RETURN
430 PRINT #1;AT 0,0,,PAPER 6;TAB 9; PAPER 4; BRIGHT 1;" I AM THINK ! ";PAPER 6,
440 IF OX>-250 AND OX<0 THEN PLOT ABS OX,1: DRAW 0,140
450 IF OY>-140 AND OY<0 THEN PLOT 0,ABS OY: DRAW 255,0
460 IF t$=CHR$ 32 THEN GO TO 510
470 FOR n=1 TO 250
480 LET x=n/a+x0: LET A(n)=FN t(x):
490 IF z>=1 AND z<140 THEN PLOT n,z
500 NEXT n
510 IF u$=CHR$ 32 THEN GO TO 560
520 FOR n=1 TO 250
530 LET x=n/a+x0: LET B(n)=FN u(x):
540 IF Z>=1 AND z<140 THEN PLOT n,z
550 NEXT n
560 RANDOMIZE USR 3438: RANDOMIZE USR 64000: OVER 1:
0: GO SUB 1900: BEEP .2,1: RETURN
600 BEEP .2,11: PRINT AT 2,0; PAPER 6; BRIGHT 1;"C":
610 IF xn<=x0 OR yn<=y0 THEN PRINT #1;TAB 6; PAPER 3;
!": GO SUB 1900: RETURN
620 IF t$=CHR$ 32 AND u$=CHR$ 32 THEN PRINT #1;TAB 6; PAPER 2; BRIGHT 1;" NO THE
FUNCTIONES !" : GO SUB 1900: RETURN
630 INPUT "X=";x$
640 IF x$="c" THEN GO SUB 1900: BEEP .2,11: RETURN
650 LET x=VAL x$: IF CODE x$<48 OR CODE X$>57 THEN GO TO 630
660 PRINT #1;AT 0,0;"X=";x
670 IF t$<>CHR$ 32 THEN PRINT #1;AT 0,15;"Y1=";FN t(x)
680 IF u$<>CHR$ 32 THEN PRINT #1;AT 1,15;"Y2=";FN u(x)
690 BEEP .2,11: GO SUB 1900: RETURN
800 PRINT AT 2,12; PAPER 6; BRIGHT 1;"S": RANDOMIZE USR 3438: BEEP .3,8: BEEP .5,4
810 IF xn<=x0 OR yn<=y0 THEN PRINT #1;TAB 6; PAPER 3; BRIGHT 1;" NO THE COORDINATS
!": GO SUB 1900: GO TO 100
820 IF t$=CHR$ 32 AND u$=CHR$ 32 THEN PRINT #1;TAB 6; PAPER 2; BRIGHT 1;" NO THE
FUNCTIONES !": GO SUB 1900: GO TO 100
830 PLOT OVER 1; INK 2;k,0: DRAW OVER 1; INK 2;0,140
832 PRINT #1;AT 0,0;"X=";x0+k/a
834 IF t$<>CHR$ 32 THEN PRINT #1;AT 0,15;"Y1=";A(k)
836 IF U$<>CHR$ 32 THEN PRINT #1;AT 1,15;"Y2=";B(k)
840 IF INKEY$=CHR$ 9 THEN GO SUB 880
850 IF INKEY$=CHR$ 8 THEN GO SUB 950
860 IF INKEY$="s" THEN GO TO 1030
870 GO TO 840
880 IF k>24 9 THEN BEEP .5,2: RETURN
890 IF POINT (k,0)=1 THEN PLOT OVER 1;k,0: DRAW OVER 1;0,140
900 LET k=k+1: PLOT OVER 1; INK 2;k,0: DRAW OVER 1; INK 2;0,140: RANDOMIZE USR 3438
.2,3: RETURN RANDOMIZE USR 34 38
RANDOMIZE USR 64012: OVER
RANDOMIZE USR 3438 BRIGHT 1;" NO THE COORDINATS
910 PRINT #1;AT 0,0;"X=";x0+k/a
920 IF t$<>CHR$ 32 THEN PRINT #1;AT 0,15;"Y1=";A(k) 930 IF U$<>CHR$ 32 THEN PRINT #1;AT 1,15;"Y2=";B(k) 94 0 RETURN
950 IF k<3 THEN BEEP .5,2: RETURN
960 IF POINT (k,0)=1 THEN PLOT OVER 1;k,0: DRAW OVER 1;0,140
980 LET k=k-1: PLOT OVER 1; INK 2;k,0: DRAW OVER 1; INK 2;0,140: RANDOMIZE USR 3438 990 PRINT #1;AT 0,0;"X=";x0+k/a
1000 IF t$<>CHR$ 32 THEN PRINT #1;AT 0,15;"Y1 = ";A(k) 1010 IF u$<>CHR$ 32 THEN PRINT #1;AT 1,15;"Y2=";B(k) 102 0 RETURN
1030 IF POINT (k,0)=1 THEN PLOT OVER 1;k,0: DRAW OVER 1;0,140 1040 BEEP .3,8: BEEP .5,4: GO SUB 1900: GO TO 100
1900 PAPER 5: PRINT AT 0,0;"X";AT 0,12;"R";AT 0,22;"1";AT 1,0;"Y";AT 1,12;"G";AT 1,22;"2";AT 2,0;"C";AT 2,12;"S";AT 2,22;"I": PAPER 7: RETURN
V.P.GRAPH.
Текст этой программы незначительно отличается от "GRAPHIC". Ниже приводятся отличающиеся строки.
480 LET x=n/a+x0: LET z=FN t(x)*b-OY
530 LET x=n/a+x0: LET z=FN u(x)*b-OY
650 IF CODE X$<48 OR CODE X$>57 THEN GO TO 630
655 LET X=VAL x$
832 LET x=k/a+x0: PRINT #1;AT 0,0;"X=";x
834 IF t$<>CHR$ 32 THEN PRINT #1;AT 0,15;"Y1=";FN t(x)
836 IF u$<>CHR$ 32 THEN PRINT #1;AT 1,15;"Y2=";FN u(x)
910 LET x=k/a+x0: PRINT #1;AT 0,0;"X=";x
920 IF t$<>CHR$ 32 THEN PRINT #1;AT 0,15;"Y1=";FN t(x)
930 IF u$<>CHR$ 32 THEN PRINT #1;AT 1,15;"Y2=";FN u(x)
990 LET x=k/a+x0: PRINT #1;AT 0,0;"X=";x
1000 IF t$<>CHR$ 32 THEN PRINT #1;AT 0,15;"Y1 = ";FN t(x)
1010 IF u$<>CHR$ 32 THEN PRINT #1;AT 1,15;"Y2=";FN u(x)
Буду, признателен за все замечания и дополнения, которые смогут сделать читатели для улучшения программ. Так, например, в предлагаемых мной графических программах параболическую функцию нельзя задать как Y=X02, но можно, как Y=X*X - почему? Как это связано с работой операторов DEF FN и FN?
Хотелось бы также знать, как работают процедуры обработки ошибок в ПЗУ. Или, конкретней, как отключить процедуры ПЗУ и подключить собственные. Например, при построении графиков типа Y=SQR X было бы желательно, чтобы компьютер игнорировал отрицательные значения: X и переходил к обработке следующего значения, не выдавая сообщения об ошибке. Как вернуться в Бейсик?
Невозможно дать ответ на вопрос Василия Петровича более полный, чем был дан в большой работе Алексеева А.Г. под общим названием "ПРОФЕССИОНАЛЬНЫЙ ПОДХОД". Первая часть этой работы так и называется: "Обработка ошибок в Бейсике". Она была опубликована в РЕВЮ-92, № 5-6, стр.113. Пользуясь случаем, сообщаем об опечатке в листинге программы, приведенной на стр. 115 (левая колонка, внизу): в Бейсик-строке 100 шестое значение DATA должно быть 225, а не 255, иначе не сходится контрольная сумма при формировании кодового блока ON ERROR GO TO.
Тем, у кого нет возможности ознакомиться с этим материалом, можем посоветовать разыскать
программу SUPERCODE, там вы можете найти упомянутый блок кодов.
* * *