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