На этом шаге мы рассмотрим особенности работы этой конструкции цикла и использование функции printf().
Чтобы вычислить температуру по Цельсию для каждого значения шкалы по Фаренгейту, не требуется писать программный код для каждой точки шкалы. В подобных ситуациях выходят из положения так: делают вычисления для одной точки, используя некоторый параметр, а потом, изменяя этот параметр, заставляют участок расчета снова выполняться до тех пор, пока параметр не примет определенного значения, после которого повторение расчетов прекращают. Повторение расчетов называют циклом расчетов.
Для организации циклов существуют специальные конструкции цикла, которые охватывают участок расчета и прокручивают его необходимое количество раз. Одной из таких конструкций в языке C/C++ является конструкция while (до тех пор, пока). Тело этой конструкции ограничивается парой фигурных скобок: начинается с открывающей фигурной скобки, а заканчивается закрывающей фигурной скобкой. В это-то тело и помещается прокручиваемый участок. А сколько раз прокручивать - определяется условием окончания цикла, которое задается в заголовочной части управляющей конструкции. Вид конструкции while таков:
while (<Условие окончания цикла>)
{
<Тело цикла>
}
Работает конструкция так: в начале проверяется условие окончания цикла. Если оно истинно, то тело цикла выполняется. Если условие окончания цикла ложно, то выполнение управляющей конструкции прекращается и начинает выполняться программный код, расположенный непосредственно после закрываюшей скобки тела цикла.
Приведем пример истинности условия. Условие может быть записано в общем случае в виде некоторого выражения (переменные, соединенные между собой знаками операций). Например, a < b. Значение переменной a - это то, что лежит в ячейке с именем a, а значение переменной b - то, что лежит в ячейке b. Если значение переменной a действительно меньше значения b, то выражение считается истинным, в противном случае - ложным.
Внимательно посмотрев на конструкцию while, можно сделать вывод: для завершения цикла (для этого условие окончания цикла должно стать ложным) надо, чтобы само условие окончания изменялось в теле цикла по мере выполнения цикла и в нужный момент стало бы ложным. Теперь рассмотрим, как это происходит в нашей программе.
Сначала определяются начальные значения переменных lower, upper, step. Параметром, задающим цикл, у нас является переменная fahr: ее значение будет меняться от цикла к циклу на величину шага шкалы по Фаренгейту, начиная от минимального, когда fahr = lower (мы присваиваем ей значение переменной lower, которая ранее получила значение нуля - начала шкалы по Фаренгейту), и заканчивая максимальным, когда значение переменной lower достигнет значения переменной upper, которое мы в начале указали равным 300. Поэтому условие окончания цикла в конструкции цикла while будет таковым: "пока значение fahr не превзойдет значения переменной upper". На языке C/C++ это записывается в виде:
while (fahr <= upper)
В теле же самой конструкции цикла мы записываем на языке C/C++ формулу вычисления значения переменной cels (т. е. точки шкалы по Цельсию), Функцию printf () для вывода значений точек по Фаренгейту и Цельсию, переменную fahr для изменения параметров цикла (она добавляет значение шага шкалы по Фаренгейту, что подготавливает переход к вычислению переменной сels для нового значения переменной fahr). Это произойдет, когда программа дойдет до выполнения конца тела конструкции while (т. е. до закрывающей фигурной скобки) и перейдет к выполнению выражения, стоящего в заголовочной части while и проверке его на истинность/ложность.
Если истинность выражения-условия не нарушилась, то снова начнет выполняться тело управляющей конструкции while. Когда же переменная fahr примет значение, большее значения upper, цикл завершится: начнет выполняться код, следующий за телом цикла while. А это и будет функция _getch (), которая потребует ввода символа с клавиатуры, тем самым задерживая закрытие окна, в котором благодаря функции printf () появились результаты работы программы. Как только мы нажмем на любую клавишу, функция _getch() получит то, что ждала, в результате чего она завершится. Затем начнет выполняться закрывающая скобка тела главной функции main (). После ее обработки наше приложение закончит свою работу.
Поясним операции, примененные при формировании переменной cels. Это арифметические операции деления (/), умножения (*), вычитания (-).
Операция деления имеет одну особенность: если ее операнды типа int, то и результат - всегда целое число, т. к. в этом случае остаток от деления отбрасывается. И если бы мы в формуле для вычисления переменной cels записали 5/9, то получили бы 0, а не 0,55. Чтобы этого не случилось, нам пришлось "обмануть" операцию деления: мы записали 5.0/9.0 - так, будто операнды в формате плавающей точки (для таких операндов остаток от деления не отбрасывается).
Функция printf () в общем случае имеет такой формат:
printf(Control, arg1,arg2, ..., argN);
Строка Control содержит в себе данные двух видов:
Обозначение формата всегда начинается с символа %, а заканчивается символом типа форматирования:
Между символом % и символом типа форматирования задается ширина поля вывода, количество знаков после точки (для типа f) и т. д. Полное олределение форматов можно посмотреть в разделе Help (Справка) среды разработки. Так как переменные cels и fahr относятся к типу float, то и в функции printf () указан соответствующий формат - f.
Значение переменной fahr выводится целым числом в поле шириной 4 байта, а значение переменной cels, имеющее в результате расчетов дробное значение, выводится в поле шириной 6 байтов с одним знаком после точки (формат %6.1f).
На следующем шаге мы рассмотрим управляющую конструкцию for.