Int main(void)
{
const double SCALE = 0.333; // еще один вид символической константы
double shoe, foot;
printf("Размер обуви (мужской) длина ступни\n");
shoe = 3.0;
while (shoe < 18.5) /* начало цикла while*/
{ /* start of block */
foot = SCALE * shoe + ADJUST;
printf("%10.1f %15.2f дюймов\n", shoe, foot);
shoe = shoe + 1.0;
} /* конец блока */
printf("Если обувь подходит, носите ее.\n");
return 0;
}
Вот как выглядит сжатая версия вывода программы shoes2 .с:
обуви (мужской) |
длина ступни |
3.0 |
8.31 дюймов |
4 . 0 |
8.64 дюймов |
5.0 |
8.97 дюймов |
6.0 |
9.31 дюймов |
16.0 |
12.64 дюймов |
17.0 |
12.97 дюймов |
18.0 |
13.30 дюймов |
Если обувь подходит, носите ее.
Давайте посмотрим, как работает цикл while. Когда управление впервые доходит до оператора while, выполняется проверка того, принимает ли условие в круглых скобках значение true. В этом случае выражение условия имеет следующий вид:
shoe < 18.5
Символ < означает “меньше чем”. Переменная shoe инициализирована значением 3.0, что определенно меньше чем 18.5. Поэтому условие равно true и управление переходит на следующий оператор, который преобразует размер в дюймы. Затем программа выводит результат. Следующий оператор увеличивает значение shoe на 1.0, делая его равным 4.0:
shoe = shoe + 1.0;
В этой точке управление возвращается к порции while, чтобы проверить условие. Но почему именно в этой точке? Причина в том, что в следующей строке находится закрывающая фигурная скобка (}), а код использует пару таких скобок ({}) для обозначения границ цикла while. Операторы, находящиеся между двумя фигурными скобками, повторяются. Раздел программы внутри фигурных скобок и сами фигурные скобки называются блоком. А теперь вернемся к программе. Значение 4.0 меньше 18.5, поэтому все операторы, заключенные в фигурные скобки (блок), следующие за while, повторяются. (На компьютерном жаргоне можно сказать, что программа “проходит в цикле” по этим операторам.) Это продолжается до тех пор, пока переменная shoe не достигнет значения 19.0. Тогда условие shoe <18.5 получает значение false, потому что 19.0 не меньше 18.5. Как только это произойдет, управление передается первому оператору, следующему за циклом while. В данном случае им является финальный оператор printf ().
Рассмотренную программу можно легко модифицировать для выполнения других преобразований. Например, установив SCALE в 1.8 и ADJUST в 32.0, вы получите программу, которая преобразует значение температуры по Цельсию в значение по Фаренгейту. Присвоив SCALE значение 0.6214 и ADJUST — 0, вы реализуете преобразование километров в мили. Естественно, понадобится также соответствующим образом изменить выводимые сообщения. Цикл while предоставляет в ваше распоряжение удобное и гибкое средство управления внутри программы. Теперь давайте перейдем к ознакомлению с фундаментальными операциями, которые вы можете применять в своих программах.
Фундаментальные операции
Для представления арифметических действий в языке С используются операции. Например, операция + вызывает сложение двух значений, находящиеся по обе стороны символа операции. Если термин операция кажется вам странным, подумайте о том, что вещи такого рода должны как-то называться. “Операция” представляется более удачным вариантом, чем, скажем, “эта вещь” или “арифметический транзактор”. Теперь рассмотрим операции, применяемые для базовой арифметики: =, * и /.
Операция присваивания =
В языке С знак = не означает “равно”. Вместо этого им обозначается операция присваивания значения. Например, следующий оператор присваивает значение 2002 переменной по имени bmw:
bmw = 2002;
То есть элемент, расположенный слева от знака =, представляет собой имя переменной, а элемент справа — значение, присваиваемое этой переменной. Символ = называется операцией присваивания. Еще раз: ни в коем случае не думайте, что эта строка гласит: “переменная bmw равна 2 002”. Взамен читайте ее так: “присвоить переменной bmw значение 2 002". Для этой операции действие происходит справа налево.
Возможно, такое различие между именем переменной и ее значением выглядит запутанным, но взгляните на следующий типичный пример оператора:
i = i + 1;
С точки зрения математики этот оператор не имеет смысла. После прибавления 1 к конечному числу результат не может быть “равен” исходному числу, однако как компьютерный оператор присваивания он совершенно корректен. Его смысл таков: “извлечь значение переменной по имени i, добавить 1 к этому значению и затем присвоить новое значение переменной i” (рис. 5.1).
Оператор наподобие
2002 = bmw;
в С не имеет смысла (и, разумеется, не является допустимым), т.к. 2002 — это то, что в языке С называется значением, которое в данном случае представляет собой просто литеральную константу. Присвоить значение константе невозможно; она уже является эквивалентом значения. Следовательно, не забывайте, что элемент слева от знака = должен быть именем переменной.
Базовая операция присваивания в языке С несколько отличается от других операций. Рассмотрим короткую программу, показанную в листинге 5.3.
Листинг 5.3. Программа golf.с
/* golf.c -- таблица результатов турнира по гольфу*/
#include <stdio.h>
