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

Наука Школе

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

05 мая 2008. Десятое занятие

В школе явно повышен градус суеты: забегал сказать hello Григорий Николаевич с кипой бумаг в руках, забегали другие учителя. Надо понимать, конец года. Впрочем, Ольга Александровна заверила, что занятия будут продолжаться по всей форме -- то есть еще 12, 19 и даже 26 мая.
В лицее строго. Не зря сюда ездят дети даже из Москвы.

Eruditio aspera -- optima.
(=Строгое воспитание -- лучшее. В плане концентрации тысячелетней мудрости, автоматически оседающей в головах, учебники латинского и древнегреческого даже близко нечем заменить в современной, блин, школе.)

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


Присутствовали: Саша, Влад, Вася и обязательная Марина.
Тима из вояжа не вернется до конца уч. года. Жалко.
Женя, кажется, на каких-то соревнованиях -- где-то что-то они, вроде, выигрывают.

Тема занятия: смешивали процедуры и простейшие циклы.

info21 начал с того, что посидел с Владом, чтобы прояснить структуру его хаоса.
Ничего сложного он не мог нагромоздить -- и действительно: там есть одиннадцать повторений групп из десятка пар инструкций, соединенных одинаковыми связками из инструкции Ч.Идти(100).

Сначала собрали первый десяток пар (Ч.Идти(100); Ч.Повернуть(144);) в цикл.
Скомпилировали, выполнили, убедились, что картинка не поменялась.
Для наглядности позаменяли все десятки этими же тремя строчками цикла.
Проверили, что картинка не изменилась. (Разделяй и управляй: терпеливо идем небольшими обозримыми шагами, проверяясь на каждом. Конечно, терпение -- слабая сторона Влада, но он был тут больше наблюдателем, хотя и активно действовал на подхвате.)

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

Видно, что две переменные объявлены в разделе объявлений перед словом BEGIN.

Никакие BEGIN для оформления тела цикла не нужны. (Уточнение О.А.)

Правильный скелет цикла с отступами создается автоматически по f, F5 (как и с процедурой -- по первой букве всей конструкции).
После этого курсор оказывается в том месте, где нужно задать счетчик цикла (у нас
i или j). Нужно заполнить первую строчку и сразу скомплировать (Ctrl+K) -- Блэкбокс покажет ошибку сразу после i: необъявленный идентификатор. Соответствующее объявление набить после VAR (чтобы набрать слово INTEGER, нужно нажать i и сразу F5).

Еще на картнике видно, как с помощью отступов выявлена структура программы. Но циклы у нас получались сначала на одном уровне. Чтобы "загнать" внутренний цикл на один отступ вправо, был применен такой приемчик (конечно, можно каждую строчку отдельно клавишей Таб, но так не интересно):

Двигать группу строчек на один отступ влево-вправо можно клавишами F11-F12;
предварительно выделить поправляемые строчки (не обязательно полностью: можно откуда-нибудь с середины первой куда-нибудь в середину второй -- это чтобы не нужно было особо целиться мышкой, чтобы попасть в начало строки -- просто нажать на левую кнопку где-нибудь в первой строке, провести, не отпуская кнопку, в середину последней, и там отпустить кнопку).

Вообще, отступы делаются клавишей Tab. А удаляются обычным стиранием.
Плюс ББ смотрит, сколько было отступов в начале строки, и в новой строке автоматом вставляет столько же -- но только если отступы оформлены табами.

Раз уж речь зашла: нажав Ctrl+H (H от hide=прятать) можно увидеть табы-отступы -- в виде сереньких прямоугольничков. Повторное Ctrl+H снова их спрячет.

Кстати, Саша пытался делать отступы пробелами -- и делать занудно, и получается криво.
(Кажется, в ТП не очень принято делать отступы? И очень плохо.)

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

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


В общем, на Влада произвело заметное впечатление, как сократилась его необозримая варварская процедура (fhd на картинке) до 6 строчек:

