- •Вступление. О книге и не только
- •Объектно-ориентированное программирование и Java
- •Часть I. Введение в Java Глава 1. Основы Java
- •Простые программы
- •Комментарии
- •Простые типы данных и литералы
- •Приведение типов
- •Основные операторы Java
- •Глава 2. Управляющие инструкции Java
- •Условная инструкция if()
- •Условная инструкция switch()
- •Инструкция цикла for()
- •Инструкция цикла while()
- •Инструкция do-while()
- •Метки и инструкции break() и continue()
Инструкция цикла for()
Все кончается рано или поздно.
Из к/ф «Гараж»
Для выполнения однотипных многократно повторяющихся действий использу- ют инструкции цикла. В Java существует несколько инструкций цикла. Рассмо- трим инструкцию цикла for().
Синтаксис вызова инструкции цикла for() следующий:
for(инициализация;условие;итерация){
//телоцикла
}
В круглых скобках после ключевого слова for указываются три группы, или бло- ка, выражений. Блоки разделяются точкой с запятой. Первый блок обычно назы- вается блоком инициализации. Как правило, в этом блоке размещается команда (или команды), которая перед выполнением цикла присваивает индексным пере- менным начальные значения. Второй блок — условие, при выполнении которого продолжается работа инструкции цикла. Третий блок содержит команды, которы- ми изменяются значения индексных переменных. Первый и третий блоки могут состоять из нескольких команд. Команды одного блока разделяются запятыми.
Далее, после ключевого слова for и круглых скобок в фигурных скобках идет блок команд, которые выполняются в рамках каждого цикла и фактически фор- мируют тело инструкции цикла. Если тело инструкции цикла состоит из одной команды, фигурные скобки можно не ставить. Выполняется инструкция цикла по следующему алгоритму.
Начинается выполнение инструкции цикла с блока инициализации: последо- вательно выполняются все команды этого блока. Далее проверяется условие во втором блоке. Если оно истинно (значение true), выполняются команды тела инструкции цикла (команды в фигурных скобках). Далее выполняются коман- ды третьего блока в круглых скобках и проверяется условие во втором блоке. Если условие истинно, выполняются команды основного тела инструкции цик- ла, команды блока изменения индексных переменных (третий блок), затем про- веряется условие и т. д. Вся эта процедура продолжается до тех пор, пока при проверке условия его значение не становится равным false.
По завершении инструкции цикла выполняется следующая после него инструк- ция. Обращаем внимание читателя на то, что команды первого блока инициа- лизации инструкции цикла выполняются только один раз на начальном этапе выполнения инструкции. Пример использования инструкции цикла приведен в листинге 2.6.
Листинг 2.6. Использование инструкции цикла for()
class UsingFor{
public static void main(String[] args){
Инструкция цикла for() 57
// Индексная переменная: int i;
// Переменная для вычисления суммы: int sum=0;
// Инструкция цикла: for(i=1;i<=100;i++){ sum+=i;}
System.out.println("Сумма чисел от 1 до 100: "+sum);}
}
Программой вычисляется сумма натуральных чисел от 1 до 100. Для этого вво- дится целочисленная переменная sum, которая инициализируется с начальным нулевым значением — в эту переменную записывается значение суммы. Вы- числение суммы осуществляется посредством инструкции цикла. В нем исполь- зуется целочисленная индексная переменная i. Объявляется переменная вне инструкции цикла. В первом блоке (блок инициализации) индексной перемен- ной присваивается значение 1. Проверяется условие i<=100, то есть инструкция цикла выполняется до тех пор, пока значение индексной переменной не превы- сит значение 100. В теле инструкции цикла переменная sum увеличивается на текущее значение индексной переменной i. В третьем блоке инструкции цикла командой i++ значение индексной переменной увеличивается на единицу.
Последней командой программы выводится сообщение о значении суммы. В ре- зультате выполнения программы мы получаем сообщение:
Сумма чисел от 1 до 100: 5050
Чтобы посчитать сумму нечетных чисел в указанном диапазоне, в третьем бло- ке изменения индексной переменной команду i++ достаточно заменить коман- дой i+=2. Кроме того, индексную переменную можно инициализировать прямо в первом блоке инструкции цикла. Пример измененной программы для вычис- ления суммы нечетных чисел приведен в листинге 2.7.
Листинг 2.7. Вычисление суммы нечетных чисел
class UsingFor2{
public static void main(String[] args){
// Переменная для вычисления суммы: int sum=0;
// Инструкция цикла: for(int i=1;i<=100;i+=2){ sum+=i;}
System.out.println("Сумма нечетных чисел от 1 до 100: "+sum);}
}
В результате выполнения программы получаем:
Сумманечетныхчиселот1до100:2500
Как уже отмечалось, первый блок инициализации и третий блок изменения индексной переменной могут состоять из нескольких команд. В листинге 2.8
приведен пример программы для вычисления суммы нечетных чисел, в которой команды инициализации переменных и команда основного тела инструкции цикла включены соответственно в первый и третий блоки инструкции цикла.
Листинг 2.8. Сумма нечетных чисел
class UsingFor3{
public static void main(String[] args){
int sum,i;
// Инструкция цикла: for(sum=0,i=1;i<=100;sum+=i,i+=2);
System.out.println("Сумма нечетных чисел от 1 до 100: "+sum);}
}
Индексная переменная i и переменная sum объявляются вне инструкции цикла. Инициализируются обе переменные в первом блоке. Условие выполнения ин- струкции цикла не изменилось. Третий блок состоит из двух команд: команды sum+=i, предназначенной для увеличения значения переменной sum на величину i, и команды i+=2, изменяющей значение индексной переменной. Тело инструк- ции цикла не содержит команд, поэтому после закрывающей круглой скобки стоит точка с запятой. Результат выполнения программы такой же, как и в пред- ыдущем случае. Отметим несколько принципиальных моментов.
Если переменные sum и i объявить в инструкции цикла, доступными они будут только в пределах этой инструкции. С индексной переменной i в этом случае проблем не возникает, а вот последняя команда программы, в которой имеется ссылка на переменную sum, оказывается некорректной.
Имеет значение порядок следования команд в третьем блоке инструкции цикла. Если команды sum+=i и i+=2 поменять местами, сначала будет изменяться зна- чение индексной переменной, а затем на это новое значение увеличиваться переменная sum. В результате сумма будет вычисляться не от 1, а от 3.
Хотя тело инструкции цикла не содержит команд, точку с запятой все равно ставить нужно. Если этого не сделать, телом цикла станет следующая после инструкции цикла команда — в данном случае это команда: System.out.println("Сумма нечетных чисел от 1 до 100: "+sum)
При этом с формальной точки зрения синтаксис программы остается кор- ректным и сообщение об ошибке не появляется. При выполнении программы на каждой итерации, за исключением последней, будет осуществляться вывод текущего значения переменой sum.
Блоки инструкции цикла могут быть пустыми. В листинге 2.9 приведен пример, в котором отсутствуют команды первого блока инициализации и третьего блока изменения значения индексной переменной. При этом программа работает кор- ректно, и сумма нечетных чисел вычисляется правильно.
Листинг 2.9. Пустые блоки в инструкции цикла
class UsingFor4{
public static void main(String[] args){
Инструкция цикла while() 59
int sum=0,i=1;
// Инструкция цикла с пустыми блоками: for(;i<=100;){
sum+=i; i+=2;}
System.out.println("Сумма нечетных чисел от 1 до 100: "+sum);}
}
Индексная переменная i и переменная для вычисления суммы sum инициали- зируются при объявлении вне инструкции цикла. Поэтому в блоке инициали- зации ничего инициализировать не нужно, и блок оставлен пустым (хотя точка с запятой все равно ставится). Второй блок с проверяемым условием остался неизменным. Третий блок также пустой. Команда i+=2, которая изменяет значе- ние индексной переменной, вынесена в тело инструкции цикла.
Ситуацию можно усугубить, что называется, до предела, видоизменив програм- му так, чтобы все три блока инструкции цикла были пустыми. Пример приведен в листинге 2.10.
Листинг 2.10. В инструкции цикла все блоки пустые
class UsingFor5{
public static void main(String[] args){
int sum=0,i=1;
// Инструкция цикла со всеми пустыми блоками: for(;;){
sum+=i; i+=2;
// Выход из инструкции цикла: if(i>100) break;}
System.out.println("Сумма нечетных чисел от 1 до 100: "+sum);}
}
Поскольку второй блок пустой, то формально мы имеем дело с бесконечным ци- клом. В таком цикле необходимо предусмотреть возможность выхода из цикла. Для этого последней в теле инструкции цикла размещена команда if(i>100) break с условной инструкцией. При выполнении условия, проверяемого в условной инструкции, командой break осуществляется завершение инструкции цикла.
