Директива continue прекращает выполнение текущей итерации цикла. Например, цикл ниже не выводит четные значения:
for (var i = 0; i < 10; i++) {
if (i % 2 == 0) continue;
alert(i);
}
Для четных i срабатывает continue, выполнение блока прекращается и управление передается на for.
Совет по стилю
Как правило, continue и используют, чтобы не обрабатывать определенные значения в цикле.
Цикл, который обрабатывает только часть значений, мог бы выглядеть так:
for (var i = 0; i < 10; i++) {
if ( checkValue(i) ) {
// функция checkValue проверяет, подходит ли i
// ...
// ... обработка
// ... этого
// ... значения
// ... цикла
// ...
}
}
Все хорошо, но мы получили дополнительный уровень вложенности фигурных скобок, без которого можно и нужно обойтись.
Гораздо лучше здесь использовать continue:
for (var i = 0; i < 10; i++) {
if ( !checkValue(i) ) continue;
// здесь мы точно знаем, что i подходит
// ...
// ... обработка
// ... этого
// ... значения
// ... цикла
// ...
}
Нельзя использовать break/continue справа от оператора ‘?’
Обычно мы можем заменить if на оператор вопросительный знак '?'.
То есть, запись:
if (условие) {
a();
} else {
b();
}
..Аналогична записи:
условие ? a() : b();
В обоих случаях в зависимости от условия выполняется либо a() либо b().
Но разница состоит в том, что оператор вопросительный знак '?', использованный во второй записи, возвращает значение.
Синтаксические конструкции, которые не возвращают значений, нельзя использовать в операторе'?'. К таким относятся большинство конструкций и, в частности, break/continue.
Поэтому такой код приведёт к ошибке:
(i > 5) ? alert(i) : continue;
Метки
Бывает нужно выйти одновременно из нескольких уровней цикла.
Например, надо ввести значения в точках с координатами, вот так:
for (var i = 0; i < 3; i++) {
for (var j = 0; j < 3; j++) {
var input = prompt('Значение в координатах '+i+','+j, '');
if (input == null) break; // (*)
}
}
alert('Готово!');
Обычный вызов break в строке (*) не может прервать два цикла сразу. Для этого существуют метки.
Метка имеет вид "имя:", имя должно быть уникальным. Она ставится перед циклом, вот так:
outer: for (var i = 0; i < 3; i++) { ... }
Можно также выносить ее на отдельную строку. Вызов break outer прерывает управление цикла с такой меткой, вот так:
outer:
for (var i = 0; i < 3; i++) {
for (var j = 0; j < 3; j++) {
var input = prompt('Значение в координатах '+i+','+j, '');
if (input == null) break outer; // (*)
}
}
alert('Готово!');
Директива continue также может быть использована с меткой. Управление перепрыгнет на следующую итерацию цикла с меткой.
Метки можно ставить в том числе на блок, без цикла:
my: {
for (;;) {
for (i=0; i<10; i++) {
if (i>4) break my;
}
}
some_code; // произвольный участок кода
}
alert("После my"); // (*)
В примере выше, break перепрыгнет через some_code, выполнение продолжится сразу после блока my, со строки (*). Возможность ставить метку на блоке используется редко. Обычно метки ставятся перед циклом.
Goto?
В некоторых языках программирования есть оператор goto, который может передавать управление на любой участок программы.
Операторы break/continue более ограниченны. Они работают только внутри циклов, и метка должна быть не где угодно, а выше по уровню вложенности.
В JavaScript нет goto.
Важность: 4
Натуральное число, большее 1, называется простым, если оно ни на что не делится, кроме себя и 1.
Другими словами, n>1 - простое, если при делении на любое число от 2 до n-1 есть остаток.
Создайте код, который выводит все простые числа из интервала от2до10. Результат должен быть: 2,3,5,7.
P.S. Код также должен легко модифицироваться для любых других интервалов.
Схема решения
Решение
[Открыть задачу в новом окне]
‹ Циклы while, for Конструкция switch ›
31.07.2011
Илья Кантор
Павел
var i = j = 1, stop = 20000;
var str = 'Простые числа: ';
metka:
for (i; i <= stop; i++) {
j=2
for (j; j<i; j++)="" {<br=""> if (i % j == 0) {
continue metka;
}
}
str = str + i + ' ,';
}
alert (str);</i;>
Павел
var i = j = 1, stop = 10; var str = 'Простые числа: '; metka: for (i; i <= stop; i++) { j=2 for (j; j<i; %="" '="" (i="" (str);="" +="" ,';="" 0)="" alert="" continue="" i="" if="" j="=" j++)="" metka;="" str="str" {="" }="" } =""></i;>
Wildidea
Более правильный код, чем у автора учебника:
var i, j; outer: for (i = 2; i <= 10; i++) { for (j = 2; j <= (i-1); j++) { //обратите внимание на конструкцию j <= (i-1) if (i%j == 0) { continue outer; } } alert ("Простое число: " + i); }
·
bozz
Этот код бред: 1 цикл i=2 j=2 смотрим условие второго for (j<=(i-1) т.е 2<1 значит фальш) цикл не выполняется, а соответсвенно и проверка if, т.е. происходит скачек к выводу числа. Что значит что число может быть любое а не простое. Просто совпало что число i=2 в этот момент и оно простое. Как убедиться? Вот: var i, j; outer: for (i = 2; i <= 10; i++) { var ii=100;//любое не простое число for (j = 2; j <= (i-1); j++) { //обратите внимание на конструкцию j <= (i-1) if (ii%j == 0) { continue outer; } } alert ("Простое число: " + ii); } Видим вывод сотки один раз, дальше начинает работать проверка. У автора таже история. P.S. автору спасибо за книгу.
·
O1ga
У вас немного запутано, поэтому ошибка. Вы вводите новую переменную ii, которая является константой, назначение первого цикла с меткой outer: непонятно... Кроме того, если целое число не равно 2 и оно не является простым, оно будет больше 2х, второй цикл выполняется и все ОК. Т.е. во втором цикле нужно проверять не j <= (i-1), а j <= (ii - 1). Вот так можете проверить, например, в диапазоне от 100 до 200:
var ii, j; outer: for (ii = 100; ii <= 200; ii++) { for (j = 2; j < ii; j++) { if (ii%j == 0) { continue outer; } } alert ("Простое число: " + ii); } Если что, ниже в комментариях приводятся решения на других интервалах чисел
·
Box4sawa
//обратите внимание на конструкцию j <= (i-1); это мне напоминает x = x +1 лучше чем x++
almariel2
Похожий вопрос по задаче, что был ниже:
Почему, если прописать в первой строчке условие i=1 (а не 2), выводятся 1,2,3,5,7? Ведь если i=1; 1<10 ; 1++ - на выходе 2, а j=2, 2<1 - условие ложно => дальнейших действий ведь не должно происходить? Где у меня ошибка в логике?
Alexy
Вот тоже способ - без меток, но с флагом: var start = 2; var end = 10; var result = ""; var flag = false; for(var i = start;i<=end;i++){ flag=false; for(var j = start;j<i;j++){ :)="" alert(result); ="" flag="true;" if(flag="=false){" if(i%j="=0){" result+="i+",";" }="" ="" ="" ="" ="" ="" Правда="" в="" выводится="" запятая="" конце,="" лишняя="" мы="" не="" но="" обработку="" переменных="" пока="" проходили="" строковых=""></i;j++){>
·
Alexy
var start = 2; var end = 10; var result = ""; var flag = false; for(var i = start;i<=end;i++){ flag=false; for(var j = start;j<i;j++){ alert(result);="" flag="true;" if(flag="=false){" if(i%j="=0){" result+="i+",";" }="" ="" ="" ="" =""></i;j++){>
·
Alexy
Как тут код нормально постить :(
!=
Вопрос по последней задачке. Проходит первый цикл i = 2 затем проверяется условие, а после к i прибавляется единица. Второй цикл j = 2 затем проверяется условие (j < i) условие проходит так как 2 меньше 3 и после прибавляется единица к j.Дальше идет условие if(i % j == 0) continue nextPrime. У нас i и j = 3, поэтому при делении 3/3 остатка нет. Итого 3 не простое число, но я знаю что допустил ошибку. Скажите что я не правильно понял?
·
Artur Trvd
3 это Простое число4 не Простое =)
Когда проверяется 3 скрипт доходит до 3 % 2 и всё он уже не проверяет 3 % 3 так как в цикле условия записано j
·
Artur Trvd
Сори не знаю что тут с комментами но у мя обрезался коммент :) Я писал так:
3 это Простое число 4 не Простое :)Когда проверяется 3 скрипт доходит до 3 % 2 и всё он уже не проверяет 3 % 3 так как в цикле условия записано j < i . То есть никогда не будет такого: 3 % 3
:)
!=
Вопрос по последней задачке. Проходит первый цикл i = 2 затем проверяется условие, а после к i прибавляется единица. Второй цикл j = 2 затем проверяется условие j
·
!=
Странно не все сообщение отобразилось. Сейчас перешлю
Alf Rentgen
var num=2; var interv,i; interv = prompt('Введите интервал:',''); for(;num<=interv;num++){ for(i=2;i<=num;i++){ if(num%i != 0){ continue; } if(num % i == 0 && i!= num){ break; } alert(num); }
Вот так работает без меток, в любом интервале и выводит каждое число по одному разу. Думал долго :)
Volya Pers
for (var n;n/n || n/1 , n>1 && n<10;++n){alert(n); if (n/n && n/1) continue;}
Roma_gifted
А можно и так ) outer: for ( var i = 2; i < 10; i++ ) { for ( var j = 2; j < i; j++ ) { if ( i % j == 0 ) continue outer; } if ( i == 9 ) break; alert(i); } alert('готово!');
Roma_gifted
Не множко помучился, но за то с некой такой гордостью, хочу поделиться, тем что сам написал код ))) Но, с отличием от того который предлагают. Но вы же профи, а я только учусь.! И буду продолжать, спасибо за предоставленные уроки. <script> outer: for ( var i = 2; i < 10; i++ ) { for ( var j = 2; j < 10; j++ ) { if ( i / j % 2 == 0 ) continue outer; } alert(i); } </script>
Сергей
Чтобы во 2-м цикле выполнялось правильно условие необходимо написать так:
for (var j=2,a=0;j<=i;j++){ //цикл проверки делимости данного числа на числа, стоящие перед ним if (i % j == 0) a++; //при деление без остатка заносим 1 в переменную а }
if (a==1)alert(i); /*т.к. в цикле выше мы не берем j=1, то простые числа будут делится без остатка только один раз (на себя)*/ }
Vir2alex
Для последней задачи, в первый раз, самомстоятельно сделал вот такой код
newnum:for (var i=2; i<=10; i++){ for (var j=2; j<i; (i%j="=" 0)="" <="" code="" continue="" if="" j++)="" newnum;="" {="" }alert(i);}=""> Мне вывело числа 3, 5, 7. Далее усовершенствовал код:
newnum:for (var i=2; i<=10; i++){ for (var j=2; j<=i; j++) { if (i%j == 0 && i != j) continue newnum; }alert(i);}
У меня всё получилось, отобразились числа 2, 3, 5, 7. Потом открыл здесь решение и увидел что в примере код такой каким он был у меня сначала. Удивился, но поменял код обратно и, о чудо, отобразилось 2, 3, 5, 7.
КОД ПРЕДСТАВЛЕННЫЙ В РЕШЕНИИ НЕ МОЖЕТ ВЫВЕСТИ ЧИСЛО 2!!! ЭТО БРЕД!!! Я таких глюков за всю свою жизнь ещё не встречал.</i;>
·
Sashatkachov
лично мое мнение...так как вначале i=2 и j=2.... то для второго for (j=2; j<i; alert(i).="" i++)="" j<i="" {.....}="" условие="" ИМХО="" выполнить="" дальше,="" запускается="" и="" может="" нам="" не="" ничего="" оно="" перепрыгивает="" показывает="" проверяет..а="" просто="" сразу="" цыкл=""></i;>
Vir2alex
Для последней задачи, в первый раз, самомстоятельно сделал вот такой код newnum:for (var i=2; i<=10; i++){ for (var j=2; j<i; !="j)" &&="" (i%j="=" (var="" 0="" 0)="" 2!!!="" 2,="" 3,="" 5,="" 7.="" continue="" for="" i="2;" i++){="" i<="10;" if="" j="2;" j++)="" j++) { if="" j<="i;" newnum;="" newnum; }alert(i);}="" {="" }alert(i);}="" БРЕД!!!="" В="" ВЫВЕСТИ="" Далее="" КОД="" МОЖЕТ="" Мне="" НЕ="" ПРЕДСТАВЛЕННЫЙ="" Потом="" РЕШЕНИИ="" У="" Удивился,="" ЧИСЛО="" ЭТО="" Я="" был="" в="" встречал.="" всю="" всё="" вывело="" глюков="" ещё="" жизнь="" за="" здесь="" и="" и,="" каким="" код="" код:="" меня="" не="" но="" о="" обратно="" он="" открыл="" отобразились="" отобразилось="" получилось,="" поменял="" примере="" решение="" свою="" сначала.="" таких="" такой="" у="" увидел что="" усовершенствовал="" числа="" чудо,=""></i;>
Jeka tj
Товарищи специалисты, обьясните, пожалуйста, как работает последний пример? Никак не могу разобраться! Как я понимаю, сначала в первом цикле i=2, дальше идём во второй цикл, там j=2, сравнение 2<2 не срабатывает и выводится значение і=2. Потом следующая итерация: i=3, j=2, 2<3, 3 не делится нацело на 2 - и поэтому увеличиваем j на еденицу (j=3). Снова сравнение 3<3 не срабатывает и выводится i=3. Но если следовать данной логике, то дальше выведутся числа 4, 5 и т.д.! А этого происходить не должно! В чем же проблема?
(Изменено автором 4 месяцев назад)
·
Xosebelge
j<i; j++="" будет="" выполнится="" выполняться="" и="" не="" сначала="" тогда j<i=""></i;>
Avaylon
var i=0; while(1) { i++;
if (i==5) break;
alert(i);
alert('Последняя i = '+ i ); // 5 (*) Я немного не понимаю, почему while (1), а не while (i)?
·
Avaylon
Потому-что 1 - это true?
·
Sergey Lebedev
да. и к тому же условие while(i) не прошло бы, потому что изначально i - 0
Doxera
Ещё один вариант решения последней задачи.
var value = prompt('Введите число:', '10'); var all = 1; for (var count = 2; count <= value; count++) { mark: { for (var i = 2; i < count; i++) { if (count % i == 0) break mark; } all = all +', ' + count;} } alert(all);
Hixer
main: { var resultString = 'Простые числа: ', r = 0; do { var n = prompt('Введите верхнюю границу интервала:', 'число > 2'); if (n == null) break main; // При отмене выход из программы } while (!(n > 2)); // При вводе букв запрос повторяется for (var i = 2; i <= n; i++) { for (var j = 2; j <= i; j++) { if (i % j == 0) break; } if (r < j) { r = j; resultString += r + ' '; } } alert(resultString); }
Обратите внимание на использование метки (и комментариев). Код также работает корректно и выводит последнее простое число, если оно равно верхней границе. Первый break завершает всю программу, если пользователь нажал "Отмена" ("редкое использование"), а второй - только вложенный цикл. Песочница: http://learn.javascript.ru/pla... Не рекомендуется вводить числа, большие 9999.
visitor
Эмм, вопрос по последней задачки, как вообще эти цифры вывелись. Хоть убей не пойму 2 -выполняется только первый цикл 3- задействуется второй цикл, есть остаток от 3/2 А дальше то как? можно предположить что во втором цикле не меняется двойка за счет перескока к метке, тогда 4/2 - исключаем четверку.
у 5 остаток есть , у 6 нету ,у 7 есть, у 8 нету, у 9 есть, но почему 9 не вывелась?
Doxera
9 (как и все предыдущие цифры) по условию должна быть поделена на все цифры от 2 до 8 "по очереди" без исключения. Очередь эту может нарушить условие, что после деления не было остатка.
for(var j=2; j<i; %="" (="" ---="" 0)="" <="" continue="" i="" if="" j="=" j++)="" nextprime;="" pre="" {="" }="" ="" ="" где=""> число проверяемое на простоту, а j ---> число из "очереди". Если этот цикл заканчивается по счетчику, а не по условию if, то выполняется следующая за этой команда:alert(i); И так: 9/2 ---> остаток 1; 9/3 ---> остатка нет ----> нарушение условия----> 9 - не простое число!
А если брать число побольше, скажем 25 ( если оно простое, то должно делиться на числа от 2 до 24 с остатком). Делим по очереди: 25/2 ---> остаток 1; 25/3 ---> остаток 1; 25/4 ---> остаток 1; 25/5 ---> остаток 0 ---> нарушение условия ---> 25 - не простое число. Но нам понадобилось провести 4 операции чтобы это выяснить, а не 2.</i;>
KonRud5
Как мне кажется то имеются ввиду перебор по одному(подходит ли i к j), например с 3 : i = 3 j = 2 3 % 2 == о false то есть выводим 3,
теперь i = 4 j = 2(начальное значение j меньше i) :
4 % 2 == 0 true то есть не выводим,
с 9 :
i = 9 , j = 2:
9 % 2 == 0 false
9%3 == 0 true
то есть не выводим .
tyler
Два дня ломал голову над последней задачкой... Понял, никогда не забуду! Хочу посоветовать автору более подробно разжёвывать принцип работы скриптов. Некоторые, просто, с ходу понять весьма трудно...
Jeremen1
всё правильно, если у вас что-то не получается - всегда вините кого то другого только не себя, это истинный путь к успеху...
tyler
И в мыслях не было кого-то винить, наоборот, считаю, что книга одна из лучших :) Лишь маленький совет ;) Ваш сарказм никоим образом не связан с книгой, тролльте в другом месте...
Alexander Alkun
Ребята, я прошу прощения, перечитал несколько раз, но так и не понял из этого объяснения для чего эти метки (хотя вроде понял, что если метка встретилась, то цикл перепрыгивает к ней). Какая получается схема работы с вложенными циклами? Мне не понятно, внешний цикл вызывается второй раз, если перепрыгнул на метку или нет? Как дальше действует схема вызовов алерта? В вашем примере с break outer; alert вызывается за пределами обоих циклов, а в задаче про нат.числа во втором цикле. Не понимаю, почему так сделано и в чем разница?Может есть еще какие примеры с метками, а то я теперь спать не буду :)
eee
BREAK с меткой прерывает работу цикла (или блока) с этой меткой и выполняются команды ПОСЛЕ цикла (блока) с меткой. Без метки прерывается только цикл, в котором находится break (текущий цикл). а если надо прервать более внешний цикл, то на такой цикл и указывает метка (циклов же может быть много)
Фидель
Предыдущий пост был неудачен сорри.. Вообщем решил задачу, вот ссылка: http://learn.javascript.ru/pla...
Но как ни странно скрипт не работает :-) Пол часа искал ошибку и нашел: metka нужно было поставить после else if (i>2) { , а не перед ним, вот : http://learn.javascript.ru/pla...
Придется запомнить эту ошибку, чтобы больше не совершать :-)