1. Циклы с предусловием и постусловием
В условие описывается логическое выражение, истинность которого обеспечивает дальнейшую работу цикла. С помощью операторов записывается тело цикла.
Цикл выполняется до тех пор, пока выполняется условие, как только условие стало ложным цикл заканчивается.
Напишем программу, которая будет выводить на экран первые \(10\) целых чисел на экран.

Цикл с заданным условием окончания работы (цикл с постусловием) записывается с помощью оператора « repeat ».
Циклы в программировании. Цикл while
Циклы являются такой же важной частью структурного программирования, как условные операторы. С помощью циклов можно организовать повторение выполнения участков кода. Потребность в этом возникает довольно часто. Например, пользователь последовательно вводит числа, и каждое из них требуется добавлять к общей сумме. Или нужно вывести на экран квадраты ряда натуральных чисел и тому подобные задачи.
Цикл while
«While» переводится с английского как «пока». Но не в смысле «до свидания», а в смысле «пока имеем это, делаем то».
Можно сказать, while является универсальным циклом. Он присутствует во всех языках, поддерживающих структурное программирование, в том числе в Python. Его синтаксис обобщенно для всех языков можно выразить так:
while логическое_выражение
Это похоже на условный оператор if . Однако в случае циклических операторов их тела могут выполняться далеко не один раз. В случае if , если логическое выражение в заголовке возвращает истину, то тело выполняется единожды. После этого поток выполнения программы возвращается в основную ветку и выполняет следующие выражения, расположенные ниже всей конструкции условного оператора.
В случае while , после того как его тело выполнено, поток возвращается к заголовку цикла и снова проверяет условие. Если логическое выражение возвращает истину, то тело снова выполняется. Потом снова возвращаемся к заголовку и так далее.
Цикл завершает свою работу только тогда, когда логическое выражение в заголовке возвращает ложь, то есть условие выполнения цикла больше не соблюдается. После этого поток выполнения перемещается к выражениям, расположенным ниже всего цикла. Говорят, «происходит выход из цикла».
Рассмотрите блок-схему цикла while .

