Учись программированию на C++ Builder бесплатно!
Содержание[Скрыть]

Оператор for обеспечивает циклическое повторение некоторого оператора (в частности, составного оператора) заданное число раз. Повторяемый оператор называется телом цикла. Повторение цикла обычно определяется некоторой управляющей переменной (счетчиком), которая изменяется при каждом выполнении тела цикла. Повторение завершается, когда управляющая переменная достигает заданного значения.

Синтаксис

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

где:

  • выражение1 – задает начальное значение переменной, управляющей циклом;
  • выражение2 – является условием продолжения цикла;
  • выражениеЗ – изменяет управляющую переменную.

Структура

Сначала выполняется выражение1 (оно может состоять и из ряда выражений, разделенных запятой т.е. может использоваться операция последования). Это выражение задаст начальные значения переменной (или переменных) цикла. Затем проверяется выражеиие2, т.е. условие продолжения цикла. Если условие истинно (возвращает true ненулевое значение), то выполняется тело цикла оператор, записанный в структуре for. После завершения тела цикла выполняется выражениеЗ, определяющее обычно изменение переменной цикла. Затем опять проверяется условие, записанное как выражение2, и при истинности этого условия выполнение цикла продолжается. Как только в каком-нибудь цикле выражение2 вернет false (нулевое значение), цикл прерывается и управление передается оператору, расположенному следом за структурой for.

Пример №1

Следующие операторы вычисляют максимальное значение и сумму элементов, расположенных в массиве целых чисел Data размерностью 10:

int Max, Sum;
Мах = Sum = Data[0];
for (int i = 1; i < 10; i++) {
	if (Data[i] > Max) Max = Data[i];
	Sum += Data[i];
}

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

При использовании компилятора BCC32.EXE, запускаемого из командной строки, подобное уничтожение локальной переменной, объявленной в цикле, можно отменить опцией -Vd. Но вряд ли это имеет смысл делать.

Пример №2

В структуре for может быть использована операция запятая. Пусть в примере №1 необходимо было найти только сумму элементов массива. Тогда, если объявить переменные i и Sum до начала цикла, собственно, цикл можно весь разместить в заголовке структуры for:

 

int Sum, i;
for (Sum = Data[0], i = 1; i < 10; Sum += Data[i++]);

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

Пример №3

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

AnsiString s;
char Key = 'A';
s = Edit1->Text;
for (int i = s.Length(); i > 0; s[i--] = s[i] ^ Key);
Edit1->Text = s;

В этом примере начальное значение переменной i задано равным числу символов в строке, полученному применением функции Length(). В дальнейшем при каждом выполнении цикла i уменьшается на 1 постфиксной операцией декремента. В этом случае целесообразно именно уменьшение счетчика цикла, поскольку в противном случае во втором выражении структуры for пришлось бы каждый раз проверять с помощью функции Length(), не кончилась ли строка. А в приведенном варианте обращение к Length() производится всего один раз.

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

При пропуске какого-то из выражений, точка с запятой после пропущенного выражения (кроме третьего) должна писаться. Например, в заголовке:

for(; i<10;) ...;

пропущено первое условие и третье.

Если условие продолжения цикла не удовлетворяется с самого начала, то операторы тела структуры for не выполняются ни разу. Операторы цикла for могут быть вложенные.

Пример №4

Программа содержит три вложенных цикла for, осуществляющих вычисление матрицы Mat, равной произведению двух квадратных матриц Mat1 и Mat2 размером M на M. Все матрицы представлены двумерными массивами:

int I, J, К, X;
for (I = 1; I <= M; I++) {
	for (J = 1; J <= M; J++) {
		x = 0;
		for (K = 1; К <= M; K++) {
			X += Mat1[I][K] * Mat2[K][J];
		}
		Mat[I][J] = X;
	}
}
Поделиться