Смекни!
smekni.com

Методические указания к выполнению контрольных работ по дисциплине "Основы программирования" (стр. 10 из 40)

Последовательность \n в приведенной строке является обозначением на языке «C» для «символа новой строки», который служит указанием для перехода на терминале к левому краю следующей строки. Если вы не включите \n (полезный эксперимент), то обнаружите, что ваша выдача не закончится переходом терминала на новую строку. Использование последовательности \n – единственный способ введения символа новой строки в аргумент функции printf; если вы попробуете что-нибудь вроде

printf("Здравствуй, Мир !\n

");

то «C»-компилятор будет печатать злорадные диагностические сообщения о недостающих кавычках.

Функция printf не обеспечивает автоматического перехода на новую строку, так что многократное обращение к ней можно использовать для поэтапной сборки выходной строки. Наша первая программа, печатающая идентичную выдачу, с точно таким же успехом могла бы быть написана в виде

main()

{

printf("Здравствуй, ");

printf("Мир !");

printf("\n");

}

Подчеркнем, что \n представляет только один символ. Условные (или «эскайп») последовательности, подобные \n , дают общий и допускающий расширение механизм для представления трудных для печати или невидимых символов. Среди прочих символов в языке «C» предусмотрены следующие: \t – для табуляции, \b – для возврата на одну позицию (символ «забоя»), \" – для двойной кавычки, \ – для самой обратной косой черты.

Упражнение 2-2. Проведите эксперименты для того, чтобы узнать что произойдет, если в строке, являющейся аргументом функции printf, будет содержаться \x, где x – некоторый символ, не входящий в вышеприведенный список.

2.2. Переменные и арифметика

Пример 2-2. Следующая программа печатает приведенную ниже таблицу температур по Фаренгейту и их эквивалентов по стоградусной шкале Цельсия, используя для перевода формулу

.

Шкала по Фаренгейту

Стоградусная шкала Цельсия

0

-17,8

20

-6,7

40

4,4

60

15,6

260

126,7

280

137,8

300

140,9

Теперь сама программа:

// Напечатать таблицу Фаренгейт-Цельсий

main()

{

int lower, upper, step;

float fahr, celsius;

lower = 0; // Нижний предел таблицы

upper = 300; // Верхний предел таблицы

step = 20; // Размер шага

fahr = lower;

while (fahr <= upper)

{

celsius = (5.0/9.0) * (fahr -32.0);

printf("%4.0f %6.1f&bsol;n", fahr, celsius);

fahr = fahr + step;

}

}

Первая строка

// Напечатать таблицу Фаренгейт-Цельсий

является комментарием, который в данном случае кратко поясняет, что делает программа. Любые символы, начинающиеся с // в пределах строки программы, игнорируются компилятором; можно свободно пользоваться комментариями для облегчения понимания программы. Комментарии могут появляться в любом месте, где возможен пробел или переход на новую строку.

В языке «C» все переменные должны быть описаны до их использования, обычно это делается в начале функции до первого выполняемого оператора. Если вы забудете вставить описание, то получите диагностическое сообщение от компилятора. Описание состоит из типа и списка переменных, имеющих этот тип, как в:

int lower, upper, step;

float fahr, celsius;

Тип int означает, что все переменные списка целые; тип float предназначен для чисел с плавающей точкой, т.е. для чисел, которые могут иметь дробную часть. Точность как int, так и float зависит от конкретной машины, на которой вы работаете. На PDP-11, например, тип int соответствует 16-битовому числу со знаком, т.е. числу, лежащему между -32768 и +32767. Число типа float – это 32-битовое число, имеющее около семи значащих цифр и лежащее в диапазоне от 1.0е–38 до 1.0е+38. В главе 3 приводится список размеров для других машин.

В языке «C» предусмотрено несколько других основных типов данных, кроме int и float:

· char символ (один байт);

· short короткое целое;

· long длинное целое;

· double плавающее с двойной точностью.

Размеры этих объектов тоже машинно-независимы; детали приведены в главе 3. Имеются также массивы, структуры и объединения этих основных типов, указатели на них и функции, которые их возвращают; со всеми ними мы встретимся в свое время.

Фактически вычисления в программе перевода температур начинаются с операторов присваивания:

lower = 0;

upper = 300;

step = 20;

fahr = lower;

которые придают переменным их начальные значения. каждый отдельный оператор заканчивается точкой с запятой.

Каждая строка таблицы вычисляется одинаковым образом, так что мы используем цикл, повторяющийся один раз на строку. В этом назначение оператора while:

while (fahr <= upper)

{

... // Тело оператора while

}

проверяется условие в круглых скобках. Если оно истинно (fahr меньше или равно upper), то выполняется тело цикла – все операторы, заключенные в фигурные скобки { }. Затем вновь проверяется это условие и, если оно истинно, опять выполняется тело цикла. Если же условие не выполняется (fahr превосходит upper ), цикл заканчивается и происходит переход к выполнению оператора, следующего за оператором цикла. Так как в настоящей программе нет никаких последующих операторов, то выполнение программы завершается.

Тело оператора while может состоять из одного или более операторов, заключенных в фигурные скобки, как в программе перевода температур, или из одного оператора без скобок, как, например, в

while (i < j)

i = 2 * i;

В обоих случаях операторы, управляемые оператором while, сдвинуты на одну табуляцию, чтобы вы могли с первого взгляда видеть, какие операторы находятся внутри цикла. Такой сдвиг подчеркивает логическую структуру программы. Хотя в языке «C» допускается совершенно произвольное расположение операторов в строке, подходящий сдвиг и использование пробелов значительно облегчают чтение программ. Мы рекомендуем писать только один оператор на строке и (обычно) оставлять пробелы вокруг операторов. Расположение фигурных скобок менее существенно; мы выбрали один из нескольких популярных стилей. Выберите подходящий для вас стиль и затем используйте его последовательно.

Основная часть работы выполняется в теле цикла. Температура по Цельсию вычисляется и присваивается переменной celsius оператором

celsius = (5.0/9.0) * (fahr-32.0);

причина использования выражения 5,0 / 9,0 вместо выглядящего проще 5/9 заключается в том, что в языке «C», как и во многих других языках, при делении целых происходит усечение, состоящее в отбрасывании дробной части результата. Таким образом, результат операции 5/9 равен нулю, и, конечно, в этом случае все температуры оказались бы равными нулю. Десятичная точка в константе указывает, что она имеет тип с плавающей точкой, так что, как мы и хотели, 5.0 / 9.0 равно 0.5555... .

Мы также писали 32.0 вместо 32 , несмотря на то, что так как переменная fahr имеет тип float , целое 32 автоматически бы преобразовалось к типу float (т.е. в 32.0) перед вычитанием. С точки зрения стиля разумно писать плавающие константы с явной десятичной точкой даже тогда, когда они имеют целые значения; это подчеркивает их плавающую природу для просматривающего программу и обеспечивает то, что компилятор будет смотреть на вещи так же, как и Вы.

Подробные правила о том, в каком случае целые преобразуются к типу с плаваюшей точкой, приведены в главе 3. Сейчас же отметим, что присваивание:


fahr = lower

и проверка

while (fahr <= upper)

работают, как и ожидается: перед выполнением операций целые преобразуются в плавающую форму.

Этот же пример сообщает чуть больше о том, как работает printf. Функция printf фактически является универсальной функцией форматных преобразований, которая будет полностью описана в главе 9. Ее первым аргументом является строка символов, которая должна быть напечатана, причем каждый знак % указывает, куда должен подставляться каждый из остальных аргументов /второй, третий, .../ и в какой форме он должен печататься. Например, в операторе:

printf("%4.0f %6.1f&bsol;n", fahr, celsius);

спецификация преобразования %4.0f говорит, что число с плавающей точкой должно быть напечатано в поле шириной по крайней мере в четыре символа без цифр после десятичной точки; спецификация %6.1f описывает другое число, которое должно занимать по крайней мере шесть позиций с одной цифрой после десятичной точки, аналогично спецификациям F6.1 в ФОРТРАНЕ. Различные части спецификации могут быть опущены: спецификация %6f говорит, что число будет шириной по крайней мере в шесть символов; спецификация %2 требует двух позиций после десятичной точки, но ширина при этом не ограничивается; спецификация %f говорит только о том, что нужно напечатать число с плавающей точкой. Функция printf также распознает следующие спецификации: %d – для десятичного целого, %о – для восьмеричного числа, %х – для шестнадцатиричного, %с – для символа, %s – для символьной строки и %% - для самого символа %.

Каждая конструкция с символом % в первом аргументе функции printf сочетается с соответствующим вторым, третьим, и т.д. Аргументами; они должны согласовываться по числу и типу; в противном случае вы получите бессмысленные результаты.

Между прочим, функция printf не является частью языка «C»; в самом языке «C» не определены операции ввода-вывода. Нет ничего таинственного и в функции printf; это – просто полезная функция, являющаяся частью стандартной библиотеки подпрограмм, которая обычно доступна «C»-программам. Чтобы сосредоточиться на самом языке, мы не будем подробно останавливаться на операциях ввода-вывода до главы 9. В частности, мы до тех пор отложим форматный ввод. Если вам надо ввести числа – прочитайте описание функции scanf в главе 9, раздел 9.4. Функция scanf во многом сходна с printf, но она считывает входные данные, а не печатает выходные.