Передовица » Макулатура » ИиО » Твои первые программы

Твои первые программы (N6/1989)

М. Алексеев, Т. Алексеева. г. Миасс. Группа сайта просит вас связаться с нами! (ЗАЧЕМ ЭТО?)

0. Введение

Эта статья написана по материалам двух циклов занятий кружка юных программистов на персональных ЭВМ "Агат" в СШ N 18 г. Миасса. На занятии обычно разбираются новые понятия в приложении к простому сценарию работы с машиной, у доски составляется программа, а затем ребята вводят её в свои компьютеры, отлаживая, изменяя и усложняя. Набравшись опыта, учащиеся приступают к составлению сложных игровых и обучающих программ.

В 1986/87 учебном году изучался Бейсик, а в 1987/88 - на тех же сценариях - Рапира. В результате симпатии авторов полностью перешли к Рапире, но сильные и слабые стороны есть, конечно, у обоих подходов. Бейсик очень прост и лёгок для начинающих, но, к сожалению, этот неструктурный и непроцедурный язык идейно ограничен и не пригоден для серьёзной работы. По Бейсику очень много книг и статей в популярных журналах, он есть на многих ЭВМ, но система программирования Бейсик-Агат всё же менее комфортабельна, чем система "Школьница" с Рапирой. В отличие от английских ключевых слов Бейсика русские команды "Школьницы" доступны учащимся любого возраста. Классические структуры органично пронизывают любую программу на Рапире в лучших традициях структурного программирования, богатые возможности предоставляет такой динамический тип данных, как кортежи. Процедурный подход позволяет организовать разделение программистского труда и создавать сложные пакеты программ. Однако память машины небезразмерна, более мощная "Школьница" занимает по сравнению с Бейсиком больше места в памяти и на дискете, соответственно меньше места остаётся под программы и графику, чаще обмены с дисководом - самым слабым местом "Агата".

В этом пособии программы описаны так же, как они изучались на занятиях кружка. Сначала кратко излагается сценарий (С), затем тексты программ на Рапире и Бейсике и комментарии к ключевым местам в них (К) и, наконец, идёт развитие темы (Р) - что ещё интересного можно сделать на основе этих программ. Правила записи и смысл операторов Рапиры и Бейсика, приёмы работы с машиной здесь не приводятся. Эти вопросы следует прояснять по соответствующим руководствам параллельно с разбором программ. Программы как раз и выстроены в некоторой методической последовательности освоения начал программирования в полуигровой постановке. Естественно, что при этом не все вопросы оказались одинаково подробно рассмотрены. Предназначенное в первую очередь для учителя, это пособие может быть использовано при сравнительном изучении Рапиры и Бейсика и, конечно же, для самостоятельной работы новичков, пришедших в кружок в середине учебного года.

Большое участие в постановке и отладке приведённого программного материала приняли А.Н. Рябова и В.Г. Струц. Использованы также материалы, любезно предоставленные Н. А. Юнерман и А. Ю. Кривцовым.

1. Привет!

С. Машина задаёт вопросы, человек отвечает. Полученную в ответах информацию машина использует в новых вопросах.

1 ПРОЦ ПРИВЕТ:
2 ВЫВОД: "ЗДРАВСТВУЙ, МЕНЯ ЗОВУТ АГАТ!";
3 ВЫВОД: "А ТЕБЯ?";
4 ВВОД: ИМЯ;
5 ВЫВОД БПС: "СКОЛЬКО ТЕБЕ ЛЕТ, ", ИМЯ;
6 ВВОД ДАННЫХ: ВОЗРАСТ;
7 ВОЗРАСТ-6->КЛАСС;
8 ВЫВОД: "ПОХОЖЕ, ТЫ УЧИШЬСЯ В ", КЛАСС, "-М КЛАССЕ";
9 КНЦ;


10 REM ПРИВЕТ
20 PRINT "ЗДРАВСТВУЙ, МЕНЯ ЗОВУТ АГАТ!"
30 PRINT "A ТЕБЯ?"
40 INPUT NAME¤
50 PRINT "СКОЛЬКО ТЕБЕ ЛЕТ, "; NAME¤;
60 INPUT AGE
70 CLASS = AGE-6
80 PRINT "ПОХОЖЕ, ТЫ УЧИШЬСЯ B "; CLASS; "-M КЛАССЕ"

К. В строке 7 (70) в предположении, что в 0-м классе свойственно учиться шестилеткам, по возрасту вычисляется класс.

Р. Предусмотреть возможность беседы с вундеркиндом-дошкольником, со взрослым, завести разговор о погоде, о здоровье, о вкусах. Построить программу опроса по какому-либо предмету. Запрограммировать какой-нибудь психологический тест.

2. Угадай

С. Машина загадывает целое число от 1 до 100 и предлагает угадать его, оценивая попытки сообщениям типа "перелёт - недолёт - попал".

 1 ПРОЦ УГАДАЙ;
 2 ?"УГАДАЙ ЦЕЛОЕ ЧИСЛО ОТ 1 ДО 100";
 3 ЦЕЛЧ(ДСЧ()*100)+1->N; 0->Н;
 4 ПОКА Н/=N ::
 5   ВВОД ДАННЫХ:H;
 6   ЕСЛИ H>N ТО ?"МЕНЬШЕ" ВСЕ;
 7   ЕСЛИ H<N ТО ?"БОЛЬШЕ" ВСЕ
 8 ВСЕ;
 9 ?"МОЛОДЕЦ!!!";
10 КНЦ;

10 REM УГАДАЙ
20 ?"УГАДАЙТЕ ЦЕЛОЕ ЧИСЛО ОТ 1 ДО 100"
30 N%=RND(1)*100+1
40 INPUT H%
50 IF H%>N% THEN ?"МЕНЬШЕ": GOTO 40 
60 IF H%<N% THEN ?"БОЛЬШЕ": GOTO 40 
70 ?"МОЛОДЕЦ !!!"

К. В строке 3 (30) с помощью датчика чисел ДСЧ (RND), вырабатывающего случайное число в интервале (0;1), вычисляется загадываемое машиной целое число от 1 до 100.

Р. Можно изменять границы загадывания, очень полезно ввести счётчик попыток. Поиграв с программой, можно выработать оптимальную стратегию угадывания и вывести формулу, позволяющую по диапазону, в котором загадано число, рассчитать количество попыток, гарантирующее угадывание. Тогда программа сможет оценивать умение угадывать. Можно попробовать поиграть не в "больше - меньше", а в "горячо - холодно" или "близко - далеко" ("ближе - дальше"), когда машина следит за абсолютной величиной отклонения от цели. "Горячо - холодно" можно отражать разными цветами.

3. Загадай

С. Теперь человек загадывает, а машина угадывает, ориентируясь на его подсказки. При этом используется стратегия половинного деления (дихотомия), "изобретённая" в игре УГАДАЙ.

 1 ПРОЦ ЗАГАДАЙ;
 2 ?"ЗАГАДАЙ ЦЕЛОЕ ЧИСЛО ОТ 1 ДО 100";
 3 "ОТВЕЧАЙ: Б - БОЛЬШЕ, М - МЕНЬШЕ, Д - ДА"->ИНСТРУКЦИЯ;
 4 ?ИНСТРУКЦИЯ; 0->ЛГ; 101->ПГ; ""->ОТВЕТ;
 5 ПОКА ПГ-ЛГ > 1 ::
 6   (ЛГ+ПГ)//2->Н;
 7   ?"Это ",H; КЛАВ()->ОТВЕТ;
 8   ВЫБОР ОТВЕТ ИЗ
 9     "Б": Н->ЛГ!
10     "M": Н->ПГ!
11     "Д"; ?"УРА!!!"; ВЫХОД
12   ИНАЧЕ ?ИНСТРУКЦИЯ
13   ВСЕ
14 ВСЕ;
15 ?"ТЫ ОШИБСЯ ИЛИ СХИТРИЛ";
16 КНЦ;

10 REM ЗАГАДАЙ
20 ?"ЗАГАДАЙ ЦЕЛОЕ ЧИСЛО ОТ 1 ДО 100"
30 I¤="ОТВЕЧАЙ: Б - БОЛЬШЕ, М - МЕНЬШЕ, Д - ДА"
40 ?I¤: L%=0: R%=101
50 N%=(L%+R%)/2
60 ?"ЭТО "; N%: GET R¤
70 IF R¤="Б" THEN L%=N%: GOTO 110
80 IF R¤="M" THEN R%=N%: GOTO 110
90 IF R¤="Д" THEN ?"УРА !!!": END
100 ?I¤: GOTO 60
110 IF R%-L% > 1 THEN 50
120 ?"ТЫ ОШИБСЯ ИЛИ СХИТРИЛ"

К. В каждой попытке угадываемое число вычисляется как среднее арифметическое левой и правой границ, в случае "перелёта" это значение принимает новая правая граница, а при "недолёте" - новая левая, и так до попадания. В программе есть элементы того, что называют "защита от дурака" (foolproof). Если при ответе была нажата не та клавиша, в строке 12 (100) на экран выводится ИНСТРУКЦИЯ (I¤) и запрос повторяется. Если левая и правая границы сблизились вплотную, а играющий не признаётся, то во избежание топтания на месте программа выдаёт соответствующее сообщение и прекращает работу. Нормальное завершение здесь не в конце программы, в строке 11 (90).

Р. Здесь тоже пригодится счётчик попыток. Попробуйте делить не пополам, а в отношении (√5+1)/2 (золотое сечение) и сравните результаты.

4. Обложка

С. Напечатать на принтере "титульный лист", который можно наклеить на тетрадь по информатике.

 1 ПРОЦ ОБЛОЖКА;
 2 ?"   ВВЕДИТЕ :";
 3 ?"ФАМИЛИЮ, ИМЯ В РОДИТЕЛЬНОМ ПАДЕЖЕ";
 4 ?"   НАПРИМЕР: ИВАНОВОЙ ОЛЬГИ";
 5 ВВОД: ИМЯ;
 6 ВЫВОД БПС:"КЛАСС, БУКВУ ";
 7 ВВОД: КЛАСС;
 8 ВЫВОД БПС!"ВЫ УЧЕНИЦА (Д/Н)";
 9 КЛАВ()->OTBET;
