Как сделать бесконечный цикл

Операторы цикла в языке Си

Рассмотрим третью алгоритмическую структуру — цикл.
Циклом называется блок кода, который для решения задачи требуется повторить несколько раз.

Каждый цикл состоит из

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

В языке Си следующие виды циклов:

Цикл с предусловием while

Общая форма записи

Пример на Си : Посчитать сумму чисел от 1 до введенного k

Пример бесконечного цикла

while — цикл с предусловием, поэтому вполне возможно, что тело цикла не будет выполнено ни разу если в момент первой проверки проверяемое условие окажется ложным.

Например, если в приведенном выше коде программы ввести k=-1, то получим результат
Как сделать бесконечный цикл. Смотреть фото Как сделать бесконечный цикл. Смотреть картинку Как сделать бесконечный цикл. Картинка про Как сделать бесконечный цикл. Фото Как сделать бесконечный цикл

Цикл с постусловием do. while

Общая форма записи

Использовать цикл do. while лучше в тех случаях, когда должна быть выполнена хотя бы одна итерация, либо когда инициализация объектов, участвующих в проверке условия, происходит внутри тела цикла.

Результат выполнения:
Как сделать бесконечный цикл. Смотреть фото Как сделать бесконечный цикл. Смотреть картинку Как сделать бесконечный цикл. Картинка про Как сделать бесконечный цикл. Фото Как сделать бесконечный цикл

Параметрический цикл for

Общая форма записи

for — параметрический цикл (цикл с фиксированным числом повторений). Для организации такого цикла необходимо осуществить три операции:

Эти три операции записываются в скобках и разделяются точкой с запятой ; ;. Как правило, параметром цикла является целочисленная переменная.
Инициализация параметра осуществляется только один раз — когда цикл for начинает выполняться.
Проверка Условия повторения цикла осуществляется перед каждым возможным выполнением тела цикла. Когда выражение, проверяющее Условие становится ложным (равным нулю), цикл завершается. Модификация параметра осуществляется в конце каждого выполнения тела цикла. Параметр может как увеличиваться, так и уменьшаться.

Пример на Си : Посчитать сумму чисел от 1 до введенного k

Результат выполнения
Как сделать бесконечный цикл. Смотреть фото Как сделать бесконечный цикл. Смотреть картинку Как сделать бесконечный цикл. Картинка про Как сделать бесконечный цикл. Фото Как сделать бесконечный цикл
В записи цикла for можно опустить одно или несколько выражений, но нельзя опускать точку с запятой, разделяющие три составляющие цикла.
Код предыдущего примера можно представить в виде

Параметры, находящиеся в выражениях в заголовке цикла можно изменить при выполнении операции в теле цикла, например

Вложенные циклы

В Си допускаются вложенные циклы, то есть когда один цикл находится внутри другого:

Пример : Вывести числа от 0 до 99, по 10 в каждой строке

Результат выполнения
Как сделать бесконечный цикл. Смотреть фото Как сделать бесконечный цикл. Смотреть картинку Как сделать бесконечный цикл. Картинка про Как сделать бесконечный цикл. Фото Как сделать бесконечный цикл

Рекомендации по выбору цикла

При выборе цикла необходимо оценить необходимость проверки условия при входе в цикл или по завершении прохождения цикла.
Цикл с постусловием удобно применять в случаях, когда для проверки условия требуется вычислить значение выражения, которое затем будет размещено в теле цикла (см. выше пример ввода числа от 0 до 10).
Цикл c предусловием используется в случае если все переменные, участвующие в выражении, проверяющем условие, проинициализированы заранее, но точное число повторений цикла неизвестно или предполагается сложная модификация переменных, участвующих в формировании условия повторения цикла.
Если цикл ориентирован на работу с параметром, для которого заранее известно число повторений и шаг изменения, то более предпочтительным является параметрический цикл. Очень удобно использовать параметрический цикл при работе с массивами для перебора элементов.

Операторы прерывания и продолжения цикла break и continue

Оператор break позволяет выйти из цикла, не завершая его.
Оператор continue позволяет пропустить часть операторов тела цикла и начать новую итерацию.

Пример на Си : Вывести числа от 0 до 99 ниже главной диагонали

