Январь 2011

Руководство по actionscript. часть 1, стр. 060

«Количество товаров в вашей корзине: 2″

Оператор И без условия else

Когда в условии else оператора i f нет необходимости, то его можно просто опустить. Предположим, что в нашем приложении для интернет-магазина необходимо реализовать следующую возможность: пользователь, заказавший более десяти товаров, получает скидку 10 %. При подсчете общей стоимости покупки в процессе оформления заказа мы можем использовать код, аналогичный следующему:

if (numltems > 10) { totalPrice = total Price * .9;

}

Если значение переменной numltems будет меньше И, то значение переменной totalPrice останется неизмененным.

Цепочка операторов if

Когда необходимо выбрать один из более чем двух возможных путей выполнения программы, следует объединить вместе несколько операторов if, как показано в следующем обобщенном коде для условия с тремя возможными результатами:

if (условиоеВыражение1) {

блокКода1 } else if (условноеВыражение2) {

блокКода2 } else {

блокКодаЗ

}

Предположим, что нужно разработать многоязычное приложение, которое выводит приветствие для своих пользователей на одном из четырех языков: английском, японском, французском или немецком. При запуске программы мы просим пользователя выбрать язык и присваиваем соответствующей переменной language одно из следующих строковых значений: «english», » japanese», «french» или «german» (обратите внимание, что названия языков начинаются со строчных букв; обычно при сравнении строк все буквы записываются либо в нижнем, либо

в ВЕРХНЕМ регистре). Чтобы создать приветствие на выбранном языке, используем следующий код:

var greeting;

if (language == «english») {

greeting = «Hello»; } else if (language == «japanese») {

greeting = «Konn’ichiwa»; } else if (language == «french») {

greeting = «Bonjour»; } else if (language == «german») {

greeting = «Guten tag»; } else {

// Расположенный здесь код может быть использован // для отображения сообщения об ошибке, // вызванной неправильно выбранным языком

}

Если при выполнении предыдущего кода значением переменной language является «english», то переменной greeting присваивается значение «Hello». Если значением переменной language является «japanese», «french» или «german», то переменной greeting присваивается значение «Konnichiwa», «Bonjour» или «Guten tag» соответственно. Если переменная language не имеет ни одного из перечисленных значений (возможно, из-за возникшей ошибки впрограмме) — «english», «japanese», «french» или «german», —товыполняется код, относящийся к последнему оператору else.

Руководство по actionscript. часть 1, стр. 061

Теперь, когда мы познакомились с оператором if, рассмотрим оператор switch, предлагаемый языком ActionScript в качестве удобного способа создания условия с несколькими возможными результатами.

I Поведение оператора switch можно реализовать и с помощью операторов if, однако, j, когда речь идет об условиях с несколькими, возможными результатами, оператор switch fly считается более понятным, чем if.

Оператор switch

Оператор switch позволяет выполнять один из нескольких возможных блоков кода в зависимости от результата одного условного выражения. Оператор switch можно представить в следующем обобщенном виде:

