Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
А. Н. Васильев - Java. Объектно-ориентированное...doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
686.59 Кб
Скачать

Инструкция цикла 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 осуществляется завершение инструкции цикла.