Результат выполнения
Как сделать бесконечный цикл. Смотреть фото Как сделать бесконечный цикл. Смотреть картинку Как сделать бесконечный цикл. Картинка про Как сделать бесконечный цикл. Фото Как сделать бесконечный цикл

Пример на Си : Вывести числа от 0 до 99 исключая числа, оканчивающиеся на 5 или 8

Результат выполнения
Как сделать бесконечный цикл. Смотреть фото Как сделать бесконечный цикл. Смотреть картинку Как сделать бесконечный цикл. Картинка про Как сделать бесконечный цикл. Фото Как сделать бесконечный цикл

При вложенных циклах действия операторов break и continue распространяется только на самую внутреннюю структуру, в которой они содержатся.

Оператор безусловного перехода goto

Общая форма записи

Пример на Си : Вывести все целые числа от 5 до 0.

Источник

Цикл while в Python

Из этого материала вы узнаете, что такое циклы while, как они могут становиться бесконечными, как использовать инструкцию else в цикле while и как прерывать исполнение цикла.

Управление потоком инструкций: цикл While в Python

Как и другие языки программирования Python включает несколько инструкций для управления потоком. Одна из таких — if else. Еще одна — циклы. Циклы используются в тех случаях, когда нужно повторить блок кода определенное количество раз.

Что такое цикл while в Python?

Цикл while используется в Python для неоднократного исполнения определенной инструкции до тех пор, пока заданное условие остается истинным. Этот цикл позволяет программе перебирать блок кода.

Сначала программа оценивает условие цикла while. Если оно истинное, начинается цикл, и тело while исполняется. Тело будет исполняться до тех пор, пока условие остается истинным. Если оно становится ложным, программа выходит из цикла и прекращает исполнение тела.

Рассмотрим пример, чтобы лучше понять.

Бесконечный цикл while в Python

Бесконечный цикл while — это цикл, в котором условие никогда не становится ложным. Это значит, что тело исполняется снова и снова, а цикл никогда не заканчивается.

Следующий пример — бесконечный цикл:

Else в цикле while

Этот пример демонстрирует принцип работы else в цикле while.

Прерывания цикла while в Python

В Python есть два ключевых слова, с помощью которых можно преждевременно остановить итерацию цикла.

Источник

Как работает цикл «while» в Python

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

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

Немного информатики

Как было отмечено выше,

Цикл — это управляющая конструкция, которая раз за разом выполняет серию команд (тело цикла) до тех пор, пока условие для выполнения является истинным.

Напишем на псевдокоде классическую схему:

повторять, пока условие начало цикла последовательность инструкций конец цикла

Конструкция начинает свою работу с проверки условия, и, если оно истинно, запускается цикл. На каждой новой итерации (единичный проход по циклу) условие продолжения проверяется вновь. Таким образом, последовательность инструкций будет исполняться до тех пор, пока это условие, наконец, не окажется ложным.

Циклы, как механизм программирования, нужны, главным образом, для упрощения написания кода. Вполне очевидно, что создавать программу, выполняющую определённую операцию для каждой точки 4К дисплея в отсутствии циклов — это вручную повторять описание нужной команды 4096*2160 раз. 🤔 Много? Безусловно.

Применение в этой задаче всего одного цикла позволит сократить длину кода, как минимум, на 6 порядков. А если представить, что ту же самую программу нужно переписать для 8К монитора, то, вместо изменения всего одной инструкции в счетчике цикла, вам придётся дописывать ещё пару десятков миллионов строк кода, что является попросту недопустимым по своей величине и трудозатратам объёмом.

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

Синтаксис цикла while

В самом простом случае, цикл while в python очень похож по своей структуре на условную конструкцию с if :

import time a = 1 if a == 1: print(«I’m the condition») while a == 1: print(«I’m the loop») time.sleep(1)

count = 1 # фиксируем начальное значение while count 1 2 3 4 5 6 7 8 9 10

dayoff = False sunrise = 6 sunset = 18 worktime = 12 # пример составного условия while not dayoff and sunrise You have 6 hours to work You have 5 hours to work You have 4 hours to work You have 3 hours to work You have 2 hours to work You have 1 hours to work Finally it’s over!

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

num = 0 contol = True while num

Стоит иметь в виду, что использование неинициализированной переменной в качестве управляющей цикла обязательно приведёт к возникновению ошибки:

