Циклы
П ри решении практических задач постоянно возникает необходимость в повторении действия заданное количество раз, или до достижения какого-либо условия. Например, вывести список всех пользователей, замостить плоскость текстурой, провести вычисления над каждым элементом массива данных и т.п. В си для этих целей используются три вида циклов: с предусловием, постусловием и цикл for со счётчиком (хотя, это условное название, потому что счётчика может и не быть).
Любой цикл состоит из тела и проверки условия, при котором этот цикл должен быть прекращён. Тело цикла — это тот набор инструкций, который необходимо повторять. Каждое повторение цикла называют итерацией.
Рассмотрим цикл с предусловием.
int i = 0; while (i
Этот цикл выполняется до тех пор, пока истинно условие, заданное после ключевого слова while. Тело цикла — это две строки, одна выводит число, вторая изменяет его. Очевидно, что этот цикл будет выполнен 10 раз и выведет на экран
0
1 2 3 и так далее до 9.
Очень важно, чтобы условие выхода из цикла когда-нибудь выполнилось, иначе произойдёт зацикливание, и программа не завершится. К примеру
int i = 0; while (i
В этом цикле не изменяется переменная i, которая служит для определения условия останова, поэтому цикл не завершится.
int i = 0; while (i > 0)
В этой программе цикл, конечно, завершится, но из-за неправильного действия он будет выполнен гораздо больше 10 раз. Так как си не следит за переполнением переменной, нужно будет ждать, пока переменная переполнится и станет меньше нуля.
int i; while (i
У этого примера неопределённое поведение. Так как переменная i заранее не инициализирована, то она хранит мусор, заранее неизвестное значение. При различном содержимом переменной i будет меняться поведение.
Если тело цикла while содержит один оператор, то фигурные скобки можно опустить.
int i = 0; while (i < 10) printf("%d\n", i++);
Здесь мы инкрементируем переменную i при вызове функции printf. Следует избегать такого стиля кодирования. Отсутствие фигурных скобок, особенно в начале обучения, может приводить к ошибкам. Кроме того, код читается хуже, да и лишние скобки не сильно раздувают листинги.
Циклы с постусловием.
Ц икл с постусловием отличается от цикла while тем, что условие в нём проверяется после выполнения цикла, то есть этот цикл будет повторён как минимум один раз (в отличие от цикла while, который может вообще не выполняться). Синтаксис цикла
do < тело цикла >while(условие);
Предыдущий пример с использованием цикла do будет выглядеть как
int i = 0; do < printf("%d\n", i); i++; >while(i < 10);
Давайте рассмотрим пример использования цикла с постусловием и предусловием. Пусть нам необходимо проинтегрировать функцию.

∫ a b f ⁡ x d x
Интеграл - это сумма бесконечно малых. Мы можем представить интеграл как сумму, а бесконечно малые значения просто заменить маленькими значениями.
∫ a b f ⁡ x d x = ∑ i = a b f ⁡ i h
Из формулы видно, что мы на самом деле разбили площадь под графиком на множество прямоугольников, где высота прямоугольника - это значение функции в точке, а ширина - это наш шаг. Сложив площади всех прямоугольников, мы тем самым получим значение интеграла с некоторой погрешностью.
Пусть искомой функцией будет x 2 . Нам понадобятся следующие переменные. Во-первых, аккумулятор sum для хранения интеграла. Во-вторых, левая и правая границы a и b, в третьих - шаг h. Также нам понадобится текущее значение аргумента функции x.
Для нахождения интеграла необходимо пройти от a до b с некоторым шагом h, и прибавлять к сумме площадь прямоугольника со сторонами f(x) и h.
#include #include int main() < double sum = 0.0; double a = 0.0; double b = 1.0; double h = 0.01; double x = a; while (x < b) < sum += x*x * h; x += h; >printf("%.3f", sum); getch(); >
Программа выводит 0.328.
∫ 0 1 x 2 d x = x 3 3 | 0 1 = 1 3 ≈ 0.333
Если посмотреть на график, то видно, что каждый раз мы находим значение функции в левой точке. Поэтому такой метод численного интегрирования называют методом левых прямоугольников. Аналогично, можно взять правое значение. Тогда это будет метод правых прямоугольников.
while (x

Сумма в этом случае будет равна 0.338. Метод левых и правых прямоугольников не очень точен. Мы фактически аппроксимировали (приблизили) гладкий график монотонно возрастающей функции гистограммой. Если немного подумать, то аппроксимацию можно проводить не только суммируя прямоугольники, но и суммируя трапеции.
Приближение с помощью трапеций на самом деле является кусочной аппроксимацией кривыми первого порядка (ax+b). Мы соединяем точки на графике с помощью отрезков. Можно усложнить, соединяя точки не отрезками, а кусками параболы, тогда это будет метод Симпсона. Если ещё усложнить, то придём к сплайн интерполяции, но это уже другой, очень долгий разговор.
Вернёмся к нашим баранам. Рассмотрим 4 цикла.
int i = 0; while ( i++
int i = 0; while ( ++i
int i = 0; do < printf("%d ", i); >while(i++ < 3);
int i = 0; do < printf("%d ", i); >while(++i < 3);
Если выполнить эти примеры, то будет видно, что циклы выполняются от двух, до четырёх раз. На это стоит обратить внимание, потому что неверное изменение счётчика цикла часто приводит к ошибкам.
Часто случается, что нам необходимо выйти из цикла, не дожидаясь, пока будет поднят какой-то флаг, или значение переменной изменится. Для этих целей служит оператор break, который заставляет программу выйти из текущего цикла.
Давайте решим простую задачу. Пользователь вводит числа до тех пор, пока не будет введено число 0, после этого выводит самое большое из введённых. Здесь есть одна загвоздка. Сколько чисел введёт пользователь не известно. Поэтому мы создадим бесконечный цикл, а выходить из него будем с помощью оператора break. Внутри цикла мы будем получать от пользователя данные и выбирать максимальное число.
#include #include int main() < int num = 0; int max = num; printf("To quit, enter 0\n"); /*бесконечный цикл*/ while (1) < printf("Please, enter number: "); scanf("%d", &num); /*условие выхода из цикла*/ if (num == 0) < break; >if (num > max) < max = num; >> printf("max number was %d", max); getch(); >
Напомню, что в си нет специального булевого типа. Вместо него используются числа. Ноль - это ложь, все остальные значения – это истина. Цикл while(1) будет выполняться бесконечно. Единственной точкой выхода из него является условие
if (num == 0)
В этом случае мы выходим из цикла с помощью break; Для начала в качестве максимального задаём 0. Пользователь вводит число, после чего мы проверяем, ноль это или нет. Если это не ноль, то сравниваем его с текущим максимальным.
Бесконечные циклы используются достаточно часто, так как не всегда заранее известны входные данные, либо они могут меняться во время работы программы.
Когда нам необходимо пропустить тело цикла, но при этом продолжить выполнение цикла, используется оператор continue. Простой пример: пользователь вводит десять чисел. Найти сумму всех положительных чисел, которые он ввёл.
#include #include int main() < int i = 0; int positiveCnt = 0; float sum = 0.0f; float input; printf("Enter 10 numbers\n"); while (i < 10) < i++; printf("%2d: ", i); scanf("%f", &input); if (input sum += input; positiveCnt++; > printf("Sum of %d positive numbers = %f", positiveCnt, sum); getch(); >
Пример кажется несколько притянутым за уши, хотя в общем он отражает смысл оператора continue. В этом примере переменная positiveCnt является счётчиком положительных чисел, sum сумма, а input - временная переменная для ввода чисел.
Вот ещё один пример. Необходимо, чтобы пользователь ввёл целое число больше нуля и меньше 100. Пока необходимое число не будет введено, программа будет продолжать опрос.
do < printf("Please, enter number: "); scanf("%d", &n); if (n < 0 || n>100) < printf("bad number, try again\n"); continue; >else < break; >> while (1);
Цикл for
О дним из самых используемых является цикл со счётчиком for. Его синтаксис
Например, выведем квадраты первых ста чисел.
int i; for (i = 1; i
Одним из замечательных моментов цикла for является то, что он может работать не только с целыми числами.
float num; for (num = 5.3f; num > 0f; num -= 0.2)
Этот цикл выведет числа от 5.3 до 0.1. Цикл for может не иметь некоторых "блоков" кода, например, может отсутствовать инициализация, проверка (тогда цикл становится бесконечным) или изменение счётчика. Вот пример с интегралом, реализованный с применением счётчика for
#include #include int main() < double sum = 0.0; double a = 0.0; double b = 1.0; double h = 0.01; double x; for (x = a; x < b; x += h) < sum += x*x * h; >printf("%.3f", sum); getch(); >
Давайте рассмотрим кусок кода
double x ; for (x = a; x
Его можно изменить так
double x = a; for (; x
Более того, используя оператор break, можно убрать условие и написать
double x; for (x = a;; x += h)< if (x>b) < break; >sum += x*x*h; >
double x = a; for (;;) < if (x >b) < break; >sum += x*x*h; x += h; >
кроме того, используя оператор ",", можно часть действий перенести
double x ; for (x = a; x < b; x += h, sum += x*x*h) ;
ЗАМЕЧАНИЕ: несмотря на то, что так можно делать, пожалуйста, не делайте так! Это ухудшает читаемость кода и приводит к трудноуловимым ошибкам.
Давайте решим какую-нибудь практическую задачу посложнее. Пусть у нас имеется функция f(x). Найдём максимум её производной на отрезке. Как найти производную функции численно? Очевидно, по определению). Производная функции в точке - это тангенс угла наклона касательной.

f ⁡ x ′ = d x d y
Возьмём точку на кривой с координатами (x; f(x)), сдвинемся на шаг h вперёд, получим точку (x+h, f(x+h)), тогда производная будет
d x d y = f ⁡ ( x + h ) - f ⁡ x ( x + h - x ) = tg ⁡ α
То есть, отношение малого приращения функции к малому приращению аргумента. Внимательный читатель может задать вопрос, почему мы двигаемся вперёд по функции, а не назад. Ну пойдёмте назад
Возьмём среднее от этих двух значений, получим
В общем-то теперь задача становится тривиальной: идём от точки a до точки b и находим минимальное значение производной, а также точку, в которой производная принимает это значение. Для решения нам понадобятся, как и в задаче с интегралом, переменные для границ области поиска a и b, текущее значение x и шаг h. Кроме того, необходимо максимальное значение maxVal и координата maxX этого максимального значения. Для работы возьмём функцию x • sin ⁡ x
#include #include #include int main() < double a = 0; double b = 3.0; double h = 0.001; double h2 = h * 2.0; double maxVal = a*sin(a); double maxX = a; double curVal; double x; // Проходим по всей области от a до b // и ищем максимум первой производной // Используем функцию x*sin(x) for (x = a; x < b; x += h) < curVal = ( (x+h)*sin(x+h)-(x-h)*sin(x-h) )/h2; if (curVal >maxVal) < maxVal = curVal; maxX = x; >> printf("max value = %.3f at %.3f", maxVal, maxX); getch(); >
На выходе программа выдаёт max value = 1.391 at 1.077
Численное решение даёт такие же (с точностью до погрешности) результаты, что и наша программа.
Вложенные циклы
Рассмотрим пример, где циклы вложены друг в друга. Выведем таблицу умножения.
#include #include #include int main() < int i, j; // Для каждого i for (i = 1; i < 11; i++) < // Выводим строку из произведения i на j for (j = 1; j < 11; j++) < printf("%4d", i*j); >// После чего переходим на новую строку printf("\n"); > getch(); >
В этом примере в первый цикл по переменной i вложен второй цикл по переменной j. Последовательность действий такая: сначала мы входим в цикл по i, после этого для текущего i 10 раз подряд осуществляется вывод чисел. После этого необходимо перейти на новую строку. Теперь давайте выведем только элементы под главной диагональю
for (i = 1; i < 11; i++) < for (j = 1; j < 11; j++) < if (j >i) < break; >printf("%4d", i*j); > printf("\n"); >
Как вы видите, оператор break позволяет выйти только из текущего цикла. Этот пример может быть переписан следующим образом
for (i = 1; i < 11; i++) < for (j = 1; j printf("\n"); >
В данном случае мы используем во вложенном цикле счётчик первого цикла.
ru-Cyrl 18- tutorial Sypachev S.S. 1989-04-14 sypachev_s_s@mail.ru Stepan Sypachev students

Всё ещё не понятно? – пиши вопросы на ящик
Программирование циклов: циклы с заданным условием продолжения и окончания работы

В данном видеоуроке учащиеся начнут знакомиться с реализацией циклических алгоритмов на языкеPascal, а также с операторами языка, которые для этого предусмотрены. Будут рассмотрены операторы циклов с предусловием и постусловием, а также их применение при решении задач.

В данный момент вы не можете посмотреть или раздать видеоурок ученикам
Чтобы получить доступ к этому и другим видеоурокам комплекта, вам нужно добавить его в личный кабинет.
Получите невероятные возможности

1. Откройте доступ ко всем видеоурокам комплекта.

2. Раздавайте видеоуроки в личные кабинеты ученикам.

3. Смотрите статистику просмотра видеоуроков учениками.
Получить доступ
Конспект урока "Программирование циклов: циклы с заданным условием продолжения и окончания работы"
· Циклы с предусловием.
· Цикл с постусловием.
Циклические алгоритмы – это алгоритмы, содержащие алгоритмическую конструкцию цикла. Цикл представляет собой последовательность действий, которые повторяются многократно. Действия, которые выполняются в цикле называются телом цикла.
Цикл с предусловием работает так, что в начале проверяется условие продолжения работы цикла, если оно выполняется, то выполняется тело цикла, затем снова проверяется условие цикла. Так продолжается до тех пор, пока выполняется условие цикла. Как только условие цикла перестаёт выполнятся, цикл завершает свою работу и начинают выполнятся команды, следующие после него. Если же условие цикла не выполняется изначально, то тело цикла не выполняется вообще.

Блок-схема цикла с предусловием
Посмотрим, как программируется цикл с предусловием на языке Pascal. Для этого есть оператор цикла с предусловием. Его запись начинается со служебного слова while. После него следует условие продолжения работы цикла, оно записывается по тем же правилам что и в условном операторе. После условия цикла через пробел следует служебное слово do. На русский язык эту строку можно перевести: «Пока выполняется условие – делай». На следующей строке на расстоянии одного пробела от служебного слова while следует тело цикла. Оно может содержать один или несколько операторов. Если тело цикла содержит больше одного оператора, оно записывается между логическими скобками, то есть служебными словами begin и end. После слова end следует точка с запятой.
Описание цикла с предусловием
Задача: Написать программу, которая определяет, есть ли среди цифр натурального числа n цифра k. n и k вводятся с клавиатуры. 1 ≤ n ≤ 2 000 000 000.
Для решения задачи мы будем проверять правую цифру числа n, в случае если она не равна k мы будем убирать эту цифру. Так будет продолжаться до тех пор, пока мы не найдём цифру равную k или пока цифр не останется.
Напишем программу для решения задачи. Назовём её цифра. Для работы программы нам потребуются переменные n и k. Т. к. 1 ≤ n ≤ 2 000 000 000, зададим n принадлежащим к типу integer. Так как переменная k будет хранить всего одну цифру, то есть будет принимать значения в диапазоне от 0 до 9, для её хранения нам будет достаточно типа byte.
Напишем логические скобки. В начале тела программы будет следовать оператор writeln, который будет выводить на экран сообщение о том, что это программа поиска цифры k в натуральном числе n. После него будет следовать оператор write, выводящий на экран запрос на ввод n и оператор readln, считывающий его значение. Затем будут следовать те же операторы для k. Теперь запишем оператор цикла с предусловием while. Условием продолжения работы цикла будет: n > 0 and n mod 10 <> k. Запишем служебное слово do. Так как тело цикла будет содержать всего один оператор, логические скобки не требуются. Это будет оператор присваивания переменной n:=n div 10. После цикла запишем условный оператор, который проверяет условие n > 0. После служебного слова then в этом условном операторе будет следовать оператор write, выводящий на экран сообщение о том, что цифра k присутствует в числе n. После служебного слова else запишем оператор write, выводящий на экран сообщение о том, что цифра k отсутствует в числе n.
program cifra;
writeln ('Программа, определяющая присутствие цифры k в натуральном числе n.');
while (n>0) and (n mod 10<>k) do
n:=n div 10;
then write ('k присутствует в n.')
else write ('k отсутствует в n.');
Программа для решения задачи
Запустим программу на выполнение. Зададим n = 7085 и k = 8. Цифра 8 действительно присутствует в числе 7085.

Снова запустим программу на выполнение и зададим n = 123, а k = 4. В числе 123 действительно нет такой цифры.

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

Блок-схема цикла с постусловием
На языке Паскаль цикл с постусловием записывается с помощью оператора repeat. В его начале записывается служебное слово repeat. После этого служебного слова со следующей строки, на расстоянии одного пробела от него, следует тело цикла, состоящее из одного или нескольких операторов. После тела цикла на одном уровне со служебным словом repeat следует служебное слово until, после которого через пробел следует условие завершения работы цикла, а после него следует точка с запятой. Важно запомнить, что при записи цикла с постусловием служебные слова repeat и until выполняют роль логических скобок, то есть даже если тело цикла состоит из нескольких операторов, слова begin и end записывать не требуется.
Описание цикла с постусловием
Задача: Написать программу, которая выводит количество шагов необходимых для подтверждения гипотезы Коллатца, для заданного натурального числа n. Число n вводится с клавиатуры и находится на промежутке от 2 до 10 000. Для заданного промежутка чисел эта гипотеза уже подтверждена.
Рассмотрим гипотезу Коллатца. Она названа по имени математика, который её выдвинул. Возьмём любое натуральное число. Если оно чётное – разделим его на 2. Если же число нечётное – умножим его на 3 и прибавим 1. Повторим эти же действия над результатом и так далее… Гипотеза Коллатца заключается в том, что какое бы натуральное число мы не взяли изначально, через некоторое количество шагов в результате мы получим 1.
Составим блок-схему алгоритма решения задачи. В начале программы мы считаем число n, введённое пользователем. После этого переменной которая считает количество шагов – назовём её step – присвоим значение 0, так как ни одного шага ещё не было сделано. Запишем условный оператор, который будет проверять является ли число n чётным. Для того чтобы это проверить нужно вычислить остаток от его деления на 2. Если он равен нулю, то число является чётным, следовательно, мы должны разделить его на 2, то есть присвоить переменной n её собственное значение, делённое на 2. В противном случае, если остаток от деления n на 2 не равен нулю, то число является нечётным, и мы умножим его на 3 и прибавим к нему 1. После мы должны увеличить значение счётчика шагов – step на 1. Теперь запишем блок ветвления с условием подтверждения гипотезы, то есть n = 1. Если это условие не выполняется, нам необходимо выполнить ещё один шаг вычислений, то есть мы вернёмся к выполнению предыдущего блока ветвления. Если же n равно единице, то гипотеза подтверждена и цикл завершит свою работу. После завершения работы цикла, мы должны вывести на экран количество шагов – значение переменной step. На этом наш алгоритм завершит свою работу.

Блок-схема алгоритма решения задачи
Напишем программу по составленной блок-схеме. Назовём её collatz. Для работы программы нам потребуется 2 переменные: n и step, так как это натуральные числа и n находится на промежутке от 2 до 10 000 – они будут принадлежать к целочисленному типу integer.
Запишем логические скобки. Тело программы будет начинаться с оператора writeln, который будет выводить на экран поясняющее сообщение о том, что это программа расчёта количества шагов для подтверждения гипотезы Коллатца для натурального числа n. Дальше будет следовать оператор write, выводящий на экран запрос на ввод n. Теперь запишем оператор readln, считывающий значение n. Далее будет следовать оператор присваивания переменной step значение 0. Теперь запишем оператор цикла с постусловием repeat. И сразу запишем служебное слово until с условием завершения работы цикла – n = 1. Между служебными словами repeat и until запишем условный оператор if с условием: n mod 2 = 0 После служебного слова then запишем оператор присваивания n:=n div 2. После слова else запишем оператор присваивания переменной n её значения умноженного на 3 и увеличенного на 1. После условного оператора увеличим значение переменной step на 1. После цикла напишем оператор write, который будет выводит на Экран сообщение о том, что для подтверждения гипотезы Коллатца для заданного n потребовалось количество шагов равное значению переменной step.
program collatz;
writeln ('Программа расчёта количества шагов для подтверждения гипотезы Коллатца для натурального числа n.');
if n mod 2=0
then n:=n div 2
write ('Для подтверждения гипотезы Коллатца для заданного n потребовалось ', step, ' шагов.');
Программа для решения задачи
Запустим программу на выполнение и введём n=19. Гипотеза для числа 19 действительно подтверждается через 20 шагов.

Снова запустим программу на выполнение и введём n=3. Для числа 3 гипотеза действительно подтверждается через 7 шагов.

Программа работает правильно задача решена.
Важно запомнить:
· Цикл с предусловием на языке Pascal записывается так:
· Тело цикла с предусловием выполняется, после проверки его условия, и повторяется до тех пор, пока выполняется условие цикла.
· Если условие цикла изначально ложно, то тело цикла с предусловием при работе программы не будет выполнено ни разу.
· Цикл с постусловием на языке Pascal записывается так:
· Тело этого цикла начинает выполняться до проверки его условия и повторяется до тех пор, пока не выполняется условие цикла.
· Тело цикла с постусловием в любом случае выполняется хотя бы один раз.
Программирование циклов. Циклы с заданным условием продолжения и окончания работы
Будьте внимательны! У Вас есть 10 минут на прохождение теста. Система оценивания - 5 балльная. Разбалловка теста - 3,4,5 баллов, в зависимости от сложности вопроса. Порядок заданий и вариантов ответов в тесте случайный. С допущенными ошибками и верными ответами можно будет ознакомиться после прохождения теста. Удачи!
Система оценки: 5 балльная
Список вопросов теста
Вопрос 1
Как называется алгоритмическая структура, которая представляет собой последовательность действий, повторяющихся многократно?
Варианты ответов
- Следование
- Рекурсия
- Цикл
- Ветвление
Вопрос 2
Какая из приведённых блок-схем соответствует циклу с предусловием?
Варианты ответов
Вопрос 3
Чему будет равно t по завершении работы цикла?
t:=5;
repeat
t:=t mod 2;
until true;
Вопрос 4
Какая из приведённых блок-схем соответствует циклу с постусловием?
Варианты ответов
Вопрос 5
Чему будет равно k по завершении работы циклов?
k:=7;
while false do
repeat
k:=k+1;
until k
Вопрос 6
Какой из операторов языка Pascal используется для программирования цикла с предусловием?
Варианты ответов
Вопрос 7
Как называется последовательность действий, содержащаяся в цикле?
Варианты ответов
- Операторный блок цикла
- Тело цикла
- Заголовок цикла
- Условие цикла
Вопрос 8
Какое служебное слово в языке Pascal следует перед условием цикла с постусловием?
Варианты ответов
Вопрос 9
Сколько раз будет выполнен описанный цикл?
i:=1;
while i i:=i+5 mod 3;
Вопрос 10
Какой из операторов языка Pascal используется для записи цикла с постусловием?
Цикл с постусловием: принцип работы и примеры кода

Для повторения последовательности действий в программировании используются циклы. Существует несколько видов циклов. Эта статья посвящена циклу, который выполняется по крайней мере один раз и повторяется, пока истинно условие, которое указано после его тела. Это цикл с постусловием.
Віддамо футболку Збірної України з футболу з підписами гравців за донат від 200 грн на ЗСУ. У описі до донату обов'язково вказуй номер мобільного, щоб ми вручили приз! Кожні додаткові 200 грн у донаті +1 шанс на виграш!
Что такое цикл с постусловием
Цикл с постусловием — это последовательность действий, которая выполняется как минимум один раз и повторяется, пока указанное в конце условие истинно.
Задачи и принцип работы цикла с постусловием
Цикл с постусловием используют, когда нужно выполнить действия один раз и повторять их выполнение, пока выполняется условие цикла.
Цикл с постусловием работает по следующей схеме:

-
производится вход в цикл и выполняются инструкции, составляющие его тело;
Курс Управління командою в бізнесі.
Онлайн-курс для ефективного управління командою, спрямований на створення проактивних та самостійних команд, де мікроменеджмент не потрібний.
Примеры работы цикла с постусловием
Цикл с постусловием на разных языках программирования выглядит так:
C, C++, C#, Java, JavaScript и другие C-подобные языки
do < > while ();
Pascal
В Pascal вместо конструкции do . while используется конструкция repeat . until . Тело цикла выполняется один раз и повторяется не пока условие истинно, а пока оно не станет истинным. Когда при очередной проверке устанавливается, что условие истинно, производится выход из цикла.
repeat until ;
Python
Курс Python.
Цю мову програмування використовують від базових концепцій до складних застосувань у сферах штучного інтелекту. Після проходження курсу гарантовано отримай роботу в ІТ.
Цикл с постусловием не реализован в Python. Поведение цикла с постусловием можно сымитировать, например, следующими двумя способами (в обоих реализован цикл repeat . until , поскольку указывается условие выхода, а не продолжения).
Бесконечный цикл с принудительным выходом по break :
while True: if : break
Явная вставка тела цикла перед конструкцией цикла:
while not :
Простой цикл
Рассмотрим выполнение простого цикла с постусловием подробнее. Допустим, требуется выводить в консоли значение переменной i , пока оно меньше или равно 7. На C этот цикл можно записать так:
#include int main()< int i=3; do< printf("%d \n",i); i++; >while(i
Вывод будет таким:
3 4 5 6 7
Давайте посмотрим, что происходит при выполнении этого кода.
Курс Аналітик даних.
Протягом 4 місяців ви вивчите повний набір інструментів для аналізу даних та отримаєте можливість працевлаштування в Laba Group.
Последовательность Фибоначчи
Рассмотрим работу цикла с постусловием на примере вывода N указанных пользователем первых чисел Фибоначчи.
Последовательность Фибоначчи — это последовательность, в которой каждое очередное число является суммой предыдущих двух. Обычно эта последовательность начинается с нуля, но в некоторых источниках ее начинают с 1 и 1 или с 1 и 2 (как делал и сам Фибоначчи).
Вот первые десять чисел этой последовательности:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34

Пример кода составления последовательности Фибоначчи на Java
import java.util.*; class Fibonacci < public static void main (String[] args) throws java.lang.Exception < // Get user input and convert it to an integer System.out.print("How many Fibonacci values would you print? "); Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); // Initialize variables int index = 1; // Loop counter int prev1 = 1; // The previous number int prev2 = 0; // The number before the previous number do< System.out.println(prev2); // Calculate the next value int next = prev1 + prev2; // Move the previous back and set the previous to the current value prev2 = prev1; prev1 = next; // Increment index index++; >while(index >
Пример кода составления последовательности Фибоначчи на Python
# Get user input and convert it to an integer n = int(input("How many Fibonacci values would you like to print? ")) # Initialize variables index = 1 # Loop counter prev1 = 1 # The previous number prev2 = 0 # The number before the previous number while(True): print(prev2) # Calculate the next value next = prev1 + prev2 # Move the previous back and set the previous to the current value prev2 = prev1 prev1 = next # Increment index index += 1 # Check the condition if index > n: break

Программы с меню
Цикл с постусловием удобно использовать, например, для программ, в которых используется меню. После запуска программы выводится меню и пользователь выбирает нужный пункт.
Если выбрано какое-либо действие, кроме выхода, то производятся соответствующие действия, затем снова выводится меню. Иначе производится выход из программы:
import java.util.*; import java.time.LocalDate; import java.time.LocalTime; class Menu < public static void main (String[] args) throws java.lang.Exception < boolean exitLoop = false; do < System.out.println("Choose an operation below."); System.out.println("1. Print current date."); System.out.println("2. Print current time."); System.out.println("3. Exit."); System.out.print("Your choice >"); Scanner scanner = new Scanner(System.in); String n = scanner.nextLine(); switch (n) < case "1": LocalDate d = LocalDate.now(); System.out.println(d); break; case "2": LocalTime t = LocalTime.now(); System.out.println(t); break; case "3": exitLoop = true; break; default: System.out.print("Wrong input."); >System.out.println(); > while(!exitLoop); > >

Игровой цикл
Еще одним примером использования цикла с постусловием может послужить игра.
После запуска программы пользователю предлагается угадать, какое число выпадет, затем выводится результат (угадано или нет) и предлагается выбрать, играть снова или выйти. Так повторяется, пока не будет выбран выход из игры.
Пример кода игры с бросанием кубика на Java
import java.util.*; public class RollADie < private void greet() < System.out.println(); System.out.println("*".repeat(52)); System.out.println("Welcome to The Roll A Die Game"); System.out.println("*".repeat(52)); >private boolean continueGame() < System.out.println(); System.out.print("Enter 'Y' to roll a die again or anything else to exit: "); Scanner scanner = new Scanner(System.in); String n = scanner.nextLine(); return n.equalsIgnoreCase("Y"); >private void gameLoop() < // Get user input and check for errors int guess = 0; System.out.print("Your guess: "); Scanner scanner = new Scanner(System.in); final Random random = new Random(); try < guess = scanner.nextInt(); >catch (Exception e) < guess = 0; >if (guess < 1 || guess >6) < System.out.println("Wrong value. Must be from 1 to 6."); >else < // The user input lies between 1 and 6. Roll the dice. int r = random.nextInt(6) + 1; // Answer the user if (r == guess)< System.out.println("You win! It's " + r); >else < System.out.println("You lose! It's " + r); >> > public static void main (String[] args) throws java.lang.Exception < RollADie r = new RollADie(); r.greet(); do < // Execute the loop body if the precondition is satisfied r.gameLoop(); >while (r.continueGame()); > >

Цикл с пустым телом
Цикл с постусловием может быть «пустотелым». Пустые циклы используются, когда вычисления производятся в условии цикла, как в следующем примере на Java:
import java.util.*; class Empty < public static void main (String[] args) throws java.lang.Exception < int i, j; i = 20; j = 40; do< ; >while (++i < --j); System.out.println("Average is " + i); >>
В этом примере перед каждым вычислением условия цикла производится увеличение i на единицу и уменьшение j на единицу. Это делается с помощью преинкремента (++i) и предекремента (--j) .
Бесконечный цикл
Выполнение цикла с постусловием продолжается бесконечно, если в его теле ничто не делает значение условия ложным. Иногда такую ситуацию называют зацикливанием.
Рассмотрим такой пример на Java:
import java.util.*; class InfiniteLoop < public static void main (String[] args) < int i = 10; do< System.out.println(i); i--; >while (i > 0); > >
Этот код будет выводить в консоли числа от 10 до 1:
10 9 8 7 6 5 4 3 2 1
Но если пропущен декремент (уменьшение счетчика на единицу), то цикл будет бесконечно выводить десятку. Чтобы убедиться в этом, закомментируем строку с декрементом:
import java.util.*; class InfiniteLoop < public static void main (String[] args) < int i = 10; do< System.out.println(i); // i--; >while (i > 0); > >
10 10 10 10 10 10 10 10 10 .
Если цикл становится бесконечным по ошибке, это вызывает нестабильность программ. Но бесконечные циклы нередко специально применяются на практике. Это возможно благодаря конструкциям, позволяющим осуществлять выход из цикла. Кроме того, для выхода может использоваться сторожевой таймер.
Принудительный выход из цикла
Бесконечные циклы используются, например, в сценариях, управляющих игровыми персонажами, и в качестве циклов обработки сообщений в программах с оконным интерфейсом. Для выхода из них можно использовать оператор break .
Рассмотрим пример программы с циклом обработки сообщений на языке C:
do < bRet = GetMessage(&msg, NULL, 0, 0); if (bRet >0) // (Such a message must be processed.) < TranslateMessage(&msg); DispatchMessage(&msg); >else if (bRet < 0) // (Return code -1 indicates an error.) < // Handle the error. // . >else // (Return code 0 indicates "exit".) < break; >> while (1);
В этом фрагменте:
- запускается цикл;
- принимается сообщение, и в зависимости от него выполняется ветвление:
- если значение, возвращенное функцией GetMessage (код возврата), больше нуля, то он соответствует сообщению, которое нужно обработать;
- если код возврата меньше нуля, то произошла ошибка, и ее нужно обработать, а потом, возможно, выйти из программы;
- если код возврата равен нулю, то производится выход из программы с помощью оператора break ;
Когда в цикле используется переменная и ее значение изменено так, что значение условия становится ложным, то после этого цикл выполняется до конца.
Оператор break используют, чтобы принудительно выйти из цикла после строки с этим оператором.
Особенности цикла с постусловием
Сравнение цикла с постусловием с другими видами циклов:
- в цикле с постусловием условие находится после тела, а в цикле с предусловием — перед ним;
- цикл с постусловием выполняется по карайней мере один раз, а цикл с предусловием может не выполниться никогда;
- цикл с постусловием используют, когда количество повторений цикла заранее неизвестно, но оно не меньше единицы, а цикл со счетчиком — когда известно.
Заключение
Итак, цикл с постусловием используется, когда нужно выполнить последовательность действий один раз и повторять, пока соблюдается указанное условие. Это условие проверяется перед выходом из цикла, поэтому оно называется постусловием. Выход из цикла осуществляется, когда после очередной итерации значение условия становится ложным или когда встречается оператор break .
Некоторые языки позволяют использовать цикл с пустым телом. В этой конструкции вычисления выполняются в условии цикла.
Если в теле цикла ничто не влияет на значение его условия, цикл может повторяться бесконечно. Бесконечные циклы используются в играх, программах с оконным интерфейсом и в других случаях, когда требуется повторять действия, пока цикл не будет прерван извне.
Курс Python basic.
Після курсу ви зможете впевнено працювати з чатботами, скриптами, вбудованими системами, веб- та мобільними застосунками, а також навіть ігровими програмами.



