Преобразование типов данных

В Си существует два дополнительных указателя формата, с помощью которых можно переводить данные типа int из десятичной в восьмеричную и шестнадцатеричную системы счисления:

%o перевод в восьмеричную систему, используйте только маленькую букву о, не цифру 0
%x перевод в шестнадцатеричную систему

Для того чтобы перевести число из десятичной в другую систему счисления, надо поместить код %o или код %x в строку формата, при этом в список данных вносится число, записанное в десятичной системе. В качестве примера приведена программа, отображающая число17 в шестнадцатеричной и восьмеричной системах счисления:

main() {printf("%d равно %x в шестнадцатеричной и %o в \ восьмеричной системах счисления\n", 17, 17, 17); // так в Си и Си++ можно переносить // длинные строки символов, // заключенные в двойные кавычки (ред.) }

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

17 равно 11 в шестнадцатеричной и 21 в восьмеричной системах счисления

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

Двойственность символьных переменных

При описании функции putchar() уже говорилось, что символьные переменные могут быть заданы и как целочисленные. Следовательно, можно присвоить букву в качестве значения переменной типа int и вывести ее на дисплей при помощи функции putchar() или printf():

main() { int a; a = 'A'; putchar(a); putchar('\n'); printf("%c", a); }

При выполнении этой программы символ А появится дважды: один раз как символ, отображенный функцией putchar(), второй раз как символ, отображенный функцией printf() с использованием указателя формата %c. Независимо от того, определен тип переменной как char или int, можно преобразовать символ в его ASCII-код:

main() { char a; a = 'A'; printf("ASCII-код символа %c равен %d", a, a); }

В этом примере одно и то же значение переменной выводится на дисплей с использованием указателей формата %c и %d. В результате получаем следующее сообщение:

ASCII-код символа А равен 65

где присутствует символ А, отображенный с использованием указателя формата %c, и число 65, являющееся ASCII-кодом символа А, выведенное с помощью указателя формата %d.

Программа будет работать точно так же, и в результате мы получим ту же фразу, если переменная а будет определена как int.

Форматированный вывод

Функцию printf() можно использовать для управления форматом данных. Определять величину пробелов и количество выводимых символов можно с помощью указателей ширины поля*.

Без указателя ширины поля числа с плавающей точкой, например, будут выводиться с шестью знаками после точки. Поэтому в результате выполнения инструкции

printf("Стоимость составляет %f за %d штук", amount, count);

и появляется строка:

Стоимость составляет 45.580000 за 5 штук

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

Стоимость составляет 45.579998 за 5 штук


Рис.12. Определение количества знаков после точки

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

Чтобы определить число знаков после точки, используется указатель %.nf, где число n определяет количество знаков (рис.12). Например, если написать:

printf("Стоимость составляет %.2f", amount);

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

Стоимость составляет 45.58

Сходным образом, если написать:

printf("Стоимость составляет %.3f", amount);

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

Стоимость составляет 45.580

На рис.13 приведено несколько примеров определения количества знаков в десятичной части переменной.


Рис.13. Примеры определения количества знаков в десятичной части

 

Можно также определить общую ширину поля, то есть размер (в символах) пространства, занимаемого выводимым числом, если использовать следующий формат:

%N.nf

где N — это общая ширина поля.

Если задать инструкцию

printf("Стоимость составляет %8.2f", amount);

появится строка

Стоимость составляет 45.58

с тремя дополнительными пробелами перед числом. Чтобы понять, почему это произошло, взгляните на рис.14: указатель ширины поля сообщает компилятору, что числовое значение должно быть как бы втиснуто в «коробочку» размером восемь символов. Само по себе число занимает пять из них, включая точку, а неиспользованные символы отображаются на экран в виде пробелов, создавая перед числом пустое пространство.


Рис.14. Указатель ширины поля определяет количество пробелов на экране

Если ширина поля, заданного указателем, оказывается меньше количества символов, составляющих число, Си, тем не менее, выведет число целиком, просто игнорируя в данном случае указатель ширины поля. Выполнение инструкции

printf("Стоимость составляет %2.2f", amount);

приведет к появлению сообщения

Стоимость составляет 45.58

Можно также добавить лишнее пространство перед числом, но заполнить его нулями вместо пробелов, как на рис.15. Для этого перед числом, определяющим ширину поля, надо поставить символ 0:


Рис.15. Вывод нулей перед числом

printf("Стоимость составляет %08.2f", amount);

в результате мы увидим сообщение

Стоимость составляет 00045.58

Для того чтобы выровнять значение по левому краю (как бы поместить его слева в нашей воображаемой «коробочке»), в указатель ширины поля после % вводится знак «минус»

%-8.2f

Лишние пробелы в этом случае появятся после выведенного значения. Инструкция

printf("Стоимость составляет %-8.2f в долларах США", amount);

выводит на экран сообщение

Стоимость составляет 45.58 в долларах США

Как показано на рис.16, число 45.58 опять как бы помещается в «коробочку» из восьми символов, но теперь уже сдвигается к левому краю, а пустое пространство появляется за числом.

Указатель ширины поля может работать как с символьными, так и со строковыми данными. Дополнительные пробелы помещаются перед текстом, сдвигая строку к правому краю воображаемой «коробочки». Например, если строковая переменная, называемая message, имеет значение «Привет», то инструкция


Рис.16. Выравнивание по левому краю

printf("Я позвонил, чтобы сказать %8s", message);

отобразит на экране следующую строку

Я позвонил, чтобы сказать Привет

Как показано на рис.17, при выводе значения строковой переменной message


Рис.17. Использование указателя ширины поля при выводе строки

перед ним появятся два дополнительных пробела.