Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Циклы.docx
Скачиваний:
5
Добавлен:
22.11.2019
Размер:
1.57 Mб
Скачать

Отклонения от правил

Язык C++ добавляет к циклам С возможность, которая требует некоторой поправ­ки к синтаксису цикла for. Исходный синтаксис выглядел следующим образом:

for (выражение; выражение; выражение) оператор

В частности, управляющий раздел конструкции for состоял из трех выражений, разделенных точками с запятой, как это указывалось ранее в настоящей главе. Однако циклы C++ позволяют поступать так, как показано ниже:

for (int i = 0; i < 5; i ++)

To есть в области инициализации цикла for можно объявить переменную. Часто поступать подобным образом очень удобно, но это не вписывается в исходный син­таксис, поскольку объявление не является выражением. Это единственное незаконное поведение, которое подгонялось под правила за счет определения нового вида выра­жений — выражения оператора объявления, которое представляло собой объявление без точки с запятой и могло встречаться только в операторе for.

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

for (int i = 0; i < 5; i++)

cout << "C + + knows loop.\n";

cout << i << endl; //переменная i больше не определена

Код в лис­тинге далее использует цикл для вычисления и сохранения первых 16 факториалов. Факториалы, которые являются удобным примером автоматизации обработки, вы­числяются следующим образом.

Ноль факториал, записываемый как 0!, определен как равный 1.

Далее, 1! равен 1*0!, т.е. 1.

2! равно 2*1!, или 2.

3! равно 3*2!, или 6, и т.д.

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

#include <iostream>

const int ArSize = 16;

int main()

{

using namespace std;

long long factorials[ArSize];

factorials[1] = factorials[0] = 1LL;

for (int i = 2; i < ArSize; i++)

factorials[i] = i * factorials[i-1];

for (int i = 0; i < ArSize; i++)

cout << i << "! = " << factorials[i] << endl;

getchar();

return 0;

}

Цикл иллюстрирует возможность применения счетчика цикла в его теле как переменной.

Программа из листинга демонстрирует, как цикл for работает рука об руку с массивами, предоставляя удобное средство доступа к каждому члену массива по оче­реди. К тому же используется const для создания символического представления (ArSize) для размера массива.

После этого ArSize применяется вез­де, где вступает в игру размер массива — в определении массива, а также в выраже­нии, ограничивающем количество шагов циклов, обрабатывающих массив.

Если те­перь вы решите расширить программу для вычисления, скажем, 20 факториалов, для этого понадобится только установить ArSize в 20 и перекомпилировать программу. Благодаря использованию символической константы, вы избегаете необходимости изменять индивидуально каждое вхождение 16 на 20.

Ограничивающее выражение i < ArSize отражает тот факт, что индексы эле­ментов массива лежат в пределах от 0 до ArSize - 1, т.е. значение индекса должно останавливаться за один шаг до достижения ArSize. Вместо него можно было бы ис­пользовать проверочное условие i <= ArSize - 1.