Занятие 5.

advertisement
Занятие 5.
Конструкции языка
Инструкция if-else
Начнем с самой простой инструкции - условного оператора. Его формат таков:
if (логическое_выражение)
инструкция_1;
else
инструкция_2;
Действие его следующее: если логическое__выражение истинно, то выполняется
инструкция_1, а иначе - инструкция_2. Как и в любом другом языке, конструкция else может
опускаться, в этом случае при получении должного значения просто ничего не делается.
Пример:
if ($a>=1&&$b<=10) echo “Все ОК”;
else echo “Неверное значение в переменной”;
Если инструкция_1 или инструкция_2 должны состоять из нескольких команд, то
они, как всегда, заключаются в фигурные скобки. Например:
if ($a>$b) { echo "а больше b"; c=$b; }
elseif ($a==$b) { echo "а равно b"; $c=$a; }
else { echo "а меньше b"; $с=$а; }
Конструкция if-else имеет еще один альтернативный синтаксис:
if (логическое выражение):
команды;
elseif (другое__логическое_выражение):
другие команды;
else:
иначе_команды;
endif
Цикл с предусловием while
Эта конструкция также унаследована непосредственно от Си. Ее предназначение —
цикличное выполнение команд в теле цикла, включающее предварительную проверку, нужно ли
это делать (истинно ли логическое выражение в заголовке). Если не нужно (выражение ложно),
то конструкция заканчивает свою работу, иначе выполняет очередную итерацию и начинает все
сначала. Выглядит цикл так:
while (логическое_выражение)
инструкция;
где, как обычно, логическое_выражение - логическое выражение, а инструкция - простая
или составная инструкция тела цикла. (Очевидно, что внутри последнего должны производиться
какие-то манипуляции, которые будут иногда изменять значение нашего выражения, иначе
оператор зациклится. Это может быть, например, простое увеличение некоего счетчика,
участвующего в выражении, на единицу.) Если выражение с самого начала ложно, то цикл не
выполнится ни разу. Например:
$i=1; $р=1;
while ($i<32) {
echo $p," ";
$р=$р*2; // можно было бы написать $р*=2
$i=$i+1; // можно было бы написать $i+=1 или даже $i++
}
Данный пример выводит все степени двойки до 31-й включительно.
Как и инструкция if, цикл while имеет альтернативный синтаксис, что упрощает его
применение вперемешку с HTML-кодом:
while (логическое_выражение):
команды;
endwhile;
Цикл с постусловием do-while
В отличие от цикла while, этот цикл проверяет значение выражения не до, а после
каждого прохода. Таким образом, тело цикла выполняется хотя бы один раз. Выглядит оператор
так:
do {
команды;
} while (логическое_выражение);
После очередной итерации проверяется, истинно ли логическое_выражение и, если это
так, управление передается вновь на начало цикла, в противном случае цикл обрывается.
Альтернативного синтаксиса для do-while разработчики РНР не предусмотрели (видимо,
из-за того, что, в отличие от прикладного программирования, этот цикл довольно редко
используется при программировании сценариев).
Универсальный цикл for
Формат конструкции такой:
for (инициализирующие_команды; условие_цикла; команды_после_прохода)
тело_цикла;
Работает он следующим образом. Как только управление доходит до цикла, первым
делом выполняются операторы, включенные в инициализирующие_команды (слева направо).
Эти команды перечисляются там через запятую, например:
for ($i=0,$j=10, $k="Test!; …)
Затем начинается итерация. Первым делом проверяется, выполняется ли условие_цикла
(как в конструкции while). Если да, то все в порядке, и цикл продолжается. Иначе
осуществляется выход из конструкции. Например:
// прибавляем по одной точке
for ($i=0,$j=0,$k=”Test”; $i<10; …) $k.=”.”;
Предположим, что тело цикла проработало одну итерацию. После этого вступают в
действие команды_после_прохода (их формат тот же, что и у инициализирующих операторов).
Например:
for($i=0,$j=0,$k-"Points"; $i<100; $j++, $i+=$j)
$k=$k.".";
Приведенный пример (да и вообще любой цикл for) можно реализовать и через while,
только это будет выглядеть не так изящно и лаконично. Например:
$i=0; $j=0; $k="Points";
while {$i<100} {
$k.=".";
$j++;
$i+=$j;
}
Альтернативный синтаксис конструкции:
for (инициализирующие_команды; условие_цикла; команды_после_прохода):
операторы;
endfor;
Инструкции break и continue
Продолжим разговор про циклические конструкции. Очень часто для того, чтобы
упростить логику какого-нибудь сложного цикла, удобно иметь возможность его прервать в
ходе очередной итерации (к примеру, при выполнении какого-нибудь особенного условия). Для
этого и существует инструкция break, которая осуществляет немедленный выход из цикла. Она
может задаваться с одним необязательным параметром - числом, которое указывает, из какого
вложенного цикла должен быть произведен выход. По умолчанию используется 1, т. е. выход из
текущего цикла, но иногда применяются и другие значения:
for ($i=0; $i<10; $!++} {
for ($j=0; $j<10; $j++) {
if ($A[$i]=$A[$j]) break(2);
}
}
if ($i<10; echo 'Найдены совпадающие элементы в матрице \$А!';
В этом примере инструкция break осуществляет выход не только из второго, но и из
первого цикла, поскольку указана с параметром 2.
Инструкцию break удобно использовать для циклов поисков: как только очередная
итерация цикла удовлетворяет поисковому условию, поиск обрывается. Например, вот цикл,
который ищет в массиве $A первый нулевой элемент:
for ($i=0; $i<count($A); $i++)
if ($A[$i]==0) break;
if ($i<count($A)) echo "Нулевой элемент найден: i=$i";
Стандартная функция count(), которую мы еще не рассматривали, проста возвращает
число элементов в массиве $A.
Инструкция continue так же, как и break, работает только "в паре" с циклическими
конструкциями. Она немедленно завершает текущую итерацию цикла и переходит к новой
(конечно, если выполняется условие цикла для цикла с предусловием). Точно так же, как и для
break, для continue можно указать уровень вложенности цикла, который будет продолжен по
возврату управления.
В основном continue позволяет вам сэкономить количество фигурных скобок в коде и
увеличить его удобочитаемость. Это чаще всего бывает нужно в циклах-фильтрах, когда
требуется перебрать некоторое количество объектов и выбрать из них только те, которые
удовлетворяют определенным условиям. Например, вот цикл, который обнуляет те элементы
массива $A, которые удовлетворяют нескольким условиям:
for ($i=0; Si<count($A); $i++) {
if(!условие1($A[$i])) continue;
…
if (!условиеN($A[$i])) continue;
$A[$i]=0;
}
Download