
- •Функции.
- •Вызов функции с переменным числом параметров
- •Функция main и её параметры.
- •Директивы препроцессора (прекомпилера).
- •Объявление указателей.
- •Модификатор const.
- •Операции.
- •Указатели на различные типы.
- •Указатель на void.
- •Применение указателей для передачи данных между функциями.
- •Массивы.
- •Индексация массивов.
- •Хранение массива в памяти. Адреса элементов. Хранение массива в памяти.
- •Массивы и константные указатели.
- •Статическое и динамическое выделение памяти.
- •Функции calloc, malloc, free
- •Функция realloc
- •Передача массивов в качестве аргументов функции.
- •Указатели на функции.
- •Библиотеки функций.
- •Функции форматированного ввода-вывода.
- •Функция printf().
- •%[Флаги] [Ширина] [.Точность] [{h | l | I | i32 | i64}]тип
- •Для чего нужен форматированный вывод.
- •Функция scanf().
- •Функции sprintf() и sscanf().
- •Функции fprintf() и fscanf().
- •Функции неформатированного ввода-вывода.
- •Работа со строковыми данными (стрингами). Представление строковых данных в языке c.
- •Функции работы со строками.
- •Потоковый ввод-вывод
- •Функции форматированного ввода-вывода.
- •Функция printf().
- •%[Флаги] [Ширина] [.Точность] [{h | l | I | i32 | i64}]тип
- •Для чего нужен форматированный вывод.
- •Функция scanf().
- •Функции sprintf() и sscanf().
- •Функции fprintf() и fscanf().
- •Функции неформатированного ввода-вывода.
- •Функции работы с файлами.
- •Потоковый ввод-вывод
- •Работа с потоками
- •Курсор.
- •Ввод-вывод отдельных символов и строк.
- •Форматированный ввод-вывод информации в файл.
- •Блочный потоковый ввод-вывод
- •Смена текущей позиции в файле. Проверка конца файла.
- •Функции доступа к файлам нижнего уровня.
- •Методы сортировки данных.
- •Введение
- •Сравнение методов сортировки
- •Программная реализация алгоритмов сортировки
- •Метод пузырька.
- •Метод обмена.
- •Метод вставки.
- •Метод Шелла.
- •Метод кучи (бинарной кучи).
- •Очередь
- •Линейный список
- •Физическое (машинное) представление линейных списков
- •Программные реализации структур данных. Стек. Реализация в виде массива.
- •Стек. Связанное представление.
- •Очереди. Реализация в виде массива.
- •Дерево. Связанное представление.
- •Рекурсивный вызов функций.
- •Структуры. Объединения. Перечисления.
- •Перечисление (enum).
- •Производные типы данных.
- •Структура (struct).
- •Побитовое описание полей структуры.
- •Объявление переменных, реализующих структуру.
- •Доступ к элементам структуры.
- •Объединение (union).
- •Вложенное описание структур и объединений.
- •Описание структур и объединений в виде пользовательского типа.
- •Передача структур и объединений в виде параметров функции.
- •Инициализация структур и объединений.
- •Выгода от использования структур
%[Флаги] [Ширина] [.Точность] [{h | l | I | i32 | i64}]тип
где
Тип:
Тип |
Описание |
d |
Десятичное целое число |
с |
Символ с заданным кодом |
s |
Строка символов (соответствующий параметр указывает на начало строки) |
e |
Число с плавающей точкой, экспоненциальная запись |
f |
Число с плавающей точкой, десятичная запись |
g |
Аналогично форматам %f или %e. Используется наиболее компактный формат для данного выражения. |
u |
Десятичное целое число без знака |
o |
Восьмеричное целое число без знака |
x |
Шестнадцатеричное целое число без знака (строчные буквы) |
X |
Шестнадцатеричное целое число без знака (заглавные буквы) |
Флаги – модификаторы форматов:
Флаг |
Форматирование с флагом |
Форматирование без флага |
– |
Выравнивание по левой границе поля заданной ширины. |
Выравнивание по правой границе. |
+ |
Добавляет префикс '+' для положительных чисел (для знаковых форматов) |
Печатается только знак '-' для отрицательных чисел. |
0 |
Добавление нулей пока до достижения минимальной заданной длины. Флаг 0 игнорируется в случае целых форматов (i, u, x, X, o, d) или наличия флага -. |
Нет добавления нулей |
" " (пробел) |
Добавляет в начале знак " " (пробел) если печатается положительное значение знакового типа. Флаг " " игнорируется в случае наличия флага + |
Нет добавления пробела |
# |
Добавляет префикс ситемы исчисления для форматов o, x, X или форсирует печать десятичной точки у форматов с плавающей точкой. Для целых форматов это флаг игнорируется. |
Нет изменений |
Ширина – минимальная ширина поля. Если длина печатаемого числа или строки меньше этого значения, то к нему слева или справа (в зависимости от флага и типа) будут добавлены пробелы или нули для увеличения длины до заданного значения. Если же длина печатаемого числа или строки больше заданного значения, то число или строка печатается как есть (не обрезаются из-за несоответствия этому параметру).
Точность – точность печатаемого значения:
Тип |
Влияние параметра "точность" |
c, C |
Ни на что не влияет |
d, i, u, o, x, X |
Если длина печатаемого числа меньше, чем "точность", то слева к нему добавляются нули до длины, заданной параметром "точность". Если больше – то число печатается как есть, без обрезания. |
e, E |
"Точность" задаёт количество знаков после десятичной точки. Последний печатаемый разряд округляется. |
f |
"Точность" задаёт количество знаков после десятичной точки. Последний печатаемый разряд округляется. |
g, G |
"Точность" задаёт количество печатаемых значащих разрядов |
s, S |
"Точность" задаёт количество печатаемых символов начиная с начала строки. Все остальные символы не печатаются. |
По умолчанию для форматов с плавающей точкой точность равна 6, т.е. печатается 6 знаков после десятичной точки.
В качестве примера рассмотрим следующую программу:
main()
{
print ("/%d/\n",336);
print ("/%2d/\n",336);
print ("/%10d/\n",336);
print ("/%-10d/\n",336);
}
Эта программа печатает одно и то же значение 4 раза, но использует при этом 4 различные спецификации преобразования.
Результат выполнения выглядит следующим образом:
/336/
/336/
/ 336/
/336 /
Первая спецификация %d не содержит модификатора. Поле печати здесь имеет ширину, равную количеству цифр данного целого числа (этот выбор по умолчанию).
Вторая спецификация %2d, она указывает, что ширина поля должна равняться 2, но, поскольку число состоит из 3 цифр, поле автоматически расширяется до необходимого размера.
Следующая спецификация %10d показывает, что ширина поля равна 10. И действительно между символами (имеется семь пробелов и три цифры, причем число сдвинуто к правому краю поля.)
Последняя спецификация %-10d также указывает ширину поля, равную 10, а флаг "–" приводит к сдвигу всего числа к левому краю.
Рассмотрим теперь некоторые форматы, соответствующие данным с плавающей точкой.
Пример:
main()
{
print("/%/\n",1234.56);
print("/%e/\n",1234.56);
print("/%4.2f/\n",1234.56);
print("/%3.1f/\n",1234.56);
print("/%10.3f/\n",1234.56);
print("/%10.3e/\n",1234.56);
}
Результат работы:
/1234.560000/
/1.234560Е+03/
/1234.56/
/1234.6/
/ 1234.560/
/ 1.234Е+03/
Пояснения по работе использованных спецификаторов:
%f. При форматировании по умолчанию устанавливается значение точности равное 6, т.е. после точки печатается 6 знаков.
%е. По умолчанию по этой спецификации печатается одна цифра слева от точки и 6 справа.
%4.2f. Две позиции под запись дробной части, и 4- ширина поля. Но т.к. число не помещается в эту ширину, то поле раздвигается до той ширины, при которой можно поместить число 1234.56.
%3.1f. Т.к. указан один знак после точки, то значение 1234.56 округляется до 1234.6
%10.3f Три знака после точки, длина поля 10, число прижимается к правой границе.
%10.3е Один знак слева от точки по умолчанию (правило этого спецификатора), 3 знака справа от точки, ширина поля 10, прижимается к правой границе.
Оператор printf можно также использовать для преобразования чисел из одной системы счисления в другую или печати ASCII-кода символа или символа по его ASCII-коду.
main()
{
printf("%d\n",336);
printf("%o\n",336);
printf("%x\n",336);
printf("%#x\n",336);
printf("%c %d\n", 'A','A');
}
Результат:
336
520
150
0x150
A 65