Причем можно легко играть с числами и смотреть, что получается.

На следующее занятие -- доработать цикл в главной процедуре (на картинке он идет от 1 до 1) и воспроизвести первоначальный хаос.


Васе тем временем было предложено поиграть в Блэкбокс, за что он взялся с энтуазизмом. Потом к нему примкнул Влад. Но особо осмысленного поведения не было замечено ни у того, ни у другого, хотя Влад догадался уменьшить размер поля вплоть до бессмысленного 2х2 при четырех атомах. Тем не менее, даже сии бессмысленные манипуляции доставили обоим массу удовольствия. Интересно.


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

Вот всё-таки забавно: в сущности, было просто сказано: выясни, как стоит черепашка до и после. И стоило направить на это мысль, как парень сразу увидел, где у него были проблемы.

Саша даже запараметризовал доску: параметр e управляет размером доски. Причем все размеры задаются через e. На самом деле e -- не ширина (как думал Саша), ведь 2*e под углом 45 градусов дают по горизонтали меньше, чем e, оттого и щели получались.

Видно, что у него забор (нижняя процедура zab) может рисовать любое число досок (параметр r).

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

Устав от домика, Саша решил проверить мощь циклов в Блэкбоксе и сбацал вот такое кольцо-ежик из 360 частей: в каждой маленькая хорда длиной 1.5, и радиальный шип длиной 30, торчащий наружу:

Можно (и нужно! хотя многие отмахнутся: мелочь; но они не правы) прояснить смысл шага цикла, если перенести поворот на -1 в конец тела (перед END) -- ведь это, в сущности, связка -- переход от рисования от одного из 360 элементов к следующему.
Тогда чтение тела процедуры сразу выявляет смысл рисуемого (Ч.Идти(1.5); Ч.Повернуть(90); Ч.Идти(30); -- Г-образная штучка, которая на следующем шаге будет повернута на 1 градус).

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


Поскольку info21 сосредоточился сегодня на пацанах, О.А. наблюдала Марину. Они оставили поднадоевший домик, и стали тоже делать узоры из звезд с циклами и процедурами:

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

В этом месте произошел краткий научный диспут между О.А. и info21: как проще:
оформить цикл, рисующий одну звездочку, в отдельную процедуру (как предложил
info21),
или оставить двойной цикл (как было сначала сделано).

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

Вообще-то тут глубокий пункт затронут: идея о более раннем и более активном введении процедур, чем принято обычно.

С одной стороны -- это в духе Римского Принципа (насчет которого у большинства народа инстинкт не выработан, и это плохо).
Причем
info21 отталкивается здесь от практического опыта: доп. усилия на дубово-четкую организацию процедур с лихвой окупаются радикальным облегчением отладки программы в целом.

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

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

Соответствующую ссылку искать и вставлять мне сейчас некогда (это научно говоря; на самом деле, возможно, неохота; но думать сейчас об этом уж точно неохота...).

Линия сопротивления тут, очевидно, -- элементарная лень (выносить три строчки в целую дополнительную процедуру, ах!).

Кажется очевидным, что все эти орг-вещи имеют воспитательное и умоструктурирующее значение, выходящее за рамки "программизма", причем "программизм" в этом отношении уникален среди других школьных предметов (тут имеются в виду дискуссии на PEDSOVET.ORG насчет всех ли нужно учить программированию).


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

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

info21 с удовольствием отмечает, что Ольга Александровна тоже действует в Блэкбоксе с нарастающей уверенностью :-)

После окончания урока Марина обменялась с info21 мнениями о любимой музыке, и info21 пришлось оправдываться, почему не рок, а Гендель ... Р.Штраусс. Объяснение такое: рок надоел, захотелось посложнее, поинтереснее (более-менее правда). А на подходе к дому info21 попал под дождь без зонта -- первый хороший дождь в этом году.

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

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

Наука Школе