|
|||||||||||||||||||||||||
Методика преподавания основ алгоритмизации на базе системы "КуМир". Лекция 4Лекция 4. Арифметические выраженияАрифметические выражения и правила их записи. Алгоритмы с «обратной связью». Команда «пока». Условия в алгоритмическом языке. Команды «если» и «выбор». Команды контроля. «Визуальное» представление команд. Отступление: правила и форма записи арифметических выражений в Фортране XXI века.
Пока школьник “собирает” программу в “ПиктоМире”, он практически не должен осваивать какой-то новый, непривычный “мир ЭВМ”. Разумеется, ребенок должен научиться оперировать мышкой для получения от компьютера желаемого результата, но интерфейс в целом опирается на привычные для ребенка понятия и действия, “прозрачен” и не требует от ребенка излишней концентрации внимания на самом процессе взаимодействия с компьютером. В этот момент обучаемый концентрирует практически 100% своих усилий (или лучше сказать “объема внимания”) на алгоритме решения поставленной задачи. Но как только происходит переход от графического программирования к более традиционному текстовому, ученик начинает сталкиваться с “другим миром”, законы которого отличаются от привычных, уже изученных в школе. Речь идет в первую очередь о записи арифметических выражений, на отработку навыков манипулирования которыми на уроках математики в школе ученик потратил десятки часов и достиг определенного автоматизма. В первых задачах по управлению Роботом ЭВМ демонстрирует свои возможности как управляющая машина, а не как вычислительная. Но вот появляется цикл N раз, и при решении некоторых задач ученику может понадобиться в качестве N взять число, которое появляется как результат некоторого вычисления, например, число клеток поля размером 9 ? 14. Тут выясняется, что вовсе не обязательно вычислять общее число клеток такого поля самому (в уме, на бумаге или калькуляторе) и “вписывать” результат в программу. Оказывается, ЭВМ сможет сама проделать все нужные вычисления, как только мы сообщим ей (запишем в программе), что именно нужно вычислять. То есть, грубо говоря, для решения задачи на ЭВМ нужно не столько знать, “сколько будет дважды два”, сколько уметь сообщить ЭВМ, что нужно взять именно результат выполнения операции “дважды два” или операции “9 раз по 14”. Со сложением и вычитанием проблем нет. В записи цикл 3+3 раз для ученика нет ничего нового. Точно в такой же форме на уроках математики учащиеся записывают и, мы надеемся, вычисляют без помощи калькулятора различные суммы и разности. Но вот для более сложных арифметических выражений правила записи в школьной математике и в традиционных алгоритмических языках начинают несколько отличаться. Дело в том, что при работе на бумаге и классной доске математические формулы — корни, дроби, степени и индексы — мы “рисуем”, и это очень удобно. А в традиционных языках программирования арифметическое выражение нарисовать нельзя, а нужно “кодировать”, нажимая кнопки на клавиатуре компьютера. Из-за этого в программировании сложилась традиция упрощенной, так называемой “линейной” записи формул, к которой ученику начала XXI века приходится привыкать и приспосабливаться. (Наверное, к середине века этого делать уже не придется, см. программу внизу справа.) Итак, при вводе в программу требуемых формул (арифметических выражений) нам придется пользоваться клавиатурой компьютера и определенным образом эти формулы кодировать (шифровать). Как и всякая задача на кодирование или шифрование информации, эта простая техническая задача может оказаться притягательной для некоторых школьников (уставших от управления Роботом). При решении этой задачи выясняется, что на клавиатуре есть символ точки, но нет символа умножения “?”, да и точка тоже отнюдь не служит символом умножения. Выясняется также, что не принято писать арифметические формулы вида 8(2+3) с пропущенным знаком умножения. ЭВМ (точнее, компилятор языка программирования) могла бы разобраться в подобных формулах, но традиционно отказывается это делать и требует вписать в формулу звездочку — знак умножения: 8*(2+3). А вот две подряд идущие звездочки ЭВМ, как правило, воспринимает как знак возведения в степень. Взятые вместе, все эти мелкие детали и образуют препятствие, которое ученику необходимо преодолеть. Обычно это не вызывает затруднений. Ошибок дети, как правило, не делают, за исключением одной широко распространенной: дроби вида и записываются как 3+5/2 и 3*5/2 без скобок, вместо правильной записи (3+5)/2 и (3*5)/2. Правила записи арифметических выражений в Фортране XXI векаПоследние столетия математики отрабатывали язык математических формул, который оказался эффективным средством выражения математических понятий и методов манипуляции с математическими объектами. Когда в середине прошлого века появились компьютеры, первые компьютерные редакторы текстов и первые языки программирования, они оказались неспособными работать с отработанным в математике языком математических формул. С течением времени ситуация с математическими формулами в текстовых документах улучшилась. Математики и программисты придумали и стандартизовали способы ввода математических формул в текстовые документы, однако программисты в своих программах продолжали использовать невыразительную “линейную” форму записи формул в виде цепочки символов, вводимых со стандартной клавиатуры. В XXI веке положение стало меняться. По заказу военного ведомства США специалисты компании SUN разработали язык Fortress, в который изначально закладывалась возможность использования в текстах программ общепринятых математических обозначений. На настоящий момент в этом направлении сделаны только первые шаги, однако в языке Fortress уже можно использовать: греческие буквы: верхние/нижние индексы и дроби: формулы с опущенными знаками умножения: формулы, в которых аргументы элементарных функций не заключаются в скобки: знаки операций над множествами И это только начало, через пару десятков лет тексты используемых учеными и инженерами программ будут по внешнему виду похожи на учебники элементарной и высшей математики. Алгоритмы с “обратной связью”. Команда “пока”До сих пор мы работали с Роботом в стиле Черепашьей графики в ЛОГО, а именно командовали без всякой обратной связи. Поэтому то, что мы делали (с методической точки зрения), с тем же успехом можно было проделать, например, в том же ЛОГО. Вспомогательные алгоритмы (с аргументами или без аргументов) можно изучать как с использованием Робота, так и с использованием Черепашки. На первых порах при составлении программ для Робота (или для Вертуна) мы, как правило, заранее имели исчерпывающую информацию об обстановке Робота. Но Робот (и Вертун) с методической точки зрения значительно богаче Черепашки, так как у него есть команды обратной связи. И, пользуясь этими командами, Человек может оперативно получить информацию об обстановке вокруг удаленного от него Робота, а ЭВМ может оперативно получать информацию при исполнении программы. Например, выполняя команду “слева свободно”, от кого бы она ни исходила, Робот сообщает порцию информации об обстановке, в которой он в данный момент находится. Другую порцию информации можно получить, спросив Робота, закрашена ли клетка, где он стоит. При пользовании изображенным выше пультом ответы Робота человек считывает с табло в текстовом виде. Более дешевый пульт мог бы изображать ответ Робота путем зажигания лампочки (светодиода). Когда Роботом управляет ЭВМ, ответ Робота преобразуется в уровни электрических сигналов. Но суть процесса при этом одна и та же: при выполнении команды обратной связи информация не только поступает к Роботу, но и передается в обратном направлении, от Робота к ЭВМ или Человеку. Отсюда и термин обратная связь. Теоретически можно было обойтись только одной командой-вопросом из каждой пары типа: Справа свободно – Справа стена. Однако это усложнило бы запись алгоритма, так как потребовало бы введения отрицания, что на ранней стадии обучения является методически неоправданным, усложняющим правила написания и исполнения программ. Вместо естественной записи “сверху стена” пришлось бы писать что-то типа “сверху не свободно”, что предполагает некую двойственность, а вдруг там есть что-то, кроме стены1?
У Робота три группы команд обратной связи. Первая группа позволяет анализировать наличие или отсутствие стен сверху, снизу, справа и слева. Вторая группа состоит из двух диаметрально противоположных команд-вопросов “клетка закрашена?” и “клетка чистая?”, позволяющих узнать, закрашена ли клетка, в которой стоит Робот. Если команды первых двух групп выдают в качестве ответа “да” или “нет”, то команды последней группы возвращают в качестве ответа вещественное число. С помощью этих команд можно узнать, какова температура и какова радиация в клетке, в которой находится Робот. За счет команд третьей группы мир Робота становится заметно богаче. Благодаря этим командам мы можем ставить и решать более широкий набор задач по управлению Роботом и сбору информации на поле Робота. Более того, задачи о температуре и радиации на поле Робота могут заменить некоторые традиционные задачи по обработке массивов. “Оснащение” Робота “термометром” и “счетчиком Гейгера” — хороший методический подход при изучении задач, обычно формулируемых для массивов. Такие традиционные задачи по обработке массивов, как “минимальный элемент”, “индекс максимального элемента”, “сумма элементов”, “среднее арифметическое” и пр., могут быть переформулированы как задачи по сбору информации на поле Робота и получают при этом очень естественную интерпретацию. Горизонтальный ряд из пяти клеток с заданной в каждой клетке радиацией (10, 10, 30, 20 и 40) — это точный аналог линейной таблицы вещественных чисел из пяти элементов. И почти каждую задачу по работе с линейной таблицей можно переформулировать как задачу про Робота. В такой формулировке будет более понятно, почему такая задача возникла и зачем ее нужно решать. Представим себе, что на поле Робота справа есть стена, к которой должны будут пройти люди — может быть, спасатели. Сначала необходимо разведать, насколько прохождение по коридору опасно для здоровья, каков уровень радиации. Если люди будут продвигаться с примерно постоянной скоростью, то полученная ими доза радиации окажется пропорциональной сумме уровней радиации во всех клетках прохода до стены. Поэтому анализ степени опасности этого прохода для жизни спасателей можно переформулировать как задачу подсчета суммарной радиации в клетках прохода. Это и есть задача нахождения суммы элементов таблицы, сформулированная в терминах управления Роботом. Подобным же образом можно переформулировать практически любую задачу по обработке таблиц (массивов). Упражнение. Переформулируйте задачи “Минимальный элемент массива” и “Индекс минимального элемента массива” в терминах управления Роботом. Итак, посмотрим, какая из нижеприведенных формулировок задачи привлекательнее для школьника: 1) найти индексы минимального элемента прямоугольной таблицы; 2) в прямоугольнике на поле Робота найти клетку с минимальной радиацией и переместить Робота в эту клетку (для отдыха). Первая формулировка — чисто математическая. Кому и зачем нужны эти индексы, остается далеко за рамками задачи. Вторая — более понятна и осмысленна. Хотя школьники скорее всего раньше дела с радиацией не имели, им ясно, что высокий уровень радиации — это “плохо”, что требуемая в задаче клетка — самая безопасная, и если уж Роботу нужно найти место для отдыха, то лучше выбрать самую безопасную клетку — клетку с минимальной радиацией. Как вы заметили, в алгоритме Сумма элементов используется цикл “пока”, нами еще не введенный. Тут мы просто несколько забежали вперед. Цикл “пока” должен вводиться при обсуждении некоторой задачи (проблемный подход), например, такой, как в учебнике2: “Где-то ниже Робота на поле есть стена. Надо переместить Робота вертикально вниз до стены, т.е. установить Робота в клетку непосредственно над стеной на одной вертикали с исходным положением Робота”. Сначала можно попробовать решить эту задачу вручную. Учитель даже может нарисовать поле Робота на листе и, не показывая до поры до времени лист школьникам, выполнять их команды. Вскоре школьники поймут, что надо все время спрашивать “снизу свободно?” (или “снизу стена?”) и командовать “вниз” до тех пор, пока ниже Робота свободно. Обычно после 10 минут такой игры каждый ученик в классе в деталях представляет себе, как именно надо командовать Роботом, чтобы решить поставленную задачу. Это понимание и есть методическая цель подобной “игры”. Методический прием такого введения новой конструкции языка программирования Г.В. Лебедев в своих лекциях описывал так: “Когда ученики в деталях разберутся в том, как решать поставленную выше задачу при управлении Роботом “вручную”, происходит ключевое для нашего методического приема противопоставление этой работы “вручную” и схемы программного управления. “Замечательно! — говорит учитель. — Все разобрались, как надо управлять Роботом. Но ведь мы занимаемся не ручным управлением Роботом, а информатикой. Поэтому наша задача — написать алгоритм для ЭВМ, при выполнении которого ЭВМ прокомандует Роботом так, чтобы задача была решена. Заметьте, что расстояние от Робота до стены неизвестно, но ЭВМ, выполняя алгоритм (и не зная расстояния), должна сместить Робота к стене. Попробуйте записать такой алгоритм. Вы ведь понимаете, как нужно управлять Роботом, какие команды ЭВМ должна выдать Роботу. Так запишите это в виде алгоритма для ЭВМ”. Я еще раз обращаю ваше внимание на этот проблемный подход. Ведь практически в этом месте мы просим школьников придумать конструкцию цикла “пока”. То есть в отличие от стандартной последовательности (сначала форма записи, потом ее семантика (смысл), потом решение задач) мы сначала ставим задачу, потом разбираем, как ее решать, т.е. разбираемся со смыслом (семантикой) будущей конструкции, а потом просим учеников придумать форму записи3”.
Цикл “пока” содержательно является очень сложной конструкцией. И процесс освоения его лучше сделать наглядным. В учебнике объяснение этого цикла проводится различными способами, в том числе и с использованием блок-схемы. Наглядное объяснение работы цикла “пока” столь же важно, как и режим пошагового выполнения в “КуМире”, так как графические образы и наблюдения в процессе собственной деятельности лучше усваиваются сознанием школьника, нежели речь и математические формулы, исходящие от учителя.
Попробуем выполнить алгоритм “Шагать доупора”4. Будем выполнять программу по шагам, нажимая на пиктограмму ШАГ. Нас интересует выполнение цикла “пока”. Сначала проверяется условие “впереди свободно”. Ответ “да”, значит, должно выполниться тело цикла. И Робот смещается на одну клетку вниз. Когда тело цикла закончилось, мы возвращаемся и снова проверяем условие. И так далее, пока на очередном (Упражнение: Каком по счету?) шаге Робот упрется в стену и проверка условия даст результат “нет”. И тогда мы завершим выполнение цикла и начнем выполнять команды, записанные в программе после кц. Обратите внимание, что результаты проверки условий выводятся на поля, так что после каждой проверки условия школьнику будет сразу ясно, будет ли еще раз выполняться тело цикла, или выполнение цикла будет завершено. А если обстановка Робота иная и он еще до выполнения цикла уже стоит над стеной? Попробуем выполнить алгоритм при таких начальных условиях. Немного бояз но, а вдруг Робот сломается? Ничего подобного. Робот не сломался, цикл завершился, так как условие “снизу свободно” при первой же проверке не соблюдается и, значит, тело цикла не выполняется ни разу. Это одна из важных особенностей выполнения цикла “пока”. Еще одна важная особенность выполнения цикла “пока” — возможность зацикливания — бесконечного выполнения тела цикла. Допустим, мы перепутали и вместо команды “вниз” написали внутри цикла команду “закрасить”. Если ниже Робота свободно, то Робот никуда не будет перемещаться, а будет стоять на месте и до бесконечности закрашивать клетку, в которой стоит. Если запустить такую программу, то о зацикливании можно будет узнать по числу шагов, выполненных программой, которое будет быстро возрастать на наших глазах, в то время как Робот стоит на месте. Третья, и последняя, особенность цикла “пока” состоит в том, что условие продолжения цикла в процессе выполнения тела цикла не проверяется. Опять слегка изменим алгоритм, добавив в тело цикла еще одну команду “вниз”. Пусть Робот выполняет задачу побыстрее. Как правило, учащиеся не видят ошибочность подобной программы, неверно предполагая, что условие цикла каким-то магическим образом проверяется в каждый момент выполнения тела цикла. Это, естественно, не так. Приведенный пример демонстрирует возникшую ошибку выполнения, несмотря на то что условие цикла имело (в прошедшем времени) значение “да”. Но перед вторым шагом “вниз” условие уже никто не проверял. Из-за этого и возник отказ в программе. Условия в алгоритмическом языке. Команды “если” и “выбор”Как правило, после освоения цикла “пока” команды “если” и “выбор” осваиваются без особых затруднений. Как обычно, введение новой команды нужно начинать, отталкиваясь от задачи. Дано: Робот где-то на поле и справа свободно. Надо: переместить Робота вниз, закрасив по пути те клетки поля, у которых справа стена.
Алгоритм получается легкой переделкой решения предыдущей задачи, нужно только добавить команду “если”. На методический вопрос, почему конструкция “если” появляется в курсе после конструкции “пока”, можно найти ответ в “12 лекциях” Г.В. Лебедева5: “Конечно, легко ввести и пояснить команду “если” на каком-нибудь примере типа “осторожного” шага: “если снизу свободно то вниз все”. Беда, на наш взгляд, состоит в том, что если с этого начать (а особенно, если ввести команду “если” до циклов), то у школьников в голове не возникает никакого (пусть не формализованного) внешнего контекста, в рамках которого написание такой команды было бы осмысленным для решения каких-то содержательных задач. После того как разобран хотя бы один пример с циклом и с “если” внутри, такой внешний контекст появляется. Тогда уже можно команду “если” изучать и без циклов — ученики представят себе обстановку, в которой нужда в такой команде возникает. Но когда этот первый пример (с циклом и “если”) разобран, в команде “если” уже нечего изучать. Другие иллюстрационные примеры просто не требуются, — нужно решать задачи. Поэтому мы считаем, что впервые команда “если” должна появиться внутри цикла”. Сложность команды “если” может заключаться только в записи условия. Можно придумать задачу для школьников — записать формально условие “Робот стоит в углу”: (слева стена и сверху стена) или (сверху стена и справа стена) или (справа стена и снизу стена) или (снизу стена и слева стена) Команда “выбор”Команда “выбор” — это первая “не необходимая” команда алгоритмического языка. Невозможно сформулировать задачу, которую без этой команды нельзя решить. Команда “выбор” лишь упрощает запись в ситуации, когда вариантов много. Но и в этой ситуации алгоритм вполне можно записать, ограничившись использованием только команды “если”. “Визуальное” представление командЦикл “пока” можно объяснять не только школьникам, используя “КуМир” с Роботом, но и дошкольникам, используя младшего брата “КуМира” — “ПиктоМир”. Из предыдущей лекции нам знаком Вертун, который может ходить по полю, похожему на поле Робота. Вертун — интересный исполнитель, у него есть команды обратной связи: Вертун может проверить, закрашена ли клетка, на которой он стоит, и есть ли перед ним стена. У Вертуна, как и у Робота, двойной набор команд обратной связи. Но на это в “ПиктоМире” есть веские причины. Если в “КуМире” из команды Робота “справа стена” мы могли получить эквивалент команды “справа свободно” добавлением отрицания “не” внутрь команды, то при визуальном стиле программирования в “ПиктоМире” частички не не существует. А значит, двумя командами обойтись нельзя и нужны все четыре. Изображенные на рисунке пиктограммы обозначают эти пары команд (слева направо): “клетка закрашена” (серый цвет поля); “впереди стена” (кирпичная стена); “клетка чистая” (зеленый цвет поля); “впереди свободно” (стена разрушена).
Как же можно в “ПиктоМире” использовать эти условия? Условия можно располагать в начале вспомогательных алгоритмов в специальных клетках. В синих располагается повторитель (для организации цикла N раз), а в розовых — условие выполнения алгоритма f1–f5. Как уже говорилось в лекции 3, цикл N раз помогает учащемуся экономить клетки при составлении алгоритма. Но если простая задача состоит, например, в перемещении Вертуна вправо до стены, то программа вполне может выглядеть и так: Действительно, если “подглядеть” обстановку Вертуна, то можно легко подсчитать, что до стены 4 шага. Другое дело, если обстановка нам не видна и мы можем узнать о ней только по обратной связи от Вертуна. Аналогично ситуации с Роботом школьнику придется спрашивать Вертуна перед шагом вперед, нет ли перед ним стены. В школьном алгоритмическом языке, когда ученики вынуждены сами придумывать конструкцию цикла “пока”, у детей все еще остается большой простор для фантазии, так как границы алгоритмического языка не видны. В “ПиктоМире” у ребенка есть только то, что он видит на экране. И условия можно разместить только в одном месте. Ему остается только это и попробовать. Такая программа будет правильно работать для текущей обстановки Вертуна (и, естественно, во всех случаях, когда стена находится ближе четырех шагов от стартовой позиции). Поясним, как работает вспомогательный алгоритм f1. Перед началом алгоритма (который содержится в 12 исполняемых клетках) выполняется команда Вертуна, находящаяся в розовом поле. Если ответ “да”, то алгоритм выполняется столько раз, сколько указано в синем поле. При этом пустые клетки пропускаются, а команда из розового поля вызывается каждый раз перед очередным циклом выполнения алгоритма f1. Если розовое поле пусто, то ответ “да”. Если синее поле пусто, то цикл выполняется 1 раз. Фактически такой вспомогательный алгоритм был бы аналогичен следующей записи на алгоритмическом языке: нц <синее поле> раз пока <розовое поле> <команды в клетках алгоритма> кц Но такой конструкции в алгоритмическом языке нет. При этом f1 превращается в аналог конструкции “если”, в случае пустого повторителя (пустое синее поле) или единичного повторителя, и алгоритм f1 превращается в цикл “пока”, если условие присутствует (розовое поле), а повторитель равен бесконечности. Упражнение. Вспомните, как построить из f1 цикл N раз. Что же побудит ребенка использовать цикл “пока” (использовать розовое поле)? Дело в том, что в “ПиктоМире” всего 7 повторителей: 1 раз, 2 раза, 3 раза, 4 раза, 5 раз, 6 раз и “до бесконечности”. С таким набором можно дойти до стены, когда до нее 1, 2, 3, 4, 5 или 6 шагов. Но что делать, когда до стены 7 шагов или так много шагов, что ребенку просто не под силу подсчитать их количество? Есть повторитель “бесконечность”, и даже если ребенок еще не освоился с этим понятием, то, перебрав немногочисленные варианты создания программ в “ПиктоМире”, он обязательно попробует и вариант с повторителем “бесконечность” в синей клетке и нужным условием в розовой клетке. Это и будет созданный ребенком (осознанно) цикл “пока”. Графический язык “ПиктоМира” сильнее побуждает ребенка к изобретению цикла “пока”, чем алгоритмический язык “КуМира”. Дело в том, что при “возне” с “ПиктоМиром” ребенок сильно ограничен в выборе средств. “ПиктоМир” весь на ладони, а алгоритмический язык можно изучать долго. В “ПиктоМире” можно быстро перебрать все варианты программирования, а поскольку среди них есть и цикл “пока”, то удастся открыть и его. Отличие “КуМира” от “ПиктоМира” подобно отличию шахмат от шашек. Про последние известный американский писатель Эдгар Аллан По в детективном рассказе “Убийство на улице Морг” написал так: “Между тем здесь (в шахматах. — Прим. ред.) решает внимание. Стоит ему ослабеть, и вы совершаете оплошность, которая приводит к просчету или поражению. А поскольку шахматные ходы не только многообразны, но и многозначны, то шансы на оплошность соответственно растут, и в девяти случаях из десяти выигрывает не более способный, а более сосредоточенный игрок. Другое дело шашки, где допускается один только ход с незначительными вариантами; здесь шансов на недосмотр куда меньше, внимание не играет особой роли и успех зависит главным образом от сметливости. ...Очевидно, здесь (при равных силах) победа зависит от удачного хода, от неожиданного и остроумного решения6”. 1 Существовала и более глубокая причина, по которой мы наделили Робота диаметрально противоположными парами команд-вопросов. Когда-то в алгоритмическом языке нельзя было размещать частицу не внутри имени команды. В те времена из-за этого пришлось бы использовать полностью нечитаемые с точки зрения русского языка выражения типа “не клетка закрашена” или “не сверху свободно”. В современной версии языка подобные выражения записываются существенно более нормально: “клетка не закрашена”, “сверху не свободно”.2 Кушниренко А.Г., Лебедев Г.В., Сворень Р.А. Основы информатики и вычислительной техники. М.: Просвещение, 1990, 1991, 1993, 1996. 3 12 лекций о том, для чего нужен школьный курс информатики и как его преподавать: А.Г. Кушниренко, Г.В. Лебедев. // Методическое пособие. М.: Лаборатория базовых знаний, 2000. 4 К сожалению, назвать алгоритм “Шагать до упора” в “КуМире” нельзя, так как “до” является ключевым словом языка. 5 12 лекций о том, для чего нужен школьный курс информатики и как его преподавать: А.Г. Кушниренко, Г.В. Лебедев. // Методическое пособие. М.: Лаборатория базовых знаний, 2000. 6 Эдгар По. Рассказы. Авторский сборник. М.: Художественная литература, 1980.
Ан. Ге. Кушниренко ;
| |||||||||||||||||||||||||