LOGO
ВСТУПЛЕНИЕ. ПОЧЕМУ LOGO?
В настоящее время
LOGO является самым популярным языком программирования, предназначенным
для начального обучения в школах. Он доступен практически для всех типов
компьютеров, имеющихся на рынке, за исключением самых примитивных и неудачных.
Для него необходим графический дисплей и хотя бы 48 кбайт оперативной памяти.
Домашние компьютеры, как правило, имеют 16 кбайт постоянной памяти. В сумме это
дает как минимум 64 кбайта доступной памяти. Этому требованию удовлетворяют
подавляющее большинство компьютеров. Самые популярные среди них — APPLE 11, COMMODORE 64 и 128, AMSTRAD CPC 464 и 6128, разные модификации
IBM PC, но наибольшей популярностью пользуется ZX-SPECTRUM
48K фирмы SINCLAIR RESERCH LTD. Своей
популярностью ZX-SPECTRUM обязан прежде всего цене, которая хоть и является
довольно высокой для среднего потребителя, но довольно успешно конкурирует с
ценой на другие компьютеры.
Основным препятствием на пути
распространения LOGO является отсутствие литературы.
Достать дискету или кассету намного легче, чем приобрести учебник, который бы,
помимо описания собственно языка, содержал и особенности имеющейся версии.
Опытным программистам достаточно фирменной документации, описывающей данную
версию LOGO, но она написана на иностранном языке. Тем,
для кого LOGO станет первым языком программирования,
необходимы упрощенные технические тексты, обращающие больше внимания на
конкретное применение языка. Очень важно, чтобы именно первые контакты с
компьютером научили правильно им пользоваться и применять полученные знания для
решения различных проблем. В начальном обучении не должен читаться курс языка
программирования, не должны усваиваться его конструкции. Здесь приобретается
намного более важное умение — пользоваться хорошо отработанными методами. Язык
программирования здесь рассматривается только как орудие и соответственно
должен трактоваться точно так же, как и в компьютере. В первой фазе обучения
нет нужды вникать в особенности конструкции и принципа действия компьютера,
если математические задачи можно решать, не зная принципов функционирования и
построения машин.
Примитивные языки
программирования, такие как Фортран, • Бейсик, Кобол, различные ассемблеры,
служат примером того, с чего нельзя начинать обучение программированию.
Эти-языки слабо приспособлены к современным методам программирования, их
конструкции не защищены от элементарных ошибок, программисту нужно знать
ненужные технические подробности, в том числе о самом компьютере. Наличие
множества ограничений, отнюдь не исключающих ошибки, потеря структур алгоритмов
и данных в структуре программы — все это делает эти языки мало пригодными для
начинающих. Сделать программы на этих неструктурированных языках
"прозрачными", легкими для проверки и модификации под силу только
опытным программистам. Это требует опыта и знаний, недоступных начинающим.
Неправильный выбор языка для начального обучения с самого начала приводит к
привитию неправильного подхода к решению задач при помощи ЭВМ.
Избавиться от однажды усвоенных
навыков очень трудно, а чаще всего для этого не находится времени.
Очень немногим из тех, кто так или
иначе сталкивается в жизни с компьютерами, представляется случай, выпадает
возможность и появляется желание овладеть искусством программирования на
профессиональном уровне и избавиться от когда-то подученных "плохих
манер". Все остальные остаются на когда-то достигнутом примитивном уровне.
Плохое обучение информатике хуже,
чем отсутствие такового. Поэтому выбор первого языка программирования играет
такую важную роль.
Вопрос о том, каким должен быть
язык для обучения программированию, возник еще в 60-х годах в США, где появился
язык LOGO. В первой фазе работы над языком принимали
участие такие известные ученые, как D.BOBROV, W.FEURZEIG,
C.SOLOMON и S.PAPERT. После десяти лет работы в
школах, совершенствования языка и методики обучения возникла совре-менная
версия LOGO, принятая за основу многими фирмами,
производящими программное обеспечение. Во многих странах созданы версии LOGO на национальных языках.
Говоря об имеющихся в продаже
версиях языка, надо предостеречь от подделок. Название языка не защищено
авторским правом и часто присваивается программам, не имеющим ничего общего с
настоящим языком. К счастью, настоящий LOGO повсеместно
доступен, а пользователи быстро отказываются от подделок, не удовлетворяй” их
качеством.
Определение LOGO
как языка начального обучения, предназначенного для детей и школьной молодежи,
не должно создавать впечатления, что это просто игра. Это универсальный и
мощный язык программирования; обладающий многими чертами, которых не имеют
другие языки. Тщательно продуманная структура языка делает его достаточно
легким и удобным в использовании. Элементарные учебники по
LOGO много внимания уделяют наиболее заметной на начальном этапе
обучения особенности — "черепашьей графике" (TURTLE
GRAPHICS). Это очень удобная в использовании
версия компьютерной графики, требующая лишь самых простых технических средств —
графического дисплея и клавиатуры. Вместе с возможностью свободного определения
процедур этот язык является достаточно мощным средством управления
изображением. Черепашья графика впоследствии была перенята многими языками
программирования, в том числе Паскалем и Бейсиком, хотя и ограничена здесь в
связи с отсутствием возможности такого внезапного определения процедур, как в LOGO.
Важное достоинство LOGO — возможность свободного выполнения операций над
текстами и списочными структурами. Благодаря этому, подобрав для конкретного
случая соответствующие структуры данных, можно создавать достаточно совершенные
алгоритмы, оформленные в виде коротких, "прозрачно" сконструированных
процедур, поскольку из простых процедур можно создавать более сложные,
пользуясь LOGO можно решать очень сложные проблемы.
Все это, а также то, что LOGO довольно долго проверялся в школах до того, как
приобрел свою популярность, делает его особенно интересным для внедрения в
школьные программы.
Приводя описание языка и методов
программирования с ним, мы полагаем, что читатель имеет доступ к компьютеру с LOGO и может пользоваться им при прочтении книги. Это
необходимо,
поскольку без компьютера многое описанное здесь будет
лишено практического смысла. Поскольку версии языка для различных
микрокомпьютеров заметно отличаются, мы остановимся на одной из них — для
ZX-SPECTRUM. Те, кто имеет другой тип компьютера, также мсяут пользоваться этой
книгой, опустив информацию, касающуюся только ZX-SPECTRUM.
Все приводимые ниже команды даются
в полной и сокращенной (если она есть) версиях. Сокращенные формы команд
одинаковы для всех версий, можете проверить это на своем компьютере перед тем,
как начать изучение языка. Разница между чаще всего встречающимися версиями LOGO подробно рассматривается в журнале
"INFORMATICA" (N 9, 1985). Поскольку результаты выполнения
всех команд, приведенных в тексте, вы увидите на экране своего компьютера,
иллюстрации в тексте опущены.
ZX-SPECTRUM ДЛЯ НАЧИНАЮЩИХ
Задача данного раздела — помочь
тем, кто с ZX-SPECTRUM сталкивается впервые. Тот, кто умеет считывать с
магнитофона программы и знает правила работы с клавиатурой, может этот текст
пропустить.
Здесь будет рассказано о работе и
обслуживании ZX-SPECTRUM в его минимальном составе, наиболее популярном.
Описание касается двух версий компьютера — ZX-SPECTRUM и ZX-SPECTRUM+.
Как было сказано выше, для LOGO требуется хотя бы 48 кбайт оперативной памяти, поэтому
версия ZX-SPECTRUM 16K не годится. Оперативную память
ZX-SPECTRUM 16K можно нарастить, но такая доработка будет стоить довольно
дорого. Фирма поставляет ZX-SPECTRUM в следующем составе:
— микрокомпьютер,
— источник питания постоянного
тока 220/9В,
— коаксиальный кабель для
соединения гнезда TV с телевизором,
— кабель для подсоединения
компьютера к магнитофону,
— книги: инструкция пользователя и
учебник Бейсика,
— кассета с объяснениями и
примерами программ. Кроме того необходимы:
— телевизор,
— кассетный магнитофон.
При отсутствии кассетного
магнитофона можно использовать другой. Катушечный магнитофон имеет один
недостаток — программы на компьютер в подавляющем большинстве продаются на
кассетах, и вам придется доставать кассетный магнитофон, чтобы скопировать их
себе. Лучше всего использовать монофонические магнитофоны.
Перед включением компьютера
запомните одно правило:
шнур питания в компьютер
включается последним, после проверки всех остальных соединений.
Компьютер должен стоять на ровной,
твердой поверхности так, чтобы к вентиляционным отверстиям в корпусе
обеспечивался свободный доступ воздуха, предохраняющий компьютер от перегрева.
Цветное изображение можно получить
на телевизоре системы PAL или со специальной приставкой
на телевизорах SECAM. Без приставки телевизор системы
SECAM можно использовать как черно-белый.
Поскольку питание телевизора,
магнитофона и компьютера осуществляется от собственных кабелей, для работы вам
потребуется тройник. После того, как вы все соедините, включите блок питания
компьютера в сеть и вставите разъем блока в гнездо DC9V,
на экране должна появиться надпись
(С) 1982 SINCLAIR RESEARCH LTD.
Если надпись на экране не
появилась, значит телевизор не настроен на 36 телевизионный канал. В этом
случае регулятором настройки необходимо настроить телевизор до появления
надписи на экране. Вставьте кассету с LOGO в магнитофон
(проследите, чтобы кассета была вложена нужной стороной и перемотана на
начало). Регулятор громкости магнитофона должен находиться между 2/3 и
максимумом, регулятор тембра — в положении между 1/3 и 2/3. Поскольку разные
магнитофоны имеют разные характеристики, для своего магнитофона положение
регуляторов вам придется уточнить. Далее:
— нажмите клавишу
J, на экране появится слово LOAD;
— удерживая клавишу SYMBOL SHIFT, дважды нажмите клавишу Р, теперь на экране
высвечено LOAD"";
— нажмите клавишу
ENTER; включите магнитофон на воспроизведение.
После включения магнитофона по
краям экрана начинают мигать цвета. Для цветного телевизора красный и голубой,
для
черно-белого — темный и светлый.
Вскоре на экране появятся красные и голубые полосы и надпись:
PROGRAMM:
LOGO
Затем красные и голубые полосы
становятся нерегулярными . быстропередвигающимися сине-желтыми. Потом все может
повториться. Программа LOGO загружается около 4 минут. После
загрузки на экране появится надпись:
WELCOME
TO SINCLAIR LOGO (С) SOLI/LCSI 1984-
VER 1.6
Значит, программа готова к работе.
Выключите магнитофон.
Если на экране появилась надпись
ТАРЕ LOADING ERROR
(ошибка считывания с ленты)
повторите процесс загрузки
сначала. Причиной появления ошибки может стать плохая установка регуляторов
громкости и тембра, загрязнение воспроизводящей головки магнитофона, плохой
контакт в соединительном кабеле. Перед повторной загрузкой надо обнулить
память, для этого нажмите клавишу А и затем ENTER, на
экране появится надпись: '
NEW
А после нажатия
ENTER экран потемнеет и через несколько секунд на нем появится та же
надпись, что и после включения в сеть. Теперь надо повторить процесс загрузки.
Наберитесь терпения, процесс правильной установки регуляторов может занять
много времени. Иноща магнитофон и телевизор могут создавать взаимные помехи,
попробуйте поменять положение магнитофона.
Если при наборе команды вы нажали
не ту клавишу, команду можно удалить, нажав клавишу 0 при нажатой CAPS SHIFT.
LOGO НА ZX-SPECTRUM:ПЕРВЫЕ ШАГИ
После загрузки
LOGO на экране появится надпись WELCOME TO SINCLAIR
LOGO (С) SOLI/LCSI 1984
VER 1.6
В следующей строке — знак вопроса
и сразу за ним мигающий курсор, означающий готовность к принятию команды LOGO. В правом нижнем углу экрана высвечивается буква,
сигнализирующая о том, что клавиатура включена в режим приема строчных букв.
Режим приема можно изменить,
нажимая клавиши CAPS
SHIFT и SIMBOL SHIFT, находящиеся в нижнем ряду клавиатуры. На
рисунке 5 показано соответствие между знаками, нанесенными на клавишу, и
режимами ввода знаков. Как видно из рисунка, кроме упоминавшихся режимов есть
еще EXTENDED MODE и EXTENDED MODE
с SIMBOL SHIFT, но эти режимы мы пока рассматривать не
будем. Об их назначении мы узнаем позже, при обсуждении редактора LOGO. Для перехода в режим GRAPHICS
надо нажать клавишу 9 при нажатой CAPS SHIFT. Переход в
режим EXTENDED MODE осуществляется одновременным
нажатием CAPS SHIFT и SIMBOL SHIFT.
Переход к вводу заглавных букв осуществляется клавишей CAPS
SHIFT. Повторное нажатие этих клавиш приведет к обратному переходу.
Нажатие одной клавиши CAPS SHIFT или SIMBOL SHIFT не
приводит к смене режима ввода с клавиатуры. Но пока эти клавиши нажаты, с
клавиатуры будут вводиться соответствующие символы.
Итак, начиная с режима 1. Если
программа загружена правильно, на экране виден знак вопроса с мигающим за ним
курсором. Введем команду
CLEARSCREEN или
сокращенно
CS
и нажмем
<ENTER>. Посреди экрана появится "черепашка" LOGO, треугольник с выделенным углом. Знак вопроса,
сигнализирующий о готовности приема команды, появляется в нижней части экрана.
В правой нижней части также высвечивается буква I, показывающая режим ввода с
клавиатуры.
Сдвинем "черепашку" на
40 шагов вперед, написав FORWARD или FD
и необходимое количество шагов:
FD 40 <ENTER> Между FD и числом должен быть пробел.
Начинающие часто
забывают об этом. Если пробела не
будет, программа выдаст сообщение
I
DONJ KNOW HOW TO FD40
(я не знаю, как сделать FD40).
После нажатия
<ENTER> на экране снова появится курсор. Теперь повернем
"черепашку" направо (RIGHT или RT) на 60 градусов (не забывайте про пробел):
RT 60
<ENTER>
Сдвинем ее вперед
FD 60 <ENTER> а потом на
100 шагов назад (используя BACK или ВК):
ВК 100 <ENTER>
а теперь повернемся влево (LEFT или
LT):
LT 90 < ENTER >
На конце этого журавля поместим
противовес в форме квадрата со стороной 10. Здесь мы можем, воспользовавшись
случаем, ввести процедуру, рисующую квадрат. Выберем имя процедуры и запишем:
ТО KWADRAT <ENTER>
Заметим, что после ввода на экране
появится другой курсор:
>, означающий готовность
к приему очередной строки процедуры, не изменяя положения "черепашки"
и рисунка на экране. Чтобы нарисовать квадрат, "черепашке" придется
четыре раза пойти на 10 шагов вперед и повернуться на 90 градусов вправо:
REPEAT 4 (FD 10 RT 90] <ENTER>
Теперь закончим определение
процедуры:
END <ENTER>
На экране появится надпись:
KWADRAT
DEFINED
означающая, что слово KWADRAT теперь можно использовать как команду LOGO. В следующей строке вместо знака > опять появится
вопросительный знак: LOGO готов принять следующую
команду. Введем
KWADRAT
<ENTER> и посмотрим, что произошло.
До сих пор "черепашка"
после каждого движения оставляла черточку, можно сказать, ходила с опущенным
карандашом, оставлявшим след. Мы можем попросить ее поднять карандаш. Для этого
используется команда PENUP или PU.
Потом надо послать "черепашку" к месту, откуда она начала свое
путешествие:
PU <ENTER> HOME <ENTER>
После выполнения последней команды
"черепашка" снова окажется в центре экрана в начальной позиции.
Опустим перо и повернем "черепашку" влево:
PD <ENTER> LT 90 <ENTER>
Теперь попросим ее пройти вперед:
FD
400 < ENTER >
"Черепашка" выбежала за
левый край экрана и сразу же по-явилась справа, продолжая движение. Левый и
правый края экрана, а также верхний и нижний склеены парами, так что экран
гомеоморфичен тору.
Теперь можем отправить
"черепашку" под правый конец нарисованного журавля и нарисовать там
колодец:
FD
55 KWADRAT <ENTER>
"Черепашка" находится в
правом нижнем углу квадрата и направлена влево. Переместим
"черепашку" на конец журавля и опустим в колодец веревку. Для этого
переместим журавля на середину колодца, повернем его вправо:
FD
5 RT 90 <ENTER>
Теперь
поднимем перо и поставим "черепашку" на конец журавля:
PU
FD 70 <ENTER>
Эти примеры показывают, что
очередные команды можно писать в одной строке, отделяя друг от друга пробелами.
В этом случае нажатие <ENTER> означает выполнение
всех команд строки по очереди. Будем считать, что вы уже привыкли к нажатию
клавиши <ENTER> для ввода каждой строки, и дальше
символ <ENTER> в конце каждой строки будем
опускать.
Сейчас середина основания
"черепашки" находится на конце наклонной линии, теперь
"черепашка" может опуститься вниз, разматывая за собой паутину, как
паук:
RT
180 PD FD 55
Если нам покажется, что веревка
слишком длинная и часть ее надо стереть, используем команду
PENDOWN или PD:
РЕ BL
5 PD
Веревка стала на 5 шагов короче.
Теперь можем нарисовать на конце веревки ведро, но это мы оставим для читателя.
Повторение, с которым мы познакомились при рисовании квадрата, можно
использовать для рисования различных правильных узоров, например пучка флажков:
REPEAT 8 [FD 15 KWADRAT
ВК 15 RT 45]
Если команда длиннее одной
экранной строки, она автоматически переносится в следующую строку, в месте
переноса появляется восклицательный знак. Несмотря на то что команды
размещаются в двух строках экрана, это одна командная строка LOGO.
Она будет исполняться после нажатия <ENTER>. В
данном случае мы нажимаем <ENTER> после ввода
знака квадратной скобки. Если нажать <ENTER>
раньше, квадратная скобка автоматически допишется в конец строки. Команды,
заключенные в скобки, будут выполняться, если LOGO
правильно воспримет их синтаксис. Как мы видим,
SINCLAIR LOGO не очень защищен от таких ошибок, поэтому стоит запомнить
такое правило: команда REPEAT должна полностью
помещаться в одной командной строке LOGO. Поскольку
ввод командной строки завершает нажатие <ENTER>,
это правило запрещает нажатие <ENTER> до ввода последней
квадратной скобки, завершающей '•команду REPEAT. Хотя
командная строка может содержать больше 6 экранных строк, следует стремиться к
тому, чтобы записи не были слишком длинными, сложные командные
последовательности стоит заменять процедурами.
В графическом режиме экрана, когда
большая его часть отводится под рисунок и для ввода текста остается только две
последние строки экрана, слишком длинные командные строки могут не поместиться
полностью на экране. Начало такой длинной строки исчезает с экрана, когда ее
конец еще не дописан. Чтобы избежать этого, перед вводом длинной командной
строки можно перейти в текстовый режим экрана. В этом режиме под ввод текста
отводятся 22 командные строки по 30 знаков в каждой. Переход в этот режим
осуществляется командой TEXTSCREEN, сокращенно — TS. После выполнения этой команды мигающий курсор появляется
в левом верхнем углу в первой экранной строке. Указатель режима клавиатуры
остается, как и прежде, в правом нижнем углу экрана. Предыдущее состояние
экрана — как текст, так и рисунок — уничтожается. Значит эту команду нельзя
использовать, когда на экран выведен рисунок, изображение которого должно быть
сохранено. С этой точки зрения SINCLAIR LOGO хуже его
других версий, например, его прототип APPLE LOGO имеет
как бы две страницы: текстовую и графическую, их можно переключать в любой
момент времени, они не уничтожают друг друга.
Лучший способ сохранения рисунка —
сделать его воспроизводимым, задать в виде процедуры, при этом мы можем без
колебаний использовать команду TEXTSCREEN.
TS
ТО UZOR
REPEAT 6 [ PU FD 60 PD REPEAT 8 !
[FD 15 KWADRAT BK 15 RT 45 1 PU! BK 60 PD RT
60]
END
Согласно приведенному выше правилу
написания команд REPEAT процедура UZOR состоит
из трех строк LOGO (заголовка строки и последней
строки: END), но на экране она помещается в пяти
строках. Переход из текстового режима в графический происходит автоматически,
при использовании любой команды, связанной с "черепашкой" или выбором
цвета, написав UZOR мы получим на экране
запрограммированный рисунок. Процедура UZOR хранится в памяти, ею можно
воспользоваться в любой момент.
ОПЕРАЦИИ С ЦВЕТОМ
До сих пор мы рисовали черными
чернилами на белом фоне. Тексты писались теми же цветами. В
LOGO возможен независимый выбор цвета каждого из следующих элементов
изображения на экране:
— фона рисунка,
— линии рисунка или точки,
— фона текста,
— букв текста,
— рамки экрана.
На цветном телевизоре мы можем
увидеть восемь цветов, на черно-белом экране цвета будут отличаться по яркости.
Цвета обозначаются цифрами:
О - черный black
1 — синий blue
2 - красный red
3 - пурпурный
magenta
4 - зеленый green
5 - голубой cyan
6 - желтый yellow
7 - белый white
Для черно-белого экрана цвет тем
светлее, чем больше его номер.
Для задания цветов служат
следующие команды:
— SETBG — задает цвет фона экрана,
например, SETBG 4 задает фон зеленого цвета;
— SETPC —
цвет рисунка, воспроизводимого "черепашкой";
— SETTC —
цвет фона и букв текста, аргумент команды — две цифры, заключенные в квадратные
скобки;
— SETBR —
цвет рамки экрана, эту команду можно использовать в несокращенном варианте: SETBORDER.
Для всех этих команд, кроме
последней, используются только сокращенные формы. SETPC
в текстовом режиме приводит к переходу в графический режим,
"черепашка" устанавливается в режим HOME,
т.е. в центр экрана. Те же команды, исполненные в графическом режиме, приведут
к смене соответствующего цвета, но сам рисунок при этом может быть искажен.
Смена фона может привести к потере некоторых линий и точек рисунка. Смена цвета
рисунка во время движения "черепашки" может привести к эффекту
разливания цвета. Это связано со способом вывода на экран, принятого в
ZX-SPECTRUM.
Весь экран поделен на три части:
рамку (border), рабочую область, предназначенную для
вывода текстов и рисунков, и системное окно — две строки, расположенные
непосредственно под рабочей областью. Рабочая область экрана имеет размеры 256
х 176 точек, координата Х может меняться от -128 до +127, координата Y от -88 до +87. Каждый знак помещается на экране в квадрате
8х8 точек. На экране могут поместиться 22 строки по 32 знака. Однако в
текстовом режиме в каждую строку с клавиатуры вводится только 30 знаков —
первое знакоместо в строке резервируется под курсор, в последнем знакоместе
помещается знак переноса строки — восклицательный знак. При работе с встроенным
в ПЗУ Бейсиком ZX-SPECTRUM все 32 знакоместа строки экрана доступны для
размещения текстов.
В каждом квадрате 8 х 8 все точки
могут иметь только один цвет. Это цвет, заданный для элемента, появившегося там
последним. Цвет фона в LOGO для всего экрана одинаков.
Из сказанного понятно, что эффект
разливания цвета незаметен при рисовании рисунка одним цветом или когда части,
рисуемые разными цветами, расположены на достаточном удалении друг от друга,
Эффект разливания цвета наиболее заметен, когда на экране есть области,
полностью закрашенные одним цветом. Этого можно добиться, нарисовав ряд
параллельных черточек, отстающих друг от друга на 1 точку. В такой ситуации
попадание одной точки, окрашенной другим цветом, может привести к изменению
цвета целого квадрата.
Все вышесказанное легко проверить.
Надо нарисовать разноцветные полосы шириной 8 точек. Сделаем так, чтобы полосы
помещались в поле рисунка. Пусть полосы занимают поле 176 х 176 точек, то есть
в них должны поместиться 22 полосы шириной 8 и длиной 176 точек. Цвет каждой
полосы выбирается случайно,
для этого воспользуемся командой RANDOM 8, которая генерирует случайные целые числа из
диапазона 0...7:
TS
ТО POLOSA
SETPC RANDOM 8
REPEAT 8 [FD 87 BK 175 FD 88 PU
RT 90 FD!
1 LT 913 FD 88 RT RT
] 0 PD REPEAT 22
[POLOSA] END
Теперь введем:
POLOSA
и увидим появление на экране
вертикальных полос. В нижней части каждой полосы появляется квадрат цвета
соседней полосы. Эти квадраты появляются из-за того, что "черепашка"
в первой фазе рисования полосы не находится еще на соседней полосе. Эффект
исчезнет, если мы уберем "черепашку" с экрана. Для этого служит
команда HIDETURTLE, или сокращенно НТ. Появление
"черепашки" на экране достигается подачей команды SHOWTURTLE,
сокращенно ST.
Выполнение всех других команд не
зависит от наличия "черепашки" на экране. Исполним последовательность
команд:
CS НТ POLOSA
После выполнения команды
"черепашка" находится в точке с координатами 88,0, справа от крайней
правой полосы. Понаблюдаем за эффектом разливания цвета:
ST LT 90
НТ POLOSA
Чтобы не ограничиваться текстами,
попробуем написать процедуру рисования цветных зигзагов. Допустим, что зигзаг
имеет 10 зубцов, цвет каждого отрезка выбирается случайно:
ТО ZIGZAG
REPEAT 10 [SETPC RANDOM 8 FD 8 RT!
60 SETPC RANDOM 8 BK 8 LT 601
END
ST ZIGZAG
Очистим экран, не меняя положения
"черепашки":
CLEAN
Поскольку цвет
"черепашки" выбирается случайно, может получиться так, что она будет
невидимой, если цвет фона и "черепашки" совпадает. Нарисуем еще
несколько таких зигзагов:
ZIGZAG
PENUP FD 40 PD
REPEAT 3 [RT 120 ZIGZAG]
Попробуем дальше рисовать цветные зигзаги так, чтобы они
пересекались. Посмотрим на получающуюся картинку. Можно поэкспериментировать с
изменением цвета фона.
РАЗМЕЩЕНИЕ И ЦВЕТ ТЕКСТОВ.
При печати текста разливания цвета
не возникает, потому что каждый знак всегда расположен в отдельном квадрате.
Тексты пишутся непрерывно, как мы делали это до сих пор. Можно записывать знаки
в заданном месте экрана, начиная с заданных координат. Для строк можно выбирать
координаты от 0 до 21, для колонок от 0 до 31. Последнее знакоместо в строке
предназначено для знака переноса текста. Первое знакоместо предназначено для
знака готовности к принятию строки текста. Это справедливо только для ввода
команд. При вводе текста доступны все знакоместа экрана.
Одна из команд для ввода текстов — PRINT или PR. При выполнении команды
на экран выводится аргумент команды и осуществляется переход к новой строке.
Для печати какого-либо конкретного слова его надо ограничить слева кавычками.
Последовательность слов берется в квадратные скобки. На экран можно выводить
как слова, так и целые предложения. Например:
TS
PR "О
PR
[ZX-SPECTRUM]
PR
[LOGO]
PR
[PRINT ON SCREEN]
Кроме SETCURSOR,
сокращенно SETCUR, приводит к переносу указателя начала
текста на заданную позицию, в квадратных скобках должны указываться координаты
текста:
SETCUR [17 7] PR [.PRINT TEXT)
SETCUR [27 7] PR "Т
SETCUR [25 8] PR [=E=]
SETCUR [27 10] PR "Т
Теперь попробуем вводить надписи,
как дополнение к рисунку:
CS
SETCUR [18 10] PR "HOME
FD40
SETCUR [18 4] PR "TURTLE
SETCUR [18 5] PR [AFTER 40 STEPS]
SETCUR [18 3] PR".,
SETCUR [20 4] OVER 1 PR "/
Команда OVER
1 дает возможность напечатать знак поверх предыдущего, при этом перекрывающиеся
части знаков уничтожаются, не перекрывающиеся — остаются. Команда OVER 0 возвращает в первоначальное состояние — печатаемый
знак уничтожает существующий.
Теперь перейдем к печати цветных
текстов. Аргумент команды SETTC — заключенные в
квадратные скобки два числа: первое определяет цвет фона текста (не путайте с
фоном рисунка), второе — цвет вводимых знаков. После выполнения этой команды
изменяют свой цвет буква в правом нижнем углу экрана и квадрат, в котором она
находится. Это первое проявление действия команды. Теперь любой текст будет выводиться
на экран в заданных цветах:
SETTS [1 6]
SETCUR [5 15] PR "
SETCUR [5 16] PR [YELLOW — BLUE]
SETCUR [7 16] OVER 1 PR"/
SETCUR [10 18] FLDASH PR "FLASH
Если теперь изменить цвет рисунка:
SETBHG 5
изменится и фон текстов,
выведенных на экран. Фон буквы, показывающей режим ввода с клавиатуры,
останется неизменным. Читатель может исследовать последствия многократных
изменений фона рисунка. Исполнение команды TEXTSCREEN, или
TS, приведет к стиранию экрана и установке цветов, определенных последней
командой SETTC.
Возвращение к режиму рисования
означает возвращение фона, установленного последней командой
SETBG, "черепашке" — цвета, установленного командой SETPC, системному окну — цвета рамки экрана, цвет и фон
буквы в правом нижнем углу экрана остаются неизменными, какими были установлены
командой SETTC.
Долгая работа с темными знаками на
светлом фоне приводит к быстрой усталости зрения. Таких цветов следует
избегать.
Определим процедуру, задающую
новые атрибуты экрана:
ТО DARK
SETBG 0 SETBR 0
SETPC 7 SETTC [0
7]
Можно определить и процедуру с
противоположным действием:
ТО LIGHT
SETBG
7 . SETBR 7
SETPC 0
SETTC [7 0]
END
Если у вас есть цветной телевизор,
можете определить подобные процедуры для своих любимых цветов.
МНОГОУГОЛЬНИКИ И ОКРУЖНОСТИ
Определим процедуру с параметрами
для рисования многоугольника с заданным количеством сторон и с длиной стороны:
ТО POLYGON :ANGLES :LENGHT
RIGHT 180 / : ANGLES
REPEAT : ANGLES I FD : LENGT RT
360 / !
:ANGLES]
LT 180 / : ANGLES
END
Напомним, что восклицательный знак
означает перенос строки LOGO, не вместившийся в
экранную строку. Набирать его не надо, он появится сам.
Познакомимся также с
использованием арифметических операторов, в данном случае с делением. Двоеточие
перед параметром в данном случае означает его значение. В каждом таком случае
берется действительное значение параметра, заданное при вызове процедуры.
После такого определения процедуры
можем использовать слово POLYGON как команду LOGO:
POLYGON 4
15 или внутри другой команды:
REPEAT 4 [POLYGON 5 40 RT 90] или внутри другой процедуры:
ТО ROZET
:RADIUS :NUMBER !
:ANGLES :RLENGT
REPEAT :NUMBER [ PU FD
!
:RADIUS RT 90 PD POLYGON :ANGLES!
:RLENGT PU LT
90 BK !
: RADIUS RT 360 / : NUMBER
PD ]
END
ROZET 80 16 5 15
ROZET 24 12 4 15
Выполнив эту последовательность
команд, мы получим симметричный орнамент, составленный из повторяющихся
элементов. Присмотримся внимательнее к процедуре ROZET, Она прежде всего
использует следующие черты процедуры POLYGON:
— рисует многоугольник с заданной
длиной стороны так, что его форма не зависит от его положения;
— положение многоугольника
однозначно определяется положением "черепашки";
— положение "черепашки"
до начала рисования и после него совпадает.
Перемещения и повороты "черепашки" приведут к
поворотам рисуемой фигуры. Особенности этой процедуры освобождают нас от
необходимости задумываться о форме фигуры и положении "черепашки" по
завершении рисунка. На это надо обратить особое внимание. Программы, которые мы
создаем, не должны приносить нам новых трудностей. Программы должны иметь
прозрачную структуру, чтобы мы без особых трудностей всегда могли вспомнить,
как работает наша программа. Процедуры и их параметры должны иметь понятные
имена, чтобы было понятно, что делает данная процедура и что означают отдельные
параметры.
Увеличивая количество углов в
многоугольнике, мы будем все больше приближаться к окружности. Проверим это:
POLYGON 36 10
Углы стали практически невидимы.
Для рисования окружностей удобнее
пользоваться отдельной процедурой, задавая в качестве параметра ее радиус:
ТО CIRCLE :RADIUS
MAKE "STEP :RADIUS *3.1415926/!
18
RT 5
REPEAT 36 [FD : STEP RT
10]
LT 5
END
РЕДАКТИРОВАНИЕ ПРОЦЕДУР.
РЕДАКТОР
Содержимое любой записанной в
памяти процедуры можно модифицировать, используя команду EDIT,
или ED. Аргументом
команды будет имя процедуры. Если
мы хотим редактировать несколько процедур, аргументом команды будет
последовательность имен процедур, заключенных в скобки. Различными вариантами
вызова процедур займемся позже, а пока рассмотрим ее применение в самом простом
случае — для редактирования одной процедуры. Введем:
ED "CIRCLE
После ввода команды экран
очистится и будет выведен текст процедуры. В нижней части экрана появится
надпись, информирующая нас о том, что мы находимся в режиме редактирования.
Чтобы исправить текст, надо подвести курсор к нужному месту экрана и произвести
необходимые изменения. Для передвижения курсора используются клавиши со
стрелками. В ZX-SPECTRUM они работают при нажатой клавише CAPS
SHIFT. Само по себе продвижение курсора по экрану ни к каким изменениям
не приводит. При помощи стрелок можно перемещаться по тексту любой длины, даже
не помещающемуся на экране.
Для редактирования текста
используются еще две клавиши:
DELETE и BREAK. Нажатие BREAK и CAPS SHIFT приведет к выходу из режима редактирования. DELETE и CAPS SHIFT приведет к
стиранию знака слева от курсора.
extended MODE и стрелка влево —
переход курсора к началу строки;
EXTENDED MODE
и стрелка вправо — переход курсора к
концу строки;
EXTENDED MODE
и стрелка вверх — переход курсора к началу экрана;
EXTENDED MODE
и стрелка вниз — переход курсора к концу экрана или к концу текста, если он
находится на экране;
EXTENDED MODE
и В — переход курсора к началу текста;
EXTENDED MODE
и Е — переход курсора к концу текста;
EXTENDED MODE
ИР— переход к предыдущей странице;
EXTENDED MODE
и N — переход курсора к следующей странице;
SYMBOL SHIFT
и S — остановка сдвижки текста, после нажатия любой
клавиши сдвижка возобновляется;
EXTENDED MODE
и Y — удалить часть строки справа от курсора;
EXTENDED MODE
и R — вставить текст, удаленный командой EXTENDED MODE Y;
EXTENDED MODE
и С — закончить редактирование и запомнить измененный текст;
EXTENDED MODE
и Z — отключить звук, выдаваемый при нажатии клавиши и
по окончании процедуры.
Напомним, что ZX-SPECTRUM
переходит в EXTENDED MODE при одновременном нажатии SYMBOL SHIFT и SHIFT. Нажатие любой
символьной клавиши приведет к появлению символа слева от курсора. Попробуем
использовать это в нашей процедуре. Поставим курсор в первую строку текста
после буквы Е и введем:
RIGHT
Так мы изменим имя процедуры.
Запишем изменения командой EXTENDED MODE С. На экране
появится:
CIRCLERIGHT DEFINED
Поскольку имя процедуры
изменилось, старая процедура осталась в памяти.
Пока поправка свелась к тому, что
в имени мы отобразили способ рисования окружности: она рисуется справа от
прямой, по которой направлена "черепашка". Точно так же можно задать
процедуру, которая рисует окружность слева от прямой. Вместо того, чтобы писать
ее заново, отредактируем имеющуюся процедуру:
EDIT CIRCLERIGHT
Аргумент команды
EDIT можно опустить. Если мы редактируем процедуру, редактировавшуюся
непосредственно перед этим, можно набрать непосредственно
EDIT, или ED. По умолчанию значение аргумента
принимается равным использовавшемуся в предыдущей команде. Это свойство присуще
только данной команде и для других команд не применимо.
Выставим курсор справа от имени
процедуры и клавишей DELETE сотрем
RIGHT и допишем LEFT. Теперь, нажав EXTENDED MODE С, выйдем из режима редактирования. Наша
процедура должна выглядеть так:
ТО CIRCLELEFT :RADIUS
MAKE "STEP :RADIUS *3.1415926/>
18
LT 5
REPEAT 36 (FD : STEP LT10]
RT
END
Чтобы потренироваться в
редактировании двух процедур одновременно, определим две процедуры, рисующие
четверть окружности вправо и влево. Назовем их CIRCLELEFT
и CIRCLE-RIGHT. Наберем команду:
ED (CIRCLERIGHT CIRCLELEFT]
Заметим, что теперь имена процедур
пропустить нельзя. В имя процедуры допишем букву Q и
заменим 36 на 9. После нажатия EXTENDED MODE С на
экране появится:
QCIRCLERIGHT DEFINED
QCIRCLELEFT DEFINED
В процедуре ROZET
мы выполняли два шага с поднятым пером перед рисованием очередного элемента и
после. Определим
процедуру JUMP:
ТО JUMP : LENGHT
PU FD : LENGHT PD
END
Теперь можно попробовать создать
более сложные рисунки, например кувшин. Можно исправить процедуру ROZET так,
чтобы в ней использовалась процедура JUMP:
ТО ROZET :RADIUS :NUMBER !
:ANGLES :RLENGHT
REPEAT :NUMBER [JUMP :RADIUS
!
RT 90 POLYGON :ANGLES
:RLENGHT !
LT 90 JUMP -: RADIUS RT 360 /
:NUMBER
1
END
Поскольку исправленная процедура
не изменила имени, после выполнения EXTENDED MODE С
вместо старой процедуры будет записана ее новая версия.
Команды EXTENDED
MODE Y и EXTENDED MODE R позволят вам стирать и
копировать любую часть редактируемого текста. Команда ED
с именем несуществующей процедуры приведет к появлению страницы редактора с
именем процедуры. Используя команды редактора, можно ввести любую процедуру или
текст, поскольку редактор LOGO не проверяет
правильность вводимой процедуры. Благодаря этому редактор можно использовать
для редактирования любых текстовых данных.
Создадим в редакторе процедуру CIRC, которая рисует окружность вокруг
"черепашки". Наберем ED CIRC. На экране
появится страница редактора с надписью в верхней строке:
ТО CIRC
Курсор находится на букве Т. EXTENDED MODE и стрелка влево переместят указатель в конец
строки. Нажмем пробел и допишем: RADIUS. Нажмем <ENTER> и в следующей строке напишем:
JUMP :RADIUS
На этот раз
<ENTER> не нажимаем! EXTENDED MODE и
стрелка вправо установят курсор в начало строки. Теперь наберем EXTENDED MODE Y и EXTENDED MODE R.
На первый взгляд ничего не произошло, но так мы запомнили строку для
копирования. Стрелка вниз переставит курсор в начало следующей строки, в которой
запишем:
RT
90 QIRCLE :
RADIUS LT 90 <ENTER>
После нажатия
EXTENDED MODE R в очередной строке появится:
JUMP :RADIUS
Поставим курсор перед параметром и
допишем знак минус:
JUMP -: RADIUS .,
Далее введем поочередно:
EXTENDED MODE стрелка вправо <ENTER> END <ENTER> EXTENDED
MODE С
На экране появится:
CIRC
DEFINED
Теперь попробуем ввести процедуру,
рисующую олимпийские кольца:
ТО OLIMPCIRCLES :RADIUS I
:LENGHT
LT 90 JUMP : LENGHT CIRC !
: RADIUS LT 120 JUMP :
LENGHT!
CIRC :RADIUS
LT 60 JUMP : LENGHT CIRC!
:RADIUS
LT 120 JUMP : LENGHT CIRC!
:RADIUS
RT 90
END
Теперь посмотрим, что получится
после ввода такой строки:
CS LT 60 REPEAT 7 (OLIMPCIRCLE 10!
15 JUMP
45]
Еще один способ употребления
команды EDIT — ввод ее с пустым списком имен:
ED[ ]
Это приведет к появлению пустой
страницы редактора. Чтобы введенный текст запомнился в памяти командой EXTENDED MODE С, его первая и последняя строки должны иметь
вид, принятый для процедур.
В последней строке должно стоять END, а в первой — пост-роенный заголовок процедуры. Текст
между этими двумя строками может быть любым. Естественно, если мы хотим
использовать заголовок текста в командах LOGO, текст
должен подчиняться принятым для команд правилам.