Занятие № 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)

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

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


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

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

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

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

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

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

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

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

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


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

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

УведомлениеТехнические детали

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

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


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

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

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


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

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


      
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)

Функция 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 = int(input("Количество чисел: "))

summ = 0

for i in range(n):
    a = int(input("Слагаемое: "))
    summ = summ + a
    
print(f"Сумма равна {summ}")

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

Количество чисел: <{4}> ++enter++
Слагаемое: <{8}> ++enter++
Слагаемое: <{3}> ++enter++
Слагаемое: <{1}> ++enter++
Слагаемое: <{7}> ++enter++
Сумма равна 19

Пример № 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(f"{year} год - размер вклада: {money:.2f} руб")

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

Введите размер вклада: <{150}> ++enter++
Введите процент: <{12}> ++enter++
На сколько лет делается вклад? <{4}> ++enter++
1 год - размер вклада: 168.00 руб
2 год - размер вклада: 188.16 руб
3 год - размер вклада: 210.74 руб
4 год - размер вклада: 236.03 руб

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

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

NUM_STUD = 2    # количество студентов
NUM_TESTS = 2   # количество тестов

for student in range(NUM_STUD):
    summ = 0
    
    print(f"Студент № {student + 1}")
    for test in range(NUM_TESTS):
        score = float(input(f"Тест {test + 1}: "))
        summ += score
    
    avg = summ / NUM_TESTS
    print(f"Средний балл: {avg:.1f}")

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

Студент № 1
Тест 1: <{8}> ++enter++
Тест 2: <{7}> ++enter++
Средний балл: 7.5
Студент № 2
Тест 1: <{6}> ++enter++
Тест 2: <{3}> ++enter++
Средний балл: 4.5

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

Решите следующие задачи самостоятельно.

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

За один час прогулки, в среднем, тратится 220 ккал. Напишите программу, которая выведет на экран сколько калорий потратится за 1, 2, 3, 4 и 5 часов прогулки.

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

За 1 ч потратится 220 ккал
За 2 ч потратится 440 ккал
За 3 ч потратится 660 ккал
За 4 ч потратится 880 ккал
За 5 ч потратится 1100 ккал

В левой колонке есть лишние блоки.

Использовано попыток: 0
В коде есть ошибка.

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

В одной миле - 0.6214 километра. Напишите программу, которая выведет таблицу перевода скоростей из км/ч в мили/ч от 60 до 120 км/ч с шагом в 10 км/ч.

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

км/ч    миль/ч
60      37.3
70      43.5
80      49.7
90      55.9
100     62.1
110     68.4
120     74.6

В функцию range() можно передать три аргумента - начальное значение, границу и шаг.

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

Дано целое число \(n > 0\). Возведите число \(n\) в квадрат, используя следующую формулу суммы: \[ n^2=1+3+5+...+(2n-1) \]

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

Введите целое число: <{15}> ++enter++
Ответ: 225
Введите целое число: <{1}> ++enter++
Ответ: 1

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

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

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

Напишите программу для отслеживания бюджета за 5 дней. Пользователь вводит 5 значений - доход или расход денег за день. Выведите на экран итоговый бюджет в начале каждого дня и бюджет в конце недели. Бюджет в начале недели считайте равным нулю.

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

День 1, текущий бюджет: 0
Введите доходы/расходы: <{65}> ++enter++
День 2, текущий бюджет: 65.0
Введите доходы/расходы: <{-21}> ++enter++
День 3, текущий бюджет: 44.0
Введите доходы/расходы: <{40}> ++enter++
День 4, текущий бюджет: 84.0
Введите доходы/расходы: <{15}> ++enter++
День 5, текущий бюджет: 99.0
Введите доходы/расходы: <{-6}> ++enter++
Итоговый бюджет: 93.0

Если в начале дня бюджет отрицательный, ввод значений останавливается и выводится сообщение “Отрицательный бюджет”.

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

День 1, текущий бюджет: 0
Введите доходы/расходы: <{16}> ++enter++
День 2, текущий бюджет: 16.0
Введите доходы/расходы: <{20}> ++enter++
День 3, текущий бюджет: 36.0
Введите доходы/расходы: <{-40}> ++enter++
Отрицательный бюджет
Итоговый бюджет: -4.0

Инструкция break прерывает работу цикла.

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

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

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

Начальная популяция: <{2}> ++enter++
Прирост за день (%): <{40}> ++enter++
Количество дней: <{5}> ++enter++
1 день - размер популяции: 2.80
2 день - размер популяции: 3.92
3 день - размер популяции: 5.49
4 день - размер популяции: 7.68
5 день - размер популяции: 10.76

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

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

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

Количество учеников: <{2}> ++enter++
Количество заданий: <{3}> ++enter++
Задание 1, балл: <{1}> ++enter++
Задание 2, балл: <{2}> ++enter++
Задание 3, балл: <{1}> ++enter++
Студент 1: 4 баллов
Задание 1, балл: <{3}> ++enter++
Задание 2, балл: <{1}> ++enter++
Задание 3, балл: <{3}> ++enter++
Студент 2: 7 баллов

Добавьте расчёт общего среднего балла по всем ученикам.

...
Общий средний балл: 5.5