Занятие №13 "Работа с процедурами"
Теперь, когда вы знаете, почему так важно разбивать программу на более компактные части и разбираться с каждой из них отдельно, обсудим, как это разделение осуществляется. Все задачи разные, единого решения для всех нет и быть не может. Но именно поэтому разгадывать эту головоломку так интересно!
Мы сначала рассмотрим нисходящий процесс разделения большой программы на модульные фрагменты с четкой логической структурой. Потом мы обсудим другой способ создания сложных программ: восходящий процесс комбинирования уже существующих процедур. Ниже показан общий план этих двух подходов.
На обеих диаграммах задача, которую мы хотим решить, находится наверху, а отдельные шаги, из которых состоит наше решение, — у основания. Вы можете начать на любом уровне, так, как вам покажется разумнее
Разбиваем программы на процедуры

Первый шаг в решении любой задачи программирования — полное понимание самой задачи. После этого вы можете спланировать общее решение и разделить его на основные части. Тут не бывает правильного или неправильного подхода. И по мере того как вы будете набираться опыта, вам будет все проще определять, какие задачи «основные». Если вы работаете от общего решения вниз, то это по меньшей мере гарантирует, что будет легче сохранять общую логику программы.

Чтобы продемонстрировать этот подход к решению задач, представим себе, как бы мы рисовали дом
С одной стороны, работа над этой простой задачей позволяет сосредоточиться на стратегии поиска решения, не застревая в груде мелочей. С другой стороны, несмотря на очевидную простоту, задача имеет раз- личные решения. Вот несколько вариантов.

  • Мы можем представить себе дом состоящим из прямых линий. В таком случае основной задачей станет рисование каждой линии.
  • Мы можем представить себе, что дом состоит из шести независимых фигур: сторона 1, сторона 2, две двери, треугольник и параллелограмм. Рисование каждой из этих фигур — основная задача.
  • Поскольку две двери одинаковы, мы можем назвать одной из основных задач рисование двери и запустить ее дважды.
  • Мы можем рассматривать треугольник и параллелограмм наверху дома как единое целое: крышу. В таком случае отдельной основной задачей будет нарисовать крышу.
  • Мы можем рассматривать сторону 1 и дверь как одно целое: фасад дома. В этом случае отдельной задачей будет нарисовать фасад.
Есть много других вариантов, но этих достаточно, чтобы проиллюстрировать нашу идею. Нужно разделить общую задачу на небольшие, обозримые подзадачи, с которыми проще работать и которые можно решать по одной. Если вы обнаруживаете схожие фрагменты, пробуйте найти для них единое решение и применяйте его ко всем таким случаям.

Наш план рисования дома, тоже опирается на эту идею. Он подразумевает, что спрайт начинает в точке А и ориентирован направо. Надо создать скрипт, который подходил бы к шагам, прописанным в этом плане. Мы напишем процедуру Сторона 1 (Side1), чтобы рисовать левую сторону дома, как показано в шаге 1. Мы также напишем еще три процедуры: Дверь, Сторона 2 и Крыша (Door, Side2 и Roof), чтобы нарисовать две двери, правую сторону дома и крышу (см. шаги 2, 3, 4 и 6), и соединим все эти процедуры с соответствующими командами Движения.

Наша процедура Дом изображена на рисунке, где также показаны последовательно все этапы рисования и их привязка к процедуре. Ей требуется один параметр (масштаб), который определяет длину единицы (коэффициент масштабирования) при рисовании дома. Обратите внимание на то, что процедура Дверь используется дважды. А процедура Крыша отвечает за рисование всей крыши и может содержать различные подалгоритмы для рисования отдельных компонентов.
УПРАЖНЕНИЕ 13.1

Вы обратили внимание на то, что процедуры Сторона 1, Дверь и Сторона 2 используют практически одинаковый код? Создайте новую процедуру под названием Прямоугольник, которая в качестве параметров использует длину, ширину и масштаб и рисует прямоугольник с указанными размерами.

Измените процедуры Сторона 1, Дверь и Сторона 2 так, чтобы обратиться к новой процедуре Прямоугольник.

Отдельные процедуры для рисования дома показаны на рисунке. Они изображают простые геометрические фигуры при помощи техник, которые вы узнали из главы

Процедуры Сторона 1, Дверь и Сторона 2 рисуют прямоугольники 3 × 5, 1 × 2 и 9 × 5 единиц соответственно. Процедура Крыша имеет два подалгоритма (Треугольник и Параллелограмм) для рисования двух частей крыши. Обратите внимание, что во всех этих случаях масштаб устанавливался показателем масштаб. Это позволяет нам рисовать дома разных размеров, вводя различные аргументы.
Сборка программы из процедур

Другой способ работы с крупной задачей — сосредоточиться на мелких деталях. Если вы сначала решите мелкие части большой задачи (или найдете существующие решения), то сможете скомпоновать результаты, создав окончательное высокоуровневое решение.

Чтобы продемонстрировать этот метод, начнем с простой процедуры Лист (Leaf), которая рисует один лист.

Процедура содержит цикл повторить, который срабатывает дважды, чтобы нарисовать две половинки листа. Каждая рисуется как серия из 15 коротких фрагментов линий, расположенных относительно друг друга под углом 6°.
Используя эту процедуру как отправную точку, мы можем рисовать более сложную форму, состоящую из пяти листьев. Наша новая процедура, которую мы назовем Листья (Leaves), и результаты ее работы показаны на рис. 4.28. Как вы видите, нам понадобилось только добавить процедуру Лист в цикл повторить с необходимым углом поворота между листьями.
Теперь мы можем использовать процедуры Лист и Листья, чтобы сделать что-то еще более сложное: ветку с листьями на ней. Наша процедура Ветка (Branch) и результат ее работы показаны ниже. Спрайт перемещается вперед на 40 шагов, рисует один лист (обратившись к одно- именной процедуре), перемещается еще на 50 шагов вперед, рисует пять листьев (обратившись к процедуре Листья) и наконец возвращается на исходную позицию.
Поднимемся еще на ступеньку вверх. Как насчет того, чтобы использовать процедуру Ветка для создания сложного рисунка цветка?

Новую процедуру мы назовем Цветок (Flower). Алгоритм шесть раз по кругу обращается к процедуре Ветка, при каждом повторе изображение поворачивается под углом 60°.

Мы можем продолжать бесконечно, но идея уже ясна. Мы начали с простой процедуры под названием Лист и использовали ее в новой (Листья), чтобы создать более сложный рисунок. Процедура Ветка опирается на эти два алгоритма при создании еще более сложного объекта. Процедура Цветок использует Ветку, чтобы создать еще более сложный рисунок.

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

Scratch - Учись играя!
This site was made on Tilda — a website builder that helps to create a website without any code
Create a website