§ 5. Оператор цикла

5.1. Оператор цикла с предусловием

Алгоритмическая конструкция повторение (цикл) представляет собой последовательность действий, выполняемых многократно. Саму последовательность называют телом цикла (форзац 1).

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

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

Цикл с предусловием используется в том случае, когда известно условие продолжения работы. Для записи цикла с предусловием в Python используется команда while. Формат записи команды:

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

Строка while <условие>: является заголовком цикла. Эту строку можно прочитать следующим образом: «Пока верно условие, делай». Команды тела цикла записываются со сдвигом относительно заголовка цикла.
Пример 5.1. Написать программу для рисования ряда окружностей радиуса 10 пикселей вдоль верхнего края графического окна.

Этапы выполнения задания.

I. Исходные данные: результат работы программы не зависит от исходных данных.
II. Результат: рисунок, отображающий ряд окружностей вдоль верхнего края графического окна размером 440 × 80.
III. Алгоритм решения задачи:
1. Первую окружность расположим в верхнем левом углу. Eё радиус r = 10 и координаты центра — x = –200, y = 15.
2. Положение любой другой окружности, удовлетворяющей условию задачи, будет зависеть от координаты x. В цикле будем изменять значение x, увеличивая его на 20 (размер диаметра).
3. Цикл должен завершиться, когда значение x станет равным 200.
IV. Описание переменных: x, y, r — int.

5.2. Оператор цикла с параметром

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

for i in range (N1, N2, h):
тело цикла

Строка for i in range (N1, N2, h): является заголовком цикла. Эту строку можно прочитать следующим образом: «Для переменной i в диапазоне от N1 до N2 с шагом h делай». Переменную i называют переменной (параметром) цикла. Одно выполнение тела цикла называют итерацией цикла. При каждой итерации цикла значение переменной i будет изменяться на величину h, пока не достигнет значения N2. При i = N2 цикл не выполняется. Значение h может быть положительным или отрицательным целым числом, но не может равняться нулю. Функция range может иметь от одного до трёх параметров. Если параметров два, то значение h = 1. Если параметр один, то N1 = 0, h = 1.

Пример 5.2. Написать программу для вывода таблицы умножения на заданное число x.

Этапы выполнения задания.

I.  Исходные данные: x (введённое число).
II.  Результат: 9 строк вида a * x = c.
III.  Алгоритм решения задачи:
1.  Значение переменной a изменяется в цикле от 1 до 9.
2.  Значение переменной c = a × x.
3.  Так как количество повторений заранее известно, используем цикл for.
IV.  Описание переменных: x, c — int.

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

5.3. Решение задач с использованием оператора цикла

Пример 5.4. Нарисовать 20 квадратов с общим центром в окне 450 × 450. Длина стороны самого большого квадрата 400, верхний левый угол расположен в точке (–200, 200). Координаты верхнего левого и нижнего правого углов каждого следующего квадрата изменяются на a (a — вводится, a ≤ 10).

Этапы выполнения задания.

I. Исходные данные: a (введённое число).
II. Результат: рисунок, отображающий квадраты.
III. Алгоритм решения задачи:
1. Для рисования квадратов создадим функцию kv, изменив описанную ранее функцию rect. В функции kv будем использовать цикл for, который 4 раза повторяет две команды: рисование линии и поворот вправо на 90°.
2. Первым рисуется самый большой квадрат. Координаты его верхнего левого угла: x1 = –200, y1 = 200; нижнего правого угла: x2 = 200, y2 = –200.
3. Для другого квадрата нужно изменить координаты верхнего левого угла и нижнего правого угла. Для верхнего левого угла абсцисса увеличивается, а ордината уменьшается на значение a. Для правого нижнего — абсцисса уменьшается, а ордината увеличивается также на значение а.
4. Будем использовать цикл for, поскольку задано количество квадратов.
IV. Описание переменных: a, x1, y1, x2, y2 — int.

Пример 5.5*. Вывести на экран наибольшее натуральное число из промежутка [n, m], которое делится на заданное число x.

Этапы выполнения задания.

I.  Исходные данные: n, m (границы промежутка), x (заданное число).
II.  Результат: искомое число или сообщение «нет таких чисел».
III.  Алгоритм решения задачи:
1.  Пусть i — текущее число из промежутка.
2.  Нас интересует наибольшее число из промежутка, поэтому просмотр чисел начнём со значения i = m. На каждом шагу будем уменьшать i на 1.
3.  Цикл завершится, если мы найдём число, делящееся на x без остатка (остаток равен нулю), или просмотрели все числа из промежутка [n, m].
4.  Так как количество повторений заранее неизвестно, используем цикл while.
5.  Если по окончании цикла i = n–1, то нет чисел, удовлетворяющих условию задачи.
IV.  Описание переменных: n, m, x, i — int.

Если условие цикла всегда истинно, то возникает ситуация зацикливания программы. Такая программа будет выполняться до тех пор, пока её выполнение не будет прервано. Для остановки зациклившейся программы в среде VS Code нужно установить курсор в терминал и нажать CTRL + C.

Пример 5.1. 

V. Программа:

from turtle import *

setup(440, 80)
speed(0); hideturtle()

def p(x, y):
      penup(); setpos(x, y)
      pendown(); seth(0)
def fill_circle(x, y, r, c = «»):
      p(x, y — r)
      color(«black», c)
      begin_fill()
      circle(r)
      end_fill()
x = -200; y = 15
r = 10
while x < 200:
      fill_circle(x, y, r);
      x += 20
done()

VI. Тестирование
Запустить программу. Результат:

