Java: руководство для начинающих
Шрифт:
Ниже приведен весь исходный код программы из файла Help.java. /* Пример для опробования 3.1. Простая справочная система. */ class Help { public static void main(String args[]) throws java.io.IOException { char choice; System.out.println("Help on:") ; System.out.println(" 1. if"); System.out.println(" 2. switch"); System.out.print("Choose one: "); choice = (char) System.in.read; System.out.println("\n") ; switch(choice) { case '1': System.out.println("The if:\n"); System.out.println("if(condition) statement;"); System.out.println("else statement;"); break; case '2': System.out.println("The switch:\n"); System.out.println("switch(expression) {"); System.out.println(" case constant:"); System.out.println(" statement sequence"); System.out.println(" break;"); System.out.println (" // ..."); System.out.println ("}"); break; default: System.out.print("Selection not found."); } } }
Выполнение
Цикл for уже был представлен в главе 1, а здесь он рассматривается более подробно. Вас должны приятно удивить эффективность и гибкость этого цикла. Прежде всего обратимся к самым основным и традиционным формам цикла for.
Ниже приведена общая форма цикла for для повторного выполнения единственного оператора. for (инициализация; условие; итерация) оператор;
А вот как выглядит его форма для повторного выполнения кодового блока. fог (инициализа ция; условие; итера ция) { последовательность операторов; }
где инициализация, как правило, представлена оператором присваивания, задающим первоначальное значение переменной, которая выполняет роль счетчика и управляет циклом; условие — это логическое выражение, определяющее необходимость повторения цикла; а итерация — выражение, определяющее величину, на которую должно изменяться значение переменной, управляющей циклом, на каждом шаге цикла. Обратите внимание на то, что эти три основные части оператора цикла for должны быть разделены точкой с запятой. Выполнение цикла for будет продолжаться до тех пор, пока проверка условия дает истинный результат. Как только эта проверка даст ложный результат, цикл завершится, а выполнение программы будет продолжено с оператора, следующего после цикла for.
Ниже приведен пример программы, где цикл for служит для вывода на экран значений квадратного корня чисел в пределах от 1 до 99. В данной программе отображается также ошибка округления, допущенная при вычислении квадратного корня. // Вывод квадратных корней чисел от 1 до 99 вместе с ошибкой округления, class SqrRoot { public static void main(String args[]) { double num, sroot, rerr; for(num = 1.0; num < 100.0; num++) { sroot = Math.sqrt(num); System.out.println("Square root of " + num + " is " + sroot); // вычислить ошибку округления rerr = num - (sroot * sroot); System.out.println("Rounding error is " + rerr); System.out.println ; } } }
Обратите внимание на то, что ошибка округления вычисляется путем возведения в квадрат квадратного корня числа. Полученное значение отнимается от исходного числа.
Переменная цикла может как увеличиваться, так и уменьшаться, а величина приращения может выбираться произвольно. Например, в приведенном ниже фрагменте кода выводятся числа в пределах от 100 до -95, и на каждом шаге переменная цикла уменьшается на 5. // Цикл for, выполняющийся с отрицательным приращением переменной, class DecrFor { public static void main(String args[]) { int x; //На каждом шаге
В отношении циклов for следует особо подчеркнуть, что условное выражение всегда проверяется в самом начале цикла. Это означает, что код в цикле может вообще не выполняться, если проверяемое условие с самого начала оказывается ложным. Рассмотрим следующий пример: for(count=10; count < 5; count++) x += count; // этот оператор не будет выполнен
Этот цикл вообще не будет выполняться, поскольку первоначальное значение переменной count, которая им управляет, сразу же оказывается больше 5. А это означает,что условное выражение count < 5 оказывается ложным с самого начала, т.е. еще до выполнения первого шага цикла. Некоторые разновидности цикла for
Цикл for относится к наиболее универсальным операторам языка Java, поскольку он допускает самые разные варианты применения. Например, для управления циклом можно использовать несколько переменных. Рассмотрим следующий пример программы: // Применение запятых в операторе цикла for. class Comma { public static void main(String args[]) { int i, j; // Для управления этим циклом используются две переменные. for (i=0, j =10; i < j; i++, j —) System.out.println("i and j: " + i + " " + j); } }
Выполнение этой программы дает следующий результат: i and j 0 10 i and j 1 9 i and j 2 8 i and j 3 7 i and j 4 6
В данном примере запятыми разделяются два оператора инициализации и еще два итерационных выражения. Когда цикл начинается, инициализируются обе переменные, i и j. Всякий раз, когда, цикл повторяется, переменная i инкрементируется, а переменная j декрементируется. Применение нескольких переменных управления циклом нередко оказывается удобным и упрощает некоторые алгоритмы. Теоретически в цикле for может быть указано любое количество операторов инициализации и итерации, но на практике такой цикл получается слишком громоздким, если применяется больше двух подобных операторов.
Условным выражением, управляющим циклом for, может быть любое действительное выражение, дающее результат типа bool. В него не обязательно должна входить переменная управления циклом. В следующем примере программы цикл будет выполняться до тех пор, пока пользователь не введет с клавиатуры букву S. // Выполнение цикла до тех пор, пока с клавиатуры //не будет введена буква S. class ForTest { public static void main(String args[]) throws java.io.IOException { int i; System.out.println("Press S to stop."); for(i = 0; (char) System.in.read != 'S'; i++) System.out.println("Pass #" + i); } } Пропуск отдельных частей в определении цикла for
Ряд интересных разновидностей цикла for получается в том случае, если оставить пустыми отдельные части в определении цикла. В Java допускается оставлять пустыми любые или же все части инициализации, условия и итерации в операторе цикла for. В качестве примера рассмотрим следующую программу: // Пропуск отдельных частей в определении цикла for. class Empty { public static void main(String args[]) { int i; // В определении этого цикла отсутствует итерационное выражение. for(i =0; i < 10; ) { System.out.println("Pass #" + i) ; i++; // инкрементировать переменную управления циклом } } }