Использование цикла for...71

Другой разновидностью циклов является цикл for. Его часто предпочитают более простому циклу while. Цикл for имеет следующий вид:

      for ( инициализация ; условие ; увеличение )

      {

            // ...тело цикла

      }

Выполнение цикла for начинается с инициализации. В ней обычно находится оператор присвоения, используемый для установки начального значения переменной цикла. Условие инициализации выполняется только один раз, при первом входе в цикл for.

Затем проверяется условие. Подобно циклу while, цикл for выполняется до тех пор, пока условие не станет ложным.

После того как выполнится код тела цикла, управление получит следующий параметр цикла for ( увеличение[ 11 ]) и значение счётчика изменится. Затем опять будет выполнена проверка условия, и процесс повторится. В этом параметре обычно записывают инкрементное или декрементное выражение, которое определяет характер изменения переменной цикла на каждой итерации, но в принципе ограничений на используемые здесь операторы нет. Цикл for можно заменить эквивалентным ему циклом while:

      инициализация ;

      while ( условие )

      {

          {

              // ...тело цикла

          }

          увеличение ;

      }

Все три параметра цикла for являются необязательными. С++ игнорирует отсутствие части инициализации или увеличения цикла, а если опущено условие, С++ будет выполнять цикл for вечно ( или пока какой-либо другой оператор не передаст управление за пределы цикла ).

Для лучшего понимания цикла for рассмотрим пример. Приведённая ниже программа ForDemo выполняет то же, что и WhileDemo, но вместо while использует цикл for.

      /* ForDemo1. Вводится счётчик цикла. На экран выводится количество выполненных циклов for */

      #include <cstdio>

      #include <cstdlib>

      #include <iostream>

      using namespace std ;

      int main( int nNumberofArgs , char* pszArgs[ ] )

      {

          setlocale ( LC_ALL , ".1251" ) ; /* печать русских текстов */

          /* Ввод счётчика цикла */

          int loopCount ;

          cout << "Введите loopCount: " ;

          cin >> loopCount ;

          /* Работаем loopCount раз */

          for ( ; loopCount > 0 ; )

          {

              loopCount = loopCount - 1

              cout << "Осталось выполнить "

                    << loopCount << " циклов " ;

          }

          /* Пауза для того, чтобы посмотреть на результат работы программы */

          system( "PAUSE" ) ; return 0 ;

      }

_______________

11Увеличение в данном случае — достаточно условное название. Чаще всего здесь действительно выполняется увеличение счётчика цикла, однако это может быть любая инструкция С++, в том числе и пустая. — Прим. ред.

_________________

71 стр. Глава 5. Операторы управления программой

Программа ForDemo1 считывает вводимое при помощи клавиатуры значение в переменную loopCount. Управление передаётся циклу, если введённое значение больше нуля. Внутри цикла программа уменьшает значение счётчика и выводит получившееся значение, после чего управление вновь передаётся оператору for. Как только значение loopCount становится равным 0 , работа цикла завершается.

«Все три инструкции цикла for могут быть пустыми. Пустые инициализация и увеличение ничего не делают и никак не влияют на работу цикла, а пустое условие рассматривается как возвращающее значение true

[Советы]

Приведённый цикл for имеет две небольшие проблемы. Во-первых, он деструктивен — не в том смысле, что может сжечь ваш монитор или откусить шнур мыши — а в том плане, что он изменяет значение loopCount, которое, таким образом, "уничтожается". Во-вторых, цикл получился "нисходящий", т.е. значения переменной цикла идут от больших к меньшим. Всего этого легко избежать, если добавить специальную переменную — счётчик цикла.

      /* ForDemo2 — Вводится счётчик цикла. На экран выводится количество выполненных циклов for */

      #include <cstdio>

      #include <cstdlib>

      #include <iostream>

      using namespace std ;

      int main( int nNumberofArgs , char* pszArgs[ ] )

      {

          setlocale ( LC_ALL , ".1251" ) ; /* печать русских текстов */

          /* Ввод количества циклов */

          int loopCount ;

          cout << "Введите loopCount: " ;

          cin >> loopCount ;

          /* Цикл до достижения значения loopCount */

          for ( int i = 1 ; i <= loopCount ; i++ )

          {

              cout << "Выполнено " << i << " циклов( a ) " ;

          }

          /* Пауза для того, чтобы посмотреть на результат работы программы */

          system( "PAUSE" ) ; return 0 ;

      }

_________________

72 стр. Часть 1. Первое знакомство с С++

Программа ForDemo2 выполняет те же действия, что и ранее рассмотренная WhileDemo. Однако вместо изменения переменной loopCount в этом варианте программы введена специальная переменная цикла.

Выполнение цикла начинается с объявления переменной i и инициализации её значением переменной loopCount. Затем проверяется, является ли переменная i положительной. Если переменная положительна, то программа выводит уменьшенное на 3 значение i и возвращается к началу цикла.

«Согласно последнему стандарту языка индексная переменная, объявленная в части инициализации цикла for, известна только в пределах этого цикла. Программисты на С++ в этом случае говорят, что область видимости переменной ограничена циклом for. Например, в инструкции return рассмотренного выше примера, т.е. за пределами цикла, переменная i недоступна и не может использоваться. Однако этого новейшего правила придерживаются далеко не все компиляторы, и вам нужно протестировать свой компилятор, чтобы узнать, как он действует в этом случае. Dev-C++ при использовании i вне цикла выводит предупреждение, но позволяет программисту поступить по своему усмотрению.»

[Атас!]