[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]