Цикл for-in. Вложенные циклы. Вечный цикл
Данная тема является продолжением темы:
Содержание
Поиск на других ресурсах:
1. Цикл for-in. Движение по объектах
Цикл for-in используется в случаях, когда необходимо перебрать набор объектов, которым может быть массив, список и т.д. Общая форма использования цикла for-in следующая
for (var item in obj) { // Тело цикла // ... }
здесь
- item – переменная, составляющая объект obj. Такой составляющей может являться, например, свойство объекта. Элемент item получает поочередно значение из всего множества составляющих объекта obj.
Цикл for-in может использоваться для обхода элементов массива. В этом случае переменная item получает значение индексов массива. Для непосредственного доступа к элементу массива необходимо использовать индексирование вроде
Array[item]
где Array – имя массива.
⇑
1.1. Пример. Вывести все элементы стандартного объекта console
// Цикл for-in // Вывести все элементы объекта console for (var t in console) { document.write(t + "<br>"); }
Результат
debug error info log warn dir dirxml table trace group groupCollapsed groupEnd clear count countReset assert profile profileEnd time timeLog timeEnd timeStamp context memory
⇑
1.2. Вывести все элементы пользовательского объекта
Если разработан собственный (пользовательский) объект, то с помощью цикла for-in можно выводить все элементы этого объекта.
В примере объявляется класс Line, описывающий линию на координатной плоскости. В классе объявляются следующие элементы:
- x1, y1, x2, y2 – координаты точек линии;
- ShowLine() – функция, выводящая текущее значение координат линии (текущее состояние линии);
- Length() – функция, возвращающая длину линии.
Текст программы на JavaScript
// Цикл for-in // Условие задачи. Вывести все элементы объекта класса Line. // 1. Объявление класса Line function Line(x1, y1, x2, y2) { this.x1 = x1 this.y1 = y1 this.x2 = x2 this.y2 = y2 // Функция, которая выводит внутреннее состояние объекта this.ShowLine = function() { document.write("x1 = " + this.x1 + ", y1 = " + this.y1 + "<br>"); document.write("x2 = " + this.x2 + ", y2 = " + this.y2 + "<br>"); } // Функция, возвращающая длину линии this.Length = function() { var len = Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)) return len } } // 2. Создать объект ln1 var ln1 = new Line(2.5, 3.8, 1.4, -0.3); // 3. Продемонстрировать работу методов объекта ln1 ln1.ShowLine() document.write("ln1.Length = " + ln1.Length() + "<br>") // 4. Вывести элементы объекта ln1 document.write("<br>Object ln1:<br>") for (var t in ln1) document.write(t + "<br>")
Результат
x1 = 2.5, y1 = 3.8 x2 = 1.4, y2 = -0.3 ln1.Length = 4.244997055358225 Object ln1: x1 y1 x2 y2 ShowLine Length
⇑
1.3. Вывести все элементы массива
// Цикл for-in // Условие задачи. Вывести все элементы массива // 1. Массив строк var AS = [ "One", "Two", "Three" ]; // Цикл for-in for (var t in AS) document.write(AS[t]+"<br>"); // 2. Массив чисел var AI = [ 2.5, 3.8, 1.4, -0.8, 2 ] document.write("Array AI: ") for (var t in AI) document.write(AI[t]+" ") document.write("<br>")
Результат
One Two Three Array AI: 2.5 3.8 1.4 -0.8 2
⇑
2. Вложенные циклы
Циклы могут быть вложенными. Это означает, что один цикл в своем теле может содержать другой цикл. Вложенный цикл может являться любым циклом: for, while, do-while, for-in. В свою очередь любой вложенный цикл в своем теле также может содержать оператор цикла. Таким образом, циклический процесс абстрагируется на несколько уровней вложений. Количество вложений любого из операторов цикла не ограничено и определяется алгоритмом решения задачи.
2.1. Пример. Вложенные циклы for, while. Вывод таблицы умножения
Условие задачи. Распечатать таблицу умножения на 9 для чисел, от 1 до 5.
Решение.
Ниже демонстрируется решение, в котором верхний цикл представляет собой цикл for, внутренний цикл представляет собой цикл while.
// Вложенные циклы // Условие задачи. // Вывести таблицу умножения на 9 // для чисел от 1 до 5 // Внешний цикл for for (var i=1; i<=5; i++) { // Внутренний цикл while var j = 1 while (j<=9) { document.write(i + " * " + j + " = " + i*j + "<br>"); j++; } }
⇑
2.2. Пример. Вложенные циклы while, do-while. Определение свойств наборов чисел
Условие задачи.
Найти все числа из промежутка от 1 до 300, у которых ровно пять делителей. Для решения использовать:
- цикл while как внешний цикл;
- цикл do-while как внутренний цикл.
Решение.
// Вложенные циклы. // Найти все числа из промежутка от 1 до 300 у которых ровно 5 делителей. // Объявить дополнительные переменные var num = 1 var n, t // Внешний цикл - числа от 1 до 300 while (num <= 300) { n = 0 // количество делителей для числа num t = 1 // переменная-счетчик, нужна для вычисления количества делителей do { // Если t является делителем num, то увеличить количество делителей if (num%t==0) n++; t++ } while (t <= num) // На выходе из цикла do-while в переменной n - количество делителей числа num if (n==5) document.write(num+"<br>"); num++ // Взять следующее число }
Результат
16 81
⇑
2.3. Поиск количества вхождений заданного слова в тексте
Условие задачи.
Задан текст. Определить, сколько раз заданный фрагмент встречается в тексте.
Решение.
В решении задачи использован внешний цикл do-while и внутренний цикл for.
// Вложенные циклы // Поиск заданного слова в тексте // 1. Ввести текст var text = prompt("Input string:") // 2. Ввести искомое слово var word = prompt("Input word:") // 3. Объявить дополнительные переменные var count = 0; // Количество слов в тексте var i, j var f_find // флажок, сигнализирующий совпадение слова в тексте i = 0 while (i<text.length) { // посимвольный обход текста // Принять, что есть совпадение f_find = true for (j = 0; f_find && (j<word.length); j++) { // если найдено несовпадение, то выход из цикла if (text[i+j]!=word[j]) f_find = false } // Проверка, чем закончится цикл if (f_find) // если нету несовпадений count++ // то увеличить счетчик i++ } // Вывести результат alert("Number of occurences = " + count)
⇑
3. Вечный цикл. Примеры
При неправильном программировании циклов может возникнуть случай, когда условие окончания циклического процесса никогда не наступит. В этом случае цикл будет производиться бесконечно долго. Такой цикл называется вечный цикл.
Для циклов while, for, do-while вечный цикл будет означать, что значение условного выражения, определяющего выполнение следующей итерации, всегда будет true.
Одними из наиболее распространенных случаев, когда возникает вечный цикл, могут быть следующие:
- неправильный прирост счетчика, определенный в условии окончания циклического процесса;
- отсутствие прироста счетчика, определенного в условии завершения цикла;
- ошибочное определение результата, определяющего завершение циклического процесса;
- другие случаи.
Пример.
// Вечный цикл // 1. Цикл while var i=0; while (i<5){ // в цикле отсутствует приращение счетчика i document.write("i = " + i + "<br>") } // 2. Цикл for for (var j=0; j<5; j--) { // счетчик j изменяется не в том направлении document.write("j = " + j + "<br>") } // 3. Цикл do-while do { } while (true) // тупо, но это также вечный цикл
⇑
Связанные темы
⇑