Дипломная работа: Язык С
Этот же пример сообщает чуть больше о том, как работает PRINTF. Функция PRINTF фактически является универсальной функцией форматных преобразований, которая будет полностью описана в главе 7. Ее первым аргументом является строка символов, которая должна быть напечатана, причем каждый знак % указывает, куда должен подставляться каждый из остальных аргументов /второй, третий, .../ и в какой форме он должен печататься. Например, в операторе
PRINTF(“%4.0F %6.1F\N”, FAHR, CELSIUS);
спецификация преобразования %4.0F говорит, что число с плавающей точкой должно быть напечатано в поле шириной по крайней мере в четыре символа без цифр после десятичной точки.
спецификация %6.1F описывает другое число, которое должно занимать по крайней мере шесть позиций с одной цифрой после десятичной точки, аналогично спецификациям F6.1 в фортране или F(6,1) в PL/1. Различные части спецификации могут быть опущены: спецификация %6F говорит, что число будет шириной по крайней мере в шесть символов; спецификация %2 требует двух позиций после десятичной точки, но ширина при этом не ограничивается; спецификация %F говорит только о том, что нужно напечатать число с плавающей точкой. Функция PRINTF также распознает следующие спецификации: %D - для десятичного целого, %о - для восьмеричного числа, %х - для шестнадцатиричного, %с - для символа, %S - для символьной строки и %% для самого символа %.
Каждая конструкция с символом % в первом аргументе функции PRINTF сочетается с соответствующим вторым, третьим, и т.д. Аргументами; они должны согласовываться по числу и типу; в противном случае вы получите бессмысленные результаты.
Между прочим, функция PRINTF не является частью языка “C”; в самом языке “C” не определены операции ввода-вывода.
Нет ничего таинственного и в функции PRINTF ; это - просто полезная функция, являющаяся частью стандартной библиотеки подпрограмм, которая обычно доступна “C”-программам. Чтобы сосредоточиться на самом языке, мы не будем подробно останавливаться на операциях ввода-вывода до главы 7. В частности, мы до тех пор отложим форматный ввод. Если вам надо ввести числа - прочитайте описание функции SCANF в главе 7, раздел 7.4. Функция SCANF во многом сходна с PRINTF , но она считывает входные данные, а не печатает выходные.
Упражнение 1-3.
Преобразуйте программу перевода температур таким образом, чтобы она печатала заголовок к таблице.
Упражнение 1-4.
Напишите программы печати соответствующей таблицы перехода от градусов цельсия к градусам фаренгейта.
1.3. Оператор FOR.
Как и можно было ожидать, имеется множество различных способов написания каждой программы. Давайте рассмотрим такой вариант программы перевода температур: 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));
}
Эта программа выдает те же самые результаты, но выглядит безусловно по-другому. Главное изменение - исключение большинства переменных; осталась только переменная 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 */ MAIN () /* FAHRENHEIT-CELSIUS TABLE */
{ INT FAHR;