На ней ярко-голубыми прямоугольниками обозначена основная ветка программы, ромбом – заголовок цикла с логическим выражением, бирюзовым прямоугольником – тело цикла.
С циклом while возможны две исключительные ситуации:
- Если при первом заходе в цикл логическое выражение возвращает False , то тело цикла не выполняется ни разу. Эту ситуацию можно считать нормальной, так как при определенных условиях логика программы может предполагать отсутствие необходимости в выполнении выражений тела цикла.
- Если логическое выражение в заголовке while никогда не возвращает False , а всегда остается равным True , то цикл никогда не завершится, если только в его теле нет оператора принудительного выхода из цикла ( break ) или вызовов функций выхода из программы – quit() , exit() в случае Python. Если цикл повторяется и повторяется бесконечное количество раз, то в программе происходит зацикливание. В это время она зависает и самостоятельно завершиться не может.
Вспомним наш пример из урока про исключения. Пользователь должен ввести целое число. Поскольку функция input() возвращает строку, то программный код должен преобразовать введенное к целочисленному типу с помощью функции int() . Однако, если были введены символы, не являющиеся цифрами, то возникает исключение ValueError , которое обрабатывается веткой except . На этом программа завершается.
Другими словами, если бы программа предполагала дальнейшие действия с числом (например, проверку на четность), а она его не получила, то единственное, что программа могла сделать, это закончить свою работу досрочно.
Но ведь можно просить и просить пользователя корректно вести число, пока он его не введет. Вот как может выглядеть реализующий это код:
n = input("Введите целое число: ") while type(n) != int: try: n = int(n) except ValueError: print("Неправильно ввели!") n = input("Введите целое число: ") if n % 2 == 0: print("Четное") else: print("Нечетное")
Примечание 1. Не забываем, в языке программирования Python в конце заголовков сложных инструкций ставится двоеточие.
Примечание 2. В выражении type(n) != int с помощью функции type() проверяется тип переменной n . Если он не равен int , то есть значение n не является целым числом, а является в данном случае строкой, то выражение возвращает истину. Если же тип n равен int , то данное логическое выражение возвращает ложь.
Примечание 3. Оператор % в языке Python используется для нахождения остатка от деления. Так, если число четное, то оно без остатка делится на 2, то есть остаток будет равен нулю. Если число нечетное, то остаток будет равен единице.
Проследим алгоритм выполнения этого кода. Пользователь вводит данные, они имеют строковый тип и присваиваются переменной n . В заголовке while проверяется тип n . При первом входе в цикл тип n всегда строковый, то есть он не равен int . Следовательно, логическое выражение возвращает истину, что позволяет зайти в тело цикла.
Здесь в ветке try совершается попытка преобразования строки к целочисленному типу. Если она была удачной, то ветка except пропускается, и поток выполнения снова возвращается к заголовку while .
Теперь n связана с целым числом, следовательно, ее тип int , который не может быть не равен int . Он ему равен. Таким образом логическое выражение type(n) != int возвращает False , и весь цикл завершает свою работу. Далее поток выполнения переходит к оператору if-else, находящемуся в основной ветке программы. Здесь могло бы находиться что угодно, не обязательно условный оператор.
Вернемся назад. Если в теле try попытка преобразования к числу была неудачной, и было выброшено исключение ValueError , то поток выполнения программы отправляется в ветку except и выполняет находящиеся здесь выражения, последнее из которых просит пользователя снова ввести данные. Переменная n теперь имеет новое значение.
После завершения except снова проверяется логическое выражение в заголовке цикла. Оно даст True , так как значение n по-прежнему строка.
Выход из цикла возможен только тогда, когда значение n будет успешно конвертировано в число.
Рассмотрим следующий пример:
total = 100 i = 0 while i 5: n = int(input()) total = total - n i = i + 1 print("Осталось", total)
Сколько раз «прокрутится» цикл в этой программе, то есть сколько итераций он сделает? Ответ: 5.
- Сначала переменная i равна 0. В заголовке цикла проверяется условие i < 5 , и оно истинно. Тело цикла выполняется. В нем меняется значение i , путем добавления к нему единицы.
- Теперь переменная i равна 1. Это меньше пяти, и тело цикла выполняется второй раз. В нем i меняется, ее новое значение 2.
- Два меньше пяти. Тело цикла выполняется третий раз. Значение i становится равным трем.
- Три меньше пяти. На этой итерации i присваивается 4.
- Четыре по прежнему меньше пяти. К i добавляется единица, и теперь ее значение равно пяти.
«Смысловая нагрузка» данного цикла – это последовательное вычитание из переменной total вводимых чисел. Переменная i в данном случае играет только роль счетчика итераций цикла. В других языках программирования для таких случаев предусмотрен цикл for , который так и называется: «цикл со счетчиком». Его преимущество заключается в том, что в теле цикла не надо изменять переменную-счетчик, ее значение меняется автоматически в заголовке for .
В языке Python тоже есть цикл for . Но это не цикл со счетчиком. В Питоне он предназначен для перебора элементов последовательностей и других сложных объектов. Данный цикл и последовательности будут изучены в последующих уроках.
Для while наличие счетчика не обязательно. Представим, что надо вводить числа, пока переменная total больше нуля. Тогда код будет выглядеть так:
total = 100 while total > 0: n = int(input()) total = total - n print("Ресурс исчерпан")
Сколько раз здесь выполнится цикл? Неизвестно, все зависит от вводимых значений. Поэтому у цикла со счетчиком известно количество итераций, а у цикла без счетчика – нет.
Самое главное для цикла while – чтобы в его теле происходили изменения значений переменных, которые проверяются в его заголовке, и чтобы хоть когда-нибудь наступил случай, когда логическое выражение в заголовке возвращает False . Иначе произойдет зацикливание.
Примечание 1. Не обязательно в выражениях total = total — n и i = i + 1 повторять одну и ту же переменную. В Python допустим сокращенный способ записи подобных выражений: total -= n и i += 1 .
Примечание 2. При использовании счетчика он не обязательно должен увеличиваться на единицу, а может изменяться в любую сторону на любое значение. Например, если надо вывести числа кратные пяти от 100 до 0, то изменение счетчика будет таким i = i — 5 , или i -= 5 .
Примечание 3. Для счетчика не обязательно использовать переменную с идентификатором i . Можно назвать переменную-счетчик как угодно. Однако так принято в программировании, что счетчики обозначают именами i и j (иногда одновременно требуются два счетчика).
Практическая работа
- Измените последний код из урока так, чтобы переменная total не могла уйти в минус. Например, после предыдущих вычитаний ее значение стало равным 25. Пользователь вводит число 30. Однако программа не выполняет вычитание, а выводит сообщение о недопустимости операции, после чего осуществляет выход из цикла.
- Используя цикл while , выведите на экран для числа 2 его степени от 0 до 20. Возведение в степень в Python обозначается как ** . Фрагмент вывода:
. 32 64 128 256 512 1024 .
Примеры решения и дополнительные уроки в pdf-версии курса
X Скрыть Наверх
Python. Введение в программирование
§ 5. Оператор цикла
Для записи оператора цикла с предусловием используется команда while. Формат команды:
while . Формат команды:
Условие в записи оператора цикла может быть простым и составным. Фигурные скобки могут быть опущены, если тело цикла состоит из одной команды.
Пример 5.1. Написать программу, которая определит количество цифр в натуральном числе n.
Этапы выполнения задания
I. Исходные данные: n (заданное число).
II. Результат: k — количество цифр в числе.
III. Алгоритм решения задачи.
1. Ввод исходных значений.
2. Начальное значение переменной k = 0.
3. Чтобы посчитать количество цифр в числе, будем делить число на 10 до тех пор, пока число больше 1. Поскольку условие продолжения работы неизвестно, то будем использовать цикл while .
4. В цикле будем уменьшать число n в 10 раз и увеличивать значение k на 1.
5. Вывод результата.
Цикл while работает до тех пор, пока условие цикла истинно. Для того чтобы цикл завершил свою работу, в теле цикла должны быть команды, выполнение которых приведет к тому, что условие цикла станет ложным. Если таких команд нет, цикл выполняется бесконечно. Такую ситуацию называют зацикливанием. В случае зацикливания нужно прервать выполнение программы. В Code::Blocks для этого можно использовать кнопку .
using namespace std ;
while ( n > 0 )
///уменьшение числа в 10 раз

