Цикл while
Оператор цикла while есть практически во всех языках программирования. Он повторяет оператор или блок операторов до тех пор, пока значение его управляющего выражения истинно.
Форма цикла while следующая:
while(условие) < // тело цикла >
Здесь условие должно быть любым булевым выражением. Тело цикла будет выполняться до тех пор, пока условное выражение истинно. Когда условие становится ложным, управление передаётся строке кода, которая идёт после цикла. Если в цикле используется только один оператор, то фигурные скобки можно опустить (но лучше так не делать).
Логическое выражение вычисляется перед началом цикла, а затем каждый раз перед выполнением очередного повторения оператора.
Напишем пример с использованием цикла while, который выполняет обратный отсчёт от 10 до 0:
int counter = 10; while (counter > 0)
Программа выведет десять строк:
Осталось 10 сек. Осталось 9 сек. Осталось 8 сек. Осталось 7 сек. Осталось 6 сек. Осталось 5 сек. Осталось 4 сек. Осталось 3 сек. Осталось 2 сек. Осталось 1 сек.
Если нужно увеличивать от единицы до 10, то код будет следующим.
int counter = 1; while(counter
Поскольку цикл while вычисляет своё условное выражение в начале цикла, то тело цикла не будет выполняться, если условие с самого начала было ложным.
boolean isHungry; // голоден ли кот isHungry = true; // где вы видали сытого кота? while(!isHungry)
Вы никогда не увидите сообщение, так как сытый кот — это из области фантастики.
Обратный пример — бесконечный цикл. Создадим условие, которое всегда имеет значение true.
boolean isHungry; // голоден ли кот isHungry = true; while(isHungry)
В логах будет постоянно выводиться надпись «Кот голодный. «.
Тело цикла while может быть пустым. Например:
int i, j; i = 10; j = 30; // вычисляем среднее значение двух переменных while (++i < --j) ; // у цикла нет тела mInfoTextView.setText("Среднее значение равно " + i);
Пример работает следующим образом. Значение переменной i увеличивается, а значение переменной j уменьшается на единицу. Затем программа сравнивает два новых значения переменных. Если новое значение переменной i меньше нового значения переменной j, то цикл повторяется. На каком-то этапе значения обоих переменных сравняются и цикл прекратит свою работу. При этом переменная i будет содержать среднее значение исходных значений двух переменных. Достаточно изуверский способ вычисления среднего значения, но здесь главное увидеть пример цикла без тела. Все действия выполняются внутри самого условного выражения. Учтите, если значение первой переменной с самого начала будет больше второй переменной, то код пойдёт коту под хвост.
Профессиональные программисты часто используют циклы без тела, в которых само по себе управляющее выражение может выполнять все необходимые действия.
Числа Фибоначчи
О числах Фибоначчи почитайте в Википедии. А мы напишем пример, выводящий все числа до 150 при помощи цикла while:
private void showFibonacci() < int num1 = 0; int num2 = 1; int result = num1 + num2; mInfoTextView.setText(num1 + " " + num2 + " "); while (result < 150) < mInfoTextView.append(result + " "); num1 = num2; num2 = result; result = num1 + num2; >>
Циклы for и while взаимозаменяемы. Любой из них можно переписать в другой. Чтобы легче увидеть, как создаются циклы в разных вариантах, нужные части подсвечены цветом.
int i = 3; while (i >= 0) < System.out.println(i); i--; >
for (int i = 3; i >= 0; i--)
int i = 0; while (i < 3) < System.out.println(i); i++; >
for (int i = 0; i < 3; i++)
while (true) System.out.println("e");
for (; true; ) System.out.println("e");
Цикл while
Он используется в случае, когда один фрагмент кода должен выполняться, пока выполняется какое-то условие.
Рассмотрим синтаксис на следующем примере.
После ключевого слова while в круглых скобочках указывается выражение, которое должно возвращать значение типа boolean - это условие цикла. Далее в фигурных скобочках указываем тело цикла - код, который будет повторяться, пока условие цикла возвращает значение true . Пока выполняется условие n>0 , будет выполняться System.out.println . Мы видим, что переменная n меняется внутри тела цикла, что позволяет в конце концов выйти из него.
public class While1 < public static void main(String[] args) < int n = 10; while (n >0) < System.out.println("Тик " + n--); >> >
Условие цикла while проверяется перед выполнением тела цикла. В этом главное отличие цикла while от do-while.
Следующий пример показывает вариант использования цикла while без тела. Даны два числа 100 и 200 и необходимо найти середину между ними. Значение i увеличивается на 1 каждую итерацию цикла, а j уменьшается до тех пор, пока они не станут равны. Изменение i и j происходит в условии цикла, поэтому тело цикла не нужно. Вместо тела просто ставится точка с запятой.
public class NoBody < public static void main(String[] args) < int i = 100; int j = 200; // найти середину между i и j while (++i < --j) ; // цикл без тела System.out.println("Середина: " + i); >>
Цикл while может применяться для организации бесконечных циклов в виде while(true) :
public class EndlessLoop < public static void main(String[] args) < int i = 0; while (true) < System.out.println(i++); >> >
Презентацию с видео можно скачать на Patreon .
Java: Цикл While
Программы, которые мы пишем во время обучения, становятся все сложнее и объемнее. Они все еще очень далеки от реальных программ, где количество строк кода измеряется десятками и сотнями тысяч, но текущая сложность уже способна заставить напрячься людей без опыта.
Начиная с этого урока, мы переходим к одной из самых сложных базовых тем в программировании – циклам.
Любые прикладные программы служат очень прагматичным целям. Они помогают управлять сотрудниками, финансами, развлекают в конце концов. Несмотря на различия, все эти программы выполняют заложенные в них алгоритмы, которые очень похожи между собой.
Алгоритм — это последовательность действий или инструкций, которая приводит нас к какому-то ожидаемому результату. Это описание подходит под любую программу, но под алгоритмами обычно понимается что-то более специфичное.
Представьте себе, что у нас есть книга и мы хотим найти внутри нее какую-то конкретную фразу. Саму фразу мы помним, но не знаем, на какой она странице. Как найти нужную страницу?
Самый простой и долгий способ — последовательно просматривать книгу до тех пор, пока мы не найдем нужную страницу. В худшем случае придется просмотреть все страницы, но результат мы все равно получим.
Именно этот процесс и называется алгоритмом. Он включает в себя перебор страниц и логические проверки, нашли мы фразу или нет. Количество страниц, которое придется посмотреть, заранее неизвестно, но сам процесс просмотра повторяется из раза в раз совершенно одинаковым образом.
Для выполнения повторяющихся действий как раз и нужны циклы. Каждый такой повтор называется итерацией.
Допустим, мы хотим написать метод. Он должен выводить на экран все числа от 1 до того числа, которое мы указали через параметры:
App.printNumbers(3); // 1 // 2 // 3
Этот метод невозможно реализовать уже изученными средствами, так как количество выводов на экран заранее неизвестно. А с циклами это не составит никаких проблем:
public static void printNumbers(int lastNumber) < // i — это сокращение от index (порядковый номер) // Используется по общему соглашению во множестве языков как счетчик цикла var i = 1; while (i System.out.println("finished!"); > App.printNumbers(3);
1 2 3 finished!
В коде метода использован цикл while . Он состоит из трех элементов:
- Ключевое слово while . Несмотря на схожесть с вызовом методов, это не вызов метода
- Предикат — условие, которое указывается в скобках после while и вычисляется на каждой итерации
- Тело цикла — блок кода в фигурных скобках, аналогичный блоку кода в методе. Все константы или переменные, определенные внутри этого блока, будут видны только внутри этого блока
Конструкция читается так: «делать то, что указано в теле цикла, пока истинно условие i
// Инициализируется i var i = 1; // Предикат возвращает true, поэтому выполняется тело цикла while (1
Самое главное в цикле — завершение его работы, то есть выход из цикла. Процесс, который порождает цикл, должен в конце концов остановиться. Ответственность за остановку полностью лежит на программисте.
Обычно задача сводится к введению переменной, называемой счетчиком цикла. Он работает по такому принципу:
- Сначала счетчик инициализируется, то есть ему задается начальное значение. В примере выше счетчик — это инструкция var i = 1 , выполняемая до входа в цикл
- Затем в условии цикла проверяется, достиг ли счетчик своего предельного значения.
- В итоге счетчик меняет свое значение i = i + 1
На этом моменте новички делают больше всего ошибок. Представим, что в коде неправильно написана проверка в предикате. Это может привести к зацикливанию — ситуация, при которой цикл работает бесконечно и программа никогда не останавливается.
В таком случае приходится ее завершать принудительно:
public static void printNumbers(int lastNumber) < var i = 1; // Этот цикл никогда не остановится // и будет печатать всегда одно значение while (i System.out.println("finished!"); >
В некоторых случаях бесконечные циклы полезны. Здесь мы такие случаи не рассматриваем, но полезно увидеть, как выглядит этот код:
while (true) < // Что-то делаем >
Подведем итог. Когда все же нужны циклы, а когда можно обойтись без них? Невозможно обойтись без циклов тогда, когда алгоритм решения задачи требует повторения каких-то действий, при этом количество этих операций заранее неизвестно. Так и было в примере с книгой, который мы рассматривали в начале урока.
Задание
Модифицируйте метод printNumbers() так, чтобы он выводил числа в обратном порядке. Для этого нужно идти от верхней границы к нижней. То есть счётчик должен быть инициализирован максимальным значением, а в теле цикла его нужно уменьшать до нижней границы.
Пример вызова и вывода:
printNumbers(4);
4
3
2
1
finished!
Упражнение не проходит проверку — что делать?
Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:
- Обязательно приложите вывод тестов, без него практически невозможно понять что не так, даже если вы покажете свой код. Программисты плохо исполняют код в голове, но по полученной ошибке почти всегда понятно, куда смотреть.
В моей среде код работает, а здесь нет
Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.
Мой код отличается от решения учителя
Это нормально , в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.
В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.
Прочитал урок — ничего не понятно
Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.
Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.
Определения
- Цикл While — инструкция для повторения кода, пока удовлетворяется какое-то условие.
#7 – Циклы и операторы в них (For, While, Do while)
Циклы позволяют выполнить некий код несколько раз подряд. В ходе урока мы научимся использовать циклы в языке Java. Мы изучим работу с циклами: for, while и do while. Дополнительно мы изучим использование операторов внутри циклов.
Видеоурок
В языке Java, как и в большинстве других языков, существует 3 вида циклов. Каждый из них выполняет одну и ту же роль, но записывается по-разному. Рассмотрим все три цикла.
Цикл For
В цикле for все условия записываются в одном месте, что очень удобно во многих случаях. Стандартная запись такого цикла выглядит следующим образом:
for (int i = 0; i < 10; i++) System.out.println(i);
В объявлении цикла записывается следующее: переменная цикла, её начальное значение и диапазон. В примере выше будут выведены числа от 0 до 10.
Если в теле цикла всего одна строка кода, то фигурные скобки можно пропустить и не записывать их.
Цикл While
Суть цикла while не особо отличается от цикла for . Единственное отличие заключается в способе записи цикла. В while необходимо прописать лишь условие, а все остальные параметры записываются вне цикла:
int i = 1; // Создание переменной while (i
Цикл Do While
Цикл схож с циклом while по форме написания, но при этом работает немного по-другому. Цикл do..while будет выполнен один раз сто процентов, а дальше проверит условие и если оно верно, то цикл будет выполняться дальше:
int x = 13; do < x--; System.out.println(x); >while (x > 10);
Как видно из примера, цикл изначально неверный, но это не мешает ему сработать один раз.
Операторы для работы в циклах
Существует три основных оператора для работы в циклах:
- Оператор break - служит для выхода из цикла полностью;
- Оператор return - выполняет ту же функцию, что и оператор break, но для циклов лучше использовать break;
- Оператор continue - пропускает лишь одну итерацию и не выходит из цикла.
Весь код будет доступен после подписки на проект!
Задание к уроку
Квадраты чисел
Составьте программу, выводящую на экран квадраты чисел от 10 до 20 включительно
