You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/02-first-steps/12-while-for/7-list-primes/task.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -6,7 +6,7 @@ importance: 3
6
6
7
7
Натуральное число, большее `1`, называется [простым](https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%BE%D1%81%D1%82%D0%BE%D0%B5_%D1%87%D0%B8%D1%81%D0%BB%D0%BE), если оно ни на что не делится, кроме себя и `1`.
8
8
9
-
Другими словами, `n > 1` – простое, если при делении на любое число от `2` до `n - 1` есть остаток.
9
+
Другими словами, `n > 1` – простое, если при его делении на любое число от `1` до `n` есть остаток.
10
10
11
11
Например, `5` это простое число, оно не может быть разделено без остатка на `2`, `3` и `4`.
Copy file name to clipboardExpand all lines: 1-js/02-first-steps/12-while-for/article.md
+22-20Lines changed: 22 additions & 20 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -17,7 +17,7 @@ while (condition) {
17
17
}
18
18
```
19
19
20
-
Код из тела цикла выполняется, пока значение`condition`равно `true`.
20
+
Код из тела цикла выполняется, пока условие`condition`истинно.
21
21
22
22
Например, цикл ниже выводит `i`, пока `i < 3`:
23
23
@@ -31,24 +31,24 @@ while (i < 3) { // выводит 0, затем 1, затем 2
31
31
32
32
Одно выполнение тела цикла по-научному называется *итерация*. Цикл в примере выше совершает три итерации.
33
33
34
-
Если бы `i++`отсутствовало в примере выше, то цикл бы повторялся (в теории) вечно. На практике, конечно, браузер не позволит такому случиться, он предоставит пользователю возможность остановить "подвисший" скрипт, а JavaScript на стороне сервера придётся "убить" процесс.
34
+
Если бы строка `i++`отсутствовала в примере выше, то цикл бы повторялся (в теории) вечно. На практике, конечно, браузер не позволит такому случиться, он предоставит пользователю возможность остановить "подвисший" скрипт, а JavaScript на стороне сервера придётся "убить" процесс.
35
35
36
-
Любое выражение или переменная может быть условием цикла, а не только сравнения: условие `while` вычисляется и преобразуется в логическое значение.
36
+
Любое выражение или переменная может быть условием цикла, а не только сравнение: условие `while` вычисляется и преобразуется в логическое значение.
37
37
38
38
Например, `while (i)` -- более краткий вариант `while (i != 0)`:
39
39
40
40
```js run
41
41
let i =3;
42
42
*!*
43
-
while (i) { // когда i будет равно 0, условие станет ложным и цикл остановится
43
+
while (i) { // когда i будет равно 0, условие станет ложным, и цикл остановится
44
44
*/!*
45
45
alert( i );
46
46
i--;
47
47
}
48
48
```
49
49
50
50
````smart header="Фигурные скобки не требуются для тела цикла из одной строки"
51
-
Если тело цикла состоит лишь из одной конструкции, мы можем опустить фигурные скобки `{…}`:
51
+
Если тело цикла состоит лишь из одной инструкции, мы можем опустить фигурные скобки `{…}`:
52
52
53
53
```js run
54
54
let i = 3;
@@ -68,7 +68,7 @@ do {
68
68
} while (condition);
69
69
```
70
70
71
-
Цикл сначала выполнит тело, а затем проверит условие, и пока его значение равно `true`, он будет выполняться снова и снова.
71
+
Цикл сначала выполнит тело, а затем проверит условие`condition`, и пока его значение равно `true`, он будет выполняться снова и снова.
72
72
73
73
Например:
74
74
@@ -80,11 +80,11 @@ do {
80
80
} while (i <3);
81
81
```
82
82
83
-
Такая форма синтаксиса оправдана, если вы хотите, чтобы тело цикла выполнилось **хотя бы один раз**, даже если условие окажется ложным. Чаще используется форма с предусловием: `while(…) {…}`.
83
+
Такая форма синтаксиса оправдана, если вы хотите, чтобы тело цикла выполнилось **хотя бы один раз**, даже если условие окажется ложным. На практике чаще используется форма с предусловием: `while(…) {…}`.
84
84
85
85
## Цикл "for"
86
86
87
-
Самый распространённый цикл — цикл `for`.
87
+
Более сложный, но при этом самый распространённый цикл — цикл `for`.
88
88
89
89
Выглядит он так:
90
90
@@ -111,8 +111,8 @@ for (let i = 0; i < 3; i++) { // выведет 0, затем 1, затем 2
111
111
|*шаг*|`i++`| Выполняется *после* тела цикла на каждой итерации *перед* проверкой условия. |
112
112
|*тело*|`alert(i)`| Выполняется снова и снова, пока условие вычисляется в `true`. |
113
113
114
-
115
114
В целом, алгоритм работы цикла выглядит следующим образом:
@@ -121,6 +121,8 @@ for (let i = 0; i < 3; i++) { // выведет 0, затем 1, затем 2
121
121
→ ...
122
122
```
123
123
124
+
То есть, *начало* выполняется один раз, а затем каждая итерация заключается в проверке *условия*, после которой выполняется *тело* и *шаг*.
125
+
124
126
Если тема циклов для вас нова, может быть полезным вернуться к примеру выше и воспроизвести его работу на листе бумаги, шаг за шагом.
125
127
126
128
Вот, в точности, то, что происходит в нашем случае:
@@ -289,8 +291,7 @@ if (i > 5) {
289
291
(i > 5) ? alert(i) : *!*continue*/!*; // continue здесь приведёт к ошибке
290
292
```
291
293
292
-
...выполнение остановится. Такой код приведёт к синтаксической ошибке:
293
-
294
+
...то будет синтаксическая ошибка.
294
295
295
296
Это ещё один повод не использовать оператор вопросительного знака `?` вместо `if`.
296
297
````
@@ -306,14 +307,14 @@ for (let i = 0; i < 3; i++) {
306
307
307
308
for (let j =0; j <3; j++) {
308
309
309
-
let input =prompt(`Значение координат (${i},${j})`, '');
310
+
let input =prompt(`Значение на координатах (${i},${j})`, '');
310
311
311
-
// Что если мы захотим перейти к Done (ниже) прямо отсюда?
312
+
// Что если мы захотим перейти к Готово (ниже) прямо отсюда?
312
313
313
314
}
314
315
}
315
316
316
-
alert('Done!');
317
+
alert('Готово!');
317
318
```
318
319
319
320
Нам нужен способ остановить выполнение если пользователь отменит ввод.
@@ -334,18 +335,19 @@ labelName: for (...) {
334
335
335
336
for (let j =0; j <3; j++) {
336
337
337
-
let input =prompt(`Value at coords (${i},${j})`, '');
338
+
let input =prompt(`Значение на координатах (${i},${j})`, '');
338
339
339
-
// если пустая строка или ОТМЕНА, то выйти из обоих циклов
340
+
// если пустая строка или Отмена, то выйти из обоих циклов
340
341
if (!input) *!*break outer*/!*; // (*)
341
342
342
343
// сделать что-нибудь со значениями...
343
344
}
344
345
}
345
-
alert('Done!');
346
+
347
+
alert('Готово!');
346
348
```
347
349
348
-
В примере выше это означает, что вызовом `break outer` будет разорван внешний цикл до метки с именем `outer`, и управление перейдёт со строки, помеченной `(*)`, к `alert('Done!')`.
350
+
В примере выше это означает, что вызовом `break outer` будет разорван внешний цикл до метки с именем `outer`, и управление перейдёт со строки, помеченной `(*)`, к `alert('Готово!')`.
349
351
350
352
Можно размещать метку на отдельной строке:
351
353
@@ -356,12 +358,12 @@ for (let i = 0; i < 3; i++) { ... }
356
358
357
359
Директива `continue` также может быть использована с меткой. В этом случае управление перейдёт на следующую итерацию цикла с меткой.
358
360
359
-
````warn header="Метки — не то же самое, что \"goto\""
361
+
````warn header="Метки не позволяют \"прыгнуть\" куда угодно"
360
362
Метки не дают возможности передавать управление в произвольное место кода.
0 commit comments