Условие x < 200 для продолжения работы цикла определяется исходя из ширины графического окна.

Переключим режим ввода цвета на числовой и будем менять значение только одной составляющей цвета (например, красной). Начальное значение — 255 (чистый красный цвет имеет числовые значения (255, 0, 0)).

В цикле будем уменьшать значение красного цвета на 10. Чем меньше значение, тем темнее будет оттенок красного цвета.

Основная часть программы (без вспомогательных алгоритмов).

x = -200; y = 15
r = 10
colormode(255)
c = 255
while x < 200:
      fill_circle(x, y, r, (c, 0, 0))
      x += 20
      c -= 10
done()

Результат работы программы:

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

for _ in range(4).

Для параметра цикла i, заданного командой for i in range (N1, N2), выполняется неравенство:

N1 ≤ i < N2.

Другими словами, i больше или равен значению N1 и строго меньше значения N2.

Цикл for может быть заменён на цикл while. Замена происходит следующим образом:

Пример 5.2.

V Программа:

x = int(input(«введи x = «))
for a in range(1, 10):
      c = a * x
      print(a, ‘*’, x, ‘=’, c)

VI. Тестирование программы.
Запустить программу и ввести значение x = 7. Результат:

Решение задачи 5.2 можно записать с помощью цикла while:

x = int(input(«введи x = «))
a = 1
while a < 10:
      c = a * x
      print(a, ‘*’, x, ‘=’, c)
      a +=

VII. Проверить, что результат не изменился.

Пример 5.3. Пример использования break и continue.

for n in range(10):
     if n == 3:
     # Пропустить 3
         continue
if n == 7:
     # Остановить при 7
         break
     print(n)

Пример 5.4.

V. Программа:

from turtle import *

setup(450, 450)
speed(0); hideturtle()

def p(x, y):
     penup(); setpos(x, y)
     pendown(); seth(0)
# функция рисования квадрата
def kv(x1, y1, x2, y2, c = «»):
     p(x1, y1)
     d = abs(x2 — x1)
     color(«black», c)
     begin_fill()
      for _ in range(4):
           fd(d); rt(90)
      end_fill()
a = int(input(«введи а = «))
x1 = -200; y1 = 200
x2 = 200; y2 = -200
for _ in range(20):
     kv(x1, y1, x2, y2)
     x1 += a; y1 -= a
     x2 -= a; y2 += a
done()

VI. Тестирование программы.
Запустить программу и ввести значение a = 10. Результат:

При значениях а > 10 на рисунке появятся лишние квадраты. Подумайте почему.

Пример 5.5.

V Программа:

n = int(input(«n = «))
m = int(input(«m = «))
x = int(input(«x = «))
i = m
while i>=n and i % x !=0:
      i -= 1
if i == n — 1:
      print(«нет таких чисел»)
else:
      print(«искомое число — «,i)

VI. Тестирование программы.
Запустить программу и ввести значения n = 10, m = 20, x = 3. Результат:

Запустить программу и ввести значения n = 38, m = 45, x = 37. Результат:

1.  Что такое оператор цикла?
2.  Каким образом можно управлять количеством выполнений тела цикла?
3.  Как записывается оператор цикла с предусловием?
4.  Как записывается оператор цикла с параметром?

Упражнения

1. Измените программу из примера 5.1.

1.  Радиусы окружностей равны 20 пикселям.
2.  Окружности располагаются вдоль левого края окна.
3.  Радиус окружности вводится пользователем.
4.  Окружности образуют рамку вокруг окна.
5*.  Пользователь задаёт границу окна, вдоль которой будут располагаться окружности (например: 1 — верхняя, 2 — левая, 3 — правая, 4 — нижняя).

2. Какие изменения нужно внести в программу из примера 5.1 для того, чтобы рисунок выглядел следующим образом?

3. Внесите изменения в программу из примера 5.2. Пользователь задаёт значение второго множителя, а также начальное и конечное значения первого множителя.

4. Напишите программу для вывода квадратов чисел (по аналогии с примером 5.2).

  1. Натуральные числа, меньшие значения a.
  2. Целые числа от –a до a.
  3. Числа в заданном диапазоне от a до b с шагом h.

5. При каком максимальном значении a на экране будут видны все 20 квадратов из примера 5.3? Что происходит при больших значениях a? Измените программу так, чтобы квадраты рисовались от самого маленького к самому большому.
6. Какие изменения нужно внести в программу из примера 5.4, чтобы получить следующее изображение? Изменение интенсивности цвета смотрите в примере 5.1.
7. Измените программу из примера 5.4. Длина стороны самого большого квадрата 400,
а длина стороны каждого следующего квадрата на x меньше (x вводится).
8. 
Напишите программу, которая рисует ряд окружностей заданного радиуса, расположенных по диагонали графического окна. Рассмотрите два варианта:

1. Графическое окно квадратное.
2*. Графическое окно прямоугольное.

9. Напишите программу, которая рисует концентрические окружности с центром в середине графического окна. Радиус самой маленькой окружности — 10 пикселей. Разница радиусов — 20 пикселей. Количество окружностей вводится.
* Используйте изменение интенсивности какого-либо цвета (или двух одновременно) для заливки кругов.
10. В магазине продают конфеты в упаковках по 0,1 кг, 0,2 кг, …, 0,9 кг, 1 кг. Известно, что 1 кг конфет стоит х р. Выведите стоимости каждой упаковки в виде:

0,1 кг конфет стоит … р.
0,2 кг конфет стоит … р. …

11*. Выведите на экран наименьшее натуральное число из промежутка [n, m], которое является нечётным и не делится на введённое значение x.

Проверь себя