Найти в Дзене

Крутой курс Java для "чайников". Урок 18. Цикл while.

Ещё одним вариантом цикла является цикл while.

Аналогично циклу for при выполнении цикла while также выполняется блок команд до тех пор, пока выполняется определённое условие. У него также есть проверочное условие, есть тело цикла. И одно его выполнение также называется итерацией.

Цикл while имеет следующий синтаксис

while (проверочное выражение)

{

код для выполнения на каждой итерации (тело цикла);

}

Алгоритм работы цикла while:

1. Проверятся на истинность проверочное выражение.

2. Если проверочное выражение истинно, то выполняется тело цикла, которое расположено внутри фигурных скобок {}

3. После того, как завершится тело цикла, программа снова переходит к проверке на истинность проверочного выражения, т.е. на 1-й шаг.

Дословно можно представить алгоритм работы примерно так

пока (проверочное выражение истинно)

{

выполняется код на каждой итерации

}

В отличие от цикла for в случае с while нет части кода, в которой происходит объявление и изменение оператора счётчика, который бы отвечал за количество итераций, которые должны выполниться, и за то, в какой момент нужно сделать проверочное условие ложным, чтобы вовремя прекратить выполнение цикла. Здесь необходимо отдельно об этом позаботиться.

Важно! Если на входе в цикл проверочное выражение ложно, то ни одна итерация цикла не будет выполнена. Цикл, оценив проверочное выражение и получив в результате false, перейдёт к выполнению следующей задачи.

Теперь на конкретном примере. Возьмём пример из урока 16 (про цикл for) и реализуем его с помощью цикла while.

Задача - вывести на экран числа от 1 до 10, каждое число с новой строки.

Код для такой задачи будет следующий

int i = 1;

while ( i <= 10)

{

System.out.println(i);

i++;

}

Как он будет выполняться?

Сначала мы объявляем переменную (до цикла), фактически она будет счётчиком, и присваиваем ей начальное значение 1.

Затем входим в цикл.

Осуществляется проверка проверочного выражения i <= 10, то есть 1 <= 10.

Оно верно, соответственно, тело цикла выполнится.

Сначала выполнится команда вывода текста на экран

System.out.println(i);

В результате чего на экран будет выведено значение переменной i (которое на данный момент равно 1).

Затем выполнится оператор инкремента i++, после чего значение переменной i станет равно 2.

Смотрим, выполнится вторая итерация или нет. Проверяем на истинность проверочное условие i <= 10, т.е. 2 <= 10. Оно верно. Соответственно, вторая итерация выполнится.

Опять выполняем оператор вывода текста на экран

System.out.println(i);

Значение переменной i на данный момент равно 2. Это число и будет выведено на экран.

Затем сработает инкремент i++, значение i станет равно 3.

Всё, вторая итерация завершена.

Аналогично выполнятся с 3-й по 9-ю итерации.

Смотрим, что у нас будет после выполнения 9-й итерации. Очевидно, значение переменной i станет равно 10.

Смотрим, выполнится 10-я итерация или нет. Выполняем проверку проверочного условия. i <= 10, т.е. 10 <= 10. Пока ещё проверочное выражение верно. Значит, 10-я итерация выполнится.

Опять на экран будет выведено значение переменной i командой

System.out.println(i);

Т.е. будет выведено число 10.

Затем опять сработает оператор инкремента i++ и значение переменной i станет равно 11.

Смотрим, выполнится 11-я итерация или нет.

Проверяем, верно ли проверочное условие. i <= 10, т.е. 11 <= 10.

Проверочное условие не верно. То есть тело цикла не выполнится и программа перейдёт к выполнению последующих задач (либо завершит своё выполнение если таковых нет).

Как обычно рассматриваем особенности.

1. Ещё раз акцентирую внимание!!! В случае цикла while конструкция предусматривает только проверочное условие. Заботиться о том, чтобы оно в нужный момент было верно, а в другой нужный момент неверно, надо самостоятельно. Кроме того, надо составлять конструкцию так, чтобы цикл не стал бесконечным. То есть чтобы в какой-то момент проверочное условие стало ложным.

2. Аналогично циклу for можно выполнять любые необходимые операции с переменной-счётчиком:

  • инкремент, декремент i++, i--,
  • прибавление или вычитание любого числа i = i + 2; i = i - 5;
  • умножение и деление на любое число i *= 3; i /= 7;
  • Любые другие. Главное, чтобы проверочное условие было истинно или ложно в нужный момент исполнения программы.

3. Если в какой-то момент проверочное условие не станет ложным, то тело цикла будет исполняться снова и снова. Цикл станет бесконечным.

