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

  ⇑


Споріднені теми

  ⇑