Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Питання на ректорську к.р. по АПЗ БК 2012.docx
Скачиваний:
1
Добавлен:
27.11.2019
Размер:
521.45 Кб
Скачать

69.Цикли while()

Як уже зазначалося у попередньому уроці, порядок виконання операторів у скрипті – послідовний, починаючи з першого і до останнього. Однак у більшості випадків є потреба виконувати деяку частину коду більше одного разу, можливо, з дещо зміненими параметрами. Для таких цілей використовують цикли while() та for(). Розглянемо спочатку цикл while() як більш простий та загальний. Схема виконання циклу проста:

while(умова) оператор;

Оператор після while (цей оператор називають тілом циклу) виконується до тих пір, доки умова у дужках має значення true. Звісно, що оператор має забеспечити умову припинення циклу для того, щоб цикл не виконувався нескінченне число разів (звичайно, якщо це не робиться навмисне). Наприклад

<?

    $i = 0;

    while($i < 10) $i++;

    echo $i; ?>

Цей цикл виконається рівно 10 разів (ці рази називають кроками циклу) – на кожному разі до змінної $i буде додаватися одиниця, і як тільки $i стане не менше 10, умова $i < 10 стане дорівнювати false, станеться вихід з циклу та виконається наступний оператор після while(), тобто надрукується значення змінної $i. Можна подивитися докладніше, як це відбувається:

<?

    $i = 0;

    while($i < 10){         $i++;

        echo "i = $i<br />\n";

    }

?>

Тут значення змінної $i буде виводитися на кожному кроці циклу, і ми побачимо послідовно надруковані числа від 1 до 10.

До умови у дужках після while, звісно, можна застосовувати усі ті прийоми з логічними операціями, що ми розглядали на попередньому уроці.

Цикл while має дві форми. Описана вище є найбільш розповсюдженою та використовується майже завжди. Однак у неї є особливість – умова припинення виконання циклу має бути записана зразу після while, тобто вона має бути вже відома до початку виконання, і більше того – якщо ця умова несправедлива, то цикл не виконається жодного разу. На відміну від цієї форми можна використовувати іншу:

do оператор while(умова);

Цей цикл перевіряє справедливість умови не до, а після виконання тіла циклу. Тобто тіло циклу виконається один раз у будь-якому випадку, навіть якщо умова у дужках несправедлива. Приклад застосування обох циклів:

<?

    $i = 20;     while($i < 10){

        $i++;

        echo "i = $i<br />\n";

    }     $i = 20;     do{

        $i++;

        echo "i = $i<br />\n";

    } while($i < 10);

?>

Перший цикл while() не виконається жодного разу, оскільки перед його виконанням буде перевірено значення змінної $i, а раз воно не менше 10, то цикл не буде виконуватися взагалі. У той час як другий цикл виконається один раз, після чого буде перевірена умова і оскільки умова буде так само дорівнювати false, відбудеться вихід з циклу, проте один раз він все-таки виконається (надрукує число 21).

Іншими корисними засобами роботи з циклами є оператори break та continue. Перший з них дозволяє достроково перервати роботу циклу у будь-якій його частині, не виконуючи всі оператори після break; робота continue прямо протилежна – він дозволяє продовжити виконання циклу. Тобто break робить поточним оператором, що виконується, перший оператор після циклу, а continue – перший оператор у тілі циклу (звичайно, що при цьому перевіряється умова циклу). Приклад використання break:

<?

    $str = "Що б таке зробити коли нема роботи";

    $word = "коли";

    $index = 0;     while($index < strlen($str) - 3){

        if(substr($str, $index, 4) == $word) break;         $index++;

    }

    if($index == strlen($str) - 3)         echo "Слова '$word' не знайдено у рядку '$str'";

    else

        echo "Слово '$word' у рядку '$str' починається після позиції $index"; ?>

Розберемо цей приклад, і тим часом дізнаємося про пару нових корисних функцій для роботи з рядками тексту.

Цей приклад шукає перше входження слова $word до рядку $str. Звичайно, для цієї задачі є стандартна функція strpos(), проте ми маємо ціль лише проілюструвати роботу break. У змінній $index знаходиться позиція у рядку $str, у якій ми перевіряємо наявність слова, і ми за допомогою циклу послідовно збільшуємо $index від 0 (початок рядка) до кінця рядка. Насправді немає необхідності продивлятися весь рядок, а достатньо продивитися стільки символів, скільки є у рядку мінус стільки символів, скільки є у слові, що шукається (4), та ще один. Щоб це було більш зрозумілим, наведу приклад: якщо ми шукаємо слово з десяти букв у рядку з двадцяти, то після одинадцятої букви шукати немає потреби – ми не знайдемо там слова вже просто тому, що воно не підійде за довжиною.

Кількість символів у рядку $str повертає функція strlen($str). Ідемо далі. Так само немає необхідності проглядати увесь рядок, якщо ми знайшли слово десь у його середині. Для цього ми у разі якщо знаходимо слово на позиції $index, то перериваємо цикл оператором break. Функція substr($str, $index, 4) повертає рядок, що знаходиться у рядку $str починаючи з символу $index та довжиною у 4 символи. Так, якщо там буде те слово, що ми шукаємо ($word), то умова у if() буде справедливою та цикл перерветься оператором break.

Після того, як цикл закінчився, ми перевіряємо як саме він закінчився. Могло бути два варіанти – або цикл закінчився, бо ми дійшли до кінця рядка, або ні. Перший варіант означає, що ми не знайшли слово, другий – що знайшли. Перший варіант ми розпізнаємо за умовою $index == strlen($str) – 3, тобто $index дорівнює кількості символів у рядку мінус три. Другий – протилежний випадок, тобто $index менше цього числа. У другому випадку ми можемо сказати, з якого символа починається наше слово. У першому ми можемо лише сказати, що такого слова не знайдено.

Якщо це зрозуміло, розберемо ще один приклад, на цей раз – на використання continue.

<?     $numbers = array();

    while(count($numbers) < 10){

        $random = rand(1, 100);         if( $random % 3 ) continue;

        if( in_array($random, $numbers) ) continue;

        echo "$random<br />\n";         $numbers[] = $random;

    }

?>

Цей скрипт друкує 10 випадкових чисел у диапазоні від 1 до 100, причому кожне з цих чисел має ділитися на 3 і жодне з них не повторюється.

Для генерації випадкових чисел ми використовуємо функцію rand(), яка повертає випадкове число у диапазоні між двома своїми аргументами. Для гарантії того, що серед 10 згенерованих чисел жодне не повторюється, ми заносимо кожне згенероване число до масиву, а також перевіряємо, чи було вже це число згенероване раніше.

На початку скрипта ми створюємо пустий масив $numbers = array(). Далі йде цикл, умовою виходу з якого є заповнення масиву 10-ма елементами (функція count(), що повертає кількість елементів у масиві, поверне 10).

На кожному кроці циклу ми генеруємо випадкове число $random. Після чого ми перевіряємо, чи ділиться це число на 3 – якщо ділиться, то залишок від ділення його на 3 буде дорівнювати 0, а якщо ні, то умова if( $random % 3 ) спрацює, спрацює оператор continue і цикл повториться спочатку, тобто буде згенероване нове число і так далі. Далі ми перевіряємо, чи не виводили ми вже це число, для цього ми шукаємо його у масиві $numbers. Якщо число знайдене у цьому масиві, то функція in_array($random, $numbers) поверне true і знов-таки спрацює continue. У іншому випадку (число не знайдене у масиві та in_array($random, $numbers) поверне false) ми виводимо число та додаємо його до масиву $numbers ($numbers[] = $random).

Короткі висновки уроку:

  1. Цикли використовуються для повторення деякої частини коду декілька разів

  2. Оператори, що повторюються, називаються тілом циклу, а повторення – кроками циклу

  3. Цикл while() виконується до тих пір, доки справедлива умова у дужках

  4. Цикл do .. while() виконується принаймні один раз, тоді як просто while() може не виконатися жодного разу

  5. Оператор break виконує вихід з циклу, оператор continue – продовження виконання циклу

76.