Меню
Видеоучебник
Видеоучебник  /  Информатика  /  Основы алгоритмизации и программирования на языке Python  /  Циклические алгоритмы. Цикл с постусловием. Инструкции управления циклом

Циклические алгоритмы. Цикл с постусловием. Инструкции управления циклом

Урок 9. Основы алгоритмизации и программирования на языке Python

Из этого видеоурока ученики узнают о существовании ещё одного типа циклов – цикле с постусловием, а также о том, что в языке Python нет отдельной инструкции для реализации именно этого цикла, но его можно реализовать с помощью инструкций управления циклом. Также будут рассмотрены инструкции управления циклом, их программирование и необходимость использования.

Конспект урока "Циклические алгоритмы. Цикл с постусловием. Инструкции управления циклом"

Вопросы:

·     Цикл с постусловием.

·     Применение инструкций управления циклом на языке Python.

Рассмотрим алгоритм мытья посуды. Для того, чтобы помыть грязные тарелки, нужно: взять губку, открыть кран с водой, помыть одну тарелку, вытереть её, после чего проверить, не осталось ли грязных тарелок. Если это условие не выполняется, нужно снова помыть тарелку; если же грязных тарелок не осталось, нужно закрыть кран, положить губку на место и вытереть руки.

Наверняка вы обратили внимание на то, что этот алгоритм содержит цикл, но не с предусловием. Рассмотрим работу цикла, содержащегося в алгоритме. Сначала выполняется тело цикла и только после этого проверяется его условие, а в цикле с предусловием сначала проверяется условие и только после этого выполняется тело цикла. Этот цикл называется циклом с постусловием. Он работает до тех пор, пока его условие не выполнится, а так как его условие проверяется после исполнения тела цикла, то такой цикл в любом случае выполняется в программе хотя бы один раз.

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

В большинстве языков программирования есть отдельный оператор цикла с постусловием, но в языке Python его нет. Здесь цикл с постусловием реализуется с помощью бесконечного цикла с предусловием. Мы уже знаем, что его заголовок – while True. Дальше записываются инструкции, составляющие тело цикла с постусловием. После них следует инструкция ветвления, содержащая условие цикла с постусловием. Если это условие выполняется – следует инструкция остановки цикла – break.

Рассмотрим работу цикла с постусловием на примере решения задачи. Написать программу, которая вычисляет наибольший общий делитель двух целых положительных чисел. Наибольшим общим делителем двух чисел (сокращённо НОД) называется наибольшее число, на которое без остатка делятся оба числа. Для вычисления НОД мы будем использовать усовершенствованный алгоритм Эвклида. В нём, чтобы найти НОД двух чисел, наибольшее из них заменяется своим остатком от деления на наименьшее число до тех пор, пока одно из чисел не станет равным нулю. После этого ненулевое число имеет значение наибольшего общего делителя исходных чисел.

Напишем модуль для решения задачи. Вначале с помощью инструкции print выведем на экран сообщение о том, что это программа, вычисляющая наибольший общий делитель двух целых положительных чисел, а также запрос на ввод двух чисел. Запишем инструкцию для считывания чисел в переменные a и b. По условию задачи числа целые, поэтому при считывании мы будем преобразовывать их значения в целочисленный тип int. Теперь запишем цикл с постусловием. Для этого запишем сначала бесконечный цикл while, в котором будет ветвление с условием завершения работы цикла: a = 0 or b = 0, то есть цикл завершится тогда, когда одно из чисел станет равным нулю.  Если это условие выполняется – сработает инструкция окончания работы цикла break. Тело цикла с постусловием будет содержать ветвление для определения большего из чисел с условием a > b. Если это условие выполняется, то переменной a присвоим значение a % b, если это условие не выполняется, значит наибольшее число b, поэтому переменной b мы присвоим значение b % a. Так как одно из чисел после выполнения описанного цикла будет равно нулю, то значение ненулевого числа можно вычислить как их сумму. Поэтому выведем на экран сообщение о том, что НОД введённых чисел равен сумме значений a и b.

Сохраним написанный модуль и запустим его на выполнение. Введём числа 45 и 75. Наибольший общий делитель этих чисел действительно равен 15. Снова запустим программу и введём числа 7 и 3. Наибольший общий делитель этих чисел действительно равен единице. Программа работает правильно. Задача решена.

Циклы в языке Python после основного тела могут содержать блок инструкций else. Он выполняется в том случае, когда работа цикла была завершена без помощи инструкции, остановки исполнения цикла – break.

Помимо инструкции break есть и другая инструкция управления циклом – continue. Эта инструкция прерывает текущее исполнение тела цикла и переходит к следующему, начиная с проверки условия.

Проверим работу описанных инструкций управления циклом, решив задачу. Написать программу, генерирующую случайное целое число на промежутке от a до b и предоставляющую пользователю неограниченное число попыток для того, чтобы его угадать. Если пользователю надоело угадывать, то он должен ввести слово «Сдаюсь». A всегда меньше либо равно b.

