Оператор цикла с предусловием и коррекцией for
Общий вид оператора:
for (выражение 1; выражение 2; выражение 3)
код цикла;
где выражение 1 – инициализация счетчика (параметр цикла);
выражение 2 – условие продолжения счета;
выражение 3 – коррекция счетчика.
На рис. 7.2, а представлена схема работы цикла for, а на рис. 7.2, б – символ блок-схемы, использующийся для его обозначения.
Рис. 7.2. Схемы оператора цикла for:
а – схема работы; б – блок-схема
Инициализация используется для присвоения счетчику (параметру цикла) начального значения.
Выражение 2 определяет условие выполнения цикла. Как и в предыдущих случаях, если его результат не нулевой («истина»), – то цикл выполняется, иначе – происходит выход из цикла.
Коррекция выполняется после каждой итерации цикла и служит для изменения параметра цикла.
Выражения 1, 2 и 3 могут отсутствовать (пустые выражения), но символы «;» опускать нельзя.
Например, для суммирования первых N натуральных чисел можно записать такой код:
sum = 0;
for ( i = 1; i<=N; i++) sum+=i;
Заметим, что в выражении 1 переменную-счетчик можно декларировать. Например:
for (int i = 1; i<=N; i++)
Областью действия такой переменной будет код цикла.
Но в старых версиях компиляторов такие действия могут интерпретироваться иначе.
Цикл for эквивалентен последовательности инструкций:
выражение 1;
while (выражение 2) {
...
выражение 3;
}
а оператор for (; выражение 2; )
код цикла;
эквивалентен оператору while (выражение 2)
код цикла;
Если пропущено выражение 2, то цикл будет выполняться бесконечно, поскольку пустое условие всегда остается истинным. Бесконечный оператор: for ( ; ; ) код цикла;
эквивалентен оператору while (1) код цикла;
В заголовке оператора for может использоваться операция «запятая». Она позволяет включать в его выражения несколько операторов. Тогда рассмотренный пример суммирования первых N натуральных чисел можно записать в следующем виде:
for ( sum = 0 , i = 1; i<=N; sum+= i , i++) ;
Оператор for имеет следующие возможности:
– можно вести подсчет с помощью символов, а не только чисел:
for (ch = 'a'; ch <= 'z'; ch++) ... ;
– можно проверить выполнение некоторого произвольного условия:
for (n = 0; s[i] >= '0' && s[i] < '9'; i++) ... ;
или
for (n = 1; n*n*n <= 216; n++) ... ;
Первое выражение необязательно должно инициализировать переменную. Необходимо только помнить, что первое выражение вычисляется только один раз, перед тем как остальные части начнут выполняться.
for (printf(" вводить числа по порядку! \n"); num!=6;)
scanf("%d", & num);
printf(" последнее число – это то, что нужно. \n");
В этом фрагменте первое сообщение выводится на печать один раз, а затем осуществляется прием вводимых чисел, пока не поступит число 6.
Переменные, входящие в выражения 2 и 3, можно изменять при выполнении кода цикла, например, значения k и delta:
for (n = 1; n < 10*k; n += delta) ... ;
Использование условных выражений позволяет во многих случаях значительно упростить программу, например:
for (i = 0; i<n; i++)
printf("%6d%c", a[i],( (i%10==0) || (i==n–1) ) ? '\n' : ′ ′);
В этом цикле печатаются n элементов массива а по 10 в строке, разделяя каждый столбец одним пробелом и заканчивая каждую строку (включая последнюю) одним символом перевода строки. Символ перевода строки записывается после каждого десятого и n-го элементов. За всеми остальными – пробел.
Наиболее часто встречающиеся ошибки при создании циклов – это использование в коде цикла неинициализированных переменных и неверная запись условия выхода из цикла.
Чтобы избежать ошибок, нужно стараться:
– проверить, всем ли переменным, встречающимся в правой части операторов присваивания в коде цикла, присвоены до этого начальные значения (а также возможно ли выполнение других операторов);
– проверить, изменяется ли в цикле хотя бы одна переменная, входящая в условие выхода из цикла;
– предусмотреть аварийный выход из цикла по достижении некоторого количества итераций;
– если в состав цикла входит не один, а несколько операторов, нужно заключать их в фигурные скобки.