Занятие № 3. Решение задач с использованием цикла с предусловием
Цель: изучить применение цикла с предусловием while; рассмотреть типовые задачи.
Теория
Цикл с предусловием
Для многократного повторения инструкций используются циклы. Тело цикла с предусловием выполняется до тех пор, пока условие цикла истинно.
В Python цикл с предусловием реализуется инструкцией while
:
Цикл выполняется так:
- Вычисление значения логического выражения. Результат
True
илиFalse
. - Если значение
False
- завершить инструкциюwhile
и перейти к следующей по-порядку инструкции. - Если значение
True
- выполнить все инструкции в теле цикла и перейти к шагу 1.
Рисунок 1 содержит диаграмму с ходом работы цикла while
.
Если на первом шаге цикла значение логического выражения равно False
, то цикл
x
не выполнится ни разу.
В этом примере найдём сумму вводимых чисел. Цикл будет работать до тех пор, пока пользователь вводит числа не равные 0.
theSum = 0 # переменная-аккумулятор x = -1 # очередное слагаемое while x != 0: x = int(input("Следующее число (0 для остановки): ")) theSum = theSum + x print(theSum) # вывод ответа
Условие цикла находится в x ? строке программы.
Ещё один пример использования цикла while
- валидация вводимых значений. В следующем коде, ввод возраста (переменная age
) будет продолжаться до тех пор, пока не введут число
x
больше нуля:
age = int(input("Введите ваш возраст: ")) while age <= 0: print("Возраст должен быть больше 0") age = int(input("Введите ваш возраст: ")) print(age)
Если логическое выражение цикла всегда имеет значениеTrue
, то такой цикл while
может работать бесконечно.
В следующей программе цикл while
будет выполняться бесконечно. Как лучше всего объяснить причину зацикливания?
Выполнение тела цикла зависит только от значения переменной n
. Пока она имеет положительное значение, цикл будет выполняться.
Значение переменной answer
не используется в условии цикла, а значит не влияет на его остановку.
В логическом выражении можно использовать литералы (буквальные значения).
Условие цикла n > 0
должно принять значение False
, чтобы он остановился.
Инструкция break
С помощью инструкции break
можно прервать выполнение цикла и перейти к инструкциям расположенным после него.
while True: print("Эта строка появится на экране") break print("А эта строка?") print("Цикл while завершил работу")
Инструкция, записанная в
x строке не выполнится, так как инструкция break
в третьей строке прервёт выполнение цикла.
Инструкция continue
Инструкция continue
прерывает выполнение текущей итерации цикла. Интерпретатор вернётся к проверке условия цикла.
В следующем примере на экран выведутся только чётные числа от 1 до 9. Каждый раз, когда значение переменной x
делится на 2 без остатка, будем пропускать итерацию цикла с помощью continue
:
x = 0 while x < 10: x = x + 1 if x % 2 == 0: continue print(x) print("Конец программы")
Объединим break
и continue
в одной программе.
while True: name = input("Имя пользователя: ") if name != 'admin': continue password = input('Привет, admin. Введите пароль:') if password == 'swordfish': break print("Доступ разрешён!")
Цикл while
будет выполняться бесконечно, так как условие цикла всегда равно True
. В теле цикла просим ввести имя пользователя - переменная name
. Если имя не равно строке “
x
admin
”, то пропускаем итерацию цикла с помощью continue
и возвращаемся к началу тела цикла. Когда введено правильное имя, просим ввести пароль - переменная password
. Когда будет введен пароль “
x
swordfish
” будет выполнена инструкция break
и цикл while
прервётся.
Примеры
Пример № 1 (ex01.py)
Напишите программу рассчитывающую среднее арифметическое группы оценок. Количество оценок не известно заранее. Оценка не может быть отрицательным числом.
print("Среднее арифметическое") #сумма чисел изначально равна 0 sum = 0 #переменная count будет хранить количество оценок count = 0 #вводим первую оценку x = int(input("Введите оценку> ")) #цикл while будет выполняться пока введённая оценка #будет положительным числом while x >= 0: #прибавляем введённую оценку к общей сумме sum = sum + x #увеличиваем счётчик оценок на 1 count = count + 1 #запрашиваем ввод следующей оценки x = int(input("Введите оценку> ")) #выводим среднюю оценку print("Средняя оценка: ", sum / count)
Пример № 2 (ex02.py)
Напишите игру «Угадай число». Компьютер загадывает число от 1 до 10 и предлагает его отгадать. Компьютер сообщает пользователю больше или меньше число введённое пользователем относительно загаданного числа. Для получения случайного числа используется модуль random.
#импортируем модуль для получения случайного числа import random #генерируем случайное число от 1 до 10 num = random.randrange(1,11) #предлагаем ввести ответ guess = int(input(">")) #инициализируем счётчик количества попыток угадать число guesses = 1 #цикл повторяется пока число не угадано while num != guess: if num > guess: print("Задуманное число больше введённого") elif num < guess: print("Задуманное число меньше введённого") guess = int(input(">")) guesses = guesses + 1 #выводим результаты игры print("Задуманное число:", num) print("Количество попыток:", guesses)
Задания для самостоятельной работы
Задание № 1 (sam01.py)
Вычислите сумму всех нечётных чисел от 1 до 20. Для выполнения вычислений используйте цикл while.
Задание № 2 (sam02.py)
Вычислите сумму чётных чисел от одного до n, где n – число, введённое с клавиатуры. Для выполнения вычислений используйте цикл while.
Задание № 3 (sam03.py)
Найти все трёхзначные числа, которые делятся на 11 без остатка. Для решения задачи используйте цикл while.
Для определения делимости числа используйте оператор % - получение остатка от деления:
Задание № 4 (sam04.py)
Числа 1, 1, 2, 3, 5, 8 … являются частью последовательности Фибоначчи. Каждое число в последовательности, после первых двух является суммой двух предыдущих чисел последовательности. Напишите программу, которая вычисляет и выводит на экран n-ое число последовательности. Число n вводиться с клавиатуры.
Задание № 5 (sam05.py)
Для нахождения наибольшего общего делителя (НОД) двух чисел можно использовать алгоритм Евклида. Пусть m и n - исходные числа. Многократно выполним следующую операцию:
до тех пор, пока m не будет равно 0. После этого значение НОД будет храниться в переменной n.
Напишите программу нахождения НОД двух чисел, используя приведённый выше алгоритм.