Квазиподпрограммы
Известно, что для многократного выполнения строго фиксированных операций программным образом лучше всего в тексте основной программы использовать набор соответствующих специализированных подпрограмм. Однако при этом возникает целый ряд вопросов и затруднений, связанных со способом хранения, модификации и передачи параметров и данных, необходимых для их работы. Оптимизировать программу, имеющую в своём составе большой набор таких специализированных подпрограмм, позволяет описываемый ниже метод. Чтобы сделать его максимально понятным и наглядным, рассмотрим в качестве примера решение следующей задачи:
Составить программу на Бейсике БК или другой ПЭВМ, которая на экране рисует изображение почтового конверта (рис. 1), ожидает нажатия любой клавиши, затем, очистив экран, «переворачивает» конверт (рис. 2) и при новом нажатии клавиши «Открывает» его (рис. 3). Точки изображения имеют следующие координаты: 1:(50, 100); 5:(115, 120); 3:(100, 150); 13:(100, 170); 17: (100, 190); 2: (150, 100); 6: (105, 120); 10:(140, 150); 14:(140, 170); 18: (140, 190); 3:(50, 200); 7:(130, 110); 11:(100, 160); 15:(100, 180); 19:(135, 111); 4:(150, 200); 8:(140, 130); 12:(140, 160); 16: (140, 180); 20: (100, 50).
Рис. 1 Рис. 2 Рис. 3
Для решения задачи удобно организовать и выполнить программным образом несколько стандартных операций. Обозначим каждую своей буквой: задать точку - Т; провести линию - Л; очертить рамку - Р; нарисовать окружность - О; закрасить изображение - 3; ждать нажатия клавиши - Ж; очистить экран - Ч; закончить работу - К.
Если теперь все необходимые параметры и данные записать в одном или нескольких списках оператора DATA, а подпрограммы, нуждающиеся в них, снабдить операторами READ для считывания, то, очевидно, основная программа превратится просто в совокупность функциональных операторов, операторов GOSUB и READ.
На этом этапе построения программы можно исключить из текста... все операторы GOSUB. Действительно, их функции могут взять на себя те буквы, которыми мы обозначили стандартные операции, и последовательности команд Бейсика, выполняющие эти операции.
Условные обозначения операций вместе с относящимися к ним параметрами назовём квазиподпрограммами. Таким образом, в нашем представлении каждая квазиподпрограмма имеет своё имя-идентификатор, однако в отличие от идентификаторов, допускаемых языком Бейсик, никаких ограничений на их количество и состав символов в них не налагается. Более того, их можно записывать без кавычек и при необходимости в нескольких списках оператора DATA.
Все операторы DATA со списками имён квазиподпрограмм и необходимых данных разместим в конце текста программы и назовём блоком директив. Теперь останется составить фрагменты программы, которые будут непосредственно выполнять действия, заданные квазиподпрограммами (назовём совокупность этих фрагментов исполнительным блоком), и ту часть программы, которая будет вызывать эти фрагменты на исполнение (управляющий блок).
Итогом работы будет следующая программа.
10 DIM M(100,2) 20 ' --------------------------------- 30 ' УПРАВЛЯЮЩИЙ БЛОК 40 ' --------------------------------- 50 READ K$ 'K$ - ИМЯ ОЧЕРЕДНОЙ ПОДПРОГРАММЫ 60 IF K$="Т" THEN 160 'ЗАДАТЬ ТОЧКУ 70 IF K$="Л" THEN 230 'ЛИНИЯ 80 IF K$="Р" THEN 270 'РАМКА 90 IF K$="О" THEN 310 'КРУГ 100 IF K$="3" THEN 380 'ЗАКРАСКА 110 IF K$="Ж" THEN 420 'ЖДАТЬ КЛАВИШУ 120 IF K$="Ч" THEN 450 'ОЧИСТИТЬ ЭКРАН 130 IF K$="К" THEN 480 'КОНЕЦ РАБОТЫ 140 GOTO 50 150 ' --------------------------------- 160 'ИСПОЛНИТЕЛЬНЫЙ БЛОК 170 ' --------------------------------- 180 '*** Т - ЗАДАТЬ ТОЧКУ ************* 190 READ N,X,Y 200 M(N,1)=X 210 M(N,2)=Y 220 GOTO 50 230 '*** Л - ЛИНИЯ ******************** 240 READ N1,N2 250 LINE (M(N1,1),M(N1,2))-(M(N2,1),M(N2,2)) 260 GOTO 50 270 '*** P - РАМKА ******************** 280 READ N1,N2 290 LINE (M(N1,1),M(N1,2))-(M(N2,1),M(N2,2)),,B 300 GOTO 50 310 '*** О - KРУГ ********************* 320 READ N1,N2 330 DX=M(N1,1)-M(N2,1) 340 DY=M(N1,2)-M(N2,2) 350 R=SQR(DX*DX+DY*DY) 360 CIRCLE (M(N1,1) ,M(N1,2)),R 370 GOTO 50 380 '*** 3 - ЗАKРАСKА ***************** 390 READ N 400 PAINT (M(N,1),M(N,2)) 410 GOTO 50 420 '*** Ж - ЖДАТЬ КЛАВИШУ ************ 430 IF INKEY$="" THEN 430 440 GOTO 50 450 '*** Ч - ОЧИСТИТЬ ЭKРАН *********** 460 CLS 470 GOTO 50 480 '*** К - ОКОНЧИТЬ РАБОТУ 490 END 500 ' --------------------------------- 510 'БЛОК ДИРЕКТИВ 520 ' --------------------------------- 530 DATA Ч,Т,1,50,100,Е,2,150,100,Т,3,50,200,Т,4,150,200,Т,5,115,120,Т,6,105,120,Т,7,130,110,Т,8, 140,130,Т,9,100,150,Т,10,140,150,Т,11,100,160,Т,12,140,160,Т,13,100,170,Т,14,140,170,Т,15,100, 180,Т,16,140,180, 540 DATA Т,17,100,190,Т,18,140,190,Т,19,135,111,Т,20,100,50,Р,1,4,О,5,6,Р,7,8,Л,9,10,Л,11,12,Л,13, 14,Л,15,16,Л,17,18,З,19,Ж,Ч,Р,1,4,Л,1,4,Л,2,3,Ж,Л,1,20,Л,2,20,Ж 1000 DATA К
Преимущество данного метода в том, что он обеспечивает создание компактных, удобных в отладке программ, которые, в свою очередь, очень легко модифицируются: для создания новых изображений на экране достаточно изменить или расширить компактный блок директив.
Предлагаемый метод пригоден не только для графических программ: в исполнительный блок могут включаться команды, выполняющие самые разнообразные действия, а для управления ходом их выполнения можно пользоваться оператором ON.
Лучше всего этот метод оправдывает себя при написании программ линейной структуры, позволяя в 5-10 раз увеличить их объём за счёт компактности хранения данных и жёсткой структурности.
А. ИНГОРЬ
Спасение программ при зависании
При использовании кодов 149-151 в программах, написанных на Фокале, БК часто зависает. Приходится перезапускать процессор, теряя содержимое ОЗУ. Однако зачастую можно избежать стирания памяти! Для этого достаточно, перезапуская процессор, держать нажатой клавишу СТОП. Если после перезапуска появляется отклик в виде вопросительного знака, то программа спасена.
Этот приём основан на том, что после запуска процессора управление передаётся на адрес 100000 («горячий» запуск монитора), а первая расположенная здесь системная команда - ЕМТ 14; она заносит по вектору прерывания клавиши СТОП «холодный» запуск монитора и затем занимается восстановлением исходного состояния всех регистров. На это требуется от 0,5 до 15 с, и если успеть подать сигнал от клавиши СТОП, то произойдёт «холодный» запуск монитора и станет возможным дальнейший диалог (действия пользователя в нем выделены жирным шрифтом):
? Т<ВВОД> + <РУС><3АГЛ>ТС ¤ Щ ¤ 120020АА=120020 ¤ 26ДД=000026 ¤ 0П ¤ 34АА=000034 ¤ 121300И<ВВОД> ¤ 262АА=000262 ¤ 177777И<СТОП> ОСТАНОВ ПО КЛАВИШЕ СТОП *
После этого работа с сохранённой программой может продолжаться обычным способом.
В. ВАСИЛЕНКО
От редакции. Очевидно, что успех данного способа прямо зависит от надёжности и быстродействия срабатывания клавиши СТОП. Улучшение этих параметров рассматривалось в статье И. Панченкова «Приручение БК»; при соблюдении приведённых там рекомендаций вероятность спасения программ описанным способом возрастает очень сильно.
Подключение БК-0010 к телевизорам 4УСЦТ
В последнее время на смену телевизорам типа ЗУСЦТ начали приходить телевизоры нового поколения 4УСЦТ, и подключение к ним БК становится задачей, интересующей многих.
Для переделки телевизоров этого типа необходимы реле с напряжением срабатывания 12-15 В (например, РЭС-15, РЭС-55А), стандартный разъем СГ-5 для подключения БК и три резистора МЛТ-0,125.
На кассете обработки сигналов КОС-401Д телевизора необходимо разорвать цепи, помеченные на рисунке крестиками, и добавить элементы соединения, изображённые толстыми линиями.
Теперь достаточно подключить БК к разъёму СГ-5, нажать кнопку S1, служившую ранее для отключения динамика, - и телевизор становится монитором. Нет даже необходимости отключать антенну (как, кстати, и БК при просмотре телепередач).
Ю. ЛУЦКЕВИЧ
Новый подход к построению баз данных на БК-0010
Главный недостаток БК-0010 - малый объём ОЗУ, отводимого пользователю, что, в частности, сильно затрудняет создание сколько-нибудь серьёзных баз и банков данных. «Обойти» эту трудность можно, используя активный обмен с магнитофоном. В рамках такого подхода написана программа ИПС.01К (информационно-поисковая система, версия 1). В ней реализованы следующие соображения:
- основной функцией ИПС является целенаправленной поиск нужной информации;
- необходимый для поисковых целей информационный банк (ИБ) оформляется в виде небольших отдельных файлов на МЛ;
ИПС обеспечивает автоматическое считывание с МЛ только тех файлов, которые относятся к выбранному ИБ, остальные файлы игнорируются.
Работа с программой ИПС.01К состоит из двух частей: подготовки ИБ на МЛ и непосредственного поиска нужной информации по модели, заданной пользователем.
При подготовке ИБ данные оформляются в виде таблицы с задаваемыми пользователем графами. Это могут быть разнообразные каталоги, ведомости, сведения об учащихся и т.п. Каждая строка таблицы должна представлять собой совокупность жёстко связанных логических параметров, по каждому из которых потом можно будет провести поиск всех остальных, сцепленных с ним. Подготовленные таким образом файлы ИБ записываются на МЛ с учётом того обстоятельства, что ИПС.01К способна вести поиск не только в самом содержимом ИБ, но и по именам составляющих его файлов. В связи с этим необходимо присваивать файлам информативные имена и уже на этом этапе закладывать возможность ускорения поиска в дальнейшем.
Процедура поиска проста: достаточно задать одну из девяти основных моделей поиска, после чего по одному или по совокупности нескольких параметров из ИБ будет выбрана вся относящаяся к ним информация. Затем она может быть распечатана на принтере или подвергнута дальнейшей обработке (дополнительной выборке, редактированию и т.п.).
Особенностью ИПС.01К является заложенная в ней возможность поиска информации не только по текстовым моделям, но и по числовым параметрам. Например, из списка людей с указанием дат их рождений можно выбрать родившихся до определённого года или после нею.
Хотя ИПС.01К создавалась для работы на изолированном компьютере, оснащённом лишь магнитофоном и принтером, она легко может быть адаптирована для работы в сети КУВТ. В этом случае удобство и оперативность работы с ней возрастут на порядок.
С. КУМАНДИН
Полку периферии прибыло
Ю.А. Зальцман разработал аппаратно-программный комплекс, позволяющий вводить в память БК-0010 телевизионные изображения. Время ввода одного кадра с телевизионной камеры типа «Электроника-841» - 1,2 с. После доработки возможен ввод изображения непосредственно с эфира (через телевизор) или видеомагнитофона. Вводимый кадр отображается на экране дисплея.
Аппаратная часть выполнена на 19 микросхемах серии К155 и позволяет оцифровывать телекадр с двумя или тремя уровнями яркости, получать позитивное, негативное или оконтуренное изображение размером 512x256 точек
Программная часть помимо управления вводом пикселов в экранное ОЗУ обеспечивает упаковку изображения и запись его на МЛ в формате графического редактора ГРЕД.М1 для дальнейшей обработки (либо воспроизведения на экране без графического редактора).
Общий вес конструкции (без телекамеры) - 2 кг, питание от сети 220 В, потребляемая мощность менее 20 Вт. Телевизионный интерфейс можно использовать для копирования графических материалов (электронная фотография), в качестве системы технического зрения (распознавание образов, автоматизированный контроль, ориентация и сортировка объектов, зрение роботов), для создания заставок и картин к играм, компьютерной мультипликации и т.п.