русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Следующая итерация: continue


Дата добавления: 2015-07-09; просмотров: 1335; Нарушение авторских прав


Директива 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-м цикле выполнялось правильно условие необходимо написать так:

<script>outer: for(var i=2; i<=10; i++) { for(var j=2; j<i-1 ;="" j++)="" { if="" (i="" %="" j="=" 0)="" continue="" outer; } alert="" (i); }<="" script="">

Rustem

хочу предложить свой вариант:

for (var i=2;i<=10;i++){ //цикл проверяемых чисел

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...

Придется запомнить эту ошибку, чтобы больше не совершать :-)

 



<== предыдущая лекция | следующая лекция ==>
Любая частьforможет быть пропущена. | Если его не прервать — оно пойдёт далее, при этом остальные проверки игнорируются.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 2.133 сек.