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

 


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