Мегаобучалка Главная | О нас | Обратная связь


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



2019-12-29 215 Обсуждений (0)
Переменные и арифметика 0.00 из 5.00 0 оценок




 

Пример 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\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.

 



2019-12-29 215 Обсуждений (0)
Переменные и арифметика 0.00 из 5.00 0 оценок









Обсуждение в статье: Переменные и арифметика

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние...
Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы...
Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (215)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.006 сек.)