5.2. Оператор цикла с постусловием
Цикл, в котором условие для завершения работы проверяется после выполнения тела цикла, в С++ записывается следующим образом:
Цикл работает, пока условие истинно, и прекращает работу, когда условие становится ложным. Этот цикл называют циклом с постусловием, так как проверка условия осуществляется после выполнения тела цикла. Использовать цикл do. while лучше в тех случаях, когда команды в теле цикла должны выполниться хотя бы один раз, либо когда внутри тела цикла происходит инициализация переменных, участвующих в проверке условия окончания его работы.
Фигурные скобки в записи цикла с постусловием могут быть опущены, если тело цикла состоит из одной команды.
Пример 5.2. Написать программу, которая будет генерировать случайные числа из промежутка [1; x ] до тех пор, пока не будет сгенерировано число, кратное k . Вывести это число и количество сгенерированных чисел. Значения k и x вводятся ( k < x ).
Этапы выполнения задания
I. Исходные данные: числа k и r .
II. Результат: r (искомое число) и n (количество чисел).
III. Алгоритм решения задачи.
1. Ввод исходных значений.
2. Инициализация счетчика n = 0.
3. Поскольку нам известно условие окончания цикла — получить число, кратное k , то будем использовать цикл с постусловием. Условие можно записать так: ( r % k ). Если значение этого выражения не равно нулю, то условие истинно.
3.1. Генерируем случайное число r . В С++ для этого используется функция rand() , которая генерирует случайное число в промежутке [0; 32767). Это число будет использоваться в условии проверки окончания работы цикла.
3.2. Чтобы случайное число попало в промежуток [1; x ], найдем остаток от деления на x числа, сгенерированного функцией rand() , и прибавим к нему 1.
3.3. Увеличим значение счетчика на 1.
4. Вывод результата.
Числа, сгенерированные функцией rand() , называют псевдослучайными, поскольку при каждом запуске программы будет сгенерирована одна и та же последовательность чисел. Каждое новое число в последовательности генерируется по определенному алгоритму из предыдущего. Первое число в этой последовательности — константа, известная компилятору. Такой подход удобен для отладки программы. Однако для получения результатов необходимо при каждом запуске получать другие числа. Функция srand(n) из библиотеки cstdlib позволяет изменить первое число в последовательности в зависимости от значения параметра n . Однако, если значение n является константой, то последовательность чисел изменится по отношению к начальной, но не будет меняться при новых запусках программы. Если в качестве значения n взять системное время (функция time(NULL) из библиотеки ctime ), то при каждом запуске программы будем получать новую последовательность случайных чисел.
Пример 5.2.
using namespace std ;
Если выполнение тела цикла прекращается, когда условие цикла становится ложным, то он называется: цикл «n-раз»

Какой обьем занимает текст состоящий из 10 страниц по 20 строк и в которой стоке по 70 символов если текст набирали на компьютере.
найти количество символов в алфавите с помощью которого был записан текст состоящий из 800 символов и занимающий 64 к байт