# unknown до этого нигде не была объявлена while unknown: print(‘+’) > Traceback (most recent call last): while unknown: NameError: name ‘unknown’ is not defined

Несколько примеров использования цикла while

Идея циклов while проста: требуется определенное количество раз сделать что-то? Заведи счётчик и уменьшай/увеличивай его в теле цикла.

x = 20 y = 30 while x 20 23 26 29

Своеобразным счётчиком может быть даже строка:

word = «pythonchik» while word: print(word, end=» «) # на каждой итерации убираем символ с конца word = word[:-1] > pythonchik pythonchi pythonch pythonc python pytho pyth pyt py p

break и continue

Оператор break заставляет интерпретатор прервать выполнение цикла и перейти к следующей за ним инструкции:

counter = 0 while True: if counter == 10: break counter += 1

Цикл прервётся после того, как значение счетчика дойдёт до десяти.

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

В реальной практике, else в циклах применяется нечасто. Такая конструкция отлично сработает, когда будет необходимо проверить факт выполнения всех итераций цикла.

👉 Пример из практики : проверка доступности всех выбранных узлов сети

Например, обойти все узлы локальной сети и

В каком-либо другом языке стоило бы завести булеву переменную, в которой хранится результат проверки, но у Python, как всегда, есть способ получше!

while true или бесконечный цикл

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

Однако вы некоторых случая бесконечный цикл делают намерено:

💁‍♂️ Совет : в бесконечных циклах рекомендуется ставить таймаут выполнения после каждой итерации, иначе вы очень сильно нагрузите CPU :

import time while True: print(«Бесконечный цикл») time.sleep(1) > Бесконечный цикл Бесконечный цикл Бесконечный цикл Traceback (most recent call last): File «main.py», line 5, in time.sleep(1) KeyboardInterrupt Aborted!

Best practice

Цикл while в одну строку

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

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

Вложенные циклы

q = 1 while q 1 2 3 4 5 6 7 8 9 2 4 6 8 10 12 14 16 18 3 6 9 12 15 18 21 24 27 4 8 12 16 20 24 28 32 36 5 10 15 20 25 30 35 40 45 6 12 18 24 30 36 42 48 54 7 14 21 28 35 42 49 56 63 8 16 24 32 40 48 56 64 72 9 18 27 36 45 54 63 72 81

Как выйти с помощью break из двух циклов

В случае вложенных циклов, оператор break завершает работу только того цикла, внутри которого он был вызван:

i = 100 j = 200 while i J 200 J 201 J 202 # здесь видно, что внутренний цикл прерывается, но внешний продолжает работу I 100 I 101 I 102 I 103 I 104

В Python не существует конструкций, которая прерывала бы сразу несколько циклов. Но есть как минимум 3 способа, которыми можно реализовать данное поведение:

Способ №2 Через создание дополнительного флага:

Внешний цикл был прерван вслед за внутренним. Дело сделано!

Способ №3 Если циклы находятся в функции (как в нашем примере), достаточно просто сделать return :

Источник

Искусство написания циклов на Python

Как сделать бесконечный цикл. Смотреть фото Как сделать бесконечный цикл. Смотреть картинку Как сделать бесконечный цикл. Картинка про Как сделать бесконечный цикл. Фото Как сделать бесконечный цикл

Цикл for — самый базовый инструмент потока управления большинства языков программирования. Например, простой цикл for на C выглядит так:

Не существует более изящного способа написания цикла for на C. В сложных случаях обычно приходится писать уродливые вложенные циклы или задавать множество вспомогательных переменных (например, как i в показанном выше коде).

Эта статья познакомит вас с самыми полезными трюками по написанию циклов на Python. Надеюсь, она поможет вам ощутить красоту этого языка.

Одновременно получаем значения и индексы

Частым примером использования цикла for является получение индексов и значений из списка. Когда я начинал изучать Python, то писал свой код таким образом:

Разумеется, он работал. Но это решение не в стиле Python. Спустя несколько месяцев я узнал стандартный способ реализации в стиле Python:

Как мы видим, встроенная функция enumerate упрощает нам жизнь.

Как избежать вложенных циклов с помощью функции Product

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

Давайте убедимся в её полезности на простом примере:

Как мы видим, нам требуется три вложенных цикла, чтобы получить из трёх списков три числа, сумма которых равна 2077. Код не очень красив.

Как мы видим, благодаря использованию функции product достаточно всего одного цикла.

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

Используем модуль Itertools для написания красивых циклов

Создаём бесконечный цикл

Существует не меньше трёх способов создания бесконечного цикла:

1. При помощи функции count :

3. Через функцию repeat :

Комбинируем несколько итераторов в один

Функция chain() позволяет объединить несколько итераторов в один.

Выделяем соседние дублирующиеся элементы

Функция groupby используется для выделения соседних дублирующихся элементов в итераторе и их соединения.

Как показано выше, соседние одинаковые символы соединены вместе. Более того, мы можем указать функции groupby способ определения идентичности двух элементов:

Самостоятельно настраиваем цикл

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

Сам встроенный модуль itertools всего лишь реализует за нас самые распространённые функции. Если мы забудем функцию или не сможем найти нужную нам, то можем просто написать её самостоятельно. Если быть более точным, то эти функции являются генераторами. Именно поэтому мы можем генерировать с их помощью бесконечные циклы.

По сути, мы можем настроить цикл for под себя, как сделали бы это с настраиваемым генератором.

Давайте рассмотрим простой пример:

Разумеется, этот пример приведён только для объяснения. Существуют и другие способы выполнения тех же действий, например, использование представления списков.

Вывод

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

На правах рекламы

Надёжный сервер в аренду, создавайте свою конфигурацию в пару кликов и начинайте работать уже через минуту. Всё будет работать без сбоев и с очень высоким uptime!

Источник

Как научить преодолевать трудности, а заодно и писать циклы

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

Тема про циклы выбрана потому, что на ней отсеивается довольно много людей при освоении программирования.

Данная методика рассчитана на слабых студентов. Как правило, сильные на этой теме не застревают и особенных методик для них придумывать не нужно. Второстепенная цель статьи — перевести эту методику из класса «работает на всех студентах, но только у одного преподавателя» в класс «работает у всех студентов, всех преподавателей». На абсолютную оригинальность не претендую. Если вы уже применяете похожую методику для обучения этой теме, напишите, пожалуйста, чем ваш вариант отличается. Если решите применить, расскажите по итогам, как все прошло. Если похожая методика описана в какой-нибудь книжке, напишите, пожалуйста, название.

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

Зачем столько букв? Циклы это же элементарно!

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

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

Кому и зачем я преподаю

Поскольку вступительных экзаменов нет, то на занятиях могут быть как сильные, так и очень слабые студенты. Более подробно о моих студентах можно почитать в статье Портрет слушателей вечерних курсов
Я стремился к тому, чтобы программирование осваивали все, кто этого хочет.
Мои занятия проходят индивидуально и студент платит свои деньги за каждое. Казалось бы, студенты будут оптимизировать затраты и требовать минимум. Однако люди ходят на очные занятия с живым преподавателем не за самими знаниями, а за уверенностью в том что они успели усвоить, за ощущением прогресса и за одобрением от эксперта (преподавателя). Если студенты не будут чувствовать прогресса в своем обучении, они будут уходить. В целом можно построить занятия так, чтобы студенты ощущали прогресс в увеличении количества знакомых конструкций. То есть сначала подробно изучаем while, потом изучаем for, потом do while и вот у нас готов курс на тысячу и одну ночь, в котором два месяца изучаются одни только циклы, а на выходе — студент, который под диктовку написал стандартную библиотеку. Однако для того, чтобы решать практические задачи, нужно не только знание материала, но и самостоятельность в его применении и в поиске новой информации. Поэтому для очных курсов считаю правильным принцип — научить минимуму и поощрять самостоятельное изучение нюансов и смежных тем. В теме про циклы, минимумом я считаю конструкцию while. На ней можно понять принцип. Зная принцип можно освоить и for и do-while самостоятельно.

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

Методика ориентирована на практику

Теория объясняется на примере решения задачи. На занятиях по основам программирования, где изучаются ветвления и циклы, просто не получится устроить полезную лекцию по одной теме на целый час. 15-20 минут хватает, чтобы объяснить концепцию. Основные сложности появляются при выполнении практических заданий.
Начинающие преподаватели могут вывалить операторы, ветвления, циклы и массивы за одну лекцию. Вот только студенты у них столкнутся с проблемой усвоения этой информации.
Нужно ведь не только рассказать материал, но и убедиться, что слушатели его поняли.

Факт усвоения темы определяется по тому, как студент справляется с самостоятельной работой.
Если студенту удалось решить задачу по теме без помощи преподавателя, значит тема усвоена. Чтобы обеспечить самостоятельную проверку, у каждой задачи описывается таблица с тестовыми сценариями. У задач есть ярко выраженный порядок. Пропускать задачи не рекомендуется. Если текущая задача слишком сложная, то к следующей переходить бесполезно. Она ещё сложнее. Чтобы студент мог осилить текущую сложную задачу, ему объясняется несколько приемов на примере первой задачи. Собственно, все содержание темы сводится к приемам преодоления трудностей. Циклы это, скорее, побочный эффект.

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

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

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

While или for?

Один из спорных вопросов — выбор конструкции для примера: while или for. Однажды мой знакомый практикующий разработчик без опыта преподавания целый час убеждал меня, что цикл for — самый простой для понимания. Аргументы сводились к «в нем все понятно и по местам разложено». Однако первопричина затруднений настоящих новичков в самой идее цикла, а не в его написании. Если человек не поймет эту идею, то у него будут затруднения с синтаксисом. Как только идея осознана, то проблемы оформления кода исчезают сами.

В моих материалах тема циклов следует за темой про ветвления. Внешнее сходство if и while позволяет провести прямую аналогию: «когда условие в заголовке истинно, то выполняется тело». Особенность цикла лишь в том, что тело выполняется много раз.

Второй мой аргумент в том, что while требует меньше оформления, чем for. Меньше оформления — меньше глупых ошибок с пропущенными запятыми и скобочками. У новичков еще не настолько развита внимательность и дотошность, чтобы автоматически избегать синтаксических ошибок.
Третий аргумент — во многих хороших книгах while объясняется первым.

Если студенту удается легко преобразовывать выражения, то можно рассказать о for мимоходом. Студент дальше сам выберет что ему больше нравится. Если же преобразования вызывают затруднения, то лучше не рассеивать внимание. Пускай сначала студент решит все с помощью while. Когда тема циклов освоена, можно переписать решения, чтобы отработать преобразование while в for.
Циклы с постусловием — довольно редкий зверь. На него я время не трачу вообще. Если студент освоил идеи выявления закономерностей и преобразования выражений, то сможет разобраться без моей помощи.

При демонстрации первого примера сильным студентам, обращаю внимание на то, что в первом примере важно зафиксировать не только решение, но и всю цепочку действий, которые привели к результату. Ленивые студенты могут пренебречь писаниной и перенести себе только конечный алгоритм. Их нужно убедить в том, что однажды и для них попадется сложная задача. Для ее решения, понадобится идти по шагам как в этом примере. Именно поэтому важно зафиксировать все этапы. В следующих задачах можно будет оставить только финальный вариант решения.

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

Явное лучше неявного

Ура, работает!
Ура, работает!
Ура, работает!
Ура, работает!
Ура, работает!
Ура, работает!
Ура, работает!
Ура, работает!

Такой вариант плох тем, что в выводе не видно значения счетчика. Это проблема для начинающих. Не стоит ее недооценивать. Поначалу эта задача была первой, а задача про вывод ряда чисел по возрастанию — второй. Приходилось вводить дополнительные термины «цикл N раз» и «цикл от A до B», которые по сути одно и то же. Чтобы не плодить лишних сущностей, я решил показывать только пример с выводом ряда чисел. Немногим удается без подготовки научиться держать в голове счетчик и моделировать поведение программы в голове. Некоторые студенты впервые сталкиваются с моделированием «в уме» именно на теме про циклы.
После некоторой практики, задачу на повторение одинакового текста я даю на самостоятельное решение. Если давать сначала видимый счетчик, а потом невидимый, то у студентов возникает меньше проблем. Иногда достаточно подсказки «не пиши счетчик на экран».

Как объясняется у других?

