Опубликован: 04.11.2006 | Доступ: свободный | Студентов: 4462 / 498 | Оценка: 4.46 / 3.96 | Длительность: 39:17:00
Урок 10:

Автоматизация скриптов с помощью циклов

< Урок 9 || Урок 10: 1234 || Урок 11 >

Прерывание циклов

Обычно выполнение итераций цикла продолжается до тех пор, пока условие истинно. Однако в арсенале 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 для создания простой процедуры поиска.

  1. Откройте файл phoneNumberSearch1.fla из папки Lesson10/Assets.

Этот файл содержит два слоя: Actions и Search Assets. Слой Actions будет содержать процедуру поиска для нашего проекта. В слое Search Assets размещены два текстовых поля, кнопка и общее графическое оформление.


В этом упражнении мы создадим несложное приложение, которое позволит, введя в текстовое поле имя абонента, найти его телефонный номер. На экране у нас два текстовых поля. В одно поле, с именем name, пользователь будет вводить имя для поиска, в другом – с именем result – будет отображаться результат. Поверх изображения кнопки Search расположена невидимая кнопка, которая будет вызывать функцию поиска.

  1. Откройте панель Действия, выделите первый кадр слоя Actions и введите следующий скрипт:
info=[["John","919-555-5698"],["Kelly","232-555-3333"],["Ross","434-555-5655"]];

Этим мы создаем двумерный массив с именем info. Он содержит три элемента, каждый из которых сам по себе является массивом. Первый элемент каждого из этих субмассивов – имя абонента, второй – его телефонный номер.


Обращение к первому имени в этой структуре (John) будет выглядеть как info[0][0], обращение к его телефонному номеру – info[0][1]. Запомните этот синтаксис, он будет играть важную роль в нашем скрипте.

  1. После объявления массива info добавьте описание функции:
function search() {
  matchFound = false;
  i = -1;
  while (++i < info.length) {
  }
}

Эта функция будет выполнять поиск в массиве info нужного телефонного номера. Первым действием в теле функции создается переменная matchFound, которой присваивается начальное значение false. Каким образом эта переменная будет использоваться, вы скоро узнаете.

Далее задается цикл while, который будет перебирать все элементы массива info.

  1. Внутрь цикла 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, цикл перебирал бы их все!

  1. Добавьте в функцию search() (после цикла) еще один оператор if:
if (!matchFound) {
  result.text="No Match";
}

Этот оператор, не являясь частью цикла, проверяет значение matchFound. Если после завершения цикла значение этой переменной так и осталось false, то оператор if выполняет действие, присваивающее свойству result.text значение "No Match". Синтаксис !matchFound – сокращенный вариант записи matchFound == false.

  1. Выделите невидимую кнопку над надписью "search" и введите в панели Действия следующий скрипт:
on (release, keyPress "<Enter>") {
  search();
}

При нажатии и отпускании этой кнопки, либо при нажатии клавиши Enter будет вызываться функция search().

  1. Выполните команду Управление > Проверить фильм (Control > Test Movie). Введите в текстовое поле для поиска имя John, Kelly или Ross, а затем нажмите кнопку Search Попробуйте ввести какое-либо иное имя и вновь нажать кнопку Search.

Если имя правильное, отобразится соответствующий номер телефона; если такого имени в массиве info нет – отобразится надпись "No Match".

  1. Закройте тестовый фильм и сохраните работу как phoneNumberSearch2.fla.

В этом упражнении мы, создавая процедуру поиска, применили команды прерывания цикла continue и break. Надо сказать, что на практике команда break применяется гораздо чаще, чем continue: чтобы пропустить оставшиеся действия цикла, программисты часто используют вместо continue конструкции с оператором if.

< Урок 9 || Урок 10: 1234 || Урок 11 >
Евгений Стародубцев
Евгений Стародубцев

Вот задание:

7. Открыв панель Действия (Actions) и установив ее в Экспертный режим(Expert Mode), выделите кадр 1 слоя Actions и введите следующий скрипт:

Галина Кузнецова
Галина Кузнецова

Добрый день.

Можно ли получить среду Flash для обучения бесплатно?

Ольга Ремез
Ольга Ремез
Латвия, Рига
Светлана Ведяева
Светлана Ведяева
Россия, Саратов