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

Введение в циклы.
Тело и условие цикла while

Сделать цикл – значит указать машине: такой-то код нужно выполнить не один раз, а много раз. Это крайне могучий инструмент всех языков программирования от самых древних до самых современных. Без него, как и без переменных и IF-ов, не обходится ни одна нормальная программа. В циклах вся сила машин – человек указывает, что нужно сделать, и говорит машине – повтори это десять миллионов раз, и она выполняет это за секунду.
Сразу разберём пример. Здесь мы выводим на экран числа от 0 до 99:
//	Заведем переменную i целого типа и равную нулю
	int i = 0;

//	знак цикла while означает 
//	«повторяй блок кода { … } пока верно условие внутри скобок», то есть  (i < 100)
	while (i < 100) {
		System.out.println (i);  // распечатать текущее значение i
		i = i + 1; 	// увеличить i на 1
	}
	System.out.println ("Жизнь за циклом продолжается");
Когда компилятор встретит слово while, он сразу поймёт, что это цикл. Код внутри фигурных скобок после while будет выполняться всё время, пока верно условие в круглых скобках. В данном случае в круглых скобках написано (i < 100), то есть мы ограничиваем переменную i значением 100. Поэтому блок кода внутри фигурных скобок повторится 100 раз.

В фигурных скобках мы написали – распечатать i, затем увеличить её на 1. Этот код будет выполнен много раз, и каждый раз переменная i будет увеличиваться. Сначала она равна 0, потом 1, потом 2 и так далее, и наконец она станет равной 99. Когда i равно 100, то условие i < 100 перестает выполняться, и цикл заканчивается. Заметьте, что поскольку мы написали i строго меньше 100, то последнее значение i=100 в цикл уже не входит. Как часто делают программисты, мы начали с нуля, а не с 1. Посчитайте: от 1 до 99 будет 99 чисел, а от 0 до 99 получится ровно 100 чисел. Поэтому наш цикл сделает 100 оборотов.

В данном случае мы сами решили начать с нуля и поставить условие (i<100). Мы могли бы начать и с 10 и поставить, например, i <=100. Читается такое условие "i меньше либо равно 100". То есть теперь уже 100 включено в последний оборот цикла. В будущих уроках мы будем проходить массивы – наборы чисел, которые нумеруются с нуля. Тогда начинать с нуля и заканчивать строгим неравенством будет необходимо. Пока что вы можете начинать с чего угодно и заканчивать как угодно, лишь бы программа делала в точности то, чего вы от неё хотите.

Переменные подобные i, которые постоянно меняют свои значения в цикле, часто называют счетчиками. Это обиходное, неофициальное название, тем не менее оно очень удобно – ведь с помощью переменной i мы можем сразу посчитать, на каком обороте цикла мы находимся.
Определение. Блок кода, который выполняется в цикле, называется его телом. Тело обычно выделяется парой фигурных скобок { … }, но может состоять из одной строчки кода и тогда ограничивается точкой с запятой и фигурные скобки можно не писать.
В общем виде цикл while выглядит так:
while (условие) { тело цикла }
т.е. повторять тело цикла, пока верно условие
Точно также и все блоки кода в фигурных скобках { … } называются телами. Такие тела есть у IF-ов, у функции main, у классов и так далее. Итак, условие цикла идет в круглых скобках после слова while, а тело – в фигурных скобках после условия.

Всегда можно дописать какое-то особое действие для одного или нескольких оборотов цикла – просто вставьте if в тело цикла:
while (i < 100) { 
	if (i == 50) 
		System.out.println ("печать только на 50-ом обороте");  // особо для 50го оборота
	i ++; 
}
Поскольку фраза i = i+1 пишется часто, то для неё в Java есть сокращение i++. Мы его разбирали в теме 3 раздела 1. Аналогично вы можете написать ++ i. И то, и другое увеличивает число i на 1. Разница их в том, что (++i) как числовое выражение равно значению i+1. Напротив (i++) как числовое выражение равно просто i, а увеличение на единицу произойдёт уже на следующем утверждении в коде. Вы можете легко понять, как они устроены, выполнив код System.out.println (i++).

Кроме увеличения на 1, часто бывает нужно изменить величину i на какое-то число. Разберём это в коде:
int i = 10;
// вывести старое значение 10, хотя i будет равно 11 уже на следующей строчке
System.out.println (i ++); 
i += 2; // увеличить i на 2
i -= 5; // уменьшить i на 5
i *= 3; // увеличить i в 3 раза
i /= 2; // уменьшить i в 2 раза
// Все эти операции можно применять и для переменных других типов, 
// не только в циклах, но и где угодно в коде. 
// В цикле бывает удобно кратно изменять основную переменную на каждом обороте, 
// но программист вправе написать в цикле любой код, какой ему нужен. */ 
Самое главное мы уже освоили. Теперь время решать задачи. Ответьте на несколько вопросов, чтобы лучше усвоился новый материал:
Вопрос 1. Как переводится с английского слово while?
Переводится дословно "пока" в контексте "делай, пока верно условие". Так что цикл while читается непосредственно на английском языке.
Вопрос 2. Если условие цикла всегда остаётся верным, то этот цикл будет вечно крутиться, пока кто-нибудь не перезагрузит компьютер?
Да, именно так. Компилятор не может этого отловить, потому что, может быть, программист так и хотел сделать. Часто такие циклы пишут так:
while ( true) {
System.out.println ("Печатать бесконечное количество раз");
System.out.println ("Ведь true и в самом деле равно true");
}
Здесь дело в том, что в условии цикла, как и IFа, если нет операторов сравнения меньше, больше или равно, то автоматически подразумевается сравнение с правдой. Но в условии написана константа true, и она вечно равна правде, так что условие будет верно всегда. Так что и тело цикла будет вечно печатать одну и ту же строчку.

Часто в такие циклы вставляют дополнительное условие остановки с оператором break, но о нём подробнее в теме 3 данного раздела.
Задача 1. Как сделать так, чтобы этот код печатал числа не от 0 до 99, а от 50 до 201?
//	Заведем переменную i целого типа и равную нулю
	int i = 0;

//	знак цикла while означает 
//	«повторяй блок кода { … } пока верно условие внутри скобок», то есть  (i < 100)
	while (i < 100) {
		System.out.println (i);  // распечатать текущее значение i
		i = i + 1; 	// увеличить i на 1
	}
Решение
В первой строчке объявлена переменная счётчик, которую мы будем постоянно печатать в цикле. Раз уж нам нужны числа от 50, то придадим переменной i новое начальное значение:

int i = 50;
while (i <= 201) // условие поменяем, чтобы дойти до 201 включительно
{
System.out.println (i); // сама печать
i ++;
}


Решайте больше задач по этому разделу здесь.
В следующей теме расскажем ещё о двух вариантах цикла do-while и for