Как правило, некоторую цепочку операторов необходимо повторять не бесконечно, а до тех пор, пока выполняется некоторое условие:
Такой цикл называется циклом с предусловием (циклом ПОКА) и изображается следующей схемой:
Условие – это логическое выражение, зависящее от переменных, входящих в цепочку. Цикл повторяется до тех пор, пока условие истинно. Значит, данное условие является условиемпродолжения цикла. Выполнение цикла заканчивается, если операторы цепочки изменяют значения переменных, входящих в условие, и оно становится ложным.
Цикл не выполняется ни разу, если условие было ложным с самого начала.
Цикл ПОКА превращается в бесконечный, если условие подобрано так, что оно всегда истинно.
В PHP цикл с предусловием реализуется оператором цикла while:
или
{
. . . .
}
Операторы, находящиеся между фигурными скобками, называются телом цикла.
Внимание!Условие всегда заключается в скобки и после него точка с запятой не ставится!
Если поставить точку с запятой после условия, то этот цикл, как правило, превращается в бесконечный, потому что в этом случае условие изменяться не будет.
Фигурные скобки используются в том случае, если после условия должна следовать цепочка операторов.
Действия оператора while:
1. проверяется выполнение условия,
2. если оно истинно, то выполняется оператор (цепочка), стоящий после него,
3. после его выполнения снова проверяется условие, и если оно снова истинно, то цикл повторяется,
4. если условие становится ложным, то цикл заканчивает работу.
Примеры:
1. вычислить сумму ста первых натуральных чисел:
Пусть s – искомая сумма,
i – очередное число (изменяется от 1 до 100).
Тогда алгоритм решения задачи можно описать следующим образом:
a. обнуляем сумму s = 0,
b. берем первое число: i = 1,
c. добавляем в сумму это число: s = s + i,
d. увеличиваем очередное число на единицу: i = i+ 1,
e. если оно не больше 100, то снова добавляем его в сумму и повторяем цикл.
Представим этот алгоритм так:
ПОКА (i ≤ 100)
s = s + i;
i = i + 1;
Программа:
$i = 1;
$s = 0;
while ($i <= 100)
{
$s += $i;
$i++;
}
echo “<BR>s = $s i = $i<BR>”;
Результат решения задачи:
s = 5050 i = 101
Таким образом, выходим из этого цикла со значением i не 100, а 101.
Вместо цепочки:
$s += $i;
$i++;
можно использовать один оператор:
$s += $i++;
Этот цикл можно превратить в бесконечный, если после условия поставить точку с запятой:
$i = 1;
$s = 0;
while ($i <= 100);
{
$s += $i;
$i++;
}
echo “<BR>s = $s i = $i<BR>”;
Значение переменной $i в этом случае меняться не будет – она останется равной единице.
2. вычислить сумму s всех цифр заданного натурального числа n
Пусть s – искомая сумма,
i – очередная цифра числа.
Тогда алгоритм решения задачи можно описать следующим образом:
1. обнуляем сумму s=0,
2. берем последнюю цифру числа, для чего определяем остаток от деления исходного числа на 10: i = n % 10,
3. добавляем в сумму найденную цифру: s = s + i,
4. уменьшаем число в 10 раз: n = n / 10,
5. повторяем цикл до тех пор, пока n > 0 – это и будет условием продолжения цикла.
Программа:
$s = 0;
$n = 12345;
while ($n > 0)
{
$i = $n % 10;
$s += $i;
$n /= 10;
}
echo “<BR>s = $s”;
3. ввести с клавиатуры по одному последовательность целых чисел (конец последовательности – число 0). Определить их сумму, максимальное и минимальное число, количество введенных чисел и их среднее арифметическое.
Пусть s – искомая сумма,
min, max – минимальное и максимальное из введенных чисел,
count – количество введенных чисел,
sred – среднее арифметическое,
n – очередное число.
Тогда алгоритм решения задачи можно описать следующим образом:
1. обнуляем сумму s = 0,
2. вводим первое число n,
3. если оно не равно нулю, то
4. принимаем его значение за min и max
5. количество введенных чисел count = 1
6. увеличиваем сумму на введенное число s = s + n
7. входим в цикл ввода:
8. вводим очередное число n,
9. если оно не равно нулю, то
10. количество введенных чисел увеличиваем на 1: count = count+1
11. увеличиваем сумму на введенное число s = s + n
12. если оно меньше min, то min = n,
13. если оно больше max, то max = n,
14. повторяем цикл до тех пор, пока n # 0 – это и будет условием продолжения цикла.
Создадим интерфейс этой задачи – взаимодействие программы с пользователем, то есть что должно выводиться на экран:
Первое число: 3
Очередное число: 8
Очередное число: 1
Очередное число: -2
Очередное число: 0
Сумма = 10
Количество чисел = 4
min = -2
max = 8
Среднее арифметическое = 2.50
Схема алгоритма:
Программа:
$count = 0;
$s = 0.0;
echo “<BR>Введите первое число:”;
// ввод $n
if ($n==0)
$min = $n; // за минимум и максимум принимаем
$max = $n; //первое введенное число
$count = 1; //введено одно число
$s += $n;
while ($n != 0)
{
echo “<BR>Введите очередное число:”;
// ввод очередного $n
if ($n == 0)
$count++;
$s += $n;
if ($n > $max)
$max = $n;
if ($n < $min)
$min = $n;
}
echo “<BR>Сумма = $s”;
echo “<BR>Количество чисел = $count”;
echo “<BR>min = $min”;
echo “<BR>max = $max”;
$sred = $s / $count;
echo “<BR>Среднее арифметическое = $sred”;
Часто встречающиеся ошибки программирования:
1. Использование после условия точки с запятой, которая, как правило, приводит к появлению бесконечного цикла:
$i = 1;
$s = 0;
while ($i <= 100);
{
$s += $i;
$i++;
}
2. Условие не заключено в скобки:
$i = 1;
$s = 0;
while $i <= 100
{
$s += $i;
$i++;
}
3. Отсутствие фигурных скобок, в которые заключается тело цикла:
$i = 1;
$s = 0;
while ($i <= 100)
$s += $i;
$i++;
4.Отсутствие в теле цикла оператора, изменяющего условие:
$i=1;
$s = 0;
while ($i <= 100)
{
$s += $i;
}
У циклов с постусловием (циклов типа ДО) проверка условия продолжения цикла производится после выполнения операторов, составляющих тело цикла: