Урок №28. Цикл с условием.
До этого мы писали программы, в которых каждая команда выполнялась только один раз или не выполнялась вообще. Но мощь компьютера состоит ещё и в том, что короткая программа может выполнять очень сложную и длительную обработку данных, применяя некоторые команды многократно.
Цикл — это многократное выполнение одинаковых действий.
Поскольку цикл связан с повторением, циклические алгоритмы называют итерационными (от лат. iteratio — повторение). Каждое выполнение тела цикла называют итерацией.
Допустим, мы хотим вывести 5 раз на экран слово «привет». Можно, конечно, записать 5 одинаковых команд:
print( "привет" )
print( "привет" )
print( "привет" )
print( "привет" )
print( "привет" )
Но если нужно будет сделать какие-то действия 1000 или 1 000 000 раз? В этом случае можно организовать цикл. Простейший цикл, нужный нам в этой задаче, мы хотели бы записать так:
# сделай 5 раз:
print( «привет» )
К сожалению, в Python (как и во многих других языках программирования) такого цикла нет. Однако можно запрограммировать те же действия немного по-другому. Давайте разберёмся, как можно организовать цикл на языке Python.
Вы знаете, что программа выполняется автоматически. И при этом в любой момент нужно знать, сколько раз уже выполнен цикл и сколько ещё осталось выполнить. Для этого необходимо использовать ячейку памяти (переменную). В ней можно, например, запоминать количество завершённых итераций цикла. Такая переменная целого типа часто называется счётчиком.
Сначала в переменную-счётчик записывают ноль (ни одной итерации не сделано), а после каждой итерации цикла увеличивают значение на единицу:
count = 0
while count < 5: # заголовок цикла
print( "привет" )
count += 1 # увеличение счётчика
В этой программе используется новое служебное слово while (в переводе с английского — «пока»), после которого записано условие.
Все операторы, которые выполняются в цикле (они называются телом цикла), сдвигаются вправо на одинаковое число позиций, так же как и в условном операторе. Этот приём позволяет обойтись без операторных скобок, ограничивающих тело цикла в других языках программирования.
Нам нужно выполнять цикл 5 раз, т. е. пока счётчик не станет равен 5. Об этом говорит заголовок цикла
while count < 5:Его можно прочитать как «делай, пока count < 5».
После каждой итерации цикла переменная count увеличивается на 1 — цикл выполнен ещё один раз. Если программист забудет написать этот оператор, произойдёт зацикливание: программа никогда не остановится, потому что условие count < 5 никогда не станет ложным.
Цикл можно построить и по-другому: сразу записать в счётчик нужное количество итераций, и после каждой итерации цикла уменьшать счётчик на 1. Тогда цикл должен закончиться при нулевом значении счётчика:
count = 5
while count > 0: # заголовок цикла
print( "привет" )
count -= 1 # уменьшение счётчика
Этот вариант несколько лучше, чем предыдущий, поскольку счётчик сравнивается с нулём, а такое сравнение выполняется в процессоре автоматически.
Цикл, в котором проверка условия выполняется при входе (перед выполнением очередной итерации) называется циклом с предусловием, т. е. циклом с предварительной проверкой условия. Перед тем как начать выполнение цикла, мы проверяем, нужно ли это делать вообще.
Все циклы, записанные в начале параграфа, — это циклы с предусловием. У них есть два важных свойства:
- условие проверяется при входе в цикл, поэтому тело цикла не выполнится ни разу, если условие в самом начале ложно;
- когда при очередной проверке условия в заголовке цикла выясняется, что это условие ложно, работа цикла заканчивается.
Пример
Рассмотрим ещё одну задачу, которая решается с помощью цикла с условием. Требуется ввести с клавиатуры натуральное число и найти сумму цифр его десятичной записи. Например, если ввели число 123, программа должна вывести сумму 1 + 2 + 3 = 6.
Сначала составим алгоритм решения этой задачи. Предположим, что число записано в переменной N. Нам нужно как-то разбить число на отдельные цифры.
Текущую цифру числа будем хранить в переменной digit.
Вспомним, что остаток от деления числа на 10 равен последней цифре его десятичной записи. Запишем эту цифру в переменную digit:
digit = N % 10Сумму цифр будем хранить в целой переменной summa. В самом начале, пока ни одну цифру ещё не обработали, значение этой переменной равно нулю:
summa = 0Для того чтобы добавить к предыдущей сумме новую цифру, нужно заменить значение переменной summa на summa+digit, т. е. выполнить присваивание
summa += digitДля того чтобы получить следующую цифру числа, надо затем отсечь последнюю цифру числа N. Для этого разделим N на 10 (основание системы счисления):
N = N // 10Эти три операции — выделение последней цифры числа, увеличение суммы и отсечение последней цифры — нужно выполнять несколько раз, пока все цифры не будут обработаны (и отсечены!) и в переменной N не останется ноль:
N = int( input( "Введите число: " ) )
summa = 0
while N != 0:
digit = N % 10
summa += digit
N = N // 10
print("Сумма цифр", summa)
Выполним трассировку (ручную прокрутку) программы при N = 15. В столбцы таблицы будем записывать изменение значений всех переменных:

Для введённого числа 15 программа выведет ответ 6 (последнее значение переменной summa).
В отличие от предыдущего примера здесь количество итераций цикла заранее неизвестно, ведь оно определяется введённым числом (точнее — количеством цифр в его десятичной записи).
Докажем, что эта программа не зациклится, т. е. не будет работать бесконечно. Цикл завершается, когда переменная N становится равна нулю, поэтому нужно доказать, что это обязательно случится. По условию заданное число — натуральное, на каждой итерации цикла оно делится на 10 (остаток отбрасывается). В результате после очередного деления оно обязательно станет равно нулю.