JavaScript. Цикл for-in. Вложенные циклы. Вечный цикл

Цикл 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) // тупо, но это также вечный цикл

 


Связанные темы