Занятие № 4. Решение задач с использованием цикла с известным количеством повторений

Цель: изучить применение цикла for; рассмотреть типовые задачи.

Теория

Цикл с определённым количеством повторений

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

Инструкция цикла for записывается следующим образом:

for <элемент> in <последовательность>:
    <блок инструкций>
graph TD
    A([Начало]) --> G(( ))
    G --> B{Остались элементы?}
    B -- Да --> C[<элемент> = след. элем.]
    C --> D[блок инструкций]
    D --> G
    B -- Нет ---> E([Конец])
Рисунок 1

элемент - переменная цикла. На каждой итерации цикла в переменной цикла будет находится очередной элемент последовательности.

Рисунок 1 содержит диаграмму с ходом работы цикла for.

Строка - это последовательность символов, значит с помощью цикла for можно перебрать все символы в строке. В следующем примере выведем на экран все символы строки Привет, мир:

for letter in "Привет, мир":
    print(letter)

      
for letter in "Привет, мир":
    print(letter)

На каждой итерации данного цикла в переменной letter будет храниться очередная буква из строки Привет, мир. Этот цикл выполнится x ? раз.

Как Python понимает, какие инструкции находятся в теле цикла?


В теле любой блочной инструкции (if, while, for) может быть любое количестве строк. Обязателен лишь одинаковый отступ для инструкций.

В теле цикла может быть больше одной инструкции.

Точка с запятой для этого не используется. Блок инструкций оформляется с помощью одинакового отступа. Однако с помощью ; можно записать несколько инструкций в одной строке:

a = 1; b = 2; print(a + b)

Лучше так не делать и записывать инструкции с новой строки для лучшей читаемости кода.

Создание последовательности целых чисел

Чтобы переменная цикла for принимала значения из последовательности целых чисел, необходимо эту последовательность сгенерировать. Для этого используется функция range().

Функция range() позволяет задавать начальное и конечное значение в последовательности и шаг.

Самый простой вариант использования функции range() - указать только конечное значение.

n = 10
print(list(range(n)))

      
n = 10
print(list(range(n)))

Функция range(10) сгенерирует последовательность чисел от 0 до 9. Иными словами, создаётся последовательность целых чисел от 0 до n-1.

Технические детали

Функция range() не создаёт всю генерируемую последовательность целиком, а лишь возвращает очередной элемент последовательность по запросу. Чтобы получить всю последовательности целиком, нужно преобразовать результат работы функции range() в список с помощью функции list(). В описании цикла for преобразовывать последовательность в список необязательно. Со списками вы познакомитесь на последующих занятиях.

В функции range() можно указать начальное и конечно значение последовательности:

print(list(range(2, 15)))

      
print(list(range(2, 15)))

В этом примере будет создана последовательность целых чисел от 2 до 14.

Если указать третий аргумент при вызове функции он будет считаться шагом изменения значения:

print(list(range(2, 15, 2)))

      
print(list(range(2, 15, 2)))

Все три аргумента должны быть целыми числами, но могут быть как положительными, так и отрицательными числами:

print(list(range(15, 1, -3)))

      
print(list(range(15, 1, -3)))

В итоге, функцию range() можно вызвать с тремя наборами аргументов:

range(<конец>) #от 0 до <конец> - 1
range(<начало>, <конец>) #от <начало> до <конец>-1
range(<начало>, <конец>, <шаг>) #от <начало> до <конец>-1 с шагом <шаг>

Рассмотрим использование функции range(). Выведем на экран квадраты целых чисел от 1 до 10:

for i in range(1, 11):
    sq = i ** 2
    print(i, sq)

      
for i in range(1, 11):
    sq = i ** 2
    print(i, sq)

Функция range(1, 11) создаст последовательность целых чисел от 1 до 10.

Какое число выведется на экран после выполнения следующей программы:

sum_ch = 0
for i in range(4):
    sum_ch = sum_ch + i
print(sum_ch)

Верно. Мы находим сумму чисел от 1 до 3. На каждом шаге цикла к переменной sum_ch прибавляется очередное значение из последовательности [1, 2, 3].

Мы получим 4, если в третьей строке мы прибавляли бы к sum_ch не значение переменной цикла i а единицу. 4 - это количество итераций данного цикла.

Это сумма чисел от 0 до 4. Но функция range(4) создаст последовательность целых чисел от 1 до 3. Число 4 не включается в последовательность.

В этом коде нет синтаксических ошибок.

Break и continue

В цикле for, как и в цикле while можно использовать инструкцию прерывания цикла break и continue - переход к следующей итерации цикла.

Рассмотрим фрагмент кода:

for i in range(10):
    if i % 2 == 0:
        continue
    print(i)

На экран выведутся x нечётные числа из диапазона от 1 до x ? .

Примеры

Пример № 1 (ex01.py)

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

Первый вариант решения:

