|
Учебное введение
1.3. Оператор FOR
Как и можно было ожидать, имеется множество различных способов написания каждой программы. Давайте рассмотрим такой вариант программы перевода температур:
int main() /* fahrenheit-celsius table */ { int fahr; for (fahr = 0; fahr <= 300; fahr = fahr + 20) printf("%4d %6.1f\n", fahr, (5.0/9.0)*(fahr-32.0)); return 0; }
Эта программа выдает те же самые результаты, но выглядит безусловно по-другому. Главное изменение - исключение большинства переменных ; осталась только переменная fahr, причем типа int (это сделано для того, чтобы продемонстрировать преобразование %d в функции printf ). Нижняя и верхняя границы и размер шага появляются только как константы в операторе for, который сам является новой конструкцией, а выражение, вычисляющее температуру по цельсию, входит теперь в виде третьего аргумента функции printf, а не в виде отдельного оператора присваивания.
Последнее изменение является примером вполне общего правила языка "C" - в любом контексте, в котором допускается использование значения переменной некоторого типа, вы можете использовать выражение этого типа. Так как третий аргумент функции printf должен иметь значение с плавающей точкой, чтобы соответствовать спецификации %6.1f, то в этом месте может встретиться любое выражение плавающего типа.
Сам оператор for - это оператор цикла, обобщающий оператор while. Его функционирование должно стать ясным, если вы сравните его с ранее описанным оператором while. оператор for содержит три части, разделяемые точкой с запятой. Первая часть
fahr = 0
выполняется один раз перед входом в сам цикл. Вторая часть - проверка, или условие, которое управляет циклом:
fahr <= 300
это условие проверяется и, если оно истинно, то выполняется тело цикла (в данном случае только функция printf ). Затем выполняется шаг реинициализации
fahr =fahr + 20
и условие проверяется снова. Цикл завершается, когда это условие становится ложным. Так же, как и в случае оператора while, тело цикла может состоять из одного оператора или из группы операторов, заключенных в фигурные скобки. Инициализирующая и реинициализирующая части могут быть любыми отдельными выражениями.
Выбор между операторами while и for произволен и основывается на том, что выглядит яснее. Оператор for обычно удобен для циклов, в которых инициализация и реинициализация логически связаны и каждая задается одним оператором, так как в этом случае запись более компактна, чем при использовании оператора while, а операторы управления циклом сосредотачиваются вместе в одном месте.
Упражнение 1-5
Модифицируйте программу перевода температур таким образом, чтобы она печатала таблицу в обратном порядке, т.е. От 300 градусов до 0.
1.4. Символические константы
Последнее замечание, прежде чем мы навсегда оставим программу перевода температур. Прятать "магические числа", такие как 300 и 20, внутрь программы - это неудачная практика; они дают мало информации тем, кто, возможно, должен будет разбираться в этой программе позднее, и их трудно изменять систематическим образом. К счастью в языке "C" предусмотрен способ, позволяющий избежать таких "магических чисел". Используя конструкцию #define, вы можете в начале программы определить символическое имя или символическую константу, которая будет конкретной строкой символов. Впоследствии компилятор заменит все не заключенные в кавычки появления этого имени на соответствующую строку. Фактически это имя может быть заменено абсолютно произвольным текстом, не обязательно цифрами
#define LOWER 0/* lower limit of table */ #define UPPER 300 /* upper limit */ #define STEP 20 /* step size */ int main () /* fahrenheit-celsius table */ { int fahr; for (fahr =LOWER; fahr <= UPPER; fahr =fahr + STEP) printf("%4d %6.1f\n", fahr, (5.0/9.0)*(fahr-32)); return 0; }
величины LOWER, UPPER и STEP являются константами и поэтому они не указываются в описаниях. Символические имена обычно пишут прописными буквами, чтобы их было легко отличить от написанных строчными буквами имен переменных. Отметим, что в конце определения не ставится точка с запятой. Так как подставляется вся строка, следующая за определеным именем, то это привело бы к слишком большому числу точек с запятой в операторе for.