Найти в Дзене

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

Бесплатный курс теории и практики по программированию на Java, рассчитанный на тех, кто изучает программирование с нуля.

Ещё одним вариантом цикла является цикл 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.

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

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

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