10 ЕСЛИ ОТВЕТ="Д" ТО "ЦЫ "->К
11 ИНАЧЕ "КА "->К
12 ВСЕ;
13 ВКЛ ВЫВОД НА БУМАГУ;
14 ?"     Т Е Т Р А Д Ь";
15 ?"    ПО  ИНФОРМАТИКЕ";
!6 ?"   УЧЕНИ",К,КЛАСС," КЛАССА";
17 ?"СРЕДНЕЙ ШКОЛЫ N 18 Г. МИАССА";
18 ?"    ",ИМЯ;
19 ВЫКЛ ВЫВОД НА БУМАГУ;
20 КНЦ;

10 REM ОБЛОЖКА
20 ?"   ВВЕДИТЕ :"
30 ?"ФАМИЛИЮ,ИМЯ В РОДИТЕЛЬНОМ ПАДЕЖЕ" 
40 ?"   НАПРИМЕР: ПЕТРОВА СЕРГЕЯ"
50 INPUT NAME¤
60 INPUT "КЛАСС, БУКВУ "; CLASS¤
70 ?"ВЫ УЧЕНИЦА (Д/Н)";
80 GET R¤
90 K¤="KA "
100 IF R¤="Д" OR R¤="D" THEN K¤="ЦЫ "
110 ?: ?CHR¤(4); "PR#5"
120 ?"     Т Е Т Р А Д Ь"
130 ?"    ПО  ИНФОРМАТИКЕ"
140 ?"   УЧЕНИ";K¤; CLASS¤;" КЛАССА"
150 ?"СРЕДНЕЙ ШКОЛЫ N 18 Г.МИАССА"
160 ?"    "; NAME¤
170 ?; ?CHR¤(4); "PR#0"

К. В строках 8-12 уточняется, кому - ученику или ученице - печатать обложку. Вывод на принтер включается в строке 13 (110) и выключается в строке 19 (170). Перед печатью необходимо убедиться в том, что принтер подключен к машине и к сети, загружен соответствующий драйвер печати, т.е. всё сделано в соответствии с инструкцией по работе с принтером.

Р. Предусмотрите возможность печати обложек для разных предметов. Сделайте автоматическое центрирование, т.е. красивое расположение на равных расстояниях от краёв строк с названием предмета и именем владельца тетради, имеющих переменную длину. Изготовьте себе визитную карточку.

5. Рамка

С. "Культурные" программы, как правило, имеют заставки, содержащие название программы, имена авторов, инструкции. Заставку обычно помещают в рамку.

 1 ПРОЦ РАМКА;
 2 РЖМ ("Т10"); "*"->С;
 3 ДЛЯ K ОТ 1 ДО 30 ::
 4   ПОЗ(1,K);  ВЫВОД БПС:С;
 5   ПОЗ(K,1);  ВЫВОД БПС:С;
 6   ПОЗ(30,K); ВЫВОД БПС:С;
 7   ПОЗ(K,30); ВЫВОД БПС:С;
 8 ВСЕ;
 9 ПОЗ(0,0);
10 КНЦ;


10 REM РАМКА
20 HOME: S¤="*"
30 FOR K=1 TO 30
40 HTAB  1: VTAB  K: ?S¤;
50 HTAB  K: VTAB  1: ?S¤; 
60 HTAB 30: VTAB  K: ?S¤;
70 HTAB  K: VTAB 30: ?S¤; 
80 NEXT K

К. В строке 2 (20) делается очистка экрана, а затем назначается символ для рамки. Затем в цикле 30 раз по 4 указываются горизонтальные и вертикальные координаты позиции, где печатается символ.

Р. В качестве символа рамки хорош инверсный пробел. Можно построить рамку, переливающуюся разными цветами, несколько вложенных рамок.

6. Покупка

С. Смоделируем процесс купли-продажи. Для простоты начнём с одного товара (пирожных) и одного покупателя. В ходе торговли будем подсчитывать остаток денег у покупателя и выручку у продавца, а также отображать купленные и оставшиеся пирожные. Предусмотрим возможности исчерпания товара или денег.

 1 ПРОЦ ПОКУПКА;
 2 22->ЦЕНА; 40->ПИРОЖНЫЕ; 0->ВЫРУЧКА;
 3 ОКНО(0,0,31,31); ?;
 4 ?"'1 ПИРОЖНОЕ СТОИТ", ЦЕНА, " КОПЕЙКИ";
 5 ?; ВЫВОД БПС:"СКОЛЬКО У ВАС КОПЕЕК ";
 6 ВВОД ДАННЫХ:ДЕНЬГИ;
 7 ?; ?"  П - ПОКУПКА, К - ВЫХОД";
 8 ?; ?"    УПЛАЧЕНО  ОСТАЛОСЬ";
 9 ДЛЯ С ОТ 21 ДО 7 ШАГ -2 ::
10   ПОЗ(2,С);
11   ПОВТОР 5 :: ВЫВОД БПС:"'В 'А " ВСЕ
12 ВСЕ;
13 0->П; 21->С; ""->КЛ;
14 ПОКА НЕ КЛ="К" ::
15   КЛАВ()->КЛ;
16   ЕСЛИ КЛ="П" ТО
17     ВЫБОР ИЗ
18       ДЕНЬГИ < ЦЕНА: ПОЗ(1,2);
19          ?"ДЕНЕГ НЕ ХВАТАЕТ"; ВЫХОД !
20       ПИРОЖНЫЕ=0: ПОЗ(1,2);
21          ?"ПИРОЖНЫЕ КОНЧИЛИСЬ"; ВЫХОД
22     ИНАЧЕ
23       ПИРОЖНЫЕ-1->ПИРОЖНЫЕ;
24       ДЕНЬГИ-ЦЕНА->ДЕНЬГИ;
25       ВЫРУЧКА+ЦЕНА->ВЫРУЧКА;
26       ПОЗ(6,23); ?ВЫРУЧКА,"        ", ДЕНЬГИ;
27       П+2->П;
28       ЕСЛИ П>10 ТО 2->П; С-2->С ВСЕ;
29       ПОЗ(П,С); ВЫВОД БПС:" ";
30       ПОЗ(П+15,С); ВЫВОД БПС:"'В 'А"
31     ВСЕ
32   ВСЕ
33 ВСЕ;
34 КНЦ;

10  REM ПОКУПКА
20  P=22: C=40: B=0: TEXT=2: HOME
30  ?"ПИРОЖНОЕ СТОИТ "; P; "КОПЕЙКИ"
40  ?: INPUT "СКОЛЬКО У ВАС КОПЕЕК "; M
50  ?: ?"П - ПОКУПКА, К - ВЫХОД"
60  ?: ?"    УПЛАЧЕНО   ОСТАЛОСЬ"
70  FOR S=11 TO 25 STEP 2: VTAB S: HTAB 2
80  FOR L=1 TO 5
90  INVERSE: ?" ";: NORMAL: ?" ";
100 NEXT L: NEXT S
110 L=0: S=11
120 GET K¤
130 IF K¤="К" THEN END
140 IF NOT (K¤="П" OR K¤="P") THEN 120
150 VTAB 30: HTAB 1
160 IF M<P THEN ?"ДЕНЕГ HE ХВАТАЕТ": END
170 IF C=0 THEN ?"ПИРОЖНЫЕ КОНЧИЛИСЬ": END
180 C=C-1: M=M-P: B=B+P: VTAB 9: HTAB 6
190 ?"  "; B; "        "; M; "  ": L=L+2
200 IF L>10 THEN L=2: S=S+2
210 HTAB L: VTAB S: ?" ";
220 HTAB L+15: INVERSE: ?" ";: NORMAL
230 GOTO 120

К. После ввода начального количества денег программа управляется двумя клавишами П и К. Слева инверсными пробелами показаны продающиеся пирожные, по ходу они стираются и появляются справа - среди купленных. В распечатке программы на Рапире комбинациям соответствуют: 'L - УПР + Л - очистка экрана, 'В - функциональная точка - инверсный режим, 'А - функциональный ноль - нормальный режим. В <Редакторе> эти комбинации вводятся после нажатия клавиш УПР+Ж.

Р. Естественное развитие темы - разноцветный ассортимент товаров, небольшая очередь покупателей, вежливые вопросы продавца, реклама и бухгалтерия на уровне западного супермаркета.

7. Мозаика

С. В режиме цветной графики среднего разрешения в бесконечном цикле случайным цветом ставится точка со случайными координатами.

 1 ПРОЦ МОЗАИКА;
 2 PЖM("СГОП");
 3 ПОКА 1=1 ::
 4   ЦВЕТ(ДСЧ()*7+1);
 5   ТЧК(ДСЧ()*128, ДСЧ()*128);
 6 ВСЕ;
 7 КНЦ;

10 REM МОЗАИКА
20 MGR=1
30 COLOR = RND(1)*7+1
40 X = RND(1)*128
50 Y = RND(1)*128
60 PLOT X,Y
70 GOTO 30

Р. Можно поэкспериментировать со случайными лучами из одной точки, например из центра экрана, или со случайными отрезками по всему экрану. Попробовать строить при этом симметричные картины в двух половинах или четырёх четвертях экрана.

8. Муары

С. В режиме чёрно-белой графики высокого разрешения случайную точку экрана соединим с точками границы экрана с заданным шагом. Полюбуйтесь, какие узоры получаются из-за дискретности растра дисплея.

 1 ПРОЦ МУАРЫ;
 2 ВВОД ДАННЫХ: Ш;
 3 РЖМ("ВГОП"); ЦВЕТ(1);
 4 ""->К;
 5 ПОКА НЕ К="К" ::
 6   ДСЧ()*256->Х; ДСЧ()*256->У;
 7   ДЛЯ И ОТ 0 ДО 255 ШАГ Ш ::
 8     ЛИН(Х,У,И,0); ЛИН(Х,У,0,И);
 9     ЛИН(Х,У,И,255); ЛИН(Х,У,255,И)
