/* for_13s.c */
#include int main(void)
{
int n; // счет с интервалом 13, начиная с 2
for (n=2;n<60;n=n+13) printf("%d \n", n); return 0;
}
Значение переменной n на каждой итерации увеличивается на 13, давая следующий вывод:
2
15
28
41
54
• Можно делать подсчет по символам, а не числам.
/* for_char.c */
#include int main(void)
{
char ch;
for (ch = 'a'; ch <= 'z'; ch++)
printf("Значение ASCII для %c равно %d.\n", ch, ch); return 0;
}
В программе предполагается, что для символов в системе используется кодировка ASCII. Ниже показан фрагмент выходных данных:
Значение ASCII для а равно 97.
Значение ASCII для b равно 98.
Управляющие операторы С: циклы 219
Значение ASCII для х равно 120.
Значение ASCII для у равно 121.
Значение ASCII для z равно 122.
Программа работает, т.к. символы хранятся в памяти в виде целых чисел, поэтому цикл в любом случае имеет дело с целыми числами.
• Можно выполнять проверку условия, отличного от количества итераций. В программе for cube.с строку
for (num = 1; num <= 6; num++)
можно заменить такой строкой:
for (num = 1; num*num*num <= 216; num++)
Такое условие проверки можно было бы применять, если вас больше заботит ограничение величины куба, а не количества итераций.
• Можно позволить некоторой величине расти не в арифметической, а в геометрической прогрессии; т.е. вместо добавления каждый раз фиксированного значения можно умножать на фиксированное значение.
/* for_geo. с * /
#include int main(void)
{
double debt;
for (debt = 100.0; debt < 150.0; debt = debt * 1.1)
printf("Теперь ваша задолженность составляет $%.2f.\n", debt); return 0;
}
В этом фрагменте кода значение переменной debt на каждом проходе цикла умножается на 1.1, что увеличивает его на 10%. Вывод программы имеет следующий вид:
Теперь ваша задолженность составляет $100.00.
Теперь ваша задолженность составляет $110.00.
Теперь ваша задолженность составляет $121.00.
Теперь ваша задолженность составляет $133.10.
Теперь ваша задолженность составляет $146.41.
• В качестве третьего выражения можно использовать любое допустимое выражение. Что бы вы здесь не поместили, это будет обновляться на каждой итерации.
/* for_wild.с */
#include int main(void)
{
int x; int у = 55;
for (x = 1; у <= 75; у = ( ++x * 5) + 50) printf("%10d %10d\n", x, y); return 0;
}
Этот цикл выводит значения переменной х и алгебраического выражения ++х *5+50. Ниже показан вывод программы:
1 55
2 60
3 65
4 70
5 75
220 Глава 6
Обратите внимание, что в проверке участвует переменная у, а не х. В каждом из трех выражений, управляющих циклом for, могут применяться разные переменные. (Следует отметить, что хотя этот пример является допустимым, он не соответствует хорошему стилю программирования. Программа могла бы слать более ясной, если не смешивать процесс обновления с алгебраическими вычислениями.)
• Можно даже оставить одно или несколько выражений пустыми (но не опускайте точки с запятой). Обеспечьте наличие в цикле оператора, который в конечном итоге приведет к завершению цикла.
/* for_none.c */
#include int main(void)
{
int ans, n; ans = 2;
for (n = 3; ans <=25; ) ans = ans * n;
printf("n = %d; ans = %d.\n", n, ans); return 0;
}
Вот вывод этой программы:
n = 3; ans = 54 .
Значение переменной n в цикле остается равным 3. Переменная ans начинается со значения 2, затем увеличивается до 6 и 18, а в конечном итоге получает значение 54. (Значение 18 меньше, чем 25, так что цикл for выполняет па одну итерацию больше, умножая 18 на 3 для получения 54.) Кстати, пустое управляющее выражение, находящееся посередине, считается истинным, поэтому приведенный ниже цикл выполняется бесконечно: for (;; )
printf("Требуется определенное действие.\n");
• Первое выражение не обязательно должно инициализировать переменную. Вместо этого им могла бы быть какая-то разновидность оператора printf(). Просто запомните, что первое выражение вычисляется или выполняется только один раз, до того как начнут выполняться другие части цикла.
/* for_show.c */
#include int main(void)
{
int num = 0;
for (printf("Продолжайте вводить числа!\n"); num != 6; ) scanf("%d", &num);
printf("Вот то число, которое было нужно!\n"); return 0;
}
Этот фрагмент кода один раз выводит первое сообщение, а затем продолжает принимать числа до тех пор, пока вы не введете 6:
Продолжайте вводить числа!
3
5 8
6
Вот то число, которое было нужно!
Управляющие операторы С: циклы 221 • Параметры выражений цикла могут изменяться с помощью действий внутри тела цикла. Например, предположим, что цикл определен следующим образом:
for (n = 1; n < 10000; n = n + delta)
Если после нескольких итераций программа решит, что значение delta слишком мало или слишком велико, то посредством оператора if (глава 7) внутри цикла величину delta можно изменить. В интерактивной программе значение delta может быть изменено пользователем в процессе выполнения цикла. С таким видом настройки связана и определенная опасность; к примеру, установка delta в 0 приведет к бесконечному циклу.
Читать дальше