Переменные и арифметика
Пример 2-2. Следующая программа печатает приведенную ниже таблицу температур по Фаренгейту и их эквивалентов по стоградусной шкале Цельсия, используя для перевода формулу .
Теперь сама программа: // Напечатать таблицу Фаренгейт-Цельсий 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\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\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, но она считывает входные данные, а не печатает выходные. Упражнение 2-3. Преобразуйте программу перевода температур таким образом, чтобы она печатала заголовок к таблице. Упражнение 2-4. Напишите программы печати соответствующей таблицы перехода от градусов Цельсия к градусам Фаренгейта.
Оператор for
Пример 2-3. Как и можно было ожидать, имеется множество различных способов написания каждой программы. Давайте рассмотрим такой вариант программы перевода температур:
main() // Напечатать таблицу Фаренгейт-Цельсий { 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 , а операторы управления циклом сосредотачиваются вместе в одном месте. Упражнение 2-5. Модифицируйте программу перевода температур таким образом, чтобы она печатала таблицу в обратном порядке, т.е. От 300 градусов до 0.
Популярное: Почему двоичная система счисления так распространена?: Каждая цифра должна быть как-то представлена на физическом носителе... Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (241)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |