Наука — Школе |
Главная страничка занятий с 5-классниками Предыдущее занятие
Перед занятием
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-классниками Предыдущее занятие
Наука — Школе |