Определенные циклы
Цикл for— очень распространенная конструкция для выполнения
повторений, количество которых контролируется счетчиком или аналогичной
переменной, обновляемой на каждой итерации. Как показано на рис. 3.12,
следующий цикл выводит на экран числа от 1 до 10.
for (int i = 1; i <= 10; i++) System.out.println(i);
Рис. 3.12. Блок-схема оператора for
Первый элемент оператора for обычно выполняет инициализацию
счетчика, второй формулирует условие выполнения тела цикла, а третий
определяет способ обновления счетчика.
Хотя в языке Java, как и в языке С++, элементами оператора цикла for
могут быть практически любые операторы, существуют неписанные правила
хорошего тона, которые утверждают, что три элемента оператора for
должны только инициализировать, проверять и обновлять один и тот же
счетчик. Если не придерживаться этих правил, можно написать совершенно
невразумительные циклы.
Даже следуя правилам хорошего тона, можно сделать многое. Например, можно написать цикл с убывающим счетчиком.
for (int i = 10; i > 0; -i) System.out.prinln("Обратный отсчет ..." + i); System.out.println("Старт!);
Будьте осторожны, проверяя в цикле равенство двух чисел с плавающей
точкой. Представленный ниже цикл может никогда не завершиться:
for (double х = 0; х != 10; х += 0.1)…
Из-за ошибок округления окончательный результат никогда не будет
достигнут. Например, в приведенном выше цикле переменная х изменит свое
значение с 9.999999999999998 на 10.099999999999998, поскольку для числа
0.1 не существует точного двоичного представления.
При объявлении переменной в первой части оператора for ее область видимости простирается до конца тела цикла.
for (int i = 1; i <= 10; i++) { … } // Здесь переменная i больше не определена.
В частности, если переменная определена внутри оператора for, ее
нельзя использовать вне этого цикла. Следовательно, если вы хотите
использовать конечное значение счетчика вне цикла for, эту переменную
нужно объявлять до цикла!
int i; for (i = 1; i <= 10; i++) { … } // Здесь переменная i продолжает быть определенной.
С другой стороны, можно объявить переменные, имеющие одинаковое имя в разных циклах for.
for (int i = 1; i <= 10; i++) { … } for (int i = 11; i <= 20; i++) // Переопределение переменной i. { … }
Разумеется, цикл for эквивалентен циклу while. Точнее, оператор
for (onepaтор1, выражение1, выражение2) оператор2; эквивалентен следующей конструкции. { оператор1 ; while (выражение1 { оператор1.; операторг2; } }
В листинге 3.5 показан типичный пример использования цикла for.
Эта программа вычисляет вероятность выигрыша в лотерее. Например, если
нужно угадать 6 номеров от 1 до 50, количество возможных вариантов
равно (50 х 49 х 48 х 47 X 46х45)/(1 х2хЗх4х5х6), так что шанс выиграть
равен 1 из 15890700. Удачи!
В общем, если нужно угадать k номеров из n, количество возможных вариантов равно n*(n-1)*(n-2)*...*(n – k + 1) / 1*2*З*...*k
Следующий цикл for вычисляет эту величину.
int lotteryOdds = 1; for (int i = 1; i <= k; i++) lotteryOdds = lotteryOdds * (n - i + 1) / i;
Листинг 3.5. Программа lotteryOdds.java
|