Главная страница проекта ИНФОРМАТИКА-21

Наука Школе

Главная страничка занятий с 5-классниками   Предыдущее занятие

26 мая 2008. Тринадцатое занятие (последнее в этом уч. году)

Перед занятием info21 полюбопытствовал у Ольги Александровны насчет прошедшего ЕГЭ по информатике. О.А. с законной гордостью вынула табличку с результатами и наглядно сообщила, что 45% и 40% лицеистов написали на хорошо и отлично, соответственно. Выбор у ФМ класса был между информатикой и общество(-знанием или -ведением -- info21 не запомнил). Естественно, ФМ класс стройными шеренгами двинул на информатику. Ну, и результат соответственный, приличный.

Итак, последнее в этом учебном году экспериментальное занятие. Завтра у 5-классников завершающий год классный час и потом -- каникулы. Странно было бы, если бы на факультатив в последний понедельник в предпоследний день уч. года народ пришел бы толпою. Во всяком случае у 9-классников занятия не было.

Сюрпризов и не случилось: пришла одна обязательная Марина -- которую, таким образом, консультировали двое преподавателей.


Марине была предложена довольно сложная задачка, где требовалось один цикл вставить в другой.  Такого еще не было.
На прошлом занятии Марина продемонстрировала умение рисовать окружность, которую мы еще переделывали в ёжика ("Солнышко" в терминологии Марины). Как выяснилось чуть позже, процедурки для окружности не сохранилось в виде документа Блэкбокса (цитата в Сети не в счет -- с ученических компов в Сеть всё равно нет выхода), и это создало некоторые трудности, но пока мы этого не знаем.

Итак, умеем рисовать окружность. Значит, сможем нарисовать дугу -- часть окружности (для этого надо просто уменьшить количество шагов -- Марина по идее должна до этого догадаться).
Пририсовывая точно такую же дугу, но с поворотами в противоположную сторону, получим одиночную волну.
Рисуя несколько волн подряд с помощью цикла, должны получить искомый рисунок.

Задача была нарисована Марине на листочке бумаги, и она принялась соображать:

Видно, что Марина действует по уже испытанной схеме: раскрыла старое "Солнышко" (среднее окно), чтобы им вдохновиться. Если плясать от Солнышка, то надо было взять оттуда цикл и упростить его тело, выкинув рисование радиальных "иголок" -- но это оказалось неожиданно трудно.

Поэтому сначала просто воспроизвели с нуля окружность. Но до этого Марина успешно нашла последовательность команд, которая ставит черепашку на левый край рисунка, чтобы рисовать волну вправо. На следующей фотке начат цикл для окружности (пока с пустым телом), перед которым искомые команды (это хорошо видно слева; правда, фотка сделана в неудачный момент -- сразу после очистки рисунка, так что не видно, как черепашка встает на край картинки после выполнения этих команд):

Следующая фотка сделана после того, как Марина нарисовала-таки пол-окружности, и начала делать второй цикл для второй полуокружности. Отмечаем:
— не догадались скопировать целиком первый цикл, чтобы в нем просто вставить минус перед углом поворота;
— во втором цикле вводим вторую управляющую переменную (v2) -- пока нет ощущения, что можно использовать ту же самую.

Тем не менее, дорисовать вторую полуокружность удалось без особого напряга:


А вот дальше напряг случился, и состоял он вот в чем.

Как показал Меандр, Марина совершенно уверенно делает программу с одним циклом.
Но здесь у нас их уже два -- это во-первых. Уже здесь было заметно умственное напряжение.
Во-вторых, эти два цикла нужно вставить внутрь еще одного -- третьего!
Вот тут и произошел затык. Марина затруднилась организовать это дело, пришлось ей помогать.

Очевидно, пока нет понятия "блочного" строения программы (что цикл целиком является самостоятельным "строительным блоком", как, скажем, и отдельная команда черепашки, и его можно, например, переносить-копировать-... целиком). Впрочем, это не удивительно -- сей пункт еще не объяснялся, и вообще про синтаксическую структуру цикла ничего не было сказано сверх инструкций "делай так".