#ввод числа n
n = int(input("Введите n: "))
#переменная хранящая сумму
s = 0
for i in range(1, n):
    if i % 2 == 0:
        print(i)
        s = s + i # формула суммы
#вывод ответа
print("Сумма:", s)

      
#ввод числа n
n = int(input("Введите n: "))
#переменная хранящая сумму
s = 0
for i in range(1, n):
    if i % 2 == 0:
        print(i)
        s = s + i # формула суммы
#вывод ответа
print("Сумма:", s)

Значение переменной i в цикле for будет меняться от x ? до x n-1. В строке номер x проверяем, является ли значение в i чётным. Если да, то прибавляем его к текущему значению суммы в переменной s.

Второй вариант решения:

#ввод числа N
n = int(input("Введите n: "))
#переменная хранящая сумму
s = 0
#в функции range задан шаг изменения i
for i in range(2, n, 2):
    print(i)
    s = s + i
print("Ответ:", s)

      
#ввод числа N
n = int(input("Введите n: "))
#переменная хранящая сумму
s = 0
#в функции range задан шаг изменения i
for i in range(2, n, 2):
    print(i)
    s = s + i
print("Ответ:", s)

В этом коде третий аргумент функции range() отвечает за x шаг изменения переменной цикла i. Так как первое значение этой переменной будет равно x и шаг изменения значения равен двум, то с помощью цикла будем перебирать только чётные целые числа.

Пример № 2 (ex02.py)

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

\[ вклад = вклад * (1 + \frac{процент}{100}) \]

Программа выводит размер вклада за каждый год.

money = float(input("Введите размер вклада: "))
proc = float(input("Введите процент: "))
years_num = int(input("На сколько лет делается вклад? "))

for year in range(1, years_num + 1):
    money = money * (1 + proc / 100)
    print(year, "год - размер вклада:", money, "руб.")

      
money = float(input("Введите размер вклада: "))
proc = float(input("Введите процент: "))
years_num = int(input("На сколько лет делается вклад? "))

for year in range(1, years_num + 1):
    money = money * (1 + proc / 100)
    print(year, "год - размер вклада:", money, "руб.")

После в переменных money и proc будут храниться значения x вещественного типа. Переменная цикла for с именем x ? будет принимать значения от 1 до years_num + 1.

Задания для самостоятельной работы

Задание № 1 (sam01.py)

Выведите n раз число k. Целые числа n и k вводятся с клавиатуры.

Пример работы программы:

Введите n: 5
Введите k: 3
3
3
3
3
3

Плюс, если вывод будет выглядеть следующим образом:

Введите n: 5
Введите k: 3
33333

Задание № 2 (sam02.py)

Найдите произведение целых чисел от 1 до n и выведите его на экран.


Для хранения произведения понадобится переменная-аккумулятор, например с именем prod.


Начальное значение переменной-аккумулятора должно быть равно 1.


Чтобы получить последовательность целых чисел от 1 до n нужно записать функцию range():

range(1, n+1)

# ввод n
n = int(input("Введите n:"))
# начальное значение произведения
prod = 1

# запуск цикла от 1 до n+1
for i in range(1, n+1):
    prod = prod * i
    
# вывод ответа
print("Произведение:", prod)

Задание № 3 (sam03.py)

Даны два целых числа a и b. Найти сумму всех целых чисел от a до b включительно.

Пример работы программы:

a: 10
b: 25
Ответ: 280

Задание № 4 (sam04.py)

Дано целое число n (n > 0). Найти квадрат данного числа, используя для его вычисления следующую формулу:

\[ n^2=1+3+5+...+(2n-1) \]


Обратите внимание, что мы находим сумму нечётных чисел от 1 до \(2n-1\).

Чтобы функция range() выдала нужную последовательность, конечное значение должно быть равно \(2n\) а шаг - равен двум.

# ввод n
n = int(input("n>0: "))

# начальное значение суммы
s = 0

# запускаем цикл от 1 до 2n c шагом 2
for i in range(1, 2 * n, 2):
    s = s + i
    
# вывод ответа
print("n^2=", s, "проверка:", n ** 2)

Задание № 5 (sam05.py)

Стоимость одного килограмма конфет вводится с клавиатуры. Выведите на экран последовательно стоимость 1, 2, … , 10 кг конфет. Если на одном из шагов стоимость превышает 100 рублей, цикл должен прерываться.

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

Введите стоимость одного кг конфет: 15
...
5 кг конфет стоят 75 рублей
...

Задание № 6 (sam06.py)

Выведите на экран таблицу умножения для чётных чисел от 2 до 8.

Пример вывода:

2 x 1 = 2
2 x 2 = 4
...
4 x 1 = 4
4 x 2 = 8
...

Для решения задачи нужно использовать вложенные циклы.

# цикл для перебора чётных множителей
for i in range(2, 9, 2):
    # цикл для перебора вторых множителей
    for j in range(1, 10):
        print(i, "x", j, "=", i*j)