Лабораторная работа 4. Форматное преобразование данных
Цель работы
Исследование библиотечных функций для форматного преобразования данных.
Задание
1.1. Преобразование целых чисел
Преобразовать целые числа типов char, short, long со знаком и без в символьный формат, используя функцию sprintf и форматы ”%d”, ”%u”, ”%x”. Научиться форматировать числа с заполнением слева пробелами и без подавления ведущих нулей. Описание форматов можно получить в документации на Borland C++ Builder или в приложении к заданию.
Пример .
int a;
scanf("%d", &a);
char fmt[16];
scanf("%s", &fmt);
printf(fmt, a);
Преобразовать целые числа типов short и long со знаком и без из символьного формата в числовой, используя функцию sscanf и форматы ”%d”, ”%u”, а также модификаторы ”h” и”l”.
Пример .
char buf[32];
char fmt[16];
scanf("%s", &buf);
scanf("%s", &fmt);
short a;
sscanf(buf, fmt, &a);
printf("%d", a);
1.2. Преобразование чисел с плавающей точкой
Преобразовать числа типов float и double из символьного формата в числовой и наоборот, используя функции sscanf и sprintf соответственно. Научиться работать с форматами ”%f”, ”%e”, ”%g”, задавать требуемое число разрядов числа и число разрядов после децимальной точки, заполнять буфер форматирования пробелами слева и ведущими нулями.
1.3. Преобразование символов и строк
Преобразовать символы и строки используя форматы ”%c” и ”%s”. Научиться выравнивать текст при выводе влево или вправо, усекать текст до нужного размера поля, дополнять пробелами.
1.4. Форматирование строки данных
Реализовать в программе форматирование строки данных разных типов. Попробовать различные варианты форматирования.
Пример .
typedef struct
{
short a;
float b;
char c[16];
} A;
A data[] =
{
{ 200, 25.178, "C++"},
{ -34, 1234.520, "FORTRAN"},
{ 0, 0.000, "Pascal"}
};
int main(int argc, char* argv[])
{
char buf[256];
for(int i = 0; i < sizeof(data)/sizeof(A); i++)
{
printf("[%5d] : %8.1f (Язык: %16s)",
data[i].a, data[i].b, data[i].c);
}
}
1.5. Числовые константы
Задать, преобразовать в символьный вид и вывести в поле целочисленные константы в десятичном, восьмеричном и шестнадцатеричном форматах.
Пример .
int a = 0x123;
printf(”%d”, a);
Задать, преобразовать в символьный вид и вывести в поле вещественные константы в обычном (с точкой) и экспоненциальном форматах.
Пример .
double x = .32;
printf("%g", x);
Результаты наблюдений занести в отчет.
1.6. Приложение
Спецификаторы формата имеют следующий вид:
% [флаги] [ширина] [.точность] [F|N|h|l|L] тип
Каждый спецификатор начинается со знака процента (%). После % идут компоненты формата в следующем порядке:
Компонент | Обязательный / необязательный | Назначение |
флаги | Необязательный | Выравнивание, знаки (+, -), децимальная точка, хвостовые нули, восьмеричный и шестнадцатиричный префиксы |
ширина | Необязательный | Минимальное число символов поля, дополняемое пробелами или нулями |
точность | Необязательный | Максимальное число символов поля, для целых – минимальное число выводимых цифр |
F|N|h|l|L | Необязательный | Переопределяет размер по умолчанию преобразуемого аргумента |
тип | Обязательный | Тип преобразования |
Флаги имеют следующие значения:
Флаг | Назначение |
- | Выравнивание результата по левой границе, если не задан, то результат выравнивается по правой границе поля |
+ | Обязательно выводятся знаки + и – для чисел |
Ширина поля имеет следующий формат:
Ширина | Назначение |
n | Печатается как минимум n знаков. Если преобразуемое число имеет меньше символов, то дополняется пробелами |
0n | Печатается как минимум n знаков. Если преобразуемое число имеет меньше символов, то дополняется нулями |
Точность имеет следующий смысл:
Точность | Назначение |
нет | Используется точность по умолчанию |
.0 | Децимальный знак не печатается |
.n | Печатается n децимальных знаков. Для формата s задает максимальное число символов |
Модификаторы размера аргумента:
Префикс | Типы | Назначение |
h | d i o u x X | short int |
l | d i o u x X | long int |
L | d i o u x X | __int64 |
l | e E f g G | double |
L | e E f g G | long double |
Типы преобразования:
Тип | Аргумент | Назначение |
d | целый | Знаковое десятичное целое |
i | целый | Знаковое десятичное целое |
o | целый | Беззнаковое восьмеричное целое |
u | целый | Беззнаковое десятичное целое |
x | целый | Беззнаковое шестнадцатеричное целое (с abcdef) |
X | целый | Беззнаковое шестнадцатеричное целое (с ABCDEF) |
f | вещественный | Знаковое число в формате с плавающей точкой |
e | вещественный | Знаковое число в экспоненциальном формате |
g | вещественный | Знаковое число в смешанном формате |
E | вещественный | Знаковое число в экспоненциальном формате (E) |
G | вещественный | Знаковое число в смешанном формате (E) |
c | символ | Один символ |
s | строка | Печатается строка символов до нулевого |
% | Печатается знак % |