Но! Марина всё-таки сама предложила оформить пару внутренних циклов как одну процедуру, чтобы тело "главного" цикла стало попроще -- т.е. состояло бы из одного вызова процедуры. Правда, Марина тут же призналась, что не помнит, как сделать такое преобразование программы. Пришлось помочь -- по крайней мере начать, предоставив Марине доделать до конца (объявить переменные цикла в новой процедуре на соответствующей "полочке"; кстати, тут не хватает кусочка теории насчет переменных и "полочки" VAR, где они заводятся -- если бы не пропавшие 7 занятий подряд, про это было бы рассказано).

Возможно, цикл в цикле проще понять, если предварительно выделять внутренний цикл в отдельную процедуру -- вероятно, именно такая последовательность и должна быть в обучении:
— простой цикл с простым телом (какие-нибудь черточки);
— "абстрагировать" цикл в особую процедуру (отдельный навык -- отдельное занятие или хотя бы специально на этом останавливаться);
— уже вызов такого "абстрагированного" цикла вставлять в новый цикл.
— А явные двойные циклы оставить на потом (и вообще матрицы в школе -- пережиток времен, когда программирование преподавали знатоки фортрана; а без матриц и двойные циклы для жизни не особо нужны).

Такая последовательность вполне согласуется с нашей философией раннего введения процедур -- просто в силу новизны подхода мы немножко не дожали сей пункт (выделение произвольного куска программы, включая цикл, в отдельную процедуру) до полной уверенности.

В общем, коллективными усилиями Марины и info21 программа получилась:

Процедура названа буквой w (похожа на волну), основная процедура (Пример) содержит простой цикл из двух шагов, на каждом шаге рисуется одна волна (=один вызов w).

Правда, на фото мы уже успели поиграть с программой: удлинить дугу окружности на одном шаге с 180 до 200 градусов, поэтому вся волна пошла на 20 градусов вверх, а не точно по горизонтали.

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

Все эти выделения процедурок -- чтобы в программе оставалась простая последовательность типа

   
ВстатьНаКрай; w; w; w;

--
постоянное упражнение на абстрагирование и развитие структурированного взгляда на свою программу. И ненавязчивая подготовка к разработке методом пошаговой детализации: в какой-то момент, видимо, станет вполне естественным переход к составлению программы в "обратном" порядке.


Дальше info21 немножко показал Марине, как можно с этой программой поиграть, меняя ее чуть-чуть.

Во-первых, в циклах, рисующих дуги, увеличили поворот -- сделав его не 1 градус, а 2, и одновременно уполовинив число шагов. Это уменьшает радиус дуг (правда, сейчас вечером мозг info21 уже не хочет соображать, во сколько именно раз), так что на экране можно уместить больше волн.

Во-вторых, уменьшив число шагов в обоих циклах, рисующих дуги, мы сделали более мелкую волну -- правда, пошла она немного вниз:

Но по Марининым глазам видно, что ей всё равно понравилось.

Задача сделать всю волну горизонтальной была сформулирована, но времени на нее в этом учебном году нам уже не осталось.


Фото на память: Марина, вслух пожалев, что на каникулах не будет продолжения наших занятий (зато задано прочесть много книг), забирает домой на розовой флэшечке свою работу вместе с Блэкбоксом:

Полный комплект всех фоток со всех занятий на CD в высоком разрешении будет передан Марине завтра утром перед вторым уроком на крыльце лицея.
Обсуждение того, где и как произойдет эта встреча, заняло непропорционально много времени -- очевидно, Марина еще не успела научиться договариваться о свиданиях :-)
Зато Ольга Александровна смогла тут помочь парой советов :-)

А info21 будет соображать, как ему успеть нашлепать до пятницы тезисы для конференции в Байтике 26-27 июня, да еще успеть обсудить их с Ольгой Александровной ... ... ... ... ... ...

Тезисы итогового доклада

Главная страничка занятий с 5-классниками   Предыдущее занятие

Главная страница проекта ИНФОРМАТИКА-21

Наука Школе