10   ВСЕ;
11   КЛАВ()->К
12 ВСЕ;
13 РЖМ("Т1ДП");
14 КНЦ;

10  REM МУАРЫ
20  INPUT S
30  HGR=1: COLOR=15
40  X=RND(1)*256: Y=RND(1)*256
50  FOR I=0 TO 255 STEP S
60  PLOT I,0 TO X,Y TO 0,I
70  PLOT I,255 TO X,Y TO 255,I
80  NEXT I
90  GET K¤
100 IF NOT K¤="K" THEN 40
110 TEXT=2

К. После завершения рисунка в строке 11 (90) программа ждёт нажатия любой клавиши, чтобы рисовать новый. Если нажата "К" - завершение с переключением в текстовой режим. TEXT=2 - стандартная текстовая страница "нового" Бейсика, для "старого" - TEXT=15.

Р. Попробуйте сделать не один, а два, три центра "излучения". Поэкспериментируйте в цветном режиме.

9. Комната

С. Нарисуем план квартиры или комнаты, расставим мебель. В Рапире это можно сделать в режиме диалога, совмещённом с графикой. Из-за того, что нижнюю часть экрана при этом занимают 6 текстовых строк, вертикальные координаты должны принадлежать отрезку [24;127] в графике среднего разрешения и [48;255] - высокого.

#РЖМ("СГОК");
#ЦВЕТ(1); ОБЛ(63,63);                                                         - пол
#ЦВЕТ(0); ПРЯМ(3,25,15,75);                                               - пианино
#ЦВЕТ(2); ПРЯМ(20,40,115,115);                                              - ковер
#ЦВЕТ(3);
#ЛИН(60,110,90,110); ЛИН(90,110,90,60); ЛИН(90,60,60,60); ЛИН(60,60,60,110);
#ЦВЕТ(5); ОБЛ(80,80);                                                        - стол

В Бейсике такого режима нет, нет и процедуры ПРЯМ, вместо которой написана соответствующая подпрограмма.

10  REM КОМНАТА
20  MGR=1
30  DATA 1,0,0,127,127   REM ПОЛ
40  DATA 0,3,25,15,75    REM ПИАНИНО
50  DATA 2,20,20,115,115 REM КОВЕР
60  DATA 5,60,60,90,110  REM СТОЛ
90  DATA -1
100 READ C
110 IF C<0 THEN 150
120 READ X1, Y1, X2, Y2
130 GOSUB 300
140 GOTO 90
150 COLOR=3
160 PLOT 60,60 TO 60,110 TO 90,110 TO 90,60 TO 60,60
200 END
300 REM ПРЯМОУГОЛЬНИК
310 COLOR=C
320 FOR X=X1 TO X2
330 PLOT X,Y1 TO X,Y2
340 NEXT X
350 RETURN

К. В строках 30-60 записаны цвета и координаты концов диагоналей прямоугольников, которые в строках 100-140 читаются и передаются подпрограмме 300, -1 - признак конца данных.

Р. Хорошо бы сделать программу, помогающую подобрать подходящий вариант расстановки мебели в квартире или комнате, подвигать мебель на экране. Конечно, это лучше сделать в чёрно-белой графике высокого разрешения. В начале программы должны вводиться размеры помещения и предметов. Выбранный вариант можно будет отпечатать, сохранить на диске.

10. Контур

С. Отрезков и прямоугольников для серьёзных рисунков, для построения движущихся изображений, конечно, мало. Составим процедуру, соединяющую линиями несколько точек, которые зададим таблицей приращений координат каждой точки относительно предыдущей. Кроме этой таблицы входными данными для нашей процедуры будут координаты первой точки контура ("печки", от которой начнём "плясать") и коэффициенты увеличения по горизонтали и вертикали. В Бейсике придётся также указать длину таблицы.

 1 ПРОЦ САМОЛЕТЫ;
 2 <10, 7, 30, 0, 10, 10, 5, 0, 0, -12, 1, 0, -10, -5, -5, 0, 0, -5, -5, 0, -20, 5, -16, 0>->М;
 3 РЖМ("BГОП"); ЦВЕТ(1);
 4 КОНТУР(М,20,30,3,3);
 5 КОНТУР(М,100,130,2,2);
 6 КОНТУР(М,180,210,1,1);
 7 КОНТУР(М,80,185,-1,2);
 8 КНЦ;
 9 ПРОЦ КОНТУР(К,Х,У,А,Б);
10 ЕСЛИ К ВИДА <> И #К>1 ТО
11   Х->Х1; У->У1;
12   ДЛЯ И ОТ 1 ДО #К-1 ШАГ 2 ::
13     Х1+К[И]*А->Х2; У1+К[И+1]*Б->У2;
14     ЛИН(Х1,У1,Х2,У2);
15     Х2->Х1; У2->У1;
16   ВСЕ
17 ВСЕ;
18 КНЦ;

10  REM САМОЛЕТЫ
20  DATA 10, 7, 30, 0, 10, 10, 5, 0, 0, -12, 1, 0, -10, -5, -5, 0, 0, -5, -5, 0, -20, 5, -16, 0
30  N=12: DIM DX(N), DY(N)
40  FOR I=1 TO N: READ DX(I), DY(I)
50  NEXT I: HGR=1: COLOR=15
60  X= 20: Y=225: A= 3: B=3: GOSUB 200
70  X=100: Y=125: A= 2: B=2: GOSUB 200
80  X=180: Y= 45: A= 1: B=1: GOSUB 200
90  X= 80: Y= 70: A=-1: B=2: GOSUB 200
100 END
200 REM КОНТУР
210 IF N<2 THEN RETURN
220 PLOT X,Y
230 XX = X: YY = Y
240 FOR I=1 TO N
250 XX=XX+DX(I)*A: YY=YY-DY(I)*B
260 PLOT TO XX,YY
270 NEXT I
280 RETURN

К. В Рапире таблица приращений заносится в кортеж (строка 2), для цикла в строке 12 его длина определяется операцией #К. В Бейсике в строке 30 явно задаётся число точек контура N и определяются массивы для приращений. В строках 4-7 (60-90) идут обращения к процедуре рисования контура с различными начальными координатами и коэффициентами увеличения. В строке 10 (210) делается проверка на непустоту таблицы приращений. Вертикальные приращения в Рапире (13) и Бейсике (250) берутся с противоположными знаками, потому что в Рапире ординаты отсчитываются снизу-вверх, а в Бейсике - наоборот.

Р. Поэкспериментируйте с разными по величине и знаку коэффициентами увеличения. В цветной графике в число параметров процедуры КОНТУР войдёт, конечно, номер цвета, который пригодится и в чёрно-белой графике для создания движущихся изображений путём закрашивания фигурки цветом фона и рисования её в новом месте. Длину таблицы в Бейсике тоже можно вычислить, если, как в теме <Комната>, ввести в качестве признака конца невозможное приращение, например:

10 REM ПРИМЕР
20 DATA 1, 1, 1, -1, -1, -1, -1, 1, 999
30 N=0
40 READ A
50 IF X<256 THEN N=N+1: GOTO 40
60 N=INT(N/2): DIM X(N), Y(N): RESTORE
70 FOR I=1 TO N: READ X(I), Y(I): NEXT

11. Прятки

С. Это двухмерное развитие темы УГАДАЙ. Машина загадывает координаты точки на цветном графическом дисплее, но не показывает её. Человек ищет эту точку с помощью пультов, задающих координаты ищущей точки, которую машина показывает цветом, зависящим от расстояния между ищущей и спрятанной точками (<горячо - холодно>). Когда точки сливаются, звучит сигнал, и тайник выделяется жёлтой каймой.

 1 ПРОЦ ПРЯТКИ;
 2 ЦЕЛЧ(ДСЧ()*128)->А; ЦЕЛЧ(ДСЧ()*128)->Б
 3 РЖМ("СГОП"); 100->Р;
 4 ПОКА Р>0 ::
 5   ЦЕЛЧ(РУЧКА(1)/2)->Х; ЦЕЛЧ(РУЧКА(2)/2)->У;
 6   SQRT((А-Х)**2+(Б-У)**2)->Р;
 7   ЦBET(0); ТЧК(Х,У);
 8   ЦВЕТ(Р/15+1); ТЧК(Х,У)
 9 ВСЕ;
10 ?АЛФ(7);
11 ЦВЕТ(3); ПРЯМ(А-1,Б-1,А+1,Б+1);
12 ЦВЕТ(1); ТЧК(А,Б);
13 КНЦ;

10  REM ПРЯТКИ
20  A=RND(1)*128: B=RND(1)*128
30  MGR=1
40  X=PDL(0)/2: Y=PDL(1)/2
50  R%=SQR((X-A)^2+(Y-B)^2)
60  COLOR=0
70  PLOT X,Y
80  COLOR=R%/15+1
90  PLOT X,Y
100 IF R%>0 THEN 40
110 ?CHR¤(135): COLOR=3
120 PLOT X-1,Y-1 TO X-1,Y+1 TO X+1,Y+1
130 PLOT X+1,Y+1 TO X+1,Y-1 TO X-1,Y-1

К. Поиск идёт в бесконечном цикле, пока расстояние между точками больше нуля. Показания пультов, изменяющиеся от 0 до 255, приходится делить пополам, чтобы они оказались в диапазоне координат от 0 до 127. Чтобы отличить ищущую точку от оставленных ею следов того же цвета, в строках 7-8 (60-70) она сделана мерцающей.

Р. Исследуйте, как изменится характер поиска, если расстояние между точками делить не на 15, а на другое число - большее или меньшее. Попробуйте ввести звуковое сопровождение поиска - "миноискатель" (см. тему "Звук").

12. Перо