Пример бесконечного цикла в случае while

while (true)

{

Тело цикла

}

4. Проверочное условие может быть как простым выражением, так и сложным. Главное, чтобы результатом выполнения этого выражения было логическое значение (boolean) - true или false.

Например, можно так

while ((i >= 0) && (j <= 10))

или так

while ((i <= 5) || (j != 0))

или

while (text != "end")

5. Циклы while подобно циклам for можно вкладывать один в другой.

Здесь, как и ранее рассмотрим пример из урока 16. Он был выполнен с помощью вложенных циклов for. А мы выполним его с помощью вложенных циклов while.

int i = 1;

int j = 1;

while (i <= 3)

{

System.out.println("Номер итерации внешнего цикла - " + i);

while (j <= 3)

{

System.out.println(" Номер итерации внутреннего цикла - " + j);

j++;

}

i++;

j = 1;

}

Теперь смотрим, как эта конструкция работает.

Поскольку при работе с циклом while об объявлении переменной нужно заботиться заранее, мы объявили их до цикла.

Программа входит в цикл.

Осуществляем проверку проверочного условия первого (внешнего) цикла while (i <= 3). До цикла значение i было равно 1. 1 <= 3, что соответствует действительности, значит первая итерация внешнего цикла будет выполнена.

Начинается она с вывода на экран номера итерации.

То есть будет выведено "Номер итерации внешнего цикла - 1".

Продолжаем выполнять первую итерацию внешнего цикла. Доходим до внутреннего цикла. Проверяем на действительность проверочное условие j <= 3. То есть 1 <= 3. Условие верно. Значит, первая итерация внутреннего цикла будет выполнена.

Начинается она с вывода на экран номера итерации внутреннего цикла. Итак, на первой его итерации на экран будет выведено " Номер итерации внутреннего цикла - 1".

Далее выполнится оператор инкремента j++, в результате чего значение переменной j будет увеличено на 1 и станет равно 2.

Всё. Первая итерация внутреннего цикла завершена.

Заново осуществляем проверку на истинность проверочного условия внутреннего цикла. j <= 3, то есть 2 <= 3. Условие верно. Значит, вторая итерация внутреннего цикла выполнится.

Выполняем тело цикла. Выводим на экран текст " Номер итерации внутреннего цикла - 2". Затем инкрементом j++ увеличиваем значение переменной j на единицу. Теперь значение j равно 3.

Всё. Вторая итерация внутреннего цикла завершена.

Проверочное условие j <= 3, т.е. 3 <= 3, всё ещё истинно. Соответственно, выполняем третью итерацию внутреннего цикла. Выводим на экран " Номер итерации внутреннего цикла - 3". Опять увеличиваем значение j на единицу. Теперь оно равно 4.

Всё. Третья итерация внутреннего цикла выполнилась.

Теперь при проверке проверочного условия мы обнаружим, что оно ложно. 4 <= 3 является ложью. Поэтому четвертая итерация внутреннего цикла не будет выполнена.

Итак, после внутреннего цикла мы увеличиваем значение переменной i на единицу оператором инкремента. i++.

Теперь обратим внимание на такой момент. После выполнения последней итерации значение переменной j стало равно 4.

Чтобы наш внутренний цикл, который начнёт работу на второй итерации внешнего цикла, начал отсчёт с единицы, нужно присвоить переменной j значение 1, что мы и делаем командой j = 1

Всё. Первая итерация внешнего цикла завершена.

Выполняем проверку проверочного условия внешнего цикла. i <= 3. Поскольку значение i стало равно 2, проверочное условие истинно, вторая итерация внешнего цикла выполнится.

На второй итерации произойдёт всё то же самое, что и на первой:

- Вывод текста "Номер итерации внешнего цикла - 2"

- Три итерации внутреннего цикла, которые в конечном итоге три раза выведут на экран текст с номером итерации внутреннего цикла.

- Значение переменной i будет увеличено ещё на единицу.

- Значение переменной j снова станет равно 1 после выполнения оператора присвоения.

Таким образом, аналогично циклу for всего за программу будут выполнены 3 итерации внешнего цикла и на каждой итерации внешнего цикла будут выполнены по 3 итерации внутреннего цикла. Итого тело внутреннего цикла будет выполнено 9 раз (по 3 раза на каждой итерации внешнего цикла).

Для наглядности ещё раз копирую из урока 16 результат выполнения кода

1. Первая итерация внешнего цикла.

Вывод на экран текста "Номер итерации внешнего цикла - 1"

1.1. Первая итерация внутреннего цикла

Вывод на экран текста " Номер итерации внутреннего цикла - 1"

1.2. Вторая итерация внутреннего цикла

Вывод на экран текста " Номер итерации внутреннего цикла - 2"

1.3. Третья итерация внутреннего цикла

Вывод на экран текста " Номер итерации внутреннего цикла - 3"

2. Вторая итерация внешнего цикла.

Вывод на экран текста "Номер итерации внешнего цикла - 2"

2.1. Первая итерация внутреннего цикла

Вывод на экран текста " Номер итерации внутреннего цикла - 1"

2.2. Вторая итерация внутреннего цикла

Вывод на экран текста " Номер итерации внутреннего цикла - 2"

2.3. Третья итерация внутреннего цикла

Вывод на экран текста " Номер итерации внутреннего цикла - 3"

3. Третья итерация внешнего цикла.

Вывод на экран текста "Номер итерации внешнего цикла - 3"

3.1. Первая итерация внутреннего цикла

Вывод на экран текста " Номер итерации внутреннего цикла - 1"

3.2. Вторая итерация внутреннего цикла

Вывод на экран текста " Номер итерации внутреннего цикла - 2"

3.3. Третья итерация внутреннего цикла

Вывод на экран текста " Номер итерации внутреннего цикла - 3"

6. Работу цикла while также можно прервать преждевременно при выполнении определённого условия с помощью ключевого слова break

Пример такой конструкции для цикла while

int i = 1;

while (i <= 10)

{

System.out.println(i);

i++;

}

Эта конструкция последовательно выводит на экран числа от 1 до 10.

Можно прервать выполнение цикла, например, при значении переменной i, равном 3. Тогда конструкция будет следующей:

int i = 1:

while (i <= 10)

{

if (i == 3)

{

break;

}

System.out.println(i);

i++;

}

Результатом выполнения такого кода будет вывод на экран чисел от 1 до 2 (с 1-й по 2-ю итерацию). Затем по мере исполнения 3-й итерации программа дойдёт до исполнения оператора if. Когда условие в скобках будет истинным (при значении i, равном 3) выполнится код в фигурных скобках. То есть программа выйдет из цикла. При этом оставшиеся команды тела цикла на 3-й итерации (а это вывод текста на экран и оператор инкремента) и оставшиеся итерации цикла (с 4-й по 10-ю) выполнены не будут.

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

7. В проверочном выражении цикла while не обязательно использовать только числовые значения. Можно использовать, например, текстовые.

Такая конструкция имеет право на жизнь

int i = 1;

String j = "";

while (j != "quit")

{

System.out.println(i);

if (i == 5) j = "quit";

i++;

}

Не нарушая традиций, посмотрим, как выполняется код из примеров данного урока.

int i = 1;

while ( i <= 10)

{

System.out.println(i);

i++;

}

Готовый код

Результат выполнения

-2

Теперь пример с вложенными циклами.

-3

Результат выполнения

-4

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

Ну и, наконец, рассмотрим пример с прерыванием цикла с помощью ключевого слова break.

int i = 1;

while (i <= 10)

{

if (i == 7)

{

System.out.println("Прерывание цикла при значении i = " + i);

break;

}

System.out.println(i);

i++;

}

Готовый код

-5

Результат его выполнения

-6

Выводы:

  • Тело цикла while выполняется до тех пор, пока верно проверочное выражение.
  • Одно выполнение тела цикла while называется итерацией.
  • В отличие от цикла for при использовании цикла while необходимо самостоятельно подумать о том, как обеспечить выполнение циклом нужного количества итераций. То есть нужно вне синтаксиса цикла объявить переменную счётчик и обеспечить её изменение.
  • Если на входе в цикл while проверочное условие сразу ложно, ни одна итерация цикла не будет выполнена.
  • Операции по изменению переменной-счетчика могут быть любыми - как простыми - инкремент и декремент, так и более сложными.
  • Необходимо следить за тем, чтобы цикл не стал бесконечным, т.е. за тем, чтобы проверочное условие в какой-то момент стало ложным.
  • Проверочное условие цикла while может быть как простым, так и сложным выражением. Оно может использовать как числовые значения, так и любые другие, в том числе текстовые. Главное, чтобы результатом выполнения выражения было логическое значение true или false.
  • Аналогично циклу for циклы while можно вкладывать один в другой, если с помощью такой конструкции удобно решить поставленную задачу.
  • Работу цикла while можно прервать преждевременно с помощью ключевого слова break.

Ссылка на предыдущий урок

Ссылка на следующий урок

Ссылка на содержание курса