Дострочное пересдача экзамена
|
Автоматизация скриптов с помощью циклов
Прерывание циклов
Обычно выполнение итераций цикла продолжается до тех пор, пока условие истинно. Однако в арсенале ActionScript имеются два действия, позволяющих изменить такое поведение: continue и break.
Действие continue позволяет прервать выполнение текущей итерации и перейти сразу к следующей итерации цикла. Возьмем такой пример:
total = 0; i = 0; while (++i <= 20) { if (i == 10) { continue; } total += i; }
В этом скрипте оператор цикла while выполняет 20 итераций. На каждой итерации к переменной total добавляется значение i – кроме десятой итерации, когда i равно 10. В этом случае вызывается действие continue, выполнение дальнейших действий в теле цикла прекращается, и происходит переход к одиннадцатой итерации. В итоге переменная total будет содержать набор чисел: "1 2 3 4 5 6 7 8 9 11 12 13 14 15 16 17 18 19 20". Обратите внимание, что в этом наборе отсутствует число 10 – ведь десятая итерация цикла была прервана.
Действие break используется для досрочного прекращения цикла – даже если условие цикла все еще равно true. Рассмотрим пример:
total = 0; i = 0; while (++i <= 20) { total += i; if (total >= 10) { break; } }
В этом скрипте на каждой итерации значение переменной total увеличивается на i. Как только значение total достигнет 10 (это проверяет оператор if ), выполняется действие break и цикл while завершается (хотя по условию он должен был бы выполняться 20 раз).
В следующем упражнении мы применим действия break и continue для создания простой процедуры поиска.
- Откройте файл phoneNumberSearch1.fla из папки Lesson10/Assets.
Этот файл содержит два слоя: Actions и Search Assets. Слой Actions будет содержать процедуру поиска для нашего проекта. В слое Search Assets размещены два текстовых поля, кнопка и общее графическое оформление.
В этом упражнении мы создадим несложное приложение, которое позволит, введя в текстовое поле имя абонента, найти его телефонный номер. На экране у нас два текстовых поля. В одно поле, с именем name, пользователь будет вводить имя для поиска, в другом – с именем result – будет отображаться результат. Поверх изображения кнопки Search расположена невидимая кнопка, которая будет вызывать функцию поиска.
- Откройте панель Действия, выделите первый кадр слоя Actions и введите следующий скрипт:
info=[["John","919-555-5698"],["Kelly","232-555-3333"],["Ross","434-555-5655"]];
Этим мы создаем двумерный массив с именем info. Он содержит три элемента, каждый из которых сам по себе является массивом. Первый элемент каждого из этих субмассивов – имя абонента, второй – его телефонный номер.
Обращение к первому имени в этой структуре (John) будет выглядеть как info[0][0], обращение к его телефонному номеру – info[0][1]. Запомните этот синтаксис, он будет играть важную роль в нашем скрипте.
- После объявления массива info добавьте описание функции:
function search() { matchFound = false; i = -1; while (++i < info.length) { } }
Эта функция будет выполнять поиск в массиве info нужного телефонного номера. Первым действием в теле функции создается переменная matchFound, которой присваивается начальное значение false. Каким образом эта переменная будет использоваться, вы скоро узнаете.
Далее задается цикл while, который будет перебирать все элементы массива info.
- Внутрь цикла while (в функции search()) вставьте следующие действия:
if (info[i][0].toLowerCase() != name.text.toLowerCase()) { continue; } result.text = info[i][1]; matchFound = true; break;
На каждой итерации цикла оператор if будет (с помощью текущего значения i ) обращаться к очередному элементу массива info и сравнивать имя из этого массива с тем, что введено пользователем в поле name. Чтобы поиск не зависел от прописных и строчных букв, оба значения методом toLowerCase() переводятся в нижний регистр).
Если значения не равны, то выполняется действие continue, и остальные действия в теле цикла пропускаются.
Если текст из поля name соответствует имени из массива info, continue не вызывается, и выполняются три действия, стоящие после оператора if: переменной result.text присваивается значение соответствующего телефонного номера, matchFound становится true, затем выполняется действие break, прекращающее выполнение цикла.
Давайте разберем, как это все работает. Предположим, что в текстовое поле name мы ввели Kelly. В массиве info имя "Kelly" расположено по такому "адресу":
info[1][0]
На первой итерации цикла i равно 0, и значит, оператор if будет выглядеть так:
if (info[0][0].toLowerCase() != name.text.toLowerCase()) { continue; }
Значение "john" (имя из info[0][0], переведенное в нижний регистр) сравнивается с "kelly" (текст, введенный в поле name, переведенный в нижний регистр). Поскольку "john" не равно "kelly", вызывается действие continue, и начинается следующая итерация цикла. Значение i увеличивается на единицу, и на этой итерации оператор if выглядит так:
if (info[1][0].toLowerCase() != name.text.toLowerCase()) { continue; }
Значение "kelly" (имя из info[1][0], переведенное в нижний регистр) сравнивается с "kelly" (текст в поле name, переведенный в нижний регистр). Поскольку "kelly" равно "kelly", действие continue игнорируется, и выполняются три следующих действия тела цикла. Первое действие помещает в переменную result.text значение из info[i][1]. Поскольку i равно 1, result.text получает значение из info[1][1] – телефонный номер Kelly отображается в поле result. Далее matchFound получает значение true и действием break выполнение цикла прекращается.
Совет В принципе, применять здесь действие break не обязательно, однако оно помогает сократить время поиска. Представьте себе массив из тысяч имен – если бы не break, цикл перебирал бы их все!
- Добавьте в функцию search() (после цикла) еще один оператор if:
if (!matchFound) { result.text="No Match"; }
Этот оператор, не являясь частью цикла, проверяет значение matchFound. Если после завершения цикла значение этой переменной так и осталось false, то оператор if выполняет действие, присваивающее свойству result.text значение "No Match". Синтаксис !matchFound – сокращенный вариант записи matchFound == false.
- Выделите невидимую кнопку над надписью "search" и введите в панели Действия следующий скрипт:
on (release, keyPress "<Enter>") { search(); }
При нажатии и отпускании этой кнопки, либо при нажатии клавиши Enter будет вызываться функция search().
- Выполните команду Управление > Проверить фильм (Control > Test Movie). Введите в текстовое поле для поиска имя John, Kelly или Ross, а затем нажмите кнопку Search Попробуйте ввести какое-либо иное имя и вновь нажать кнопку Search.
Если имя правильное, отобразится соответствующий номер телефона; если такого имени в массиве info нет – отобразится надпись "No Match".
- Закройте тестовый фильм и сохраните работу как phoneNumberSearch2.fla.
В этом упражнении мы, создавая процедуру поиска, применили команды прерывания цикла continue и break. Надо сказать, что на практике команда break применяется гораздо чаще, чем continue: чтобы пропустить оставшиеся действия цикла, программисты часто используют вместо continue конструкции с оператором if.