С. Если один пульт будет задавать абсциссу, а другой - ординату точки на экране, то, вращая ручки, можно рисовать. Нажимая кнопки на том или другом пульте, можно менять цвет и состояние пера: "поднято-опущено". Выход - по одновременному нажатию обеих кнопок. Ещё интереснее рисовать вдвоём - это трудный тест на совместимость.

 1 ПРОЦ ПЕРО;
 2 РЖМ("СГОП"); 1->Ц; 0->С;
 3 ЦВЕТ(Ц); 0->ХХ; 0->УУ;
 4 ПОКА КНОПКА(1)="Д" ИЛИ КНОПКА(2)="Д" ::
 5   РУЧКА(1)/2->Х; РУЧКА(2)/2->У;
 6   ЕСЛИ КНОПКА(1)="Н" ТО
 7     Ц+1->Ц;
 8     ЕСЛИ Ц=8 ТО 0->Ц ВСЕ;
 9     ЦВЕТ(Ц); ПАУЗА(10);
10   ВСЕ;
11   ЕСЛИ КНОПКА(2)="Н" ТО
12     ABS(С-1)->С; ПАУЗА(10);
13   ВСЕ;
14   ЕСЛИ С=1 ТО
15     ЛИН(ХХ,УУ,Х,У)
16   ИНАЧЕ
17     ЦBET(0); ТЧК(ХХ,УУ);
18     ЦВЕТ(Ц); ТЧК(Х,У)
19   ВСЕ;
20   Х->ХХ; У->УУ;
21 ВСЕ;
22 РЖМ("Т1ДП");
23 КНЦ;

10  REM ПЕРО
20  MGR=1: C=1: S=0: COLOR=C
30  X=PDL(0)/2: Y=PDL(1)/2
40  A=PEEK(¤C061): B=PEEK(¤C062)
50  IF A=255 THEN 90
60  C=C+1
70  IF C=8 THEN C=0
80  COLOR=C: GOSUB 200
90  IF B=255 THEN 110
100 S=ABS(S-1): GOSUB 200
110 IF S=1 THEN PLOT XX,YY: GOTO 140
120 COLOR=0: PLOT XX,YY
130 COLOR=C: PLOT X,Y
140 XX=X: YY=Y
150 IF A=255 OR B=255 THEN 30
160 TEXT=2
170 END
200 REM ЗАДЕРЖКА
210 FOR I=0 TO 100: NEXT: RETURN

К. Опрос кнопок производится с помощью функции КНОПКА (PEEK в строке 40). Для надёжности срабатывания введена задержка функцией ПАУЗА (подпрограммой 200). При выходе происходит возврат к текстовому диалогу.

Р. Попробуйте убрать задержку, поменять её величину. Если кроме пультов опрашивать ещё и клавиши, можно построить мощный графический редактор типа ПГР (GREDIT).

13. Коды и символы

С. В машине каждой клавише соответствуют код и какое-нибудь действие - отображение символа, писк динамика, очистка экрана, перевод строки, движение по экрану, изменение цвета и т.п. И если нажатие символьных клавиш мы можем распознавать из программы, сравнивая результат нажатия с символьной константой, то для работы с остальными клавишами надо знать их коды. И наоборот, полезно уметь через коды командовать машиной не с клавиатуры, а из программы. Таблицы кодов приводятся в документации, но их недолго определить и с помощью машины в режиме диалога или небольшой программкой.

#""->К; ПОКА НЕ К="К": КЛАВ()->К; ?; ?К, КОД(К) ВСЕ;

10 REM КОДЫ СИМВОЛОВ
20 GET S¤
30 ?: ?S¤, ASC(S¤)
40 IF S¤ <> "K" THEN 20

К. Приведённые выше строка и программа выдают действие и код нажатой клавиши, выход по "К". Указанные ниже строки выдают в цикле от 0 до 255 все коды и их действия. Быстрый вывод на экран можно приостанавливать клавишей ПРОБЕЛ.

#ДЛЯ А ОТ 0 ДО 255 :: ?; ?А, АЛФ(А) ВСЕ;

]FOR I=0 TO 255: ?: ?A, CHR¤(I): NEXT

Р. Напечатайте себе памятку - таблицу кодов и символов.

14. Бегущая точка

С. Заставим бегать по экрану графики низкого разрешения 64Х64 цветную точку, меняющую направление движения по командам клавиш со стрелками и останавливаемую клавишей РЕД.

 1 ПРОЦ БЕТОЧКА;
 2 РЖМ("Н1ОП"); ""->НАЖ;
 3 31->Х; 31->У; 0->ШХ; 0->ШУ;
 4 ПОКА НЕ НАЖ="К" ::
 5   НАЖАТО()->НАЖ;
 6   ВЫБОР НАЖ ИЗ
 7     АЛФ(136):-1->ШХ; 0->ШУ !
 8     АЛФ(149): 1->ШХ; 0->ШУ !
 9     АЛФ(153): 0->ШХ; 1->ШУ !
10     АЛФ(154): 0->ШХ;-1->ШУ !
11     АЛФ(155): 0->ШХ; 0->ШУ
12   ВСЕ;
13   ЦВЕТ(0); ТЧК(Х,У);
14   Х+ШХ->Х; У+ШУ->У;
15   ЕСЛИ Х<0 ИЛИ Х>63 ТО Х-ШХ->Х ВСЕ;
16   ЕСЛИ У<0 ИЛИ У>63 ТО У-ШУ->У ВСЕ;
17   ЦВЕТ(1); ТЧК(Х,У); ПАУЗА(2);
18 ВСЕ;
19 РЖМ("Т1ДП");
20 КНЦ;

10  REM БЕГУЩАЯ ТОЧКА
20  GR=2
30  X=31: Y=31: SX=0: SY=0
40  K=PEEK(CHR¤C000): POKE CHR¤0010,0
50  IF K=ASC("K") THEN TEXT=2: END
60  IF K=136 THEN SX=-1: SY=0: GOTO 140
70  IF K=149 THEN SX= 1: SY=0: GOTO 140
80  IF K<153 OR K>155 THEN 140
90  ON K-152 GOTO 100, 110, 120
100 SY=-1: GOTO 130
110 SY= 1: GOTO 130
120 SY= 0
130 SX= 0
140 COLOR=0: PLOT X,Y
150 X=X+SX: Y=Y+SY
160 IF X<0 OR X>63 THEN X=X-SX
170 IF Y<0 OR Y>63 THEN Y=Y-SY
180 COLOR=1: PLOT X,Y
190 GOTO 40

К. В строке 3 (30) задаются исходные значения координат точки и горизонтального, и вертикального шага. В строке 5 (40) опрашивается клавиатура, и код нажатой клавиши (или 0, если ничего не нажимали) в строках 6-12 (50-90) сравнивается с кодами управляющих клавиш; в случае совпадения задаются новые значения шагов. Затем старая точка стирается и ставится новая. Условия в строках 15-16 (160-170) останавливают точку на границах экрана. Выход - по "К".

Р. Конечно, можно гонять не точку, а более интересную фигурку, и не по пустому полю, а по какому-нибудь лабиринту. Введя в игру дополнительные клавиши, можно заставить точку (и не одну) бегать по диагонали, менять цвет, оставлять за собой след. Вместо остановки на границе можно сделать переход на противоположную сторону экрана.

15. График 1

С. Научим машину благородному искусству графического изображения зависимостей между числами. Начнём с построения графика функции. Необходимо будет задать формулу вычисления функции по аргументу, затем диапазоны изменения значений аргумента и функции. Математические абсциссу и ординату для размещения на экране нам придётся пересчитывать в экранные координаты и наоборот. Обязательно нарисуем оси - через 0 или крайние значения. В цикле слева направо по экранной абсциссе будем вычислять соответствующий ей математический аргумент, по аргументу - функцию, а по значению функции - экранную ординату и, если эта ордината не оказалась за пределами экрана, ставить точку.

 1 ПРОЦ ГРАФИК(Ф,Х1,Х2,У1,У2);
 2 ОСИВ(Х1,Х2,У1,У2);
 3 ДЛЯ А ОТ А1 ДО А2 ::
 4   Ф(Х1+(А-А1)*МХ)->У;
 5   В1+(У-У1)/МУ->В;
 6   ЕСЛИ У>=У1 И У<=У2 ТО ТЧК(А,В) ВСЕ
 7 ВСЕ;
 8 НАДПИСЬ();
 9 КНЦ;

10 ПРОЦ ОСИВ(Х1,Х2,У1,У2);
11 ЕСЛИ Х2<=Х1 ИЛИ У2<=У1 ТО СТОП ВСЕ;
12 0->Х0; 0->У0;
13 ЕСЛИ Х1>=0 ТО Х1->Х0
14 ИНАЧЕ ЕСЛИ Х2<=0 ТО Х2->Х0 ВСЕ
15 ВСЕ;
16 ЕСЛИ У1>=0 ТО У1->У0
17 ИНАЧЕ ЕСЛИ У2<=0 ТО У2->У0 ВСЕ
18 ВСЕ;
19 3->A1; 252->A2; 3->B1; 252->B2;
20 (Х2-Х1)/(A2-A1)->MX;
21 (У2-У1)/(B2-B1)->МУ;
22 A1+(Х0-Х1)/МХ->A0 ;
23 В1+(У0-У1)/МУ->В0;
24 РЖМ("ВГОП"); ЦВЕТ(1);
25 ЛИН(А1,B0,A2,B0); ЛИН(A0,Bl,A0,В2);
26 ЛИН(A2-5,B0-2,A2,В0); ЛИН(A2-5,B0+2,А2,В0);
27 ЛИН(A0-2,B2-5,A0,В2); ЛИН(A0+2,B2-5,А0,В2);
28 КНЦ;
29 ФУНК ФФ(T); 0->Р;
30 ЕСЛИ T/=-2 ТО Т+1/(T+2)**2-1->P ВСЕ;
31 РЕЗ:Р;
32 КНЦ;
33 ПРОЦ НАДПИСЬ;
34 ТКС(96, 30, 8, 0, 1, 0, 1, 2, 1, 2, 1, 0, "у=х+1/(х+2)^2-1");
35 КНЦ;

