Оператор цикла do while
Если условное выражение, управляющее циклом while, первоначально имеет значение false, то тело цикла не будет выполняться вообще. Однако иногда желательно выполнить тело while-цикла по крайней мере один раз, даже если условное выражение сначала имеет значение false.
В Java имеется цикл do while, который делает именно это. Цикл do while всегда выполняет свое тело, по крайней мере один раз, потому что его условное выражение размещается в конце цикла. Общая форма цикла:
do {
statement; // тело цикла
} while (condition);
Каждая итерация цикла do while сначала выполняет тело цикла, а затем оценивает условное выражение. Если это выражение — true, цикл повторится. Иначе, цикл заканчивается. Как и у всех Java-циклов, condition должно быть булевским выражением.
Пример 7. В следующем фрагменте кода печатаются все целые числа от 0 до 9:
int count = 0;
do {
System.out.println(count);
count++;
} while(count < 10);
Контрольный вопрос 4. Написать фрагмент кода, выводящий на консоль четные числа от 2 до 100 с использованием цикла do-while:
Цикл do-while часто используют для получения ввода пользователя.
Оператор цикла for
Общая форма оператора for:
for(initialization;condition;iteration) {
// тело цикла
}
Если повторяется только один оператор, фигурные скобки не нужны.
Цикл for работает следующим образом. В начале работы цикла выполняется выражение initialization. В общем случае это выражение устанавливает значение переменной управления циклом, которая действует как счетчик. Важно понять, что выражение инициализации выполняется только один раз. Затем оценивается condition. Оно должно быть булевским выражением и обычно сравнивает переменную управления циклом с некоторым граничным значением. Если это выражение — true, то отрабатывают операторы из тела цикла, если — false, цикл заканчивается. Далее выполняется часть цикла iteration. Обычно это выражение, которое осуществляет инкрементные или декрементные операции с переменной управления циклом. Затем цикл реализовывает итерации. В каждом проходе цикла — сначала оценивается условное выражение, потом выполняется тело цикла и затем — выражение iteration. Этот процесс повторяется до тех пор, пока управляющее выражение не станет false.
Пример 8. В следующем фрагменте кода распечатываются целые числа 0…9
int count;
for(count = 0 ; count < 10 ; count++)
System.out.println(count);
Объявление переменных управления внутри цикла for
Часто переменная, которая управляет циклом for, необходима только для целей цикла и не используется в другом месте. Когда дело обстоит так, можно объявить переменную внутри инициализационной части for.
for(int count = 0 ; count < 10 ; count++)
System.out.println(count);
Когда переменная объявляется внутри заголовка for-цикла, важно помнить, что область ее действия заканчивается там же, где и у for-оператора (т. е. область действия переменной ограничена циклом for). Вне цикла for переменная прекратит существование.
Контрольный вопрос 5. Что напечатает следующая программа:
public class CountToTenError {
public static void main(String[] args) {
for (int i = 1; i <=10; i++)
System.out.println(i);
System.out.println(“The final value of i is “ + i);
}
}
Синтаксис цикла for позволяет использовать несколько переменных при инициализации и итерации. Например:
for(int i = 0, j = 10 ; i < 10 ; i++, j--)
sum += i * j;
Замечание. Выражения initialization,condition,iteration для цикла for являются вообще говоря не обязательными, например, допустим следующий оператор for(;;). Если condition пропущен, предполагается, что он имеет значение true.
Java допускает вложение циклов. То есть один цикл может быть внутри другого.
Пример 9.
int i, j;
for(i=0; i<10; i++) {
for(j=i; j<10; j++)
System.out.print(".”);
System.out.println();
}
}
Вывод этой программы:
..........
.........
........
…
.
Контрольный вопрос 5. Что делает следующий фрагмент кода.
int sum = 0;
for ( int number = 2; number <= 100; number += 2 )
sum += number;
System.out.println("The sum is " + sum);
Контрольный вопрос 6. Что напечатает следующая программа:
public class CountToTenErrorFixed {
public static void main(String[] args) {
int i;
for (i = 1; i <=10; i++)
System.out.println(i);
System.out.println(“The final value of i is “ + i);
}
}
Нигде не сказано, что итератор должен увеличиваться, он может и уменьшаться.
Контрольный вопрос 7. Что напечатает следующая программа:
public class CountDown {
public static void main(String[] args) {
for (int count = 10; count >= 1; count--) {
System.out.print(count+” “);
}
}
}
Контрольный вопрос 8. Будет ли работать следующий код ?
public class TerseCoder {
public static void main(String[] args) {
for (int i = 1; i <=10; System.out.println(i++));
}
}
Инициализационная и итерационная части цикла for могут состоять из нескольких выражений, разделенных запятыми.
Пример 10.
int a, b;
for (a = 1, b = 10; a <= 10; a++, b--)
System.out.println(a + “ “ + b);
output:
1 10
2 9
3 8
4 7
5 6
6 5
7 4
8 3
9 2
10 1
Любопытно, что все три части цикла for необязательны.
Вложенные циклы.
Пример 11.
public class NestedLoop {
public static void main(String[] args) {
for(int x = 1; x < 10; x++) {
for (int y = 1; y < 10; y++)
System.out.print(x + “-” + y + “ “);
System.out.println();
}
}
}
output:
1-1 1-2 1-3 1-4 1-5 1-6 1-7 1-8 1-9
2-1 2-2 2-3 2-4 2-5 2-6 2-7 2-8 2-9
3-1 3-2 3-3 3-4 3-5 3-6 3-7 3-8 3-9
4-1 4-2 4-3 4-4 4-5 4-6 4-7 4-8 4-9
5-1 5-2 5-3 5-4 5-5 5-6 5-7 5-8 5-9
6-1 6-2 6-3 6-4 6-5 6-6 6-7 6-8 6-9
7-1 7-2 7-3 7-4 7-5 7-6 7-7 7-8 7-9
8-1 8-2 8-3 8-4 8-5 8-6 8-7 8-8 8-9
9-1 9-2 9-3 9-4 9-5 9-6 9-7 9-8 9-9