Листинг 2. Программа, в которой используется оператор получения остатка от деления нацело.

/*change.c*/main(){int amount, twenties, tens, fives, ones, r20, r10;printf("Введите необходимую сумму: ");scanf("%d", &amount);twenties = amount / 20;r20 = amount % 20; /*r20 - остаток от деления на двадцать*/tens = r20 / 10;r10 = r20 % 10; /*r10 - остаток от деления на десять*/fives = r10 / 5;ones = r10 % 5;putchar('\n');printf("Для того чтобы дать %d \ долларов сдачи, используйте:", amount);printf("%d банкнот(ы) достоинством 20 долларов", twenties);printf("%d банкнот(ы) достоинством 10 долларов", tens);printf("%d банкнот(ы) достоинством 5 долларов", fives);printf("%d банкнот(ы) достоинством 1 доллар", ones);}

Если вы ввели, например, значение 57, то получите следующий результат:

Для того чтобы дать 57 долларов сдачи, используйте:2 банкнот(ы) достоинством 20 долларов1 банкнот(ы) достоинством 10 долларов1 банкнот(ы) достоинством 5 долларов2 банкнот(ы) достоинством 1 доллар

Рис. 2 иллюстрирует работу этой программы. Количество двадцатидолларовых банкнот рассчитывается с помощью инструкции twenties = amount/20. Так как и переменная amount, и переменная twenties относятся к типу int, результат деления окажется целым числом. Он показывает, сколько раз число 20 содержится в значении переменной amount. Для компьютера результат — это просто некая величина, которую следует занести в память. Для нас же значение переменной twenties представляет значимую информацию, так как сообщает, сколько надо взять банкнот достоинством 20 долларов, чтобы дать сдачу.

Листинг 2. Программа, в которой используется оператор получения остатка от деления нацело. - student2.ru
Рис. 2. Как работает программа, использующаяоператор остатка от деления нацело

Теперь, когда мы знаем, что нужны две банкноты по 20 долларов, встает вопрос: как определить нужное количество десятидолларовых купюр? Вспомните, как поступают в таких случаях в реальной жизни. После того как мы отняли от общей суммы два раза по 20 долларов, надо взять сумму остатка и посмотреть, сколько банкнот по 10 долларов могло бы в нее войти. Программа поступает аналогичным образом. Для того чтобы определить размер остатка, используется оператор %. В инструкции r20 = amount % 20 переменной r20 присваивается значение, полученное в остатке после деления переменной amount на 20. Для нас это число означает сумму, оставшуюся после того, как из общей суммы вычли столько раз по 20, сколько это было возможно. Два раза по 20 долларов составляет сумму 40 долларов, вычитаем ее из общей суммы и получаем 17 долларов. Значение 17 присваивается переменной tens.

Та же процедура, которая описана для переменной twenties, повторяется для переменных tens и fives. Значение переменной ones равно остатку после деления на 5.

Типы данных и операторы

Как правило, при выполнении математических расчетов по обе стороны от знака равенства используют данные одного типа. Например, если складывают два числа типа float, тип переменной, которой присваивают результат, тоже должен быть определен как float. Это показано в следующем примере:

main(){floatcost, shipping, total;cost = 56.09;shipping = 4.98;total = cost + shipping;printf("Общаястоимостьсоставляетсумму %.2f \долларов", total);}

Результат работы программы, представленный на экране монитора, выглядит так:

Общая стоимость составляет сумму 61.07 долларов

Можно использовать и данные разных типов в правой и левой частях выражения. Отображаемое на экране значение будет определяться в зависимости от типа переменной в левой части выражения. Для примера приведен слегка измененный вариант той же программы:

main(){int total;float cost, shipping;cost = 56.09;shipping = 4.98;total = cost + shipping;printf("Общая стоимость составляет сумму %d долларов", total);}

В операции сложения участвуют две переменные типа float (cost и shipping), но полученный результат присваивается целочисленной переменной total. Если сложить эти числа на калькуляторе, то в результате получим 61.07, но так как переменная total — целочисленная, то и результат будет преобразован в целое число. Использование указателя формата %d задает отображение на экране целого числа 61.

Листинг 2. Программа, в которой используется оператор получения остатка от деления нацело. - student2.ru
Рис.3. Математические операции выполняются до того, как данные преобразуются к заданному типу переменной

Обратите внимание, вначале выполняется математическое действие, а затем происходит присваивание значения (рис.3). Если бы заданные значения преобразовывались в целые числа до их сложения, то результат оказался бы равен 60 (56+4).

Можно складывать два целых числа, определив сумму как float:

main(){int cost, shipping;float total;cost = 56;shipping = 4;total = cost + shipping;printf("Общая стоимость составляет сумму %.2f \ долларов", total);}

В этом случае, в соответствии с типом переменной total и указателем формата %f, результат сложения будет представлен числом с плавающей точкой. Но вследствие того, что оба слагаемых являлись целыми числами, в десятичной части будут проставлены нули — 60.00.

Данные float и int можно объединять и в правой части уравнения, причем в случае сложения и вычитания полученные результаты будут отображаться в соответствии с заданным типом переменной в левой части. Посмотрите на следующую программу:

main(){intshipping;floattotal, cost;cost = 56.09;shipping = 4;total = cost + shipping;printf("Общая стоимость составляет сумму \%.2f долларов", total);}

Здесь выполняется сложение двух переменных типа int и float, с последующим отображением полученного результата в виде значения типа foat (60.09).

Аналогичные правила соблюдаются и при выполнении деления. Но имейте в виду: если вы хотите, чтобы переменная, содержащая результат деления и определенная как float, имела значимые цифры в десятичной части, необходимо, чтобы хотя бы у одного из участвующих в делении чисел (литералов) также имелась дробная часть. На рис.4 продемонстрировано, как одно и то же действие выполняется трижды. Каждый раз результат деления определен как тип float. Однако в первом случае ни одно из чисел не имеет знаков после точки, так что при отображении результата в десятичной части стоят нули.

Листинг 2. Программа, в которой используется оператор получения остатка от деления нацело. - student2.ru
Рис. 4. Деление литералов

Выражения

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

main() { intcount; count = 5; printf("Значениеравно %d", count+19); }

В результате выполнения программы появится сообщение:

Значение равно 24

В этом примере вторым аргументом функции printf() является выражение count+19. При вызове функции значение выражения оценивается (вычисляется) в первую очередь. Результат вычисления выводится на дисплей при помощи указателя формата %d.

При использовании выражений значение переменной не изменяется. В нашем примере, после того как было вычислено и выведено на экран значение выражения count+19, содержимое переменной count по-прежнему осталось равным 5. Помните, что выражение является правой частью уравнения, и рассчитанная таким образом величина не присваивается никакой переменной.

Выражения могут состоять из любой комбинации констант, переменных, константных выражений и операторов:

printf("%d", count+number);printf("%d", 16-4);printf(%f", amount*TAX_RATE);

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

main() { floatcost, shipping; printf("Введите стоимость единицы товара: "); scanf("%f", &cost); printf("Введите величину транспортных расходов: "); scanf("%f", &shipping); printf("Общаясуммасоставляет %f", cost+shipping); }

Выполнение инструкции

printf("Общая сумма составляет %f", cost+shipping);

приведет к результату, который мог быть получен и другим способом:

total = cost + shipping;/*total следует определить как тип float*/printf("Общая сумма составляет %f", total);

Обе инструкции выводят на экран монитора общую сумму затрат. В первом случае используется выражение, так что нет необходимости определять переменную, которой будет присвоено полученное значение, и нет необходимости писать уравнение. В процессе работы программы выполняется математическая операция сложения, и итог сразу же отображается на экране с помощью функции printf(). Результат, полученный таким образом, не заносится в память компьютера и, следовательно, если возникнет необходимость снова вывести на экран сумму затрат, придется опять воспользоваться выражением cost+shipping.

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

Если вы предполагаете, что результат какой-либо математической операции может понадобиться не один раз, присвойте его значение какой-либо переменной. Выражения имеет смысл использовать только в том случае, если результат может понадобиться только однажды.

Наши рекомендации