10  REM ГРАФИК
20  HOME: ?"СТРОИМ ГРАФИК ФУНКЦИИ :"
30  LIST 1000,1999: ?
40  ?"ЗАДАЙТЕ ГРАНИЦЫ АРГУМЕНТА И ФУНКЦИИ" 
50  ?: INPUT "XMIN, ХМАХ "; X1, X2
60  IF X1 >= X2 THEN 50
70  ?: INPUT "YMIN, YMAX "; Y1, Y2
80  IF Y1 >= Y2 THEN 70
300 REM ОСИ HGR
310 X0=0: Y0=0
320 IF X1>0 THEN X0=X1: GOTO 340
330 IF X2<0 THEN X0=X2
340 IF Y1>0 THEN Y0=Yl: GOTO 360
350 IF Y2<0 THEN Y0=Y2
360 A1=3: A2=252: B1=252: B2=3
370 MX=(X2-X1)/(A2-A1)
380 MY=(Y2-Y1)/(B2-B1)
390 A0=A1+(X0-X1)/MX
400 B0=B1+(Y0-Y1)/MY
410 HGR=1: COLOR=15
420 PLOT A1,B0 TO A2,B0: PLOT A0,B1 TO A0,B2
430 PLOT A2-5,B0-2 TO A2,B0 TO A2-5, B0+2
440 PLOT A0-2,B2+5 TO A0,B2 TO A0+2, B2+5
500 REM ТОЧКИ ГРАФИКА
510 FOR A=A1 TO A2
520 X=X1+(A-A1)*MX: GOSUB 1000
530 B=B1+(Y-Y1)/MY
540 IF B>=B2 AND B<=B1 THEN PLOT A,B
550 NEXT A
560 END
1000 REM ВЫЧИСЛЕНИЕ ФУНКЦИИ
1010 IF X <> -2 THEN Y=X+1/(X+2)^2-1
1020 RETURN

К. На иллюстрации видно, что должно получиться в Рапире после обращения #ГРАФИК(ФФ,-5,4,-6,3);, содержащего и имя функции, и необходимые диапазоны.

Текст надписи малыми буквами набран в "Редакторе отладчика". Для построения графика другой функции надо будет написать другой блок ФУНК с другим именем, изменить текст в НАДПИСЬ и обратиться к ГРАФИК с соответствующими именем и диапазонами. В Бейсике труднее совмещать текст с графиком, но зато Бейсик-программа может распечатать саму себя, в частности текст подпрограммы вычисления функции, а диапазоны можно ввести и в диалоге, заодно проверив их на здравый смысл. В отдельный блок ОСИВ (300-400) выделено вычисление масштабов и построение осей, всё это ещё пригодится.

Р. Конечно, осям нужна разметка и оцифровка. Для рисования цветных графиков можно переделать ОСИВ в ОСИС с соответствующими изменениями границ экранных координат А и В. Для ускорения рисования попробуйте идти по абсциссе не подряд, а с некоторым шагом, соединяя точки линиями.

16. График 2

С. Если в исследуемом диапазоне аргумента нет точек, приближаясь к которым функция стремится в бесконечность, то почему бы не поручить машине самой найти её минимум и максимум, пройдя диапазон аргумента с некоторым шагом. Чтобы не делать повторных вычислений, значения функции можно запомнить в соответствующем кортеже (массиве). Иногда функцию задают в виде таблицы, или таблицы получаются в результате расчётов, причём шаг таблицы по аргументу может быть неравномерным. В нашей программе сначала будут созданы таблицы значений аргумента и функции, найдены минимумы и максимумы, а затем по этим данным будет построен график.

 1 ПРОЦ ГРАФ(Ф,Е1,Е2);
 2 <>->Ц; <>->Д; (Е2-Е1)/50->ДЕ;
 3 ДЛЯ Е ОТ Е1 ДО Е2 ШАГ ДЕ ::
 4   Ц+<Е>->Ц; Д+<Ф(Е)>->Д
 5 ВСЕ;
 6 ГРАФИН(Ц,Д);
 7 КНЦ;
 
 8 ФУНК F(Х); РЕЗ:Х*Х-2*Х-3; КНЦ;

 9 ПРОЦ НАДПИСЬ;
10 ТКС(100,200,8,0,1,0,1,2,1,2,1,0,"y=х^2-2х-3");
11 КНЦ;

12 ПРОЦ ГРАФИН(Х,У);
13 ЕСЛИ #Х>#У ТО СТОП ВСЕ;
14 Х[1]->Х1; Х1->Х2; У[1]->У1; У1->У2;
15 1->И1; 1->И2;
16 ДЛЯ И ОТ 2 ДО #Х ::
17   ЕСЛИ Х[И]<Х1 ТО Х[И]->Х1;
18   ИНАЧЕ ЕСЛИ Х[И]>Х2 ТО Х[И]->Х2 ВСЕ
19   ВСЕ;
20   ЕСЛИ У[И]<У1 ТО У[И]->У1; И->И1
21   ИНАЧЕ ЕСЛИ У[И]>У2 ТО У[И]->У2; И->И2 ВСЕ
22   ВСЕ
23 ВСЕ;
24 ?;?"HA ОТРЕЗКЕ [",Х1,";",Х2,"]";
25 ?;?"YMIN=",У1," ПРИ Х=",Х[И1];
26 ?;?"YMAX=",У2," ПРИ Х=",Х[И2];
27 КЛАВ()->К;
28 ОСИВ(Х1,Х2,У1,У2);
29 ДЛЯ И ОТ 2 до #Х ::
30   А1+(Х[И-1]-Х1)/МХ->АН;
31   В1+(У[И-1]-У1)/МУ->ВН;
32   А1+(Х[И]-Х1)/МХ->АК;
33   В1+(У[И]-У1)/МУ->ВК;
34   ЛИН(АН,ВН,АК,ВК)
35 ВСЕ;
36 НАДПИСЬ();
37 ПОКА НЕ К="К" ::
38   КЛАВ()->К; РЖМ("ВГП");
39   КЛАВ()->К; РЖМ("Т1П")
40 ВСЕ;
41 КНЦ;

10  REM ГРАФИН
20  НОМЕ: ?" СТРОИМ ГРАФИК ФУНКЦИИ :"
30  LIST 40: ?
40  DEF FN F(X)=X*X-2*X-3
50  ?"ЗАДАЙТЕ ГРАНИЦЫ АРГУМЕНТА"
60  ?: INPUT " XMIN, XMAX  "; X1, X2
70  IF X1>=X2 THEN 50
80  N=50: DIM X(N),Y(N): DX=(X2-X1)/N
90  X(0)=X1: Y(0)=FN F(X1): Y1=Y(0)
100 Y2=Y1: I1=0: I2=0
110 FOR I=1 TO N: X(I)=X(I-1)+DX
120 Y(I)=FN F(X(I))
130 IF Y(I)<Y1 THEN Y1=Y(I): I1=1: GOTO 150
140 IF Y(I)>Y2 THEN Y2=Y(I): I2=I
150 NEXT I
160 ?: ?"YMIN="; Y1;" ПРИ X=";X(I1)
170 ?: ?"YMAX="; Y2;" ПРИ=";X(I2)
180 GET K¤
300 REM ОСИ HGR
.
. см тему ГРАФИК.1
.
500 REM ЛИНИИ ГРАФИКА
510 A=A1+(Х(0)-X1)/MX
520 B=B1+(Y(0)-Y1)/MY
530 PLOT A,B
540 FOR I=1 TO N
550 PLOT TO A1+(X(I)-X1)/MX, B1+(Y(I)+Y1)/MY
560 NEXT I
570 GET K¤: TEXT=2
580 IF K¤="K" THEN END
590 GET K¤: POKE ¤C713,0
600 GOTO 570

К. В этой Бейсик-программе формула не заведена в подпрограмму, вызываемую по номеру строки, а определена как функция с именем F (строка 40). Диапазон изменения аргумента делится на 50 частей, в 51 точке вычисляются значения функции, в строках 13-23 (90-150) из них выбираются наименьшее и наибольшее, результат выводится на экран. По нажатии какой-нибудь клавиши (строка 27/180) рисуются оси и все точки соединяются линиями, после этого любая клавиша (кроме "K" - выход) переключает из графического режима в текстовый и обратно.

Р. Поэкспериментируйте с числом отрезков, на которые разбивается диапазон аргумента. Постройте изображение неоднозначной функции, например, спирали.

17. Словарь

С. Составим обучающую программу, содержащую некоторую часть англо-русского словаря и позволяющую работать в двух режимах: опрос, т.е. на заданные программой русские слова надо ввести соответствующие английские, после трёх ошибок в переводе слова программа подсказывает, и перевод, т.е. для введённых английских слов программа находит русские, а если не находит, то извиняется.

 1 ПРОЦ СЛОВАРЬ;
 2 <"IF", "ЕСЛИ ", "THEN", "ТОГДА,ТО", "FOR",
    "ДЛЯ", "END", "КОНЕЦ", "STEP", "ШАГ",
    "PRINT", "ПЕЧАТАТЬ", "GET", "ПОЛУЧИТЬ",
    "READ", "ЧИТАТЬ", "PLOT", "ЧЕРТИТЬ",
    "INPUT","ВВОД", "ТО", "ДО,K", "COLOR",
    "ЦВЕТ", "RETURN", "ВОЗВРАТ", "DATA",
    "ДАННЫЕ">->С;
 3 ПОКА 1=1 ::
 4   ВЫВОД БПС:"О -ОПРОС, П -ПЕРЕВОД, К -КОНЕЦ";?;
 5   ВЫБОР КЛАВ() ИЗ
 6     "О": ОПРОС() !
 7     "П": ПЕРЕВОД() !
 8     "К": ВЫХОД
 9   ВСЕ
10 ВСЕ;
11 КНЦ;

12 ПРОЦ ОПРОС;
13 ДЛЯ И ОТ 2 ДО #С ШАГ 2 ::
14   ВЫВОД БПС:С[И], " - "; 0->Н;
15   ПОКА Н<3 :: ВВОД:ОТВЕТ;
16     ЕСЛИ ОТВЕТ=С[И-1] ТО ?" ПРАВИЛЬНО"; 3->Н
17     ИНАЧЕ ?" НЕПРАВИЛЬНО"; Н+1->Н;
18       ЕСЛИ Н=3 ТО ?"  ",С[И-1] ВСЕ
19     ВСЕ
20   ВСЕ
21 ВСЕ;
22 КНЦ;

