Арифметическая операция в Scratch между числом и строкой


Многим знаком Scratch – детская среда программирования, обучение в которой обычно сводится к созданию творческих проектов по принципу «от простого к сложному». При этом «классический подход» к изучению программирования (переменные > ветвления > циклы > функции > структуры > объекты > …) в Scratch затруднителен.

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

Первым, с чем сталкивается начинающий скретчер, являются спрайты. Хотя в Scratch как такового объектно-ориентированного программирования нет, спрайты можно считать объектами. На этом этапе обучающийся видит, что в программе может быть множество объектов, поведением которых управляют внешние для них скрипты. Спрайты получают команды или по требованию передают информацию о своем состоянии, то есть программирование сводится к управлению объектами.

Вторым, что в Scratch сразу сваливается на голову юного программиста, является понятие о многопоточности. Каждый спрайт может иметь по несколько скриптов, выполняемых одновременно. Несколько спрайтов также могут выполнять свои программы одновременно друг с другом. Причем оказывается сложнее организовать последовательное выполнение.

Одновременное выполнение скриптов


Последовательное выполнение


Уже на первом занятии мы не можем избежать знакомства с циклами. Иначе кот особо не разбежится. На этом этапе знакомство приходится оставлять интуитивным и поверхностным. Мы ограничиваем его циклами «повторять всегда» и «повторить … раз», которые более просты для понимания. Цикл с условием изучается в уроке, специально посвященном циклам. Этот урок предполагает знание логических выражений и переменных.

Поскольку Scratch событийно-ориентированная среда, блоки условного оператора удобнее изучить до переменных. Условием могут выступать те или иные события.

Условный оператор, в котором логическим выражением выступает событие


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

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

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

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

Строковая переменная в арифметической операции


Scratch реализован так, чтобы в процессе выполнения не возникало критических ошибок. Видимо поэтому, если попытаться использовать строку в арифметической операции, она заменяется нулем (см. первый скрин).

Программист должен знать, что возможности языков программирования расширяются библиотеками. Работая в Scratch, ученик может подключать дополнения, которые приводят к появлению в среде новых команд.

Расширения в Scratch


Функции в Scratch реализованы в разделе «Другие блоки», где с одной стороны вы создаете собственный блок, который можно вставлять в другие скрипты. С другой стороны – должны собрать функциональность этого блока, то есть то, что он будет делать.

Определение и вызов функции


Возврата значении из скретч-функции нет.

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

Комментарии (9)


  1. FForth
    15.03.2019 21:30

    Знакомы ли Вам проекты языка программирования Форт (Forth) на базисе языка Scratch
    и если да, то что Вы об этом думаете?
    Примеры таких проектов с Github:
    ikforth is an idiomatic Forth implementation written from scratch.
    MOBLuSE_FORTH — a Forth (programming language) in Scratch 2 for Scratch.MIT.Edu


    1. plustilino Автор
      15.03.2019 22:32

      Не знакомы. Как нибудь посмотрю.


  1. akryukov
    15.03.2019 21:31

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


    Хотя в Scratch как такового объектно-ориентированного программирования нет, спрайты можно считать объектами.

    Думаю тут лучше подойдёт термин "формальный исполнитель" вместо "объект".
    Объекты из ООП это все таки уже про абстрактные типы данных: упаковка множества значений в одну переменную, скрытие состояния, операции над скрытым состоянием.
    Формальный исполнитель имеет особенность по сравнению с объектами — он может "если касается края, оттолкнуться". То есть он может получать информацию о внешнем мире. В ООП обычно наоборот — объект знает только о себе, а мир — о себе. При этом объекту давать знания о мире нельзя — нарушит SRP. Придется заводить менеджер передвижения и отталкивания.


    Причем оказывается сложнее организовать последовательное выполнение.

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


    Условием могут выступать те или иные события.

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


    1. plustilino Автор
      15.03.2019 22:56

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


      App Inventor ( ru.wikipedia.org/wiki/App_Inventor ) хотя тоже позиционируется как продукт для подростков, но насколько знаю там некоторые взрослые реальные приложения под андроид запиливают.

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


      Согласна, что просто понятие многопоточности не сложное. В скретч она как бы по умолчанию, как данность. Возможно по внутренней реализации к настоящей многопоточности отношения не имеет. Но обратить на нее внимание ученика следует, так как в реальном программировании — это важная тема. А в Scratch он сразу видит, что два скрипта выполняются одновременно.

      В вашем примере в условии было «мышь нажата». Это не столько событие, сколько состояние внешнего мира.

      Формально «мышь нажата» — логическое выражение. Либо правда, либо ложь. Неформально — вопрос: «Мышь нажата?».


    1. nomadmoon
      16.03.2019 02:29

      Для взрослых пытались делать Visual Age for Java

      Заголовок спойлера
      image


      1. FForth
        16.03.2019 10:27

        LabView используется в промышленности, не говоря о графических языках для ПЛК.

        Из развиваемых сообществами HiAsm и FlProg но это не совсем классическое понимание программирования.
        Для контроллеров AVR кто то ещё использует Algorithm Builder Здесь форумная тема его применения — это уже улучшенный вариант ассемблера в блок-схемном исполнении.

        P.S. В качестве блок-схемного отображения может быть использован «язык» Дракон :)


        1. akryukov
          16.03.2019 10:44

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


        1. phaggi
          16.03.2019 10:49

          С «Драконом» всё непросто. Он, с одной стороны, очень строгий и поэтому уменьшает шанс на ошибку в алгоритме; а с другой стороны — он, как мне показалось, заточен под написание простых программ. Мне совершенно не понятно, как на нём сделать что-то реально сложное; как там работать со структурами и объектами; видимо, в этом направлении Дракон требует доработки. Я уж не говорю о попытке автоматического превращения схем Дракона в код…