switch (условноеВыражение) { case выражение1:

блокКода1

break; case выражение2\ ¦ блокКода2

break; default:

блокКодаЗ

В предыдущем коде условноеВыражение — это выражение, которое среда выполнения Flash попытается последовательно сопоставить со всеми указанными выражениями case сверху вниз. Выражения case записываются с помощью оператора-метки case и завершаются двоеточием. Если результат выражения условноеВыражение совпадает со значением выражения case, то выполняются все инструкции, расположенные за данной меткой case, включая инструкции во всех последующих блоках этого оператора! Чтобы предотвратить выполнение последующих блоков, необходимо использовать оператор break в конце каждого блока. Если же мы хотим, чтобы несколько условий инициировали выполнение одного и того же блока кода, то оператор break можно опустить. Например, в следующем примере кода блокКода1 выполняется в тех случаях, когда результат выражения условноеВыражение совпадает со значением либо выражения выражение!, либо выражения выражение2:

switch (условноеВыражение) { case выражение!: case выражение2:

блокКода!

break; case выражениеЗ:

блокКода2

break; default:

блокКодаЗ

}

Если результат выражения условноеВыражение не совпадает ни с одним из значений выражений case, то выполняются все инструкции, расположенные за меткой default.

Метка default обычно указывается после всех выражений case, однако с технической точки зрения ее можно поместить в любом месте оператора switch. Более того, эта метка не является обязательным атрибутом рассматриваемого оператора. Если default не указана и результат выражения условноеВыражение не совпадает ни с одним из значений выражений case, то выполнение программы продолжается с инструкции, расположенной сразу за оператором switch (то есть код, размещенный внутри оператора switch, просто не выполняется).

Следующий пример кода демонстрирует реализацию условия для создания приветствия на нескольких языках, которое было рассмотрено в предыдущем разделе, с использованием оператора switch вместо цепочки операторов if. Оба подхода работают одинаково, однако можно утверждать, что код с использованием оператора switch легче для чтения и зрительного восприятия.

Руководство по actionscript. часть 1, стр. 062

Var greeting;

switch (language) { case «english»: greeting = «Hello»; break;

}

case «Japanese»:

greeting = «Konnichiwa»;

break: case «french»:

greeting = «Bonjour»:

break;

case «german»: greeting = «Guten tag»; break;

default:

// Расположенный здесь код может быть использован для отображения // сообщения об ошибке, вызванной неправильно выбранным языком

$4

В операторе switch при сравнении результата выражения условноеВыражение со значениями выражений case неявно используется оператор строгого равенства (===), а не 3# оператор равенства (==). Описание различий между этими операторами можно найти в справочнике по языку ActionScript корпорации Adobe.

Циклы

В предыдущем разделе мы узнали, что условный оператор позволяет единожды выполнить блок кода, если результатом его условного выражения является значение t rue. Цикл, в свою очередь, позволяет многократно выполнять блок до тех пор, пока результатом его условного выражения является значение true.

В языке ActionScript существует пять различных типов циклов: while, do-while, for, for-in и f or-each-in. Первые три типа обладают схожей функциональностью, однако их синтаксис отличается. Оставшиеся два типа используются для доступа к динамическим переменным экземпляра объекта. Мы еще не рассматривали динамические переменные экземпляра, поэтому пока остановимся на первых трех типах циклов. Информацию по циклам f or-in и f or-each-in можно найти в гл. 15.

Оператор while

Структурно оператор while во многом напоминает if: основной оператор содержит блок кода, который выполняется только в том случае, если результатом заданного условного выражения является значение true:

while (условноеВыражение) { блокКода

}

Если результатом выражения условноеВыражение является true, то выполняются инструкции из блока блокКода (называемого телом цикла). Однако, в отличие от оператора i f, когда выполнение блока блокКода завершается, управление снова передается на начало оператора while (то есть среда выполнения Flash «возвращается» к его началу). Второе выполнение оператора while ничем не отличается от первого: вычисляется

результат выражения условноеВыражение и, если его значением является true, снова выполняется блок блокКода. Этот процесс будет продолжаться до тех пор, пока результатом выражения условноеВыражение не станет false, после чего выполнение программы будет продолжено с инструкции, расположенной сразу за оператором while.

Руководство по actionscript. часть 1, стр. 063

Если выражение условноеВыражение никогда не возвращает значение false, то цикл будет выполняться бесконечно и среда выполнения Flash будет вынуждена сгенерировать ошибку, которая остановит цикл (а вместе с ним и весь исполняемый в данный момент код). Чтобы избежать подобной ситуации, в блок блокКода цикла while обычно включается инструкция, которая модифицирует выражение условноеВыражение, заставляя его вернуть значение false при выполнении определенного условия.

Например, рассмотрим следующий цикл, определяющий результат возведения числа 2 в третью степень (то есть 2 умножается на 2 и умножается на 2), — тело цикла выполняется два раза:

var total = 2; var counter = 0;

while (counter < 2) { total = total * 2; counter = counter + 1;

}

При выполнении предыдущего цикла while среда выполнения Flash сначала вычисляет результат условного выражения:

counter < 2

Поскольку значение переменной counter равно 0 и, соответственно, меньше 2, значением условного выражения является true; таким образом, Flash выполняет тело цикла:

total = total * 2; counter = counter + 1;

В теле цикла переменной total присваивается ее текущее значение, умноженное на 2, а к значению переменной counter прибавляется 1. С этого момента значением переменной total является 4, а переменной counter — 1. После выполнения тела цикла наступает время повторить его.

При выполнении цикла во второй раз среда Flash снова проверяет значение условного выражения. На этот раз значением переменной counter является 1, что по-прежнему меньше 2, поэтому значением условного выражения является true. Следовательно, Flash выполняет тело цикла во второй раз. Как и в предыдущий раз, переменной total присваивается ее текущее значение, умноженное на 2, а к значению переменной counter прибавляется 1. С этого момента значением переменной total является 8, а переменной counter — 2. После выполнения тела цикла снова наступает время повторить его.

При выполнении цикла в третий раз среда Flash снова проверяет значение условного выражения. На этот раз значением переменной counter является 2, что уже не меньше 2, поэтому значением условного выражения является false и выполнение цикла прекращается. В процессе вычислений значение переменной total, которое

Руководство по actionscript. часть 1, стр. 064

Изначально равнялось 2, было дважды умножено на само себя, поэтому результатом является 8.

I В реальном коде для выполнения экспоненциальных вычислений следует использовать м& 4 „ функцию Math. pow(), а не оператор цикла. Например, для возведения 2 в третью степень №{‘ используется конструкция Math. pow(2, 3).

Хотя предыдущий цикл не вызывает особого восторга, он обладает потрясающей гибкостью. Например, если бы мы хотели возвести, скажем, число 2 в степень 16, мы могли бы просто обновить значение в условном выражении, чтобы тело цикла выполнялось 15 раз, как показано в следующем примере:

var total = 2; var counter = 0; while (counter < 15) {

total = total * 2;

counter = counter + 1;

}

// Здесь значение переменной total равно 65 536

Одно выполнение тела цикла называется итерацией. Соответственно, переменная, которая контролирует выполненное количество итераций данного цикла — в нашем случае это counter, — называется итератором или, реже, индексом цикла. Традиционно, для именования итераторов циклов используется буква i, как показано в следующем примере кода:

var total = 2; var i = 0; while (i < 15) {

total = total * 2;

i = i + 1;

}

Последняя строка в теле цикла из предыдущего примера называется корректором цикла, поскольку она до известной степени корректирует значение итератора, что в конечном счете приводит к завершению цикла. В данном случае корректор цикла прибавляет 1 к значению итератора. Эта операция является настолько распространенной, что для нее был создан собственный оператор: оператор инкремента, записываемый как ++. Оператор инкремента прибавляет 1 к значению своего операнда. Например, в следующем примере к значению переменной п прибавляется 1:

var п = 0;

п++; // значение переменной п теперь равно 1

В следующем примере кода наш цикл реализован уже с использованием оператора инкремента:

var total = 2; var i = 0; while (i < 15) {

total = total * 2;

i++;

Противоположностью оператора инкремента является оператор декремента, записываемый как —. Он вычитает 1 из значения своего операнда. Например, в следующем примере из значения переменной п вычитается 1:

var п = 4;

п—; // значение переменной п теперь равно 3

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

Руководство по actionscript. часть 1, стр. 065

Обработка списков с помощью циклов

Циклы обычно используются для обработки списков элементов.

Предположим, что мы создаем регистрационную форму, в которой пользователь должен указать адрес электронной почты. Перед отправкой формы на сервер мы хотим проверить, содержит ли указанный адрес электронной почты символ @. Если этого символа нет, мы предупредим пользователя, что введенный адрес электронной почты является неверным.

Обратите внимание, что в этом примере наша концепция «правильного» адреса является крайне упрощенной. Например, в нашем коде адреса, начинающиеся или заканчивающиеся символом @ либо содержащие несколько символов @, считаются корректными. Тем не менее пример демонстрирует первый скромный шаг в создании алгоритма проверки адресов электронной почты.

Чтобы проверить наличие символа @ в адресе электронной почты, мы используем цикл, трактующий адрес как список из отдельных символов. Перед выполнением цикла мы создадим переменную isValidAddress и присвоим ей значение false. Тело цикла будет выполняться один раз для каждого символа в адресе электронной почты. При выполнении тела цикла в первый раз проверяется, является ли первый символ адреса электронной почты символом @. Если является, то в теле цикла переменной is Val idAddres s присваивается значение true, что указывает на корректность адреса электронной почты. При выполнении тела цикла во второй раз проверяется, является ли второй символ адреса электронной почты символом @. И снова, если этот символ найден, в теле цикла переменной is Val idAddres s присваивается значение true, что указывает на корректность адреса электронной почты.

Руководство по actionscript. часть 1, стр. 066

Тело цикла продолжает проверять каждый символ в адресе электронной почты до тех пор, пока не останется ни одного символа. Если после выполнения цикла значение переменной isValidAddress по-прежнему равно false, значит, символ @ не был найден и, следовательно, адрес электронной почты считается некорректным. С другой стороны, если значение переменной isValidAddress равно true, значит, символ @ был найден и, следовательно, адрес электронной почты считается корректным.

Теперь взглянем на реальный код проверки. В настоящем приложении мы бы начали работу с получения адреса электронной почты, указанного пользователем.

Тем не менее, чтобы упростить этот пример, мы укажем адрес электронной почты вручную, как показано ниже:

var address = «me@inoock. org»:

Цосле этого мы создадим переменную isValidAddress и присвоим ей значение

false:

var. isValidAddress = false: Затем создадим итератор цикла:

var i = 0:

Далее определим оператор while для нашего цикла. Мы хотим, чтобы тело цикла выполнялось один раз для каждого символа строки, хранящейся в переменной addres s. Для получения количества символов в строке используется переменная экземпляра length класса String. Например, значением выражения «abc» . length является 3. Это значит, что строка abc состоит из трех символов. Таким образом, общая структура нашего цикла выглядит следующим образом:

while (i < address.length) { i++:

}

Всякий раз при выполнении тела цикла мы должны получить один из символов строки, хранящейся в переменной address, и сравнить его со строкой «@». Если полученный символ совпадает с ней, то присвоим переменной isValidAddress значение true. Чтобы получить определенный символ строки, воспользуемся методом экземпляра charAt ( ) собственного класса String. Название метода является сокращением фразы character at («символ в позиции»). Методу charAt ( ) необходимо передать один аргумент — число, указывающее позицию, или индекс, получаемого символа. Нумерация символов начинается с нуля. Например, результатом следующего выражения вызова является значение «т», поскольку именно этот символ находится в позиции 0:

Руководство по actionscript. часть 1, стр. 067

Address. charAt(0);

Подобным образом результатом следующего выражения вызова является значение » @ «, поскольку в позиции 2 находится символ @:

address. charAt(2);

В теле цикла индекс получаемого символа задается динамически через итератор i, как показано в следующем примере кода:

while (i < address.length) { if (address.charat(i) == "(a") { isvalidaddress = true:

}

i++:

}

Код проверки адреса электронной почты целиком:

var address = «me@inoock. org»: var isValidAddress = false: var i = 0:

while (i < address.length) { if (address.charat(i) == "@") { isvalidaddress = true;

}

i++;

}

В качестве упражнения рассмотрим, как среда выполнения Flash будет выполнять предыдущий оператор while.

Сначала среда Flash вычисляет значение условного выражения:

i < address.length

Здесь значение переменной i равно 0, а значение выражения address. length равно 12. Число 0 меньше 12, поэтому результатом условного выражения является true, среда выполнения Flash выполняет тело цикла:

if (address. charAt(i) == «@») { isValidAddress = true:

}

i++:

В теле цикла среда Flash сначала должна определить, нужно ли выполнять код в условном операторе:

if (address. charAt(i) == «@») { isValidAddress = true:

}

Чтобы определить, нужно ли выполнять код в предыдущем условном операторе, Flash проверяет, совпадает ли результат выражения вызова address. charAt (i) со строкой «@». При выполнении тела цикла в первый раз значение переменной i равно 0, поэтому выражение вызова address. charAt (i) преобразуется в выражение address. charAt (0), которое, как мы видели раньше, возвращает символ «т» (первый символ в адресе электронной почты). Символ «т» не равен символу » @ «, поэтому среда Flash не выполняет код в условном операторе.

После этого Flash выполняет корректор цикла, увеличивая значение переменной i на 1:

i++;

После выполнения тела цикла наступает время повторить его.

При выполнении цикла во второй раз среда Flash снова проверяет значение условного выражения. На этот раз значение переменной i равно 1, а значение выражения address. length по-прежнему равно 12. Число 1 меньше 12, поэтому результатом условного выражения является значение true и Flash выполняет тело цикла во второй раз. Как и раньше, в теле цикла определяется, нужно ли выполнять код в условном операторе:

if (address. charAt(i) == «@») { isValidAddress = true;

}

Значение переменной i равно 1, поэтому выражение вызова address. charAt (i) преобразуется в выражение address. charAt (1), которое возвращает символ «е»

(второй символ в адресе электронной почты). Символ «е» вновь не равен символу » @ «, поэтому среда Flash не выполняет код в условном операторе.

После этого Flash выполняет корректор цикла, увеличивая значение переменной i до 2. И снова наступает время повторить цикл.

При выполнении цикла в третий раз Flash проверяет значение условного выражения. На этот раз значение переменной i равно 2, а значение выражения address. length по-прежнему равно 12. Число 2 меньше 12, поэтому результатом условного выражения является значение true и среда Flash выполняет тело цикла в третий раз. Как и раньше, в теле цикла определяется, нужно ли выполнять код в условном операторе:

Руководство по actionscript. часть 1, стр. 068

If (address. charAt(i) == «@») { isValidAddress = true;

}

Значение переменной i равно 2, поэтому выражение вызова address. charAt (i) преобразуется в выражение addres s. charAt (2), которое возвращает символ «@». Символ «@» равен символу «@», поэтому среда Flash выполняет код в условном операторе, присваивая переменной isValidAddress значение true. После этого Flash выполняет корректор цикла, увеличивая значение переменной i до 3.

Тело цикла будет выполнено еще девять раз. После завершения оператора цикла значением переменной isValidAddress будет являться true. Это сообщает программе, что адрес электронной почты можно с уверенностью отправлять на сервер для дальнейшей обработки.

Завершение цикла с помощью оператора break

Цикл, описанный в предыдущем разделе, был работоспособным, но неэффективным. В соответствии с упрощенной логикой гипотетического алгоритма проверки адреса, если адрес электронной почты содержит символ @, он считается корректным. Чтобы определить наличие символа @, в цикле из предыдущего раздела проверялся каждый отдельный символ в указанном адресе электронной почты. В случае с адресом me@mock. org тело цикла выполнялось целых 12 раз, хотя уже после проверки третьего символа было ясно, что адрес является корректным. Следовательно, девять раз тело цикла выполнялось без надобности.

Чтобы сделать цикл из предыдущего раздела более эффективным, можно воспользоваться оператором break, который сразу завершает выполнение цикла:

var address = «me@iTioock. org»; var isValidAddress = false; var i = 0;

while (i < address.length) { if (address.charat(i) == "@") { isvalidaddress = true; break;

}

i++;

В предыдущем примере кода, как только символ @ будет найден в строке, хранящейся в переменной address, переменной isValidAddress будет присвоено значение true, после чего оператор break завершит выполнение цикла.

Если создаваемый вами цикл используется для поиска определенного элемента в списке, *v л ^ то всегда применяйте оператор break для завершения цикла сразу после нахождения х — Jp: искомого элемента.

Упражнение: попробуйте модифицировать предыдущий цикл, чтобы адреса, начинающиеся или заканчивающиеся символом @ либо содержащие несколько символов @, считались некорректными. Кроме того, вы можете попробовать изменить цикл, чтобы некорректными считались и адреса, не содержащие ни одного символа. (точка).

Руководство по actionscript. часть 1, стр. 069

Оператор do-while

Как уже отмечалось ранее, оператор while говорит среде выполнения Flash многократно выполнять блок кода до тех пор, пока результатом указанного условия является значение true. Из-за особенностей структуры цикла while его тело будет полностью пропущено, если при проверке условного выражения в первый раз его результатом не является значение true. Оператор do-while гарантирует, что тело цикла будет выполнено по крайней мере один раз с минимальными затратами. Синтаксис оператора do-while отчасти напоминает перевернутый синтаксис оператора while:

do {

блокКода } while (условноеВыражение):

Описание цикла начинается с ключевого слова do, за которым следует блок блок-Кода тела цикла. При первом прохождении цикла do-while блок блокКода выполняется даже до проверки результата выражения условноеВыражение. Если после завершения блока блокКода результатом выражения условноеВыражение является значение true, то цикл начинается заново и блок блокКода выполняется снова. Цикл выполняется до тех пор, пока выражение условноеВыражение не примет значение false.

Оператор for

Цикл for, по существу, является синонимом цикла while, однако для его записи применяется более компактный синтаксис. Выражения инициализации и корректирования цикла размещаются вместе с условным выражением в верхней части цикла for. Вот его синтаксис:

for (инициализация: условноеВыражение: корректирование) { блокКода

}

Перед первой итерацией цикла for выполняется выражение инициализация (один, и только один раз). Обычно это выражение используется для присваивания исходного

значения одной или нескольким переменным итераторов. Как и в случае с другими циклами, если результатом выражения условноеВыражение является значение true, то блок блокКода выполняется. В противном случае цикл завершается. И хотя выражение корректирование размещается в заголовке цикла, оно выполняется в конце каждой итерации, перед очередной проверкой результата выражения условноеВыражение на допустимость продолжения цикла.



Полезные ссылки
Случайные записи
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.78
  • 23.08.2011">Британский ученый призывает запретить сливочное масло.
  • 22.03.2011">Руководство по actionscript. часть 2, стр. 024
  • 22.03.2011">Руководство по actionscript. часть 2, стр. 010
  • 13.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.90
  • 23.07.2011">Chrome OS
  • 12.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.106
  • 04.10.2010">Определение цвета пикселя на экране
  • 15.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.49
  • 12.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.116
  • 02.03.2011">Руководство по actionscript. часть 5, стр. 107
  • 04.03.2011">Руководство по actionscript. часть 5, стр. 028
  • 14.08.2011">Купи билет через интернет
  • 24.02.2011">Руководство по actionscript. часть 6, стр. 113
  • 04.03.2011">Руководство по actionscript. часть 5, стр. 027
Опрос

Какие цвета вы предпочитаете?

View Results

Loading ... Loading ...