Главная → Уроки → Информатика 8 класс

§ 5.5. Программирование циклических алгоритмов

Прочитай параграф о циклах на Python — операторах while и for, функции range, выходе из цикла через break и вложенных циклах — и ответь на 10 вопросов.

Не получается разобраться? Бесплатный ИИ-репетитор по информатике 8 класс разберёт ошибку по шагам и не даст списать.

Представьте программу, которая должна напечатать сто строк или сложить все числа, сколько бы их ни набрал пользователь. Писать одну команду сто раз подряд никто не станет, а во втором случае число повторений даже неизвестно заранее. Для таких задач в языке есть операторы цикла — команды, которые записывают конструкцию «повторение»: они велят машине повторять одну группу операторов, тело цикла, столько раз, сколько нужно. В Python операторов цикла два, while и for, и ими записывают все виды циклов: цикл ПОКА, цикл ДО и цикл ДЛЯ.

Оператор while

Оператор while записывает цикл ПОКА, у которого задано условие продолжения. Первая строка — слово while, условие и двоеточие, а под ней со сдвигом вправо идёт тело:

while условие: тело цикла

Условие здесь такое же логическое выражение, как в операторе if: сравнение или несколько сравнений, связанных словами and, or и not. Python находит его значение перед каждым проходом. Если вышло True, тело выполняется целиком, и всё начинается снова с проверки. Если вышло False, цикл окончен и программа идёт к первой строке после тела — к той, что стоит на уровне самого while. Тело, как и блок ветвления, образуют строки с одинаковым сдвигом под строкой с двоеточием. Последовательность «проверка, затем тело» изображена на рисунке 1 слева.

Две блок-схемы рядом. Слева цикл while: сверху ромб «условие», стрелка «да» ведёт вниз в прямоугольник «тело цикла», от него линия возвращается вверх, ко входу ромба, а стрелка «нет» уходит из цикла к надписи «дальше». Справа цикл while True с break: сначала прямоугольник «тело цикла», под ним ромб «условие окончания»; стрелка «нет» возвращается вверх, ко входу тела, а стрелка «да» подписана break и уходит к надписи «дальше»
Рис. 1. Цикл while проверяет условие перед телом, а while True с break — после тела.

Дано: программа узнаёт, сколько раз введённое число можно разделить на 2 без остатка, а пользователь набрал 48.

n = int(input('Введите число: ')) k = 0 while n % 2 == 0: n = n // 2 k += 1 print(k, n)

Решение. 48 — чётное, тело выполняется: n = 24, k = 1. Затем n принимает значения 12, 6 и 3, и после каждого прохода k увеличивается на 1. При n = 3 остаток от деления на 2 равен 1, условие ложно, и цикл заканчивается.

Ответ: 4 3.

Запись k += 1 — сокращение для k = k + 1. Переменную, которая так считает проходы, называют счётчиком, а перед циклом её обнуляют.

Ни разу или бесконечно

У оператора while есть два свойства, о которых надо помнить. Первое: если условие ложно уже при первой проверке, тело не выполнится ни разу. Наберите в той же программе 45 — и на экране сразу будет 0 45, ведь нечётное число на 2 не делится.

Второе: если условие никогда не станет ложным, цикл будет работать бесконечно, то есть программа зациклится. Поэтому тело обязано менять то, от чего зависит условие. Ловушка есть даже в нашей программе: при вводе 0 проверка 0 % 2 == 0 истинна каждый раз, потому что 0 // 2 снова равно 0. Такую программу приходится останавливать вручную, командой среды разработки.

Без while не обойтись, когда число повторений нельзя узнать до начала цикла. Вклад каждый год растёт в a раз; через сколько лет он хотя бы удвоится?

a = float(input('Введите годовой множитель: ')) y = 1 k = 0 while y < 2: y = y * a k += 1 print('Лет:', k)

При a = 1.1 вклад после первого года равен 1.1 от начального, после второго — 1.21, и только после восьмого года он впервые станет не меньше 2. Программа напечатает Лет: 8, хотя заранее этого числа в ней нет нигде.

Ввод до нуля

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

rekord = 0 k = 0 a = int(input()) while a != 0: if a > rekord: rekord = a k += 1 a = int(input()) print(k, rekord)

Ввод здесь записан дважды: перед циклом и последней строкой тела. Благодаря этому любое прочитанное число сначала проходит проверку a != 0 в заголовке и только потом сравнивается с рекордом, так что ноль с рекордом не сравнивается никогда.

Хочешь больше времени в телефоне?

В Family Track телефон открывается за уроки: прочитал параграф, сдал тест и получил минуты. Сколько минут стоит урок, решают родители. Отправь им ссылку, пусть посмотрят.

Отправить родителямПройти урок бесплатно

Вопросы из теста

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

Какие значения по очереди примет параметр i в цикле for i in range(6, 30, 6)?

Что напечатает программа ниже? Каждое число на экране стоит в своей строке, здесь они перечислены через запятую.

Не получается разобраться? Бесплатный ИИ-репетитор по информатике 8 класс разберёт ошибку по шагам и не даст списать.

← § 5.4. Программирование разветвляющихся алгоритмов