Партнерка на США и Канаду по недвижимости, выплаты в крипто
- 30% recurring commission
- Выплаты в USDT
- Вывод каждую неделю
- Комиссия до 5 лет за каждого referral
31.01.17
Задание: Прочитать и законспектировать в рабочей тетради
ТЕМА: Цикл for
общий вид | пример | |
for(начало;условие;приращение) команда | var i; var sum = 0; for(i=1; i<=100; i++) sum += i; alert("Сумма 1+2+...+100="+sum); |
Цикл работает так. Команда, помещаемая в начало, выполняется до циклического повторения (в примере это команда i=1;), а сам цикл образуется следующими действиями:
Проверка условия (в примере i<=100). Выполнение тела цикла (в примере sum += i). Выполнение команды, записанной в разделе приращение (в примере i++).Как и в команде while, тело цикла может не выполниться ни разу, если условие ложно с самого начала. Не выполнится при этом и команда из раздела приращение. А вот команда из раздела начало выполняется всегда, независимо от условия, и выполняется ровно один раз.
Замечание. В заголовке цикла for любая из трех конструкций начало, условие, приращение может быть опущена, при этом соответствующую точку с запятой опускать нельзя. Когда опущено условие, считается, что оно имеет значение true. Таким образом, цикл превращается в бесконечный:
for(;;) команда; | Этот цикл не остановится, если только не будет содержать внутри себя команду break. |
ТЕМА:Команды break и continue
Эти команды используют в теле цикла для изменения последовательного хода выполнения команд.
Команда continue заставляет браузер пропустить выполнение всех команд после нее и до конца тела цикла. Но цикл продолжается.
Команда break еще радикальнее — она заставляет браузер немедленно прекратить выполнение цикла.

Пример 1 (continue)
Найти сумму 5 четных чисел, случайным образом взятых из диапазона [1,20].
var len = 5; // Количество чисел. var a = 1; // Левая граница интервала. var b = 20; // Правая граница интервала. var sum = 0; // Сумматор. var counter = 0; // Счетчик чисел. var number; // Случайное число. var str = ""; // Строка для вывода. while (counter < len) { number = Math. floor(a + (b-a+1)*Math. random()); if (number%2) continue; sum += number; str += number; if (counter < len-1) str += " + "; else str += " = "; counter++; } str += sum; alert(str); |

Замечание. Стандартная функция Math. random() генерирует случайное число из отрезка [0,1]. Стандартная функция Math. floor(num) возвращает ближайщее целое число, меньшее или равное аргументу.
Пример 2 (break)
Целые числа случайным образом генерируются из диапазона [1,20]. Требуется суммировать эти числа до тех пор, пока очередное случайное число не станет равным 10.
var a = 1; // Левая граница интервала. var b = 20; // Правая граница интервала. var special = 10; // Критическое значение случайного числа. var sum = 0; // Сумматор. var number; // Случайное число. var str = ""; // Строка для вывода. for (;;) { number = Math. floor(a + (b-a+1)*Math. random()); sum += number; str += number; if (number == special) break; str += " + "; } str += " = " + sum; alert(str); |

Замечание. Конструкция for(;;){...} используется для задания бесконечного цикла.
ТЕМА: Оптимизация: программирование циклов с конца
Подсчитать сумму элементов массива set можно так (нумерация элементов массива в JavaScript начинается с нуля; set. length — свойство массива — его длина):
var sum = 0;
for(var i=0; i < set. length; i++) sum += set[i];
А можно и так:
var sum = 0;
for(var i=set. length; --i>=0; ) sum += set[i];
Перепишем этот вариант суммирования на “русском” языке:
var s = 0;
var i=set. length;
ПОВТОРЯТЬ
{
уменьшить i на 1.
проверить i: если i>=0 то s += set[i];
иначе цикл закончить
}
Второй способ предпочтительнее.
Сравнение с нулем обычно более эффективно, чем сравнение с другим числом, тем более, сравнение с переменной, которая является собственностью объекта set (до нее еще нужно добраться).
Иными словами “--i>=0” работает быстрее, чем “i<set. length”.
Что касается “i=set. length” во втором варианте, то это присваивание не “крутится” в цикле, а работает ровно один раз до входа в него.
Общее правило: в цикле со счетчиком значение счетчика должно по возможности уменьшаться.
Циклы — это как раз то место, где имеет смысл оптимизировать программу. Понятно почему: ведь выполнение тела цикла повторяется многократно, и малое улучшение помножается на большое “число оборотов”. Если цикл выполняется 1000 раз, то такая оптимизация дает тысячекратный выигрыш.
Заметим, что такой вариант:
var sum = 0;
for(var i=set. length; (i--)>=0; ) sum += set[i];
является ошибочным, ведь в нем уменьшение i на единицу происходит после проверки условия, а не до, как в правильном варианте.
Описание переменной цикла
Можно написать так:
for(var i=100; i; i--) ...
— или так:
var i;
for(i=100; i; i--) ...
Для браузера эти записи эквивалентны. Вспомним, что в конструкции цикла:
for(начало; условие; приращение) команда;
команда начало выполняется один раз перед первым оборотом цикла. Поэтому ясно, что переменная i не определяется 100 раз описателем var.
Рекомендации такие:
- Счетчик цикла i можно описывать там же, где описываются другие переменные в начале функции или скрипта. Счетчик обязательно нужно описывать в общем месте, если он используется в нескольких циклах. Если в функции цикл единственный, то можно записывать for(var i=...; ...; ...) — это красиво, и подчеркивает вспомогательный характер переменной i, недостойной более “солидных” описаний.
А что происходит, когда описание переменной помещается внутрь цикла while?
Если написать в С++ так:
while(...)
{
int digit = ...
...
}
то переменная digit будет видна только внутри цикла и не доступна вне его. Дело здесь не в цикле, а в блоке {...}. Описания внутри блока локальны. Это означает, что переменная digit будет создаваться при входе в цикл и уничтожаться при выходе из него.
Такая инкапсуляция переменных имеет смысл, как и инкапсуляции в программировании вообще. Программисты всегда стараются сделать область видимости переменной как можно более узкой. Это обычная практика оборонительного программирования.
Если переменная, подобная digit, используется как рабочая внутри цикла и не имеет смысла вне его, то разумнее объявить ее локальной внутри этого цикла, чем объявлять ее в начале функции с комментарием “рабочая переменная цикла такого-то”.
Однако, к сожалению, здесь C++ расходится с JavaScript. Для JavaScript запись:
while(...)
{
var digit = ...
...
}
эквивалентна такой:
var digit;
...
while(...)
{
digit =....
}
С этим печальным фактом приходится считаться. Но в обоих случаях переменная digit создается один раз. Ведь описание — это не команда, а декларация. Браузер просматривает скрипт и выделяет под все переменные память, а только потом начинает выполнять команды.
Конструкция, в которой совмещены декларация и команда:
var digit = 10;
выполняется браузером так: сначала под переменную отводится память, а затем в нее помещается число 10.
Если браузер не может выполнить инициализацию переменной при ее создании:
function fun(t)
{
var x = t+1;
...
}
— то он отделяет создание переменной от ее вычисления. Переменная создается один раз при первом просмотре функции (подготовка к работе), затем работают команды функции и среди них команда x = t+1.