23 ПРОЦ ПЕРЕВОД;
24 ПОКА 1=1 ::
25   ?"ВВЕДИТЕ ИНТЕРЕСУЮЩЕЕ ВАС";
26   ?" АНГЛИЙСКОЕ СЛОВО ИЛИ К";?;
27   ВВОД:ВОПРОС;
28   ЕСЛИ ВОПРОС="К" ТО ВЫХОД
29   ИНАЧЕ -1->И;
30     ПОКА И<#С-2 :: И+2->И;
31       ЕСЛИ ВОПРОС=С[И] ТО ?"  ",С[И+1]; #С+2->И ВСЕ
32     ВСЕ;
33     ЕСЛИ И=#С-1 ТО ?"EXCUSE ME, I DON'T KNOW";?; BCE
34   BCE
35 BCE;
36 КНЦ;

10  REM СЛОВАРЬ
20  DATA IF, ЕСЛИ, THEN, "ТОГДА,TO", FOR
25  DATA ДЛЯ, END, КОНЕЦ, STEP, ШАГ, PRINT
30  DATA ПЕЧАТАТЬ, GET, ПОЛУЧИТЬ, READ
40  DATA ЧИТАТЬ, PLOT, ЧЕРТИТЬ, INPUT, ВВОД
45  DATA TO, "ДО,К", COLOR, ЦВЕТ, RETURN
50  DATA ВОЗВРАТ, DATA, ДАННЫЕ
60  N=14: DIM E¤(N),R¤(N)
70  FOR I=1 TO N: READ E¤(I), R¤(I): NEXT I
80  ?"1 -ОПРОС, 2 -ПЕРЕВОД, 0 -КОНЕЦ";
90  GET K¤: HOME
100 ON VAL(K¤)+1 GOSUB 120,200,300
110 GOTO 80
120 END
200 REM ОПРОС
210 FOR I=1 TO N: ?R¤(I);" - ";: K=0
220 INPUT P¤
230 IF P¤=E¤(I) THEN ?" ПРАВИЛЬНО": GOTO 260
240 ?"  НЕПРАВИЛЬНО": K=K+1: IF K<3 THEN 220
250 ?"   " ;E¤(I)
260 NEXT I
270 RETURN
300 REM ПЕРЕВОД
310 ?"ВВЕДИТЕ ИНТЕРЕСУЮЩЕЕ ВАС"
320 ?"  АНГЛИЙСКОЕ СЛОВО ИЛИ К"
330 ?: INPUT Q¤: IF Q¤="К" THEN RETURN
340 FOR I=1 TO N
350 IF Q¤=E¤(I) THEN ?"   " ; R¤(I): GOTO 310
360 NEXT I
370 ?"EXCUSE ME, I DON'T KNOW": ?: GOTO 310

К. В Бейсике русские переводы, содержащие запятую, разделяющую варианты, заключены в кавычки, без которых эти варианты оказались бы в разных элементах массива и всё запуталось бы. В Бейсике английские и русские слова помещены в два массива, перебираемые в циклах подряд, а в Рапире все слова записаны с чередованием в один кортеж, который просматривается в циклах с шагом 2. В Бейсик-программе при выборе режима ОПРОС/ПЕРЕВОД в строке 90 вводится символ цифры 1 или 2, который в 100-й строке с помощью функции VAL превращается в число для вызова одной из подпрограмм.

Р. Наверное, программа опроса должна подсчитывать количество или процент правильных и неправильных ответов и по какому-то критерию оценивать ответ, может быть, направлять опрос тем или другим путём. Серьёзной программе нужно будет большее количество слов, хранимых в отдельных файлах (для разных языков), где слова будут упорядочены по алфавиту, что позволит программе перевода быстрее ориентироваться среди них (например, той же дихотомией: делим словарь пополам и смотрим, где интересующая нас буква - до или после и т.д.). При опросе также будут перебираться не все слова, а только некоторое количество слов, выбираемых из словаря случайно или по какому-нибудь принципу. Сделайте специальную программу, упорядочивающую набор слов по алфавиту - русскому или латинскому.

18. Звук

С. Игровую программу может приятно оживить удачно подобранное звуковое сопровождение. В Рапире для этого всегда под рукой встроенная процедура ЗВУК(Д,П) - 0<Д, П<256; чем больше П, тем ниже звук, длительность звука зависит от Д и П. В Бейсике для этого заносят в соответствующее место памяти небольшую подпрограмму в кодах, к которой обращаются после засылки по соответствующим адресам параметров, аналогичных П и Д.

 1 ПРОЦ З;
 2 ПОВТОР З :: ЗВУК(80,166) ВСЕ;
 3 ЗВУК(255,210);
 4 ПОВТОР З :: ЗВУК(70,188) ВСЕ;
 5 ЗВУК(255,224);
 6 КНЦ;

 7 ПРОЦ СИРЕНА(Д1,П1,Д2,П2,К);
 8 ПОВТОР К ::
 9   ЗВУК(Д1,П1); ЗВУК(Д2,П2)
10 ВСЕ;
11 КНЦ;

10  REM ЗВУК
20  DATA 160, 0, 174, 0, 3, 173, 48, 192, 136,
         208, 5, 206, 1, 3, 240, 5, 202, 208,
         245, 240, 237, 96
30  FOR A=770 TO 791: READ C: POKE A,C: NEXT A
40  DATA 166, 60, 166, 60, 166, 60, 210, 255,
         187, 60, 187, 60, 187, 60, 222, 255
50  FOR I=1 TO 8
60  READ F,L: POKE 768,F: POKE 769,L: CALL 770
70  NEXT I
80  GET K¤
90  FOR I=1 TO 6
100 POKE 768,140: POKE 769,50: CALL 770
110 POKE 768,70: POKE 769,100: CALL 770
120 NEXT I

К. Строки 20-30 - ввод кодовой программы. Процедура 3 (строки 40-70) - воспроизведение знакомой энергичной музыкальной фразы. После вызова СИРЕНА (100, 150, 200, 70, 6) (в Бейсике после нажатия клавиши) звучит сирена.

Р. Полезно исследовать смысл, влияние и взаимосвязь параметров П и Д, разобраться в исходном ассемблерном тексте кодовой программы. На этой основе можно сделать программу, превращающую клавиатуру машины в музыкальный инструмент. Другие подобные программы могли бы создавать различные шумовые эффекты: рёв мотора, стук сердца, капель и даже подобие речи.

19. Музыкальная библиотека

С. Чередующиеся в определённом порядке звуки определённой частоты и длительности - это уже мелодия. В Рапире для этого на системном диске есть К-файл МУЗЫКА. КОД и процедура НОТА с параметрами КАКАЯ и ДЛИНА. КАКАЯ - это номер ноты от 1 до 47 (больше - выше), 0 - пауза. ДЛИНА от частоты не зависит и может быть от 1 до 255, для целой ноты можно принять 64.

В Бейсике придётся поступить так же, как в теме ЗВУК, но кодовая программа будет подлиннее и позволит получать более длинные звуки. В связи с тем, что отношение частот соседних нот (полутон) равно корню 12-й степени из 2, используемые для получения нефальшивых звуков числа должны принадлежать соответствующей геометрической прогрессии.

Выбрав одну из нот в качестве опорной и отсчитывая от неё полутона вверх и вниз, можно закодировать мелодию в виде последовательности номеров нот (членов прогрессии). При этом для каждой ноты нужно задать длительность, но в связи с тем, что ноты одинаковой длины зачастую соседствуют, можно сэкономить, кодируя длительность отрицательным числом и считая, что она относится ко всем последующим нотам до новой длительности. Если ко всем номерам добавить одно и то же число, получится та же мелодия, но в другой тональности, повыше или пониже.

Несколько мелодий объединим в музыкальную библиотеку, выдающую по номеру одну из мелодий или их каталог для выбора.

 1 ПРОЦ БИМ; (* БИБЛИОТЕКА МЕЛОДИЙ *)
 2 ЕСЛИ НЕ ПPИ3HAK="ЗАГРУЖЕНО" ТО
 3   ВВОД ИЗ ДЗУ:НОТА;
 4   ПОДГОТОВИТЬ_НОТУ();
 5   "ЗАГРУЖЕНО"->ПРИЗНАК
 6 ВСЕ;
 7 <<"ГАММА",1,3,5,6,8,10,12,13,12,10,8,
             6,5,3,1>>->Б;
 8 <-8,8,-16,5,5>->К1; <8,6,5,3,-4,1>->К2;
 9 Б+<<"МАЛЕНЬКАЯ ЕЛОЧКА">+K1+К1+К2+
     <-8, 10, -16, 13, 10>+К1+К2>->Б;
10 <-16,7,2,7,2,7,6,6,0,6,2,6,2,6>->K1;
11 <7,9,-32,9,9,-16,9,9,10,-32,10,10,
    -16,10,10,10,9,7,6>->K2;
12 Б+<<"КУЗНЕЧИК">+K1+<7,7,0>+K1+<-8,7,
    -16,0>+K2+<7,7,0>+K2+<-8,7>>->Б;
13 Б+<<"СТЕПЬ",-8,1,-16,1,-8,3,-16,1,
    -3,10,-8,10,-16,10,-8,11,-16,10,-3,
     3,-8,3,-16,5,8,6,3,-3,1,-16,1,5,8,
    -8,11,-16,5,-3,6>>->Б;
14 <-8,1,9,9,9,9,-4,9,-8,8,8,11,11,9,8,
    -4,8,-8,6,6,6,6>->K1;
15 Б+<<"ПРЕКРАСНОЕ ДАЛЕКО">+K1+<6,6,-5,
     4,-16,9,13,13,-3,11,-16,13,14,-3,
     13>+K1+<4,2,-16,1,6,-8,9,0,1,1,5,
     8,5,-4,6>>->Б;
