Опубликован: 05.07.2006 | Уровень: для всех | Доступ: платный
Лекция 2:

Учебное введение

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.

Ярослав Воробей
Ярослав Воробей
Россия
Дмитрий Левин
Дмитрий Левин
Россия