Текст книги "Java: руководство для начинающих (ЛП)"
Автор книги: Герберт Шилдт
Жанр:
Программирование
сообщить о нарушении
Текущая страница: 7 (всего у книги 36 страниц)
Прежде чем переходить к чтению последующих разделов этой главы, поэкспериментируйте с собственными разновидностями цикла for. В ходе эксперимента вы непременно обнаружите замечательные свойства этого цикла. Расширенный цикл for
С недавних пор в распоряжение программирующих на Java предоставлен так называемый расширенный цикл for, обеспечивающий специальные средства для перебора объектов из коллекции, например из массива. Расширенный цикл for будет представлен в главе 5 при рассмотрении массивов. Цикл while
Еще одной разновидностью циклов в Java является while. Ниже приведена общая форма этого цикла. while (условие) оператор;
где оператор – это единственный оператор или блок операторов, а условие означает конкретное условие управления циклом и может быть любым логическим выражением. В этом цикле оператор выполняется до тех пор, пока условие истинно. Как только условие становится ложным, управление программой передается строке кода, следующей непосредственно после цикла.
Ниже приведен простой пример использования цикла while для вывода на экран букв английского алфавита. // Демонстрация цикла while, class WhileDemo { public static void main(String args[]) { char ch; // вывести буквы английского алфавита, используя цикл while ch = 'а'; while(ch <= 1z1) { System.out.print(ch); ch++; } } }
В данном примере переменная ch инициализируется кодом буквы а. На каждом шаге цикла на экран сначала выводится значение переменной ch, а затем это значение увеличивается на единицу. Процесс продолжается до тех пор, пока значение переменной ch не станет больше кода буквы z.
Как и в цикле for, в цикле while проверяется условное выражение, указываемое в самом начале цикла. Это означает, что код в теле цикла может вообще не выполняться, а кроме того, избавляет от необходимости производить отдельную проверку перед самим циклом. Данное свойство цикла while демонстрируется в следующем примере программы, где вычисляются целые степени числа 2 от 0 до 9. // Вычисление целых степеней числа 2. class Power { public static void main(String args[]) { int e; int result; for(int i=0; i < 10; i++) { result = 1; e = i; while(e > 0) { result *= 2; e–; } System.out.println("2 to the " + i + " power is " + result); } }
Ниже приведен результат выполнения данной программы. 2 to the 0 power is 1 2 to the 1 power is 2 2 to the 2 power is 4 2 to the 3 power is 8 2 to the 4 power is 16 2 to the 5 power is 32 2 to the 6 power is 64 2 to the 7 power is 128 2 to the 8 power is 256 2 to the 9 power is 51.2
Обратите внимание на то, что цикл while выполняется только в том случае, если значение переменной е больше нуля. А когда оно равно нулю, как это имеет место на первом шаге цикла for, цикл while пропускается. Цикл do-while
Третьей и последней разновидностью циклов в Java является do-while. В отличие от циклов for и while, в которых условие проверялось в самом начале, в цикле do-while условие выполнения проверяется в самом конце. Это означает, что цикл do-while всегда выполняется хотя бы один раз. Ниже приведена общая форма цикла do-while. do { операторы; } while (условие) ;
При наличии лишь одного оператора фигурные скобки в данной форме записи необязательны. Тем не менее они зачастую используются для того, чтобы сделать конструкцию do-while более удобочитаемой и не путать ее с конструкцией цикла while. Цикл do-while выполняется до тех пор, пока условное выражение истинно. // Демонстрация цикла do-while. class DWDemo { public static void main(String args[]) throws java.io.IOException { char ch; do { System.out.print("Press a key followed by ENTER: ") ; ch = (char) System.in.read(); // ввести символ с клавиатуры } while(ch != 1q1); } }
Используя цикл do-while, мы можем усовершенствовать игру в угадывание букв, созданную в начале этой главы. На этот раз выполнение цикла будет продолжаться до тех пор, пока пользователь не угадает букву. // Игра в угадывание букв, четвертая версия, class Guess4 { public static void main(String args[]) throws java.io.IOException { char ch, ignore, answer = 'S'; do { System.out.println("I'm thinking of a letter between A and Z."); System.out.print("Can you guess it: "); // ввести символ с клавиатуры ch = (char) System.in.read(); // отвергнуть все остальные символы во входном буфере do { ignore = (char) System.in.read(); } while(ignore != 'n'); if(ch == answer) System.out.println("** Right **"); else { System.out.print("...Sorry, you're "); if(ch < answer) System.out.println("too low"); else System.out.println("too high"); System.out.println("Try again!n"); } } while(answer != ch) ; } }
Ниже приведен один из возможных вариантов выполнения данной программы в интерактивном режиме. I'm thinking of a letter between A and Z. Can you guess it: A ...Sorry, you're too low Try again! I'm thinking of a letter between A and Z. Can you guess it: Z ...Sorry, you're too high Try again! I'm thinking of a letter between A and Z. Can you guess it: S ** Right **
Обратите внимание на еще одну интересную особенность данной программы: в ней применяются два цикла do-while. Первый цикл выполняется до тех пор, пока пользователе не введет правильную букву. А второй цикл приведен ниже и требует дополнительных пояснений. // отвергнуть все остальные символы во входном буфере do { ignore = (char) System.in.read(); } while(ignore != ’n');
Как пояснялось ранее, консольный ввод буферизуется построчно. Это означает, что для передачи символов, вводимых с клавиатуры, приходится нажимать клавишу , что приводит к формированию последовательности символов перевода строки и возврата каретки. Эти символы сохраняются во входном буфере вместе с введенными с клавиатуры. Кроме того, если ввести с клавиатуры несколько символов подряд, не нажав клавишу , они так и останутся во входном буфере.
В рассматриваемом здесь цикле эти символы отвергаются до тех пор, пока не будет достигнут конец строки. Если не сделать этого, лишние символы будут передаваться программе как отгадываемые, что не соответствует правилам игры в отгадывание. (Для того чтобы убедиться в этом, попробуйте закомментировать внутренний цикл do-while в исходном коде программы.) После представления ряда других языковых средств Java в главе 10 рассматриваются некоторые более совершенные способы обработки консольного ввода. Но применение метода read () в данной программе дает элементарное представление о принципе действия системы ввода-вывода в Java. А кроме того, в данной программе демонстрируется еще один пример применения циклов в практике программирования на Java.
Пример для опробования 3.2. Расширение справочной системы Java
В этом проекте предстоит расширить справочную систему Java, созданную в примере для опробования 3.1. В эту версию программы будут добавлены сведения о синтаксисе циклов for, while и do-while. Кроме того, будет реализована проверка действий пользователя, работаю щего с меню. Цикл будет повторяться до тех пор, пока пользователь не введет допустимое значение.
Последовательность действий
Скопируйте файл Help.java в новый файл Help2.java.
Измените часть программы, ответственную за отображение вариантов, предлагаемых пользователю на выбор. Реализуйте ее с помощью циклов так, как показано ниже. public static void main(String args[]) throws java.io.IOException { char choice, ignore; do { System.out.println("Help on:"); System.out.println(" 1. if"); System.out.println(" 2. switch"); System.out.println(" 3. for"); System.out.println(" 4. while"); System.out.println (" 5. do-whilen"); System.out.print("Choose one: "); choice = (char) System.in.read(); do { ignore = (char) System.in.read(); } while(ignore != 'n'); } while ( choice < 'l1 | choice > '5'); }
Обратите внимание на вложенные циклы do-while, используемые с целью избавиться от нежелательных символов, оставшихся во входном буфере. После внесения приведенных выше изменений программа будет отображать меню в цикле до тех пор, пока пользователь не введет числовое значение в пределах от 1 до 5.
Дополните оператор switch выводом на экран сведений о синтаксисе циклов for, while и do-while, как показано ниже.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; case '3': System.out.println("The for:n"); System.out.print("for(init; condition; iteration)"); System.out.println(" statement;"); break; case ' 4 ' : System.out.println("The while:n"); System.out.println("while(condition) statement;"); break; case '5': System.out.println("The do-while:n"); System.out.println("do {"); System.out.println(" statement;"); System.out.println("} while (condition);"); break; }
Обратите внимание на то, что в данном варианте оператора switch отсутствует ветвь default. А поскольку цикл отображения меню будет выполняться до тех пор, пока пользователь не введет допустимое значение, необходимость в обработке неправильных значений отпадает.
Ниже приведен весь исходный код программы из файла Help2.java. /* Пример для опробования 3.2. Расширенная справочная система, в которой для обработки результатов выбора из меню используется цикл do-while. */ class Help2 { public static void main(String args[]) throws java.io.IOException { char choice, ignore; do { System.out.println("Help on:"); System.out.println(" 1. if"); System.out.println(" 2. switch"); System.out.println(" 3. for"); System.out.println(" 4. while"); System.out.println(" 5. do-whilen"); System.out.print("Choose one: "); choice = (char) System.in.read(); do { ignore = (char) System.in.read(); } while(ignore != 'n'); } while ( choice < '1' | choice > '5'); 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; case '3': System.out.println("The for:n"); System.out.print("for(init; condition; iteration)"); System.out.println(" statement;"); break; case '4': System.out.println("The while:n"); System.out.println("while(condition) statement;"); break; case '5': System.out.println("The do-while:n"); System.out.println("do {"); System.out.println(" statement;"); System.out.println("} while (condition);"); break; } } } Применение оператора break для выхода из цикла
С помощью оператора break можно специально организовать немедленный выход из цикла в обход любого кода, оставшегося в теле цикла, а также минуя проверку условия цикла. Когда в теле цикла встречается оператор break, цикл завершается, а выполнение программы возобновляется с оператора, следующего после этого цикла. Рассмотрим следующий краткий пример программы: // Применение оператора break для выхода из цикла, class BreakDemo { public static void main(String args[]) { int num; num = 100; // выполнять цикл до тех пор, пока квадрат значения // переменной i меньше значения переменной num for(int i=0; i < num; i++) { if(i*i >= num) break; //прекратить цикл, если i*i >= 100 System.out.print(i + " "); } System.out.println("Loop complete."); } }
Выполнение этой программы дает следующий результат: 0123456789 Loop complete.
Как видите, цикл for организован для выполнения в пределах значений переменной num от 0 до 100. Но, несмотря на это, оператор break прерывает этот цикл раньше, когда квадрат значения переменной i становится больше значения переменной num.
Оператор break можно применять в любых циклах, предусмотренных в Java, включая и те, что намеренно организованы бесконечными. В качестве примера ниже приведен простой пример программы, в которой вводимые данные читаются до тех пор, пока пользователь не введет с клавиатуры букву q. // Чтение вводимых данных до тех пор, пока не будет получена буква q. class Break2 { public static void main(String args[]) throws java.io.IOException { char ch; // "Бесконечный" цикл, завершаемый с помощью оператора break. for ( ; ; ) { ch = (char) System.in.read(); // ввести символ с клавиатуры if(ch == 'q1) break; } System.out.println("You pressed q!"); } }
Если оператор break применяется в целом ряде вложенных циклов, то он прерывает выполнение только самого внутреннего цикла. В качестве примера рассмотрим следующую программу: // Применение оператора break во вложенных циклах, class ВгеакЗ { public static void main(String args[]) { for(int i=0; i<3; i++) { System.out.println("Outer loop count: " + i); System.out.print(" Inner loop count: "); int t = 0; while(t < 100) { if(t == 10) break; // прервать цикл, если t = 10 System.out.print(t + " "); t++; } System.out.println(); } System.out.println("Loops complete."); } }
Выполнение этой программы дает следующий результат: Outer loop count: 0 Inner loop count: 0123456789 Outer loop count: 1 Inner loop count: 0123456789 Outer loop count: 2 Inner loop count: 0123456789 Loops complete.
Как видите, оператор break из внутреннего цикла вызывает прерывание только этого цикла. А на выполнение внешнего цикла он не оказывает никакого влияния. В отношении оператора break необходимо также иметь в виду следующее. Во-первых, в теле цикле может присутствовать несколько операторов break, но применять их следует очень аккуратно, поскольку чрезмерное количество операторов break обычно приводит к нарушению нормальной структуры кода. И во-вторых, оператор break, выполняющий выход из оператора switch, оказывает воздействие только на этот оператор, но не на объемлющие его циклы. Оператор break в качестве оператора goto
Помимо оператора switch и циклов, оператор break может быть использован как “цивилизованный” вариант оператора goto. В языке Java оператор goto отсутствует, поскольку он дает возможность произвольного перехода в любую точку программы, что способствует созданию плохо структурированного кода. Программы, в которых часто используется оператор goto, обычно сложны для восприятия и сопровождения. Но в некоторых случаях оператор goto может оказаться полезным. Его удобно, например, использовать для экстренного выхода из многократно вложенных циклов.
Для решения подобных задач в Java определена расширенная форма оператора break. Используя этот вариант оператора break, можно, например, выйти за пределы одного или нескольких кодовых блоков. Эти блоки должны быть частью циклов или оператора switch. Кроме того, нужно явно указать точку, с которой должно быть продолжено выполнение программы. Для этой цели в расширенной форме оператора break предусмотрена метка. Как будет показано далее, оператор break позволяет воспользоваться всеми преимуществами оператора goto и в то же время избежать сложностей, связанных с его применением.
Ниже приведена общая форма оператора break с меткой, break метка;
Как правило, метка – это имя, обозначающее кодовый блок. При выполнении расширенного оператора break управление передается за пределы именованного кодового блока. Оператор break с меткой может содержаться непосредственно в именованном кодовом блоке или в одном из блоков, входящих в состав именованного блока. Следовательно, рассматриваемый здесь вариант оператора break можно использовать для выхода из ряда вложенных блоков. Но это языковое средство не позволяет передать управление в кодовый блок, не содержащий оператор break.
Для того чтобы присвоить имя кодовому блоку, нужно поставить перед ним метку. Именовать можно как независимый блок, так и оператор, адресатом которого является кодовый блок. Роль метки может выполнять любой допустимый в Java идентификатор с двоеточием. Пометив кодовый блок, метку можно использовать в качестве адресата оператора break. Благодаря этому выполнение программы возобновляется с конца именованного блока. Например, в приведенном ниже фрагменте кода используются три вложенных блока. // Применение оператора break с меткой, class Break4 { public static void main(String args[]) { int i; for(i=l; i<4; i++) { one: { two: { three: { System.out.println ("ni is " + i) ; // Переходы no меткам. if(i==l) break one; if(i==2) break two; if(i==3) break three; // Эта строка кода никогда не будет достигнута. System.out.println("won't print"); } System.out.println("After block three."); } System.out.println("After block two."); } System.out.println("After block one."); } System.out.println("After for."); } }
Выполнение этого фрагмента кода дает следующий результат: i is 1 After block one. i is 2 After block two. After block one. i is 3 After block three. After block two. After block one. After for.
Рассмотрим подробнее приведенный выше фрагмент кода, чтобы лучше понять, каким образом получается именно такой результат его выполнения. Когда значение переменной i равно 1, условие первого оператора if становится истинным и управление передается в конец блока с меткой one. В результате выводится сообщение "After block one. " (После первого блока). Если значение переменной i равно 2, то успешно завершается проверка условия во втором операторе i f и выполнение программы продолжается с конца блока с меткой two. В результате выводятся по порядку сообщения "After block two." (После второго блока) и "After block one. ". Когда же переменная i принимает значение 3, истинным становится условие в третьем операторе if и управление передается в конец блока с меткой three. В этом случае выводятся все три сообщения: два упомянутых выше, а также сообщение "After block three. " (После третьего блока), а затем еще и сообщение "After for. " (После цикла for).
Обратимся к еще одному примеру. На этот раз оператор break будет использован для выхода за пределы нескольких вложенных циклов. Когда во внутреннем цикле выполняется оператор break, управление передается в конец блока внешнего цикла. Этот блок помечен меткой done. В результате происходит выход из всех трех циклов. // Еще один пример применения оператора break с меткой, class Break5 { public static void main(String args[]) { done: for(int i=0; i<10; i++) { for(int j=0; j<10; j++) { for (int k=0; k<10; k++) { System.out.println(k + " ") ; if(к == 5) break done; // переход по метке done } System.out.println("After k loop"); // не выполнится } System.out.println("After j loop"); // не выполнится } System.out.println("After i loop"); } }
Ниже приведен результат выполнения данного фрагмента кода. 0 1 2 3 4 5 After i loop
Расположение метки имеет большое значение, особенно когда речь идет о циклах. Рассмотрим в качестве примера следующий фрагмент кода: // Расположение метки имеет большое значение, class Вгеак6 { public static void main(String args[]) { int x=0, y=0; // Здесь метка располагается перед оператором, stopl: for(x=0; х < 5; х++) { for(у = 0; у < 5; у++) { if(у == 2) break stopl; System.out.println("х and у: " + x + " и + у); } } System.out.println(); //А здесь метка располагается непосредственно перед // открывающей фигурной скобкой. for(x=0; х < 5; х++) stop2: { for(у =0; у < 5; у++) { if(у == 2) break stop2; System.out.println("х and у: " + x + " " + у); } } } }
Ниже приведен результат выполнения данного фрагмента кода. х and у: 0 0 х and у: 0 1 х and у: 0 0 х and у: 0 1 X and У 1 0 X and У 1 1 X and У 2 0 X and У 2 1 X and У 3 0 X and У 3 1 X and У 4 0 X and У 4 1
Ряды вложенных циклов в данном фрагменте кода идентичны за исключением того, что в первом ряду метка находится перед внешним циклом for. В таком случае при выполнении оператора break управление передается в конец всего блока цикла for, а оставшиеся итерации внешнего цикла пропускаются. Во втором ряду метка находится перед открывающей фигурной скобкой кодового блока, определяющего тело внешнего цикла. Поэтому при выполнении оператора break stop2 управление передается в конец тела внешнего цикла for, и далее выполняется очередной его шаг.
Не следует, однако, забывать, что в операторе break нельзя использовать метку, не определенную в объемлющем его цикле. Например, приведенный ниже фрагмент кода некорректен и не подлежит компиляции. // Этот фрагмент кода содержит ошибку, class BreakErr { public static void main(String args[]) { one: for(int i=0; i<3; i++) { System.out.print("Pass " + i + ” : ") ; } for(int j=0; j<100; j++) { if(j == 10) break one; // НЕВЕРНО! System, out .print (j + " 11 ); } }
Кодовый блок, обозначенный меткой one, не содержит оператор break, и поэтому управление не может быть передано этому блоку. Применение оператора continue
С помощью оператора continue можно организовать преждевременное завершение шага итерации цикла в обход обычной структуры управления циклом. Оператор continue осуществляет принудительный переход к следующему шагу цикла, пропуская любой код, оставшийся невыполненным. Таким образом, оператор continue служит своего рода дополнением оператора break. В приведенном ниже примере программы оператор continue используется в качестве вспомогательного средства для вывода четных чисел в пределах от 0 до 100. // Применение оператора continue. class ContDemo { public static void main(String args[]) { int i; // вывести четные числа в пределах от 0 до 100 for(i = 0; i<=100; i++) { if((i%2) != 0) continue; // завершить шаг итерации цикла System.out.println(i); } } }
В данном примере выводятся только четные числа, поскольку при обнаружении нечетного числа шаг итерации цикла завершается преждевременно в обход вызова метода println().
В циклах while и do-while оператор continue вызывает передачу управления непосредственно условному выражению, после чего продолжается процесс выполнения цикла. А в цикле for сначала вычисляется итерационное выражение, затем условное выражение, после чего цикл продолжается.
Как и в операторе break, в операторе continue может присутствовать метка, обозначающая тот объемлющий цикл, выполнение которого должно быть продолжено. Ниже приведен пример программы, демонстрирующий применение оператора continue с меткой. // Применить оператор continue с меткой, class ContToLabel { public static void main(String args[]) { outerloop: for(int i=l; i < 10; i++) { System.out.print("nOuter loop pass " + i + ", Inner loop: "); for(int j = 1; j < 10; j++) { if(j == 5) continue outerloop; // продолжить внешний цикл System.out.print (j); } } } }
Выполнение этой программы дает следующий результат: Outer loop pass 1, Inner loop: 1234 Outer loop pass 2, Inner loop: 1234 Outer loop pass 3, Inner loop: 1234 Outer loop pass 4, Inner loop: 1234 Outer loop pass 5, Inner loop: 1234 Outer loop pass 6, Inner loop: 1234 Outer loop pass 7, Inner loop: 1234 Outer loop pass 8, Inner loop: 1234 Outer loop pass 9, Inner loop: 1234
Как следует из приведенного выше примера, при выполнении оператора continue управление передается внешнему циклу, и оставшиеся итерации внутреннего цикла пропускаются.
В реальных программах оператор continue применяется очень редко. И объясняется это, в частности, богатым набором в Java операторов цикла, удовлетворяющих большую часть потребностей в написании прикладных программ. Но в особых случаях, когда требуется преждевременное прекращение цикла, оператор continue позволяет сделать это, не нарушая структуру кода.
Пример для опробования 3.3. Завершение построения справочной системы Java
В этом проекте предстоит завершить построение справочной системы Java, начатое в предыдущих проектах. Данная версия будет дополнена сведениями о синтаксисе операторов break и continue, а также даст пользователю возможность запрашивать сведения о синтаксисе нескольких операторов. Эта цель достигается путем добавления внешнего цикла, который выполняется до тех пор, пока пользователь не введет с клавиатуры букву q вместо номера пункта меню.
Последовательность действий
Скопируйте файл Help2.java в новый файл Help3.java.
Поместите весь исходный код программы в бесконечный цикл for. Выход из этого цикла будет осуществляться с помощью оператора break, который получит управление тогда, когда пользователь введет с клавиатуры букву q. А поскольку этот цикл включает в себя весь код, то выход из него означает завершение программы.
Измените цикл отображения меню так, как показано ниже.do { System.out.println('1. if"); System.out.println('2. switch"); System.out.println('3. for"); System.out.println('4. while"); System.out.println('5. do-while"); System.out.println('6. break"); System.out.println('7. continuen") System.out.println('Help on:"); System.out.print("Choose one (q to quit): choice = '(char) System.in.read(); do { ignore = (char) System.in.read(); } while(ignore != fn'); } while( choice < '1' | choice > '7' & choice != ' q1); Как видите, цикл теперь включает в себя операторы break и continue. Кроме того, буква q воспринимается в нем как допустимый вариант выбора.
Дополните оператор switch операторами break и continue, как показано ниже. case '6': System.out.println("The break:n"); System.out.println("break; or break label;"); break; case ’71: System.out.println("The continue:n"); System.out.println("continue; or continue label;"); break;
Ниже приведен весь исходный код программы из файла Help3.java. /* Пример для опробования 3.3. Завершенная справочная система по управляющим операторам Java, обрабатывающая многократные запросы. */ class Не1рЗ { public static void main(String args[]) throws java.io.IOException { char choice, ignore; for(;;) { do { System.out.println("Help on:"); System.out.println(" 1. if"); System.out.println(" 2. switch"); System.out.println(" 3. for"); System.out.println(" 4. while"); System.out.println(" 5. do-while"); System.out.println(" 6. break"); System.out.println(" 7. continuen"); System.out.print("Choose one (q to quit): "); choice = (char) System.in.read(); do { ignore = (char) System.in.read(); } while(ignore != 'n'); } while( choice < '1' | choice > '7' & choice != 'q'); if (choice == 'q') break; 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 (11 // ..."); System.out.println("}"); break; case '3' : System.out.println("The for:n"); System.out.print("for(init; condition; iteration)"); System.out.println(" statement;"); break; case '4' : System.out.println("The while:n"); System.out.println("while(condition) statement;"); break; case '5': System.out.println("The do-while:n"); System.out.println("do {"); System.out.println(" statement;"); System.out.println("} while (condition);"); break; case '6' : System.out.println("The break:n"); System.out.println("break; or break label;"); break; case '7': System.out.println("The continue:n"); System.out.println("continue; or continue label;"); break; } System.out.println(); } } }
Ниже приведен один из возможных вариантов выполнения данной программы в диалоговом режиме. Help on: 1. if 2. switch 3. for 4. while 5. do-while 6. break 7. Continue Choose one (q to quit): 1 The if: if(condition) statement; else statement; Help on: 1. if 2. switch 3. for 4. while 5. do-while 6. break 7. Continue Choose one (q to quit): 6 The break: break; or break label; Help on: 1. if 2. switch 3. for 4. while 5. do-while 6. break 7. Continue Choose one (q to quit): q Вложенные циклы
Как следует из предыдущих примеров программ, один цикл может быть вложен в другой. С помощью вложенных циклов решаются самые разные задачи. Поэтому, прежде чем завершить рассмотрение циклов в Java, уделим еще немного внимания вложенным циклам. Ниже приведен пример программы, содержащей вложенные циклы for. С помощью этих циклов для каждого числа от 2 до 100 определяется ряд множителей, на которые данное число делится без остатка. /* Использовать вложенные циклы для выявления множителей чисел от 2 до 100. */ class FindFac { public static void main(String args[]) { for(int i=2; i <= 100; i++) { System.out.print("Factors of " + i + ": ") ; for(int j = 2; j < i; j++) if((i%j) == 0) System.out.print(j + " "); System.out.println() ; } } }
Ниже приведена часть результата выполнения данной программы. Factors of 2: Factors of 3: Factors of 4: 2 Factors of 5: Factors of 6: 2 3 Factors of 7: Factors of 8: 2 4 Factors of 9: 3 Factors of 10: 2 5 Factors of 11: Factors of 12: 2 3 4 Factors of 13: Factors of 14: 2 7 Factors of 15: 3 5 Factors of 16: 2 4 8 Factors of 17: Factors of 18: 2 3 6 Factors of 19: Factors of 20: 2 4 5 В данной программе переменная i из внешнего цикла последовательно принимает значения до 2 до 100. А во внутреннем цикле для каждого числа от 2 до текущего значения переменной i выполняется проверка, делится ли это значение без остатка. В качестве упражнения попробуйте сделать данную программу более эффективной. (Подсказка: число итераций во внутреннем цикле можно уменьшить.) ## Упражнение для самопроверки по материалу главы 3 1. Напишите программу, которая вводила бы символы с клавиатуры до тех пор, пока не встретится точка. Предусмотрите в программе счетчик числа пробелов. Сведения о количестве пробелов должны выводиться в конце программы. 2. Какова общая форма многоступенчатой конструкции if-else-if? 3. Допустим, имеется следующий фрагмент кода: if(х < 10) if (у > 100) { if(!done) х = z; else у = z; } else System.out.println("error"); // что если? ```
С каким из операторов if связан последний оператор else?
Напишите цикл for, в котором перебирались бы значения от 1000 до 0 с шагом -2.
Корректен ли следующий фрагмент кода?for (int i = 0; i < num; i++) sum += i; count = i;
Какие действия выполняет оператор break? Опишите оба варианта этого оператора.
Какое сообщение будет выведено после выполнения оператора break в приведенном ниже фрагменте кода?for(i =0; i < 10; i++) { while(running) { if(x