Раздел 5.4 - Циклы со схемой итераций

Существует два часто встречающихся типа циклов, которые непосредственно поддерживаются в Аде: в циклы while и for. Эти циклы называют `циклами со схемой итераций'. Это обыкновенные циклы, которым предшествует информация, описывающая необходимую схему цикла.

Цикл while достаточно прост. Записывается обычная циклическая конструкция, как это было продемонстрировано в предыдущем разделе, а впереди нее - ключевое слово ``while'' и условие. Выполнение инструкций внутри цикла while повторяется до тех пор, пока условие остается истинным. Ниже приведен пример цикла, который выводит N и увеличивает его на единицу, пока N остается меньше 20.

 while N < 20
 loop
  Put(N);
  N := N + 1;
 end loop;

Цикл for выглядит очень похоже, и начинается с ключевого слова ``for''. Сначала локальному параметру цикла присваивается нижнее граничное значение. Затем циклически проверяется, меньше ли этот парметр верхнего граничного значения, и, если это так, выполняется последовательность инструкций, и значение параметра увеличивается на единицу. Ниже приведен пример цикла, котрый выводит "Hello" 20 раз:

 for Count in 1 .. 20
 loop
   Put_Line("Hello");
 end loop;

Есть ключевые моменты относительно циклов for , о которых стоит упомянуть:

  1. Переменная, заданная в цикле `for', является локальной переменной, видимой только инструкциям внутри цикла и не может быть ими изменена (можно выйти из цикла , используя инструкцию exit, которую мы уже рассматривали).
  2. Параметр цикла всегда изменяется на единицу. Обратный порядок выполнения цикла может быть получен при помощи ключевого слова `reverse' после ключевого слова `in'. В этом случае начальным значением параметра цикла будет верхняя граница (записываемая второй) и это значение будет уменьшаться до тех пор, пока не станет меньше нижней границы (записываемой первой). Если необходимо увеличивать или уменьшать параметр на величину, большую чем единица, используйте другой тип цикла.

Как в цикле ``while'', так и в ``for'', перед каждой итерацией выполняется проверка условия. Это значит, что цикл может выполниться "ноль" раз, если условие изначально ложно. Это - западня для начинающих программистов на Ada. Конструкция

  for J in 10 .. 1 loop

выполниться ноль раз (т.е. операторы внутри цикла никогда не будут выполнены), так как 10 больше чем 1.

Конструкция

  for J in reverse 10 .. 1 loop
также выполняется ноль раз; в Ada 10 .. 1 считается пустым списком, а изменение порядка выполнения ничего не меняет. Вероятно, вместо этого необходимо записать:
  for J in reverse 1 .. 10 loop

Упражнение:

Если необходимо повторить что-то ровно 10 раз, какая схема итераций подходит лучше всего?

  1. Цикл While.
  2. Цикл For.
  3. Цикл без схемы итераций.

Вы можете также:

PREVIOUS Перейти к предыдущему разделу

NEXT     Перейти к следующему разделу

OUTLINE  Вернуться к содержанию Урока 5

David A. Wheeler (dwheeler@ida.org)

Перевод: Юрий Королев   Общая редакция перевода: Г.Ю. Сисюк

Исходная копия этого документа находится по адресу "http://www.adahome.com/Tutorials/Lovelace/s5sf.htm".

Исходная копия перевода размещена на сайте http://www.ada-ru.org