В большинстве учебных материалов в интернете, синтаксис цикла дается в составе «лекции». Например на developer.mozilla.org (в настоящий момент) вместе с циклом while описываются еще несколько конструкций. При этом даются исключительно сами конструкции в виде шаблонов. Результат их запуска описывается словами, а иллюстрация отсутствует. На мой взгляд, такая подача темы умножает на ноль полезность таких материалов. Ученик может переписать код и запустить его сам, но эталон для сравнения все равно нужен. Как понять, что пример переписан правильно, если не с чем сравнить результат?
Когда дается только шаблон, без примера, студенту становится еще сложнее. Как понять, что фрагменты кода расставлены в шаблоне правильно? Можно попробовать написать как-нибудь, а потом запустить. Но если нет эталона для сравнения результата, то запуск тоже не поможет.

В курсе по C++ на интуите синтаксис цикла закопан в третьей странице лекции 4 по теме «операторы». При объяснении синтаксиса циклов делают особый упор на термин «оператор». Термин подается в виде набора фактов вроде «символ; это оператор», «<> это составной оператор», «тело цикла должно быть оператором». Мне такой подход не нравится тем, что он как бы прячет важные взаимосвязи за одним термином. Разбор исходного кода программы на термы на таком уровне нужен разработчикам компиляторов для реализации спецификации языка, но никак не студентам в первом приближении. Новички в программировании редко обладают достаточной дотошностью, чтобы настолько внимательно относиться к терминам. Редкий человек запоминает и понимает новые слова с первого раза. Практически никто не может правильно применить термин, который только что узнал. Поэтому у студентов возникает куча ошибок вроде «написал while(a такт 10
такт 9
такт 8
такт 7
такт 6
такт 5
такт 4
такт 3
такт 2
такт 1

Подход с описанием шаблона, примера программы и результата работы этой программы используется также в книге «Javascript для детей» и в курсе js на w3schools.com. Формат веб-страницы даже позволяет сделать этот пример интерактивным.

В книге Страуструпа «Принципы и практика с использованием C++» 2016 г. автор пошел еще дальше. Первым делом объясняется какой результат должен получиться, а уже после этого — показывают текст программы. Причем в качестве примера берут не просто случайную программу, а дают экскурс в историю. Это помогает обратить внимание на нее «Смотри, это не просто какой то бесполезный текст. Ты видишь что то значимое».

В качестве примера итерации рассмотрим первую программу, выполненную на машине с хранимой программой (EDSAC). Она была написана Дэвидом Уилером (David Wheeler) в компьютерной лаборатории Кэмбриджского университета (Cambridge University, England) 6 мая 1949 года. Эта программа вычисляет и распечатывает простой список квадратов.
0 0
1 1
2 4
3 9
4 16
.
98 9604
99 9801
Здесь в каждой строке содержится число, за которым следуют знак табуляции (‘\t’) и квадрат этого числа. Версия этой программы на языке C++ выглядит так:

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

Как объясняю я сам

На этой задаче мы знакомимся с приемами решения сложных задач. Первоначальное решение нужно сделать примитивно и просто. Ну а затем можно подумать, как улучшить это решение.
Введение
Глава 1
Глава 2
Глава 3
Глава 4
Глава 5
Глава 6
Глава 7
Заключение

По моим наблюдениям, подход «шаблон-пример-результат» в разных комбинациях все равно приводит к тому, что студенты воспринимают цикл как иероглиф. Это проявлялось в том, что они не понимали зачем там писать условие, как выбирать между i++ и i— и прочие вроде бы очевидные вещи. Для избежания этих заблуждений, подход к рассказу о циклах должен подчёркивать смысл повторения одинаковых действий и только потом — оформление их с помощью конструкции. Поэтому прежде чем давать синтаксис цикла, нужно решить задачу «в лоб». Примитивное решение задачи про оглавление выглядит так:

Как его можно улучшить?
Заменить однообразные действия на цикл.
Какие действия тут повторяются подряд без изменений?
В этом фрагменте таких нет. Впрочем команды по выводу слова «Глава» с номером очень похожи друг на друга.
Поэтому следующий этап — поиск разницы между фрагментами. Это только в этой задаче все очевидно, потом повторяться будут не одиночные команды, а блоки кода по 5 строк и более. Искать придется не просто в списке команд, а конструкциях ветвления или цикла.
В примере разница между командами в числе после слова «Глава».
Как только разница найдена, нужно понять закономерность изменения. Отличающийся фрагмент это число? Оно постоянно увеличивается или уменьшается? Как меняется значение числа между двумя командами рядом?
В примере число после слова «Глава» увеличивается с шагом 1. Разница найдена, закономерность выявлена. Теперь можно заменить различающийся фрагмент на переменную.
Объявлять такую переменную нужно перед первым из повторяющихся фрагментов. Такую переменную обычно называют I или j или как-то более развернуто. Её начальное значение должно быть равно первому выводимому на экран значению. В примере первое значение это 1.
Какое начальное значение нужно взять для вывода ряда чисел «100, 101, 102, 103, 104, 105»?
В этом ряду первое число 100.
После каждой команды вывода нужно увеличить значение этой переменной на 1. Эта единица — шаг изменения.
Какой шаг будет в ряду чисел «100, 102, 104, 106»?
В этом ряду шаг 2.
После замены различающегося фрагмента на переменную, код будет выглядеть так:

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

Далее вводится новые термины, чтобы студент не оказался в ситуации «все понимаю, но сказать не могу»:
— счётчик — всегда переменная, которая нужна для отслеживания количества шагов цикла. Обычно целое число, которое сравнивается с ограничением.
— шаг счётчика — описание закономерности изменения счётчика.
— ограничение — число или переменная, с которой сравнивается счётчик, чтобы алгоритм был конечным. Значение счётчика меняется так, чтобы приближаться к ограничению.
— тело цикла — набор команд, которые будут повторяться. Когда говорится «команда написана внутри цикла», то имеют в виду именно тело.
— итерация цикла — однократное выполнение тела цикла.
— условие цикла — логическое выражение, от которого зависит, будет ли выполняться ещё одна итерация. (Тут возможна путаница с конструкциями ветвления)
Нужно быть готовым к тому, что первое время студенты будут применять термины не по назначению. Это относится как к сильным, так и к слабым. Налаживание общего языка это целое искусство. Сейчас напишу кратко: нужно ставить задачу «выдели фрагмент кода с » и самому правильно использовать эти термины в разговоре.
После преобразования с циклом получается фрагмент:

Главное заблуждение

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

Ученики постоянно натыкаются на эту проблему, как в начале, так и в более сложных задачах.
Коронная подсказка в этом случае:

Сколько раз нужно повторять написание команды: один раз или много?

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

В коде должны остаться все три этапа решения, чтобы потом ссылаться на них в случае затруднений. Первые два варианта достаточно закомментировать, чтобы они не мешали.
Внимание студента нужно обратить на следующие факты:
— В условии цикла обычно сравнивается счётчик и ограничение. Счётчик может меняться в теле цикла, а ограничение — нет. Чтобы нарушить это правило, нужно сформулировать веские причины.
— Команды для вывода слов «Введение» и «Заключение» находятся за пределами тела цикла. Нам их нужно выполнить 1 раз. «Введение» — до повторения действий, «Заключение» — после.
В процессе закрепления этой темы, освоения следующих, а также разбирательств с затруднениями даже сильным студентам полезно задавать вопрос: «А вот это действие сколько раз нужно выполнять? Один или много?».

Развитие дополнительных навыков

Чтобы понять, насколько быстро можно двигаться, нужно дать прочитать условия этих задач и спросить: «чем они отличаются от примера?», «Что нужно изменить в примере, чтобы решить их?». Если студент осмысленно отвечает, тогда пусть решит хотя бы одну на занятии, а остальные — дома самостоятельно. Если решение будет успешно, то можно начать объяснение про условия внутри циклов.
Если с самостоятельным решением затруднения, то нужно все отрабатывать на занятии. Чтобы решение задачи не напоминало рисование совы, я рекомендую сначала решить задачу не универсально. То есть так, чтобы решение проходило первый тест и не использовало конструкцию цикла. Ну а потом уже применять преобразования, чтобы добиться универсальности решения.

Циклы и ветвления

На мой взгляд, полезно дать тему «циклы внутри ветвлений» отдельно. Так, чтобы потом было видно разницу между многократной проверкой условия и однократной.
Задачи для закрепления будут про вывод чисел от А до В, которые вводятся пользователем:
— всегда по возрастанию.
— по возрастанию или по убыванию в зависимости от значений А и В.

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

Пользователь вводит число Х. Вывести в столбик числа от 0 до 9 и поставить знак ‘+’ напротив того числа, которое равно Х.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *