Освой программирование играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Цикл while

Бесконечный цикл

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

Форма цикла while следующая:


while(условие) {
    // тело цикла
}

Здесь условие должно быть любым булевым выражением. Тело цикла будет выполняться до тех пор, пока условное выражение истинно. Когда условие становится ложным, управление передаётся строке кода, которая идёт после цикла. Если в цикле используется только один оператор, то фигурные скобки можно опустить (но лучше так не делать).

Логическое выражение вычисляется перед началом цикла, а затем каждый раз перед выполнением очередного повторения оператора.

Напишем пример с использованием цикла while, который выполняет обратный отсчёт от 10 до 0:


int counter = 10;
while (counter > 0) {
    mInfoTextView.append("Осталось " + counter + " сек.\n");
	counter--;
}

Программа выведет десять строк:


Осталось 10 сек.
Осталось 9 сек.
Осталось 8 сек.
Осталось 7 сек.
Осталось 6 сек.
Осталось 5 сек.
Осталось 4 сек.
Осталось 3 сек.
Осталось 2 сек.
Осталось 1 сек.

Если нужно увеличивать от единицы до 10, то код будет следующим.


int counter = 1;
while(counter < 11){
    System.out.println(counter);
    counter++;
}

Поскольку цикл while вычисляет своё условное выражение в начале цикла, то тело цикла не будет выполняться, если условие с самого начала было ложным.


boolean isHungry; // голоден ли кот
isHungry = true; // где вы видали сытого кота?
while(!isHungry) {
    mInfoTextView.setText("Случилось чудо - кот не голоден");
}

Вы никогда не увидите сообщение, так как сытый кот - это из области фантастики.

Обратный пример - бесконечный цикл. Создадим условие, которое всегда имеет значение true.


boolean isHungry; // голоден ли кот
isHungry = true;
while(isHungry) {
    System.out.println("Кот голодный...");
}

В логах будет постоянно выводиться надпись "Кот голодный...".

Тело цикла 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 взаимозаменяемы. Любой из них можно переписать в другой. Чтобы легче увидеть, как создаются циклы в разных вариантах, нужные части подсвечены цветом.

whilefor

int i = 3;
while (i >= 0)
{
    System.out.println(i);
    i--;
}

for (int i = 3; i >= 0; i--)
{
    System.out.println(i);
}

int i = 0;
while (i < 3)
{
    System.out.println(i);
    i++;
}

for (int i = 0; i < 3; i++)
{
    System.out.println(i);
}

while (true)
    System.out.println("e");

for (; true; )
    System.out.println("e");
Реклама