Партнерка на США и Канаду по недвижимости, выплаты в крипто

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