Шрифт:
РИС. 8.3. Структура цикла for.
Cейчас мы продемонстрируем, как цикл for используется в программе, печатающей таблицу кубов целых чисел:
/* таблица кубов*/
main
{
int num;
for(num=1;num<=6;num++)
printf(" %5d %5d \n", num, num*num*num);
}
программа выводит на печать числа от 1 до 6 и их кубы:
1
8
27
64
125
216
Из первой строки цикла for мы сразу можем узнать всю информацию о параметрах цикла: начальное значание переменной num, конечное значение, а также насколько увеличивается значение переменной num при каждом выполнении тела цикла. Цикл for часто используется для реализации в программе временной задержки с целью согласования скорости реагирования (в даном случае замедления) машины с возможностями восприятия человека.
for(n=1; n<= 10000; n++);
Этот цикл заставляет машину считать до 10000. Единственный символ "точка с запятой", расположенный во второй строке, интересует нас о том, что никаких других действий в этом цикле не производится. Такой уединенный символ "точка с запятой" можно представлять себе как "пустой" оператор, т. е. оператор, который не выполняет никаких действий.
Гибкость конструкции for
Хотя цикл for на первый взгляд очень похож на цикл DO в Фортране, цикл FOR в Паскале и цикл FOR ... NEXT в Бейсике, for в Си является гораздо более гибким средством, чем любой из упомянутых. Эта гибкость - следствие способа использования упомянутых выше трех выражений в спецификации цикла for. До сих пор первое выражение применялось для инициализации счетчика, второе - для задания его граничного значения, а третье - для увеличения его текущего значения на 1. Использованный таким образом оператор for в языке Си совершенно аналогичен упомянутым выше соответствующим операторам в других языках. Но, кроме описанной, существует еще и много других возможностей его применения, девять из которых мы приводим ниже.
1. Можно применять операцию уменьшения для счета в порядке убывания вместо счета в порядке возрастания:
for(n = 10; n > 0; n--)
printf(" %d секунд!\n", n);
printf(" Пуск!\n");
2. При желании вы можете вести счет двойками, десятками и т. д.
for (n = 2; n & 60; n = n + 13)
printf(" %d\n", n);
В этом операторе значение переменной n будет увеличиваться на 13 при каждом выполнении тела цикла; будут напечатаны числа 2, 15, 28, 41 и 54.
Заметим, между прочим, что в языке Си имеется и другая сокращенная форма записи для увеличения переменной на фиксированную величину. Вместо выражения n = n + 13 можно воспользоваться записью n + = 13.
Знак += определяет "аддитивную операцию присваивания", в результате выполнения которой величина, стоящая справа, прибавляется к значению переменной, расположенной слева. Дополнительные детали, относящиеся к этой операции, приведены ниже.
3. Можно вести подсчет с помощью символов, а не только чисел.
for(ch = 'а' ; ch <= 'z'; ch++)
printf(" Величина кода ASCII для %с равна %d.\n" , ch, ch);
При выполнении этого оператора будут выведены на печать все буквы от а до z вместе с их кодами ASCII. Этот оператор "работает", поскольку символы в памяти машины размещаются в виде чисел и поэтому в данном фрагменте счет ведется на самом деле с использованием целых чисел.
4.Можно проверить выполнение некоторого произвольного условия, отличного от условия, налагаемого на число итераций. В нашей программе таблица кубов вы могли бы заменить спецификацию
for(num = 1; num <= 6; num ++)
на
for(num = 1; num *num *num <= 216; num++)
Это было бы целесообразно в случае, если бы нас больше занимало ограничение максимального значения диапазона кубов чисел, а не количества итераций.
5. Можно сделать так, чтобы значение некоторой величины возрастало в геометрической, а не в арифметической прогрессии, т. е. вместо прибавления фиксированного значения на каждом шаге цикла, выполнялось бы умножение:
for(debt = 100.0; debt < 150.0; debt = debt*l.l)
printf(" Baшдолгтеперь$%.2f.\n", debt);
В этом фрагменте программы значение переменной debt умножается на 1.1 на каждом шаге цикла, что увеличивает ее на 10%. Результат выглядит следующим образом:
Ваш долг теперь $100.00
Ваш долг теперь $110.00
Ваш долг теперь $121.00
Ваш долг теперь $133.10