16 Б+<<"ПОДМОСКОВНЫЕ ВЕЧЕРА",-8,1,4,8,
     4,-4,6,-8,4,3,-4,8,6,-2,1,-8,4,8,
     11,11,-4,13,-8,11,9,-2,8,-4,10,12,
    -8,15,13,-3,8,-8,3,1,8,6,-2,9,-8,
     11,9,-4,8,-8,6,4,-4,8,6,-2,1>>->Б;
17 <-32,7,6,6,-16,6>->К1; <-32,6,4 ,-16,4 >->К2;
18 Б+<<"МОЦАРТ">+K1+K1+K1+<-8,14,-32,
     14,12,-16,11,-32,11,9,-16,7,-32,
     7,6,-16,4,-8,4>+K2+K2+K2+<-8,12,
     -32,12,11,-16,10,-32,10,7,-16,6,
     -32,6,4,-16,2,-8,2>>->Б;
19 0->И; 0->СДВИГ; 8->Д;
20 ПОКА И>=0 ::
21   ЕСЛИ И<1 ИЛИ И>#Б ТО
22     ДЛЯ Й от 1 ДО #Б :: ?й," ",Б[й,1] ВСЕ
23   ИНАЧЕ
24     ?Б[И,1],", СДВИГ=",СДВИГ;?;
25     ВЫВОД БПС: "ИЗМЕНИМ ТОНАЛЬНОСТЬ (Д/Н) ?"?
26     КЛАВ()->ОТВЕТ;?;Б[И,2:#Б[И]]->М;
27     ЕСЛИ ОТВЕТ="Д" ТО
28       48->МИН; 0->МАК;
29       ДЛЯ Т ИЗ М ::
30         ЕСЛИ Т>0 ТО
31           ЕСЛИ Т<МИН ТО Т->МИН ВСЕ;
32           ЕСЛИ T>MAK ТО Т->MAK ВСЕ
33         ВСЕ
34       ВСЕ;
35       ?"ВЫБЕРИТЕ СДВИГ ОТ ",1-МИН, " ДО ",48-МАК;
36       ВВОД ДАННЫХ:СДВИГ;
37     ВСЕ;
38     МЕЛОДИЯ(М,СДВИГ)
39   ВСЕ;
40   ?;?" 0 - КАТАЛОГ МЕЛОДИЙ";
41   ?;?"1 - ",#Б," - ИСПОЛНЕНИЕ";
42   ?;?" -1 - ВЫХОД";?;
43   ВВОД ДАННЫХ:И;
44 ВСЕ;
45 КНЦ;
46 ПРОЦ МЕЛОДИЯ(К,С);
47 ИМЕНА: Т,Д; 8->Д;
48 ДЛЯ Т ИЗ К ::
49   ВЫБОР ИЗ
50     Т<0: ЦЕЛЧ(-48/Т)->Д !
51     Т=0: НОТА(Т,Д) !
52     Т>0: НОТА(Т+С,Д)
53   ВСЕ
54 ВСЕ;
55 КНЦ;

10   REM БИБЛИОТЕКА МЕЛОДИЙ
20   GOSUB 1000
30   FOR A=1 TO N: ?A;" - ";NAME¤(A): NEXT A
40   ?; INPUT K
50   IF K<0 THEN END
60   IF K=0 OR K>N THEN 30
70   ?: ?NAME¤(K),"СДВИГ=";S: ?
80   ?"ИЗМЕНИМ ТОНАЛЬНОСТЬ (Д/Н) ?": GET R¤
90   IF R¤="D" OR R¤="A" THEN INPUT"СДВИГ ";S 100 READ C
110  IF C-1000<K THEN RETURN
120  GOSUB 900: RESTORE
130  FOR A=770 TO 819+N: READ R¤: NEXT A
140  ?; ?" 0 - КАТАЛОГ МЕЛОДИЙ"
150  ?: ?"1 - ";N;" - ИСПОЛНЕНИЕ"
160  ?: ?" -1 - ВЫХОД"
170  GOTO 40
900  REM *** МЕЛОДИЯ ***
910  READ C
920  IF C>255 THEN RETURN
930  IF C<0 THEN POKE 769,-64/C: GOTO 910
940  POKE 768,H%(C+S): CALL 770: GOTO 910
950  RETURN
1000 REM *** НАЧАЛЬНЫЕ УСТАНОВКИ ***
1010 DATA 173,1,3,72,10,10,10,10,41,
     240,141,64,3,104,74,74,74,74,41,
     15,141,65,3,160,0,174,0,3,173,48,
     192,136,208,10,206,64,3,208,5,206,
     65,3,48,5,202,208,240,240,232,96
1020 FOR A=770 TO 819: READ C: POKE A,C: NEXT A
1030 DIM H%(37): A=256: P=2^(1/12): H%(1)=0
1040 FOR C=2 TO 37: A=A/P
1050 H%(C)=INT(A+0.5): NEXT C
1060 DATA ГАММА, МАЛЕНЬКАЯ ЕЛОЧКА, МОЦАРТ
1070 N=3: DIM NAME¤(N)
1080 FOR A=1 TO N: READ NAME¤(A): NEXT A
1090 RETURN
2000 REM ************* НОТЫ
2010 REM *** ГАММА ***
2011 DATA 1001,-8,1,3,5,6,8,10,12,13,
          13,12,10,8,6,5,3,1,256
2020 REM *** МАЛЕНЬКАЯ ЕЛОЧКА ***
2021 DATA 1002,-8,8,-16,5,5,-8,8,-16,5,
     5,8,6,5,3,-5,1,-8,10,-16,13,10,-8,
     8,-16,5,5,8,6,5,3,-5,1,256
2030 REM *** МОЦАРТ ***
2031 DATA 1003,-32,7,6,-16,6,-32,7,6,
     -16,6,-32,7,6,-16,6,-8,14,-32,14,
     13,-16,11,-32,11,9,-16,7,-32,7,6,
     -16,4,-8,4,-32,6,4,-16,4,-32,6,4,
     -16,4,-32,6,4,-16,4,-8,13,-32,13,
     11,-16,10,-32,10,7,-16,6,-32,6,4,
     -16,2,-8,2,256

К. В Рапира-программе первый раз загружается с диска файл НОТА с процедурой ПОДГОТОВИТЬ НОТУ, загружающей, в свою очередь, К-файл МУЗЫКА.КОД, и задаётся ПРИЗНАК загруженности этих файлов, по которому при последующих вызовах БИМа обращения к диску обходятся. При подборе тональности в строках 28-36 определяются минимальный и максимальный номера нот, дабы при сдвиге не случилось выхода за пределы диапазона 1-47. В процедуре МЕЛОДИЯ в цикле воспроизведения коды разделяются на длительности (меньшие нуля), ноты и паузы (равные нулю), к последним сдвиг не применяется. К этой процедуре можно обращаться и в диалоге, задавая кортеж мелодии в заголовке, подбирать её на слух. Библиотеку можно расширять, наращивать кортеж Б новыми кортежами, начинающимися с текста-названия. Обратите внимание, как с помощью рабочих кортежей К1 и К2 вводятся повторяющиеся фрагменты.

В Бейсик-программе сначала исполняется подпрограмма 1000, где в память машины заносится кодовая программа управления динамиком, вычисляются и запоминаются в массиве Н% 37 членов геометрической прогрессии - три октавы. Начало прогрессии - 256 (0) - самый низкий звук, но можно выбрать и другое начало, например 249 - на четверть тона выше. Обработки паузы нет, её надо организовывать специально, видимо, циклом. В массиве NAME¤ запоминаются названия мелодий для каталога. Поиск мелодии (100-110) в списке данных ведётся по числу (1000+номер в каталоге), с которого она должна начинаться. После воспроизведения (в подпрограмме 900) по команде RESTORE происходит возврат на начало списка и "пустое" считывание всех начальных данных (как текстовых) для подхода к первой мелодии.

Экспериментируя со сдвигом тональности, вы можете убедиться, что слишком высокие ноты звучат хуже, слышится фальшь, вызванная ошибками округления до целого. Для сравнения распечатайте геометрическую прогрессию с округлением и без него.

Р. Можно изменять не только тональность, но и темп исполнения (adagio, allegro и др.), введя множитель у длительности. Вставляя между всеми нотами небольшие паузы, можно попробовать получить staccato. Вообще, полезно было бы облегчить процесс кодирования мелодий с использованием традиционных названий нот (до, до#, ре...) и других музыкальных стандартов (мажор, минор и проч.). И всё это в графике - нотный стан, скрипичный ключ, нотные знаки. При этом необходимо помнить, что быстродействие машины невелико и задержки при воспроизведении мелодии не доставят удовольствия слушателям.

20. Двоичные числа

С. В машине вся информация хранится в двоичном виде. Значением того или иного двоичного разряда (0 или 1) вместе с соседними определяются цвет, символ, изображение в графике и даже оператор в Бейсике. Научимся переводить десятичные числа в двоичную систему счисления и обратно. Двоичные числа будем представлять в виде текстов, состоящих из символов 0 и 1.

 1 ФУНК BYNDEC(DEC); (* 10->2 *)
 2 ИМЕНА: BYN,А,В;
 3 ЕСЛИ DEC ВИДА 0 ТО
 4   ""->BYN; DEC->А;
 5   ПОКА А>0 :: А//2->В;
 6     ЕСЛИ А>В+В ТО "1"+BYN->BYN
 7     ИНАЧЕ "0"+BYN->BYN
 8     ВСЕ;
 9     В->А
10   ВСЕ
11 ИНАЧЕ ?"ОШИБКА: BYNDEC(",DEC,")"; ВЫХОД
12 ВСЕ;
13 РЕЗ:BYN;
14 КНЦ;

15 ФУНК DECBYN(BYN); (* 2->10 *)
16 ИМЕНА: DEC,РАЗРЯД;
17 ЕСЛИ BYN ВИДА "Ю" ТО
18   0->DEC;
19   ДЛЯ РАЗРЯД ИЗ BYN ::
20     ЕСЛИ РАЗРЯД ИЗ "01" ТО
21       DEC+DEC->DEC;
22       ЕСЛИ РАЗРЯД="1" ТО DEC+1->DEC ВСЕ
23     ИНАЧЕ
       ?"ОШИБКА: DECBYN ",ВYN,")";ВЫХОД
24     ВСЕ
25   ВСЕ
26 ИНАЧЕ
     ?"ОШИБКА: DECBYN(",BYN,")"; ВЫХОД
27 ВСЕ;
28 РЕЗ:DEC;
29 КНЦ;

10 REM 10 -> 2
20 INPUT " ДЕСЯТИЧНОЕ: "; DEC: A=DEC: BYN¤=""
30 B=INT(A/2)
40 IF A>B+B THEN BYN¤="1"+BYN¤:GOTO 60
50 BYN¤="0"+BYN¤: A=B
60 IF A>0 THEN 30
70 ?" ДВОИЧНОЕ: "; BYN¤
80 GOTO 20

10 REM 2 -> 10
20 INPUT " ДВОИЧНОЕ: "; BYN¤
30 DEC=0: L=LEN(BYN¤)
40 FOR I=1 TO L: R¤=MID¤(BYN¤,I,1)
50 IF NOT (R¤="1" OR R¤="0") THEN 20
60 DEC=DEC+DEC
70 IF R¤="1" THEN DEC=DEC+1
80 NEXT I
90 ?" ДЕСЯТИЧНОЕ: "; DEC
100 GOTO 20

К. В Рапире к функциям перевода можно обратиться из программы или в диалоге, например: #?BYNDEC(1023); или ?DECBYN(<10010>);. Оператором ИМЕНА рабочие переменные А, В, BYN, DEC и РАЗРЯД локализованы в функциях, т.е. не доступны из других программ и не пересекаются с одноимёнными переменными в других программах. В строках 3 и 17 делается проверка на соответствие типа входного параметра - число или текст, а в строке 20 - на то, что текст состоит лишь из 0 и 1, при ошибке выдаётся соответствующее сообщение. Бейсик-программы зациклены, а в последнем случае при ошибке будет просто запрашиваться новое двоичное число, так как проверку типа на вводе Бейсик делает автоматически.

Р. Можно попробовать записывать двоичные числа не текстами, а десятичными, состоящими из 0 и 1. Запрограммируйте сложение и умножение двоичных чисел. Вспомнив тему "Коды и символы", исследуйте, как разные символы представлены в машине, как она различает русские и латинские буквы, большие и малые. Используя команды АДРЧ и АДРЗ (PEEK и POKE), по адресам графической страницы разберитесь в их содержимом, попробуйте изменить цвет, сформировать изображение в цветном или чёрно-белом режиме.

21. Шестнадцатеричные числа

С. Двоичная запись всё же труднообозрима, да и обрабатывает данные машина не побитно, а побайтно, т.е. группами по 8 бит. Поэтому освоим ещё одну систему счисления - с основанием шестнадцать. В ней четыре двоичных разряда изображаются одним знаком - цифрой от 0 до 9 или латинской буквой A, B, C, D, E, F, а любой байт - двумя знаками. Эта система по ёмкости превосходит десятичную, например: двузначной десятичной записи 15 соответствует шестнадцатеричная F, 255 - FF. В этой системе обычно адресуется память в Бейсике и Ассемблере.

 1 ФУНК HEXDEC(DEC); (* 10 -> 16 *)
 2 ИМЕНА:НЕХ,А,В;
 3 ЕСЛИ DEC ВИДА 0 ТО
 4   ""->HEX; DEC->А;
 5   ПОКА А>0 :: А//16->В; А-16*В->А;
 6     ЕСЛИ А>9 ТО А+7->А ВСЕ;
 7     АЛФ(А+176)+НЕХ->НЕХ; В->А
 8   ВСЕ;
 9 ИНАЧЕ ?"ОШИБКА: HEXDEC(",DEC,")"; ВЫХОД
10 ВСЕ;
11 РЕЗ:HEX;
12 КНЦ;

13 ФУНК DECHEX(HEX); (* 16 -> 10 *)
14 ИМЕНА:DEC,РАЗРЯД,Д;
15 ЕСЛИ НЕХ ВИДА "Ю" ТО
16   0->DEC;
17   ДЛЯ РАЗРЯД ИЗ HEX ::
18     ЕСЛИ РАЗРЯД ИЗ "0123456789ABCDEF" ТО
19       КОД(РАЗРЯД)-176->Д;
20       ЕСЛИ Д>9 ТО Д-7->Д ВСЕ;
21       DEC*16+Д->DEC
22     ИНАЧЕ
       ?"ОШИБКА: DECHEX(",HEX,")"; ВЫХОД
23     ВСЕ
24   ВСЕ
25 ИНАЧЕ
     ?"ОШИБКА: DECHEX(",DEC,")"; ВЫХОД
26 ВСЕ;
27 РЕЗ:DEC;
28 КНЦ;

10 REM 10 -> 16
20 INPUT " ДЕСЯТИЧНОЕ; ";DEC: A=DEC: HEX¤=""
30 B=INT(A/16): A=A-B*16
40 IF A>9 THEN A=A+7
50 HEX¤=CHR¤(A+176)+HEX¤: A=B
60 IF A>0 THEN 30
70 ?" ШЕСТНАДЦАТЕРИЧНОЕ: ";HEX¤
80 GOTO 20

10  REM 16 -> 10
20  INPUT" ШЕСТНАДЦАТЕРИЧНОЕ: ";HEX¤
30  DEC=0: L=LEN(HEX¤)
40  FOR I=1 TO L: R¤=MID¤(HEX¤,I,1)
50  D=ASC(R¤)-176
60  IF D>1 THEN D=D-7
70  IF D>15 OR D<0 THEN 20
80  DEC=DEC*16+D
90  NEXT I
100 ?" ДЕСЯТИЧНОЕ: ";DEC
110 GOTO 20

К. При обработке текстов с шестнадцатеричными числами пользуемся тем, что у символов от 0 до 9 коды от 176 подряд до 185, а от A до F - 193-198. Вообще говоря, в Бейсике перевод 16->10 не очень актуален, так как предусмотрена шестнадцатеричная форма представления констант, и для чисел меньше ¤8000 можно воспользоваться, например, оператором печати: ?¤2C3A. Попробуйте, что получится при переходе через ¤8000.

Р. Запрограммируйте функции HEXBYN(2->16) и BYNHEX(16->2). Сделайте программу перевода чисел из системы с основанием М в систему с основанием N, где М и N можно задать любыми, а в качестве цифр свыше 9 используются латинские буквы.

22. Сборка Бейсик-программ, или Как сделана эта статья

Занявшись составлением сложных программ на Бейсике, вы вскоре столкнётесь с необходимостью использовать в них фрагменты других программ, например, создание графиков, сложные вычисления или музыкальные коды. Хранение таких отлаженных подпрограмм в A-файлах ничего не даст, так как при считывании по команде LOAD прежняя программа пропадает. Набирать такие куски с распечатки заново - непроизводительная трата сил и времени с неизбежными ошибками и лишней отладкой. Выход в использовании T-файлов. Обычно мы вводим тексты программ с клавиатуры, а вывод текстов делаем на экран или бумагу. Но можно вводить тексты программ с диска из T-файла и <распечатывать> программу на диск - в T-файл. Команды LOAD и SAVE не в счёт, они работают с кодовой формой хранения Бейсик-программ в оперативной памяти и в A-файлах. Для того чтобы вывести текст программы в T-файл, добавим в неё такую строку:

0 INPUT N¤: ?: ?CHR¤(4);"OPEN"+N¤: 
   ?: ?CHR¤(4);"WRITE"+N¤: LIST1,: 
   ?: ?CHR¤(4);"CLOSE"+N¤: END

и, вставив диск, запустим изменённую программу: RUN. На запрос введём имя для T-файла. Записанный файл можно теперь прочитать в редакторе "Школьницы". Если хотите, Бейсик-программы можно сразу набирать в редакторе, с соответствующими удобствами и неудобствами, и здесь же делать сборку, выбрав в меню ДОПИСАТЬ ФАЙЛ.

В Бейсике программа из T-файла вводится по команде EXEC имя. Чтобы видеть читаемый текст, не забудьте перед этим ввести команду MON,1. Так, нетрудно собрать программу из нескольких T-файлов, при этом следует иметь в виду, что если номера строк в них будут повторяться, то, как и при вводе с клавиатуры, последующая строка затрёт в памяти предыдущую с таким же номером.

И вышеприведённую 0-строку тоже удобно хранить в отдельном T-файле, например, с именем W, вводя её при необходимости по EXECW и не пользуясь номером 0 в программах для других целей.

А статья эта была набрана в системе "Агат-автор", которая умеет читать тексты T-файлов, преобразовывать их в свой формат и записывать в виде B-файлов. Таким образом и были собраны и описаны все приведённые программы.

    Литература
  1. ПЭВМ "Агат": Техническое описание. Ч.2. Программное обеспечение. ФгЗ.032.002 ТО1. Москва, 1986.
  2. Описание языка Рапира в системе "ШКОЛЬНИЦА". 3533847.0042-01 33 01. Новосибирск, 1987.
  3. Степанов М.Е. Программирование на языке Бейсик-Агат: Методические рекомендации учителю Ч.1. НИИ школ МП РСФСР. Москва, 1986.
  4. Самолысов В.А. Учебные задания по работе на ПЭВМ "Агат" (для учащихся девятых классов). М.: изд. НИИ школ МП РСФСР, 1986.
  5. Уоттенберг Ф. Программирование для персонального компьютера Эпл: Пер. с англ. М.: Мир, 1988.
  6. Алексеев М., Рябова А. "Агат", ассемблер и музыка // Информатика и образование. 1989. N 5.

* * *

Использование материалов проекта agatcomp без получения предварительного письменного разрешения agatcomp запрещено.


Почта для обратной связи: mail@agatcomp.ru


Живое общение по теме Агата: Telegram группа Agatcomp.


Накопленные знания и проекты: тематический ФОРУМ.


© 2004-2024 agatcomp.su / agatcomp.ru

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *