[an error occurred while processing this directive]
5 Сохранение процедур и рисунков
______________________________________________________________
Когда Вы определяете процедуру, она помещается в оперативную память компьютера; эта память называется "рабочая". Для просмотра содержимого рабочей памяти используется несколько примитивов, описанных в этой главе.
К несчастью, рабочая память не может вечно хранить Ваши процедуры: когда компьтер выключен, содержимое рабочей памяти теряется. Если Вы хотите сохранить прцедуры для дальнейшего использования, Вы должны записать их на диск. Затем, когда они понадобятся, их можно будет загрузить в рабочую память.
Вы также можете записывать рисунки, которые нарисовала черепашка.
Просмотр процедур
Прежде всего, Вы должны иметь возможность использовать больше шести строк текста на Вашем экране, в противном случае Вы будете видеть только небольшой кусок процедуры. Вы можете выбрать текстовый режим подав ЛОГО команду TS (Text Screen).
Команда DRAW вернет Вас обратно в графический режим.
Вы можете вывести на экран заголовки всех процедур с помощью команды POTS (Print Out Title lineS).
Для просмотра процедур целиком используйте команду POPS (Print Out ProcedureS).
Если Вы хотите просмотреть какую-то конкретную процедуру, команада PO (PrintOut), это как раз то, что Вам нужно. Попрбуйте ввести:
PO "SQUARE
Запись процедур
Вы можете записывать процедуры из рабочей памяти на диск с помощью команды SAVE и считывать их обратно командой LOAD.
Убедитесь, что с дтска снята защита записи. Затем введите:
SAVE "MYWORK
Все процедуры из рабочей памяти будут записаны на диск в файл MYWORK. Хотя ЛОГО позволяет выбирать для файла имя любой длины, файловая система ограничивает длину имен файлов до десяти символов.
Для чтения процедур с диска в рабочую память используйте команду LOAD. Прежде всего необходимо очистить рабочую память командой ERPS (ERase all ProcedureS).
Теперь введите:
LOAD "MYWORK
Теперь Ваши процедуры опять находятся в рабочей памяти.
Вы можете просмотреть имена файлов, находящихся на диске с помощью команды CAT.
Для удаления ненужного файла с диска предназначена команда ERFILE. Например для удаления файла MYWORK введите:
ERFILE "MYWORK
Запись рисунков
Также как процедуры, ЛОГО позволяет записывать и считывать с диска рисунки. Для этого Вы должны использовать команды SAVEPICT и READPICT.
Заметьте, что эти команды нельзя использовать в текстовом режиме.
Например введите:
SAVEPICT "SPINFIL
Это вызовет запись рисунка на диск под именем SPINFIL. Конечно, Вы можете выбрать другое имя.
Теперь очистите экран и попробуйте прочитать рисунок рисунок обратно в память компьютера:
READPICT "SPINFIL.
Резюме
Оперативная память компьютера называется "рабочая". Когда Вы выключаете компьютер, содрежимое рабочей памяти теряется. Если Вы хотите сохранить процедуры, переменные и рисунки, находящиеся в рабочей памяти, Вы должеы записать их на диск.
1. Команда SAVE записывает процедуры из рабочей памяти на диск. например:
SAVE "MYWORK
2. Команда LOAD загружает процедуры из файла на диске в рабочую память. Например:
LOAD "MYWORK
3. Команда SAVEPICT записывает картинку с экрана на диск. Например:
SAVEPICT "SPINFIL
4. Команда READPICT загружает картинку из файла на диске в компьютер. Например:
READPICT "SPINFIL
Для просмотра списка имен файлов (каталога) на диске используется команда CAT.
Для удаления файлов с диска имеется команда ERFILE.
Для просмотра процедур в рабочей памяти имеется несколько команд ЛОГО:
1. Вы можете вывести заголовки процедур командой POTS (Print Out LineS).
2. Вы можете просмотреть все процедуры целиком с помощью команды POPS (Print Out ProcedureS).
3. Конкретную процедуру можно просмотреть введя команду PO (Print Out), например:
PO "SQUARE
Вы можете установить полный текстовый экран командой TS (Text Screen).
.сс
6 Дальнейшее знакомство с процедурами
______________________________________________________________
Использование одной процедуры внутри другой
Если Вы записали процедуру SQUARE, загрузите ее. В противном случае определите ее.
Теперь введите следующие команды и посмотрите, что получится:
TO SPIN REPEAT 6 [SQUARE LEFT 60] END SPIN
Вы должны узнать рисунок из второй главы. Разница в том, что квадраты рисует процедура SQUARE, а процедура SPIN вызывает ее. Мы имеем ситуацию, когда одна процедура вызывает другую.
Таким образом, любую самую сложную программу можно составить из простых процедур также, как из простых радиодеталей и микросхем можно сделать компьютер.
Использование нескольких процедур внутри других
В процедуре SPIN одна процедура вызывает другую. Однако нет причин, из-за которых одна процедура не может вызывать несколько других. Например процедура рисования домика может вызывать процедуры рисования стен и крыши:
TO HOUSE TRIANGLE SQARE END
Резюме
Вы можете использовать одни процедуры внутри других. Например:
TO SPIN REPEAT 6 [SQUARE LEFT 60] END
Если вы хотите изменить процедуру вы можете выбрать один из двух путей:
1. Вы можете уничтожить процедуру командой ERASE и ввести новый вариант процедуры.
2. Вы можете использовать редактор ЛОГО для изменения процедуры. Смотрите Приложение Б и следующую главу.
.сс
7 Что делать, если процедура не работает
______________________________________________________________
Процесс поиска ошибок в программах называется "отладка".
Как правило ошибки являются результатом опечаток. К счастью, большинство из них быстро обнаруживается. Например, если Вы ввели команду:
FORWARD 100
ЛОГО выдаст сообщение:
FORWARD doesn't like 100 as input
Такое сообщение называется "сообщение об ошибке".
Если Вы допустили опечатку внутри процедуры, ошибка не будет обнаружена до ее выполнения. Например, наберите и выполните следующую процедуру:
TO BADSQUARE
REPEAT 4 [FORWARD 100 LEFT 90]
END
Однако, если Вы набрали FORWARD 1000 вместо FORWARD 100, Вы не получите сообщения об ошибке. А если в процедуре допущено несколько аналогичных ошибок, результат ее выполнения может оказаться очень странным.
Делайте процедуры небольшими
Наиболее эффективный способ борьбы с ошибками - это составление программы из небольших процедур. Кроме того программа становится нагляднее. Например, рассмотрим программу рисования человечка:
RIGHT 90 BACK 100 FORWARD 100 LEFT 120 BACK 100 FORWARD 100 RIGHT 60 FORWARD 200 RIGHT 60 BACK 100 FORWARD 100 LEFT 120 BACK 100 FORWARD 100 RIGHT 60 FORWARD 50 RIGHT 90 REPEAT 36 [FORWARD 10 LEFT 10] LEFT 90
Эта программа работает, однако, для того чтобы понять ее надо потратить время.
Как ее можно улучшить? Вы должны разбить задачу на небольшие процедуры. Запустив каждую процедуру отдельно Вы быстро обнаружите допущенные ошибки, если, конечно они там есть. Наша программа может иметь следующий вид:
TO человек VEE FORWARD 200 VEE FORWARD 50 HEAD END
Пргорамма стала гораздо понятнее. Теперь Вы должны написать процедуры VEE и HEAD:
TO VEE RIGHT 60 LINE LEFT 120 LINE RIGHT60 END
где LINE определена как:
TO LINE FORWARD 100 BACK 100 END
и
TO HEAD RIGHT 90 REPEAT 36 [FORWARD 10 LEFT 10] LEFT 90 END
Отладка программ
Если Вы наберете приведенную выше программу и выполните ее (введя MAN), Вы увидите человечка с поднятыми руками и ногами. Значит, где то допущена ошибка.
Вы имеете две команды, которые могут помочь при отладке программ: PAUSE и CONTINUE(CO). Если Вы поместите команду PAUSE в процедуру, ее выполнение прекратится при достижении команды. Вы можете посмотреть, что уже нарисовано к этому моменту и, если все в порядке, продолжить выполнение введя CONTINUE.
Наш человечек выглядит неправильно из-за ошибки в процедуре VEE, которая рисует руки и ноги. Для локализации ошибки надо поставить две команды PAUSE в процедуру VEE, как показано ниже:
TO VEE RIGHT 60 LINE PAUSE LEFT 120 LINE PAUSE RIGHT 60 END
Для изменения VEE надо воспользоваться редактором ЛОГО введя команду EDIT(ED). Введите:
EDIT "VEE
На экране отобразится проедура VEE. Вы можете перемещать курсор с помощью стрелок. Потренируйтесь немного. Теперь подведите курсор в конец первой строки, содержащей команду LINE и нажмите ВВОД. Текст раздвинется, оставив строку для новой команды PAUSE. Точно также добавьте PAUSEв другой строке. Наконец нажмите клавишу КОПИЯ ("равно" на функциональной клавиатуре).
Теперь запустите VEE и посмотрите, что получится:
VEE Pausing, in VEE PAUSE VEE? CONTINUE Pausing, in VEE PAUSE VEE? CONTINUE
Черепашка начинает неправильно рисовать правую линию и перед PAUSE стоят только две команды: RIGHT 60 и LINE. Снова вызовите редактор. Для удаления символов используйте клавишу УДАЛИТЬ ("точка" на функциональной клавиатуре). Исправьте RIGHT 60 на RIGHT 120. И запустите процедуру. Так, постепенно, Вы должны полностью отладить процедуру.
Полное описание редактора ЛОГО приведено в Приложении Б.
Резюме
Для предотвращения ошибок в программах используйте следующие методы:
1. Делайте процедуры короче и проще.
2. Составляйте подробное описание каждой процедуры.
3. Проверяйте каждую строку до нажатия клавиши ВВОД.
Если, несмотря на перечисленные меры, допущена ошибка, внимательно изучите процедуру. Если ошибка не обнаружена, попробуйте с помощью команд PAUSE и CONTINUE(CO) выделить ошибки.
Для внесения изменений в процедуры вызовите редактор командой EDIT(ED). Подробно, редактор описан в Приложении Б.
.сс
8 Передача параметров в процедуру
______________________________________________________________
До сих пор, если Вы хотели нарисовать одинаковые фигуры разной величины, Вы должны были писать отдельные процедуры для каждой фигуры. Можно облегчить себе жизнь, если написать процедуру, которая будет рисовать фигуру размера, задаваемого специальной "входной" величиной процедуры.
Например, введите следующую процедуру:
TO TRIANGLES :SIDE REPEAT 3 [FORWARD :SIDE LEFT 120] END
Теперь выполните:
TRIANGLES 100 TRIANGLES 300
Первая строка процедуры TRIANGLES кроме названия процедуры содержит название входного параметра SIDE. Представьте этот параметр как "коробку". Когда Вы вызываете процедуру, например:
TRIANGLES 200
Вы помещаете входное значение (в нашем случае 200) в коробку с названием SIDE. ЛОГО берет это значение из коробки и использует, всякий раз, когда в процедуре встречается :SIDE.
В нашем примере, число 200 будет помещено в коробку SIDE и будет использоваться внутри процедуры. Таким образом, при входном занчении 200 процедура будет эквивалентна строке:
REPEAT 3 [FORWARD 200 LEFT 120]
Попробуйте написать процедуры для рисования других многоугольников.
Процедура может иметь несколько входных значений, для примера ниже приводится первая строка такой процедуры:
TO RECTANGLE :SIDE1 :SIDE2
Эта процедура должна рисовать прямоугольник. Допишите ее.
Резюме
Ваши процедуры могут иметь параметры, также как примитивы. Например:
TO TRIANGLES :SIDE REPEAT 3 [FORWARD :SIDE LEFT 120] END
SIDE - это "переменная" и для обращения к переменным используется двоеточие (:).
Процедуры вызываются следующим образом:
TRIANGLES 100 TRIANGLES 300
Вы можете задавать несколько входных переменных для одной процедуры.
.сс
9 Использование вычислений в ЛОГО
______________________________________________________________
Вы можете использовать в ЛОГО числа и имеете два способа показать результат любого вычисления.
Прежде всего, Вы можете использовать черепашку. Введите следующий пример и посмотрите, что получится:
BACK 200 FORWARD 50 + 200 - 50
Для умножения и деления используются знаки "*" и "/". Например:
FORWARD 10 * 20 RIGHT 180 / 2
Второй путь заключается в использовании встроенного калькулятора ЛОГО. Наберите следующую строку:
1 + 3 - 2
Хотя ЛОГО и посчитало резултат, Вы не сказали, что с ним делать потом. Чтобы напечатать результат на экране используйте команду PRINT(PR):
PRINT 1 + 3 - 2
Попробуйте ввести другие арифметические формулы, например:
2 - 1 * 5 + 5
Изменение порядка вычислений
Предположим, Вам надо сложить три плюс два и умножить результат на два. Если ввести:
3 + 2 * 2
сначало будет выполнено умножение два на два, а затем к полученному результату прибавится три. Для изменения порядка вычисления надо воспользоваться скобками:
(3 + 2) * 2
Теперь результат будет правильным.
Использование дробных чисел
Вы можете использовать в ЛОГО дробные числа. Для отделения целой части от дробной используется "точка". Например:
FORWARD 100 LEFT 20 FORWARD 200 * 0.5 LEFT 60 / 3 FORWARD 400 * 0.25 LEFT 50 / 2.5
Использование отрицательных чисел
В ЛОГО также можно использовать отрицательные числа, как результат вычислений:
FORWARD - 100 - 100 FORWARD 200
Резюме
Вычисления могут использоваться как входные параметры команд, например:
FORWARD 100 + 200 LEFT 30 + 60
Они также могут использоваться внутри процедур.
Для обозначения операций умножения и деления используются знаки "*" и "/"
Для изменения порядка вычислений используются круглые скобки, например:
20 * (10 - 5)
Вы можете использовать дробные и отрицательные числа.
Вы можете вывести результат вычислений на экран командой PRINT(PR), например:
PRINT 100 + 150
.сс
10 Использование переменных
______________________________________________________________
Предположим у Вас есть несколько пустых коробок. Каждая коробка имеет название, в зависимости от того, что в ней лежит. Например в одной коробке могут лежать магнитные диски, а в другой карандаши. Число предметов в каждой коробке может время от времени меняться.
ЛОГО тоже имеет такие коробки, они называются "переменные". Вы уже сталкивались с ними при использовании в качестве входных параметров процедур.
Переменные ЛОГО имеют имена. Они также содержат в себе значения, которые могут изменяться.
Когда Вы задаете входное занчение процедуры, оно передается внутрь снаружи. В следующей процедуре переменной присваивается значение командой MAKE:
TO SPIRAL MAKE "SIDE 100 REPEAT 32 [FD :SIDE LT 90 MAKE "SIDE (:SIDE + 20)] END
SPIRAL очень похожа на процедуру рисования квадрата, но после рисования каждая сторона увеличивается на 20. Таким образом получается "спираль".
Как же работает процедура? Сначала команда MAKE присваивает переменной SIDE значение 100.
Затем, команда REPEAT использует значение переменной для рисования линии, делает поворот на 90 градусов и увеличивает с помощью команды MAKE значение переменной на 20. И так 32 раза.
Попытайтесь приспособить эту программу для рисования "треугольной спирали".
Одинаковые имена переменных
Входные переменные используются только внутри процедур, поэтому разные процедуры могут иметь входные переменные с одинаковыми названиями. Такие переменные называются "локальными". Для большей ясности посмоторите, как работает следующая процедура:
TO PRIVATE :NUMBER PRINT :NUMBER DOPRINT :NUMBER +1 PRINT :NUMBER END TO DOPRINT :NUMBER PRINT :NUMBER END
В результате получится:
PRIVATE 1 1 (это печатает PRIVATE) 2 (это печатает DOPRINT) 1 (это печатает PRIVATE)
Переменная NUMBER процедуры PRIVATE имеет значение 1, а процедуры DOPRINT - 2.
Резюме
Входной параметр - только один из способов использования переменных.
Переменные - это "коробки", которые могут иметь различные имена и содержимое. Содрежимым переменных являются числа.
Вы можете задавать переменные внутри процедур командой MAKE. Например:
MAKE "NUMBER 10
Присваивает переменной NUMBER значение 10.
.сс
11 Рекурсия
______________________________________________________________
В 10-й главе Вы научились рисовать спираль. Процедура выглядела следующим образом:
TO SPIRAL MAKE "SIDE 100 REPEAT 32 [FD :SIDE LT 90 MAKE "SIDE (:SIDE + 20)] END
Теперь запустите следующую программу:
TO NEWSPIRAL :SIDE WINDOW FORWARD :SIDE LEFT 90 NEWSPIRAL (:SIDE + 20) END
NEWSPIRAL 100
Результат тот-же, если не считать того, что черепашка продолжает бесконечно рисовать спираль и за границей экрана. Чтобы ее остановить нажмите клавишу РЕД. Новая процедура выглядит меньше предыдущей, хотя Вас может смутить предпоследняя строка в которой процедура вызывает сама себя. Этот прием называется "рекурсией".
Выход из рекурсии
До сих пор, Ваша рекурсивная процедура останавливалась только нажатиме РЕД или после переполнения рабочей памяти компьютера. Однако существует более приемлемый способ, например:
TO NEWSPIRAL :SIDE IF :SIDE > 500 [STOP] FORWARD :SIDE LEFT 90 NEWSPIRAL (:SIDE + 20) END
В этой версии команда IF заставляет черепашку остановиться, если длина стороны становится больше 500 (SIDE > 500).
Арифметическая рекурсия
Рекурсию можно использовать не только для рисования, например:
TO COUNTDOWN :NUMBER IF :NUMBER = 0 [STOP] PRINT :NUMBER COUNTDOW :NUMBER -1 END
COUNTDOWN 10
Резюме
Процедура может вызвать сама себя, это называется "рекурсия". Например:
TO NEWSPIRAL :SIDE FORWARD :SIDE LEFT 90 NEWSPIRAL (:SIDE + 20) END
Вы можете остановить процедуру нажатием клавиши РЕД.
Вы также можете прекратить выполнение процедуры добавить команды IF и STOP. Например:
TO NEWSPIRAL :SIDE IF :SIDE > 500 [STOP] FORWARD :SIDE LEFT 90 NESPIRAL (:SIDE + 20) END
.ст лого3
[an error occurred while processing this directive]