Урок 6. Переменные. Они такие непостоянные...

Тема: Язык программирования Logo

Давайте немного подумаем над тем, как компьютер работает с данными. Под данными мы будем понимать любые числа, слова или одиночные символы (буквы, знаки). Когда мы пишем исходный код, то в нем используются команды (например, цвет_холста, налево, назад и др.) и данные (например, 50, 135, "a", "Саша", "*" и т.п.). И то и другое сохраняется в компьютерной памяти, которая разделена на ячейки. Под каждую команду или данное отводится одна или несколько ячеек (в зависимости от их размера).

Если в программе мы используем несколько раз одну и туже команду в разных частях кода, то это вовсе не значит, что в памяти сама команда сохраняется множество раз. Черепашка-компьютер знает, в какой ячейке хранится единственный "оригинал" команды и "берёт" его оттуда каждый раз, когда видит эту команду в коде, который мы написали. Действительно. Это очень экономно по отношению к памяти. Представьте, что мы использовали в своем коде раз 10-20 команду вперёд. Если бы под каждый ее "экземпляр" выделялась память, то мы бы заняли как минимум 10-20 ячеек. А так нам нужна всего лишь одна ячейка, к которой исполнитель-черепаха будем обращаться в случае надобности.

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

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

Итак. Данные в программе могут стать переменными. Переменные имеют имена, по которым программист может обращаться к конкретным ячейкам памяти с данными. Но почему же переменные называются переменными? Ведь это обозначает что-то изменчивое, непостоянное. Дело в том, что программист может изменять их значение. Нет, не вводить другое число или строку, которое поместится в другие ячейки, а именно изменять уже ранее занятую ячейку (ячейки) памяти. Зачем это нужно? Причин много. Рассмотрим хотя бы такой пример:

сброс
иди 150, 150
направо 60
вперёд 50
налево 60 
назад 50
направо 60
вперёд 50

Посмотрите на этот код (он заставляет черепаху нарисовать небольшой зигзаг, но сейчас это не важно). Здесь три раза используется число 50 и три раза число 60. Каждое число занимает свою ячейку (или несколько ячеек) памяти, т.е. в итоге получается как минимум шесть занятых ячеек. Но допустим у нас много памяти и нам ее не жалко. Хорошо. Но что вы будете делать, если потребуется сделать зигзаг немного больше, а угол между отрезками немного меньше? Придется исправлять все числа. Если программа была бы еще больше, то это абсолютно неэффективно. Куда правильней было бы записать пример выше вот так:

сброс
иди 150, 150
$л = 50
$у = 60
направо $у
вперёд $л
налево $у
назад $л
направо $у
вперёд $л

На первый взгляд стало только хуже. Появились две дополнительные строчки кода в начале. Но это только кажется. В этих двух строчках и происходит загадочное явление под названием "присвоение переменным значений", или запись данных в ячейки памяти и присвоение этим ячейка имен. $л и $y – это имена переменных. В последней версии языка Лого значок $ (доллар) стал обязательным перед именем переменной. Вместо "л" и "у" может быть что угодно, но желательно, чтобы по смыслу это что-то значило. Например, здесь "л" – это сокращение от "линия", а "у" – от "угол". Можно было бы (и правильней было бы) использовать вот такие переменные: $линия, $угол. Они более очевидны для любого, кто будет читать код.

Итак, вернемся к вопросу, почему эти две строчки кода сделали программу лучше. Теперь, чтобы изменить зигзаг достаточно поменять числа в местах, где они становятся переменными (связываются с именами). Не нужно просматривать всю программу (представьте, что она очень большая) в поисках числа 50, которое обозначает длину линии, чтобы его изменить.

Но это вовсе не главное волшебство переменных. От того, что их значения можно менять однажды в начале программы они переменными не становятся. Их значения можно менять сколько угодно раз в середине, конце и где угодно в программном коде. Значение переменной в начале выполнения программы может не совпадать с ее значением в конце. Чаще всего так и происходит. Рассмотрим пример:

 
сброс
иди 50, 50
$л = 50
$у = 60
направо $у
вперёд $л
налево $у
назад $л
направо $у
вперёд $л
 
направление 0
иди 10, 10
напиши $л
иди 30, 10
напиши $у
 
иди 100, 200
$л = $л + 100
$у = $у + 20
направо $у
вперёд $л
налево $у
назад $л
направо $у
вперёд $л
 
направление 0
иди 10, 380
напиши $л
иди 50, 380
напиши $у
иди 400, 400

холст в KTurtle

Перед тем как рисовать второй зигзаг, мы меняем значения переменных на 100 и 20 единиц. Мы могли бы вычилить их сразу и записать так: $л = 150, $у = 80. Но зачем так утруждать себя, если мы хотим изменить величину на какое-то значение, а не преследуем цель узнать конкретное значение (хотя такое тоже может быть). В коде мы выводим значения переменных на холст, чтобы убедиться, что в различные моменты времени они имеют разные значения.

Задание

Напишите код, который выводит на холст большой квадрат и маленький шестиугольник. При этом командам должны передаваться на выполнение не числа, а переменные, связанные с числами. Используйте только две переменные, изменив их значение перед "рисованием" второй фигуры.

Для справки: угол в квадрате равен 360/4 = 90 градусов, в шестиугольнике равен 360/6 = 60 градусов.

Результат задания. Вид холста KTurtle

Ответ (код на Лого)