Начнём написание модуля для решения задачи. С помощью инструкции print выведем на экран запрос на ввод числа a. Теперь напишем инструкцию для считывания a. Так как, по условию задачи, это целое число, то при вводе его значение мы будем преобразовывать в целочисленный тип int. Скопируем написанные инструкции и изменим их для считывания значения b. Так как функции генерации случайных чисел описаны в модуле random, подключим его. Теперь присвоим переменной n случайное число на промежутке от a до b, сгенерированное с помощью функции randint. Далее с помощью инструкции print выведем на экран сообщение о том, что загадано случайное число на промежутке от a до b и предложение его угадать. Теперь присвоим переменной s значение пустой строки, позже именно в эту строку мы будем считывать вводимые числа.

Теперь напишем цикл для угадывания значения n. Он будет работать до тех пор, пока значение строки s не станет равным значению переменной n, преобразованной в строковый тип str. Тело цикла будет начинаться со считывания значения строки s. Так как данные с клавиатуры вводятся в текстовой форме, нам не нужно их преобразовывать. Теперь запишем инструкцию ветвления с условием, что значение s равно текстовой строке 'Сдаюсь'. Если это условие выполняется, завершим исполнение цикла с помощью инструкции break. Далее запишем блок elif с условием, что значение s равно значению n, преобразованному в строковый тип str. Если это условие выполняется, вернёмся в начало цикла с помощью инструкции continue. После этого ветвления запишем инструкцию print, которая выводит на экран сообщение о том, что пользователь не угадал число, и предложение попробовать ещё раз. Дальше напишем блок else для цикла и в нём инструкцию print, выводящую сообщение о том, что пользователь угадал. Сохраним написанный модуль.

print ('Введите a.')

a = int (input ())

print ('Введите b.')

b = int (input ())

import random

n = random.randint (a, b)

print ('Загадано случайное целое число на промежутке [a; b]. Попробуйте его угадать.')

s = ''

while s != str (n):

    s = input ()

    if s == 'Сдаюсь':

        break

    elif s == str (n):

        continue

    print ('Вы не угадали. Попробуйте ещё раз.')

else:

    print ('Поздравляем! Вы угадали.')

Рассмотрим, как должен работать цикл, который мы написали в программе. После считывания s, если это строка 'Сдаюсь', исполнение цикла будет завершено инструкцией break, и начнут выполняться команды, следующие после цикла. Если это число, равное n, то благодаря инструкции continue снова будет проверено условие цикла. Оно будет ложно, так как противоречит условию ветвления, поэтому начнёт выполняться блок else цикла. Если в строке s хранится любое другое значение, то будет выведено сообщение о том, что пользователь не угадал.

Протестируем программу, которую мы написали. Введём промежуток от 1 до 3. Теперь зададим значение 1. Программа вывела сообщение о том, что мы не угадали, и предложение попробовать ещё раз. Попробуем ввести 2. Программа снова предлагает попробовать ещё раз. И, наконец, введём 3. На этот раз программа вывела сообщение о том, что мы угадали. Снова запустим программу и введём промежуток от 1 до 100. Угадывание числа на таком промежутке займёт много времени, поэтому сразу введём слово «Сдаюсь». Как видим, программа завершила свою работу. Программа работает правильно. Задача решена.

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

Например, в нашей программе можно очень просто избавиться от инструкции continue, а также от блока else в цикле, переписав ветвление так, чтобы оно, когда условие в блоке elif выполняется, выводило на экран сообщение о том, что пользователь угадал. А в том случае, когда никакое из условий не выполняется, выведем на экран сообщение о том, что пользователь не угадал.

print ('Введите a.')

a = int (input ())

print ('Введите b.')

b = int (input ())

import random

n = random.randint (a, b)

print ('Загадано случайное целое число на промежутке [a; b]. Попробуйте его угадать.')

s = ''

while s != str (n):

    s = input ()

    if s == 'Сдаюсь':

        break

    elif s == str (n):

        print ('Поздравляем! Вы угадали.')

    else:

        print ('Вы не угадали. Попробуйте ещё раз.')

Таким образом, принцип работы кода стал очевиднее, при этом программа всё ещё работает правильно. Убедимся в этом. Сохраним написанный модуль и запустим его на выполнение. Введём промежуток от 1 до 100. Предпримем пару безуспешных попыток угадать число, после чего запишем слово «Сдаюсь». Программа завершила свою работу. Снова запустим модуль и введём промежуток от 1 до 1. Введём 1. Программа вывела сообщение о том, что мы угадали. Таким образом мы убедились в правильности работы программы.

Мы узнали:

·     Как работают инструкции остановки работы цикла – break, а также прерывания текущего исполнения цикла – continue.

·     В цикле может присутствовать блок else, который выполняется в том случае, когда исполнение цикла завершено без помощи инструкции break.

·     Цикл с постусловием работает до тех пор, пока не выполнится его условие, которое проверяется после исполнения тела цикла.

·     Цикл с постусловием в программе в любом случае выполняется хотя бы один раз.

·     Так как в языке Python нет инструкции для записи цикла с постусловием, он реализуется через бесконечный цикл прерываемый с помощью инструкции break.

0
12203

Комментарии 0

Чтобы добавить комментарий зарегистрируйтесь или на сайт