Блок 1. Раздел 3. Тема 2

Циклы for и do-while.

В Java предусмотрены три основных базовых вида циклов. С видом while мы уже знакомы, теперь очередь do-while и for. Суть та же - повторять тело цикла, пока верно условие. Отличается оформление и небольшие детали.
Кроме слова while, можно пользоваться словами for и do-while.

Разберем сначала цикл for. У него есть три секции - объявление переменных, условие окончания цикла и операция, которую нужно постоянно выполнять на каждом обороте. Чаще всего в секции объявления переменных создают счётчик, затем пишут условие, что счётчик меньше заданного числа, а в последней секции ставят увеличение счетчика на единицу. Посмотрим пример:
for (int i = 0; i < 10; i ++) {
	System.out.println (i);(
}
Этот цикл распечатывает значения i = 0, 1, 2, 3, …, 9. Цикл for полностью аналогичен циклу while – отличается только оформление. После слова for идут круглые скобки и в них через точку запятой необходимо вставить 3 раздела:
for (Объявление переменных;
Условие окончания; операции)
{ Тело цикла }
Переменная, объявленная в for, будет «жить» только внутри цикла. Поэтому обычно в for объявляют счетчик, который нужен только для него. Можно оставить этот раздел пустым, тогда пишется просто точка с запятой, вот так:
int i = 0;
// Заведем пустой раздел объявления переменных. 
// Тогда мы сможем переменной i продолжать пользоваться после цикла 
for ( ; i < 10; i += 2) 
	System.out.println (i);
// У этого цикла тело из одной строчки – можно не ставить фигурные скобки. 
// Здесь тело отделено просто точкой с запятой.  

// Поскольку переменная i была объявлена ещё до начала for, 
// то к ней можно обращаться и дальше, например, снова распечатать:

System.out.println ("После цикла i равно " + i); 
// будет распечатано 10, хотя последняя распечатка в цикле была 8.
// Дело в том, что i < 10 ещё работает при i = 8, и уже неверно при i = 10.
// Поэтому внутри цикла крайнее значение 8, но после него переменная,
// в последний раз увеличившись на 2 и уже не пройдя условие i<10,
// останется равной 10.
Условие окончания точно такое же, как и в while. Последний раздел – операция, которая будет повторятся на каждом обороте цикла. Например, i++ или i += 2, или i = 2*i + 1. Это любая операция, которую можно записать в одну строчку. Поскольку переменные в одной строке можно объявлять через запятую, то это допускается и в цикле for. Также и операции можно указывать через запятую специально для такой секции в for:
for (int i = 0, j = 10; i < 10; i ++, j --) {
	System.out.println (i); // печатать i, идущую от 0 к 10
	System.out.println (j); // печатать j, идущую от 10 к 0
}	// иногда нужно идти не от 0 к 10, а наоборот от 10 к 0.
Цикл do-while
Он полностью аналогичен циклу while, с единственной разницей – сначала исполняется тело цикла, а затем уже проверяется условие окончания. Поясним на примере:
int i = 0;
do {    // этот код выполнится хотя бы 1 раз в любом случае
	System.out.println (i);
	i ++;
} while (i < 10);  // условие проверяется каждый раз после первого прогона
Обозначение для цикла легко читается по-английски – «do while» буквально значит «делай блок кода, пока верно условие в скобках». При этом тело цикла do-while запустится хотя бы один раз совершенно точно, в то время как цикл while может не запуститься ни одного раза, если его условие сразу же выдает ложь. Например:
int i = 100;
do {    // этот код выполнится хотя бы 1 раз наверняка
	System.out.println (i);
	i ++;
} while (i < 10);  // i = 101 больше 10 – цикл завершен, но один прогон состоялся

int j = 100;
//	цикл не выполнится ни одного раза – условие ложно
while (j < 10) {    // j = 100 больше 10 – цикл завершен, не начавшись
	System.out.println (j); //распечатки не будет ни одной
	j ++;
}
Иногда на первом обороте цикла происходят действия, которые точно нужно выполнить и затем уже рассуждать, стоит ли выполнять цикл дальше – тогда лучше использовать do-while. Наоборот, если возможно цикл не имеет смысла запускать вовсе, то лучше использовать while.

Все три цикла while, for и do-while полностью эквивалентны - зная хотя бы один из них, вы можете писать те же программы, что и с помощью других.
Самое главное мы уже освоили. Теперь время решать задачи. Ответьте на несколько вопросов, чтобы лучше усвоился новый материал:
Вопрос 1. Какой код можно писать в теле цикла?
В теле цикла пишется такой же код как везде. Там могут быть IFы, вызовы функций. Внутри тела цикла можно запустить новый цикл - он будет полностью прокручиваться от начала до конца на каждом обороте исходного цикла. Так мы получим двойной цикл - им будет посвящена одна из ближайших тем.

Также тело может быть пустым, например:
int i = 0;
for (; i < 100; i += 20);
Такой for будет делать вычисления за счет своей операции i+=20, а тело может быть и не нужно - оно просто ограничено точкой с запятой, а команд в нём нет.

Вопрос 2. И всё-таки, что лучше - while, for или do-while?
Это исключительно вопрос удобства в конкретном случае, а в целом все циклы эквивалентны.

Нужно объявить переменную, поставить условие окончания цикла и итерировать (переходить от шага к шагу) в одной строчке? Это for.

Необходимо быть уверенным, что цикл запустится хоть раз точно? Это do-while

Может быть, цикл не запустится ни одного раза или просто лень думать, какой из циклов брать,- берите while.
Задача 1. Что будет напечатано по итогу выполнения этого кода и почему?
int x = 10;
int y = 100;

for ( ; x < y; x += 20, y --) ;

System.out.println ("x равен " + x + " ; y равен " + y);
Правильный вывод программы
x равен 110 ; y равен 95
Объяснение
Сначала x = 10, y = 100. В цикле x каждый раз увеличивается на 20, в то же время y уменьшается на 1. Рассмотрим значения переменных на каждом обороте цикла:
1) x равен 10 ; y равен 100
2) x равен 30 ; y равен 99
3) x равен 50 ; y равен 98
4) x равен 70 ; y равен 97
5) x равен 90 ; y равен 96
В последний раз выполнена операция, условие стало неверным и после цикла на печати будет выведено: x равен 110 ; y равен 95 .
Решайте больше задач по этому разделу здесь.
В следующей теме расскажем про возможность остановить цикл досрочно с помощью операторов break и continue