Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
A.doc
Скачиваний:
36
Добавлен:
09.04.2015
Размер:
5.6 Mб
Скачать

133 Глава 3

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

Естественно, исходное объявление i теперь должна быть исключена из програм- мы. Если вы внесете это изменение в последний пример, то обнаружите, что про- грамма не компилируется, потому что переменная цикла i исчезает после заверше- ния цикла, и вы не можете обращаться к ней в операторе вывода. Цикл имеет область видимости, распространяющуюся от управляющих выражений for до конца его тела, которое может быть либо блоком кода в фигурных скобках, либо единственным опе- ратором. Счетчик i теперь объявлен внутри области видимости цикла, и вы не мо- жете обращаться к нему в операторе вывода, потому что оно находится за пределами этой области. По умолчанию компилятор С++ придерживается стандарта ISO/ANSI

Решения и циклы 134

С++, который утверждает, что переменная, определенная внутри условия цикла, не может быть доступна вне этого цикла.

Вы можете вообще исключить инициализирующее выражение из цикла. Если ини- циализировать i в отдельном операторе объявления, то цикл можно написать так:

Тут по-прежнему нужна точка с запятой, отделяющая выражение инициализации от проверочного условия цикла. Фактически обе точки с запятой всегда должны при- сутствовать, независимо от того, пропущено ли какое-то одно из управляющих выра- жение, или даже все сразу. Если вы пропустите первую точку с запятой, то компиля- тор не сможет понять, какое именно из трех управляющих операторов отсутствует, или даже какой именно точки с запятой не хватает.

Цикл for может быть пустым. Например, вы можете поместить оператор цикла из предыдущего примера в выражение инкремента. Тогда цикл будет выглядеть так:

Точка с запятой после закрывающей скобки необходима, чтобы сообщить компи- лятору, что оператор цикла теперь пусто. Если вы пропустите ее, то оператор, следу- ющий непосредственно после этой строки, будет интерпретирован как тело цикла. Иногда пустой оператор цикла пишется в программах в отдельной строке:

Вы можете использовать операцию запятой, чтобы включить несколько счетчи- ков в цикл for. Ниже показан пример.

Описание полученных результатов

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

Понятно, что таким образом в каждый из разделов for можно вставить столько вы- ражений, сколько понадобится.

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

Обратите внимание, что присваивания, задающие начальные значения i и power, являются выражениями, а не операторами. Оператор всегда заканчивается точкой с запятой.

При каждом увеличении i на 1 значение power удваивается за счет сложения с са- мим собой. Это порождает последовательность чисел, представляющих степени двой- ки. Результат работы программы выглядит следующим образом.

Манипулятор setw, с которым вы познакомились в предыдущей главе, использует- ся для симпатичного выравнивания столбцов цифр. Чтобы использовать setw () без квалифицированного имени, в программу включен заголовочный файл <iomanip> и добавлено объявление using для имен из пространства std.

Если вы пропустите второе управляющее выражение, которое специфицирует проверочное условие цикла for, то предполагается, что это условие всегда будет true, поэтому цикл будет продолжаться бесконечно, если только вы не предусмотри- те какой-то другой способ выхода из него. На самом деле при желании вы можете пропустить все управляющие выражения в скобках после for. Это может показаться не слишком полезным, однако, в действительности все как раз наоборот. Довольно часто возникают ситуации, когда необходимо выполнить цикл некоторое число раз, но вы заранее не знаете, сколько именно итераций понадобится. Рассмотрим следую- щий пример.

Решения и циклы 138

Описание полученных результатов

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

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

Блок цикла выполняет следующие базовые действия.

  • Читает значение.

  • Добавляет прочитанное из cin значение к sum.

  • Проверяет, желаете ли вы продолжить вводить значения.

Первое действие внутри блока приглашает вас ввести число, и читает введенное значение в переменную value. Введенное значение добавляется в sum, после чего за- дается вопрос — желаете ли вы продолжить ввод, и предлагается ввести 1 п1, если не желаете. Введенный символ помещается в переменную indicator для последующей проверки на равенство 'п' или 'N' в операторе if. Если равенства нет, цикл про- должается, в противном случае выполняется break. Эффект от break в цикле подо- бен тому, что он имеет в контексте оператора switch. В данном случае он приводит к немедленному выходу из цикла с передачей управления оператору, следующему за закрывающей фигурной скобкой блока цикла.