При изучении алгоритмов используется графический способ их описания при помощи блок-схем. Данный способ имеет ряд преимуществ перед словесной записью, но позволяет ли он понятно объяснить материал?
Обратить внимание на блок-схемы меня заставил следующий простой пример на языке MVPL (Microsoft Visual Programming Language).
Здесь есть блок данных, блоки переменных, условия и блок действия по изменению данных для переменной. Но что такое Merge? Рассмотрим блок-схему.
Как вы уже догадались, на рисунке показан цикл, в котором точка слияния стрелок как раз и является виджетом Merge. Всё понятно, но как данные из блока "Test = Test + 1" попадают в точку Merge, а данные из ветки "да" в конец алгоритма? Очень просто - при помощи опущенных на схеме операторов goto. Считается так, если последовательность прохождения блоков нарушена, то там неявно стоит оператор goto, о чём все и всегда должны помнить. Не напоминает ли это вам ситуацию с дорожными знаками и другими случаями из жизни, когда проблемы случаются как раз именно из-за того, что одни поленились что-то обозначить явно (например, яму), а вторые забыли или не успели вспомнить то, что может быть в отсутствии обозначений?
Итак, рассмотренная блок-схема показывает циклический алгоритм до появления циклов. Экскурс в историю полезен, но вызывает недоумение другое. Блоки для обозначения начала и конца цикла есть в ГОСТ 19.701-90. Введён он был в 1992 году, переиздан в 2010 году. До него действовал ГОСТ 19.002-80 от 1981 года, в котором блоков для обозначения цикла не было. Получается так, что до сих пор в современных учебниках показаны блок-схемы по стандарту, введённому 37 лет назад и никто не соизволил привести их хотя бы к более новому стандарту. Не в этом ли кроется одна из причин того, что далеко не все и не сразу начинают понимать то, что есть циклы, когда дело доходит до программирования?
Показанную блок-схему можно назвать отладочной, но для этого нужно продемонстрировать пошаговую отладку программы.
Использование обозначения блоков начала и конца цикла по обновлённому ГОСТу кажется подходящим решением, но для большей наглядности лучше показать эквивалентную последовательность всех операций в цикле, поместив последний в пунктирную рамку.
Таким способом невозможно показать циклы с большим количеством итераций, но для объяснения сущности цикла это и не требуется. Данная схема также наглядно показывает и то, сколько операций пришлось бы каждый раз выписывать, если бы не существовало ни циклов, ни оператора goto.
Вывод из всего сказанного простой: проблема заключается не в самих блок-схемах, а в том, как они используются для объяснения материала.
Вы хотите увидеть использование блок-схем на практике? Пожалуйста. На странице flowgorithm.org можно загрузить приложение для преобразования блок-схем в код для языков, показанных ниже.
Работать с программой крайне просто. Через 5 минут после её установки без особого труда у меня получилось создать работающую блок-схему для нашего примера, а также получить её код на JavaScript.
Как видите, оформление блок-схемы отличается от того, что можно встретить в литературе, но думаю, что данная программа будет не лишней как при изучении блок-схем, так и при поиске их практического применения.