/ Выдающееся исполнение!/
/ Выдаю/ /Выдаю /
Обратите внимание на то, как поле расширяется для того, чтобы поместились все указанные символы. Заметим также, как спецификация точности ограничивает число символов, выводимых на ПЕЧАТЬ. Символы .5в спецификации формата указывают функции printf( )на необходимость напечатать только пять символов.
Теперь вы ознакомились с некоторым количеством примеров. А знаете ли вы, как подготовить оператор печати, чтобы напечатав нечто вроде следующей фразы:
Семья NAME, возможно, лишь на XXX.XX долларов богаче!
Здесь NAMEи ХХХ.ХХпредставляют значения соответствующих переменных в программе, скажем name[40]и cash. Вот одно из решений:
printf(" Семья %s, возможно, лишь на %.2f долларов
богаче! \n", name, cash);
До сих пор мы без тени сомнения применяли спецификации преобразования для переменных разных типов, например, %fдля типа floatи т. д. Но, как мы уже видели в нашей программе поиска кода ASCII, для некоторого символа функцию printf()можно использовать также для преобразования данных из одного типа в другой. Мы не намерены, однако, терять чувство реальности и по прежнему будем работать с целыми типами.
Использование функции printf( ) для преобразования данных
Здесь мы снова займемся выводом на печать целых чисел. Поскольку мы уже осведомлены о полях, то не будем заботиться об использовании символа /, чтобы отмечать их начало и конец.
main( )
{
printf(" %d\n", 336);
printf(" %o\n", 336);
printf(" %x\n", 336);
printf(" %d\n", -336);
printf(" %u\n", -336);
}
В нашей системе результат будет выглядеть следующим образом
336
520
150
-336
-65200
Как вы, по-видимому, и ожидали, при использовании спецификации %dбудет получено число 336точно так же, как в примере, обсуждавшемся чуть выше. Но давайте посмотрим, что произойдет, когда вы "попросите" программу напечатать это десятичное целое число в восьмеричном коде. Она напечатает число 520, являющееся восьмеричным эквивалентом 336 (5х64+2х8+0х 1= 336). Аналогично при печати этого числа в шестнадцатеричном коде мы получим 150.
Таким образом, мы можем использовать спецификации, применяемые для функции printf( )с целью преобразования десятичных чисел в восьмеричные или шестнадцатеричные и наоборот. Или же если вы захотите напечатать данные в желаемом для вас виде, то необходимо указать спецификацию %dдля получения десятичных чисел, %о- для восьмеричных, а %х- для шестнадцатеричных. При этом не имеет ни малейшего значения, в какой форме число первоначально появилось в программе.
Сделаем еще несколько замечаний относительно вывода на печать. Печать числа -336при использовании спецификации %dне вызывает никакого затруднения. При применении же спецификации %u(unsigned - беззнаковая) получаем число 65200, а не 336, как можно было бы ожидать. Причина получения такого результата лежит в способе представления отрицательных чисел в нашей системе. Здесь используется так называемый "дополнительный код". Числа от 0до 32767отображаются обычным образом, а от 32768до 65535представляют отрицательные числа, причем 65535кодирует число -1, 65534- число -2и т. д. Поэтому числу -336соответствует 65536, -336= 65200. Этот метод применяется не во всех системах. Тем не менее отсюда следует вывод: не ожидайте, что спецификация преобразования %uприводит просто к отбрасыванию знака числа.
Сейчас мы переходим к обсуждению интересного примера, которого мы уже касались ранее, а именно к использованию функции printf()для нахождения кода ASCIIнекоторого символа. Например оператор
printf(" %c%d\n" , ' А', ' А');
выдаст следующий результат:
A 65
А- это буква, а 65- десятичный код ASCII символа А. Мы могли бы использовать спецификацию %о, если бы хотели получить восьмеричный код ASCII символа А.
Все вышесказанное дает хороший способ нахождения кодов ASCII для различных символов и наоборот. Вполне возможно, конечно, что вы предпочтете ему поиск кодов в приложении Ж. Что произойдет, если вы попробуете преобразовать число, больше 255, в символ? Следующая строка и результат ее выполнения дадут ответ на этот вопрос:
Читать дальше