HTML, XHTML и CSS на сто процентов.
11.4. Условия и циклы. Редко какая-либо программа или сценарий имеют линейный алгоритм. Обычно в ходе работы часто проверяются различные условия и в зависимости от результата принимаются какие-то решения. Для автоматизации работы в коде также используются циклы, которые позволяют намного снизить трудоемкость разработки. Условные операторы. В процессе создания сценариев обычно требуется изменить порядок выполнения кода. В этом разделе рассматриваются механизмы ветвления, позволяющие выбирать одно из альтернативных действий в зависимости от условия. Оператор if. Оператор if управляет последовательностью выполнения команд. Синтаксис этого оператора: If (логическое выражение). { Операторы. } Сначала вычисляется логическое выражение, затем, если оно равно true, выполняются операторы, если же оно равно false, то операторы пропускаются и продолжается выполнение сценария. Рассмотрим пример. Допустим, функция f(x) определяется следующим образом: HTML, XHTML и CSS на сто процентов. Для нахождения значения этой функции на определенной точке можно воспользоваться кодом, приведенным в листинге 11.11. Листинг 11.11. Пример работы оператора if. <html> <head> <titlе>Пример работы оператора if</title> <script> Var x, y; //Запрашиваем значение x. X=prompt ("Введите значение x","0"); //Преобразуем введенную строку в число. X=+x; //Определяем значение функции. If (x<0){ Y=x+10; } If ((x>=0)&&(x<=5)){ Y=x*x+4; } If (x>5){ Y=5/x; } Alert("Функция f("+x+")="+y); </script> </head> <body> </body> </html> С помощью этого кода можно легко найти значение данной функции в любой точке (рис. 11.12). HTML, XHTML и CSS на сто процентов. Рис. 11.12. Определение значения функции с помощью оператора if. Оператор if..else. Часто удобно использовать полную форму условного оператора if..else. С его помощью можно задать действия, которые необходимо выполнить, если логическое выражение равно false: If (логическое выражение). { Операторы1. } Else. { Операторы2. } Более того, можно совместить else с другим оператором if. В этом случае можно рассмотреть несколько альтернативных вариантов и выполнить соответствующие операторы: If (логическое выражение1). { Операторы1. } Else if (логическое выражение2). { Операторы2. } Else. { Операторы3. } Теперь перепишем предыдущий сценарий для определения функции с помощью оператора if..else (листинг 11.12). Листинг 11.12. Пример работы оператора if..else. <html> <head> <titlе>Пример работы оператора if..else</title> <script> Var x, y; //Запрашиваем значение x. X=prompt ("Введите значение x","0"); //Преобразуем введенную строку в число. X=+x; //Определяем значение функции. If (x<0) y=x+10; //при x<0. Else if (x>5) y=5/x; //при x>5. Else y=x*x+4; //при 0<=x<=5. Alert("Функция f("+x+")="+y); </script> </head> <body> </body> </html> Как видно из данного кода, фигурные скобки необязательны, если выполняется только один оператор. Однако рекомендуется всегда использовать их для облегчения чтения кода. Обратите внимание, что в целях оптимизации второй проверкой проверяется условие x>5. Оператор switch. Оператор switch позволяет сравнить значение с множеством других. Этого же эффекта можно достичь с помощью нескольких операторов if, но оператор switch позволяет создавать наглядный и краткий код. Этот оператор дает возможность предусмотреть операторы по умолчанию, которые выполняются, если не найдено ни одно соответствие: Switch (выражение). { Case значение1: Операторы. Case значение2: Операторы. .. Default: Операторы. } Допустим, необходимо, чтобы сценарий переводил названия животных с английского языка на русский (листинг 11.13). Листинг 11.13. Пример работы оператора switch. <html> <head> <titlе>Пример работы оператора switch</title> <script> Var trans; //Запрашиваем название животного. Var beast=prompt ("Введите название животного","dog"); //Находим соответствующее название на русском языке. Switch (beast). { Case "dog": Trans="собака"; Break; Case "cat": Trans="кошка"; Break; Case "cow": Trans="корова"; Break; Default: Trans="неизвестное животное". } Alert(beast+" – "+trans); </script> </head> <body> </body> </html> Этот код позволяет получить перевод названия одного из трех животных (рис. 11.13). HTML, XHTML и CSS на сто процентов. Рис. 11.13. Пример работы оператора switch. Обратите внимание на оператор break, который позволяет закончить работу оператора switch, так как иначе будет выполняться оставшийся код в операторе switch. Операторы цикла. Для многократного выполнения кода используют операторы цикла. Кроме того, циклы предоставляют удобные средства для манипулирования массивами. Цикл for. Оператор for служит для создания цикла. Он имеет следующий синтаксис: For (выражение инициализации; выражение условия; выражение цикла). { Операторы. } Выражение инициализации обычно служит для задания начального значения счетчика цикла. Выражение условия позволяет прекратить выполнять цикл, когда условие перестанет выполняться, то есть примет значение false. Выражение цикла обычно осуществляет инкремент или декремент счетчика цикла. Любое из этих выражений может быть пропущено, но соответствующая точка с запятой должна стоять. В листинге 11.14 представлен код, позволяющий найти факториал числа – n!=1*2*3*..*n. Листинг 11.14. Факториал с помощью оператора for. <html> <head> <titlе>Факториал с помощью оператора for</title> <script> Var f=1; Var x=prompt ("Введите число","5"); X=+x; For(var i=1;i<=x;i++). { F=f*i; } Alert(f); </script> </head> <body> </body> </html> В этом коде организуется цикл от 1 до x, при этом для простоты введенное значение не проверяется на допустимость, поэтому можно, например, получить значение Infinity (бесконечность) при большом значении x. Цикл while. Оператор while сходен с оператором for, но он не производит инициализацию и инкремент счетчика в своем объявлении. Синтаксис этого оператора следующий: While (выражение условия). { Операторы. } Если выражение условия в цикле while сразу ложно, то операторы не выполнятся ни разу. В листинге 11.15 представлен код, позволяющий найти факториал с помощью цикла while. Листинг 11.15. Факториал с помощью оператора while. <html> <head> <titlе>Факториал с помощью оператора while</title> <script> Var f=1; Var x=prompt ("Введите число","5"); X=+x; Var i=1; While(i<=x). { F=f*i; I++; } Alert(f); </script> </head> <body> </body> </html> Цикл do..while. Оператор do..while практически идентичен оператору while, но, поскольку в нем проверка условия осуществляется в конце, он гарантирует выполнение операторов по крайней мере один раз: Do. { Операторы. } while (выражение условия). В листинге 11.16 представлен код, позволяющий найти факториал с помощью цикла do..while. Листинг 11.16. Факториал с помощью оператора do..while. <html> <head> <titlе>Факториал с помощью оператора do..while</title> <script> Var f=1; Var x=prompt ("Введите число","5"); X=+x; Var i=1; Do. { F=f*i; I++; } while(i<=x). Alert(f); </script> </head> <body> </body> </html> Цикл for..in. С помощью конструкции for..in можно выполнить операторы почти для каждого свойства объекта. Синтаксис этого оператора: For (свойство in объект). { Операторы. } Например, с помощью данного оператора можно произвести инкремент всех элементов массива (листинг 11.17). Листинг 11.17. Пример использования оператора for..in. <html> <head> <titlе>Пример использования оператора for..in </title> <script> Var a= new Array (5,76,43,12,77,-5, 0); For (var i in a). { A[i]++; } Alert(a); </script> </head> <body> </body> </html> В ходе выполнения этого кода все элементы массива a увеличат свое значение на единицу (рис. 11.14). HTML, XHTML и CSS на сто процентов. Рис. 11.14. Инкремент элементов массива. Обратите внимание, что в цикле for..in не определяется свойство массива length. Операторы break и continue. Иногда в ходе выполнения цикла возникает необходимость прервать весь цикл или одну его итерацию. Для этой цели служат операторы break и continue. Оператор break полностью прекращает выполнение цикла и передает управление операторам, следующим за циклом. Оператор continue прерывает текущее выполнение цикла и переходит к выполнению следующего шага цикла. Различие в работе этих операторов продемонстрировано в листинге 11.18. Листинг 11.18. Пример использования операторов выхода из цикла. <html> <head> <titlе>Пример использования операторов выхода из цикла</titlе> <script> Var a= new Array (5,0,2,0-3,0); Var b= new Array(); //Создаем бесконечный цикл. While(true). { Var x=prompt ("Введите число","0"); //Преобразуем введенную строку в число. X=+x; //Если введен ноль, то цикл прерывается. //Это единственный выход из бесконечного цикла. If (x==0) {break}. //Вложенный цикл, просматривающий все элементы массива. For (var i=0;i<a.length;i++). { //Проверяем значение элемента массива a. If (a[i]==0). { B[i]="-"; //Прерываем текущую итерацию цикла for, чтобы избежать. //деления на ноль. Continue; } //Находим частное. B[i]=x/a[i]; }//Конец цикла for. Alert(a+"\n"x+"\n"+b); }//Конец цикла while. </script> </head> <body> </body> </html> Данный код позволяет определить частное от введенного пользователем числа и элементов массива a. При этом в числе элементов этого массива могут быть нули, тогда необходимо в элемент массива с результатом b ввести прочерк (—) (рис. 11.15). HTML, XHTML и CSS на сто процентов. Рис. 11.15. Пример использования операторов выхода из цикла. В вышеприведенном коде также демонстрируется возможность вложения одного цикла в другой. Из цикла while возможен выход, только если ввести нуль (значение по умолчанию). Цикл for во время исполнения иногда прерывается, если элемент массива a равен нулю, чтобы избежать деления на ноль.