
- •Происхождение языка с
- •Язык среднего уровня
- •Структурированный язык
- •Язык программирования
- •Компиляторы против интерпретаторов
- •Вид программ на с
- •Библиотеки и компоновка
- •Раздельная компиляция
- •Карта памяти с-программы
- •Переменные, константы, операторы и выражения
- •Идентификаторы
- •Типы данных
- •Модификаторы типов
- •Модификаторы доступа
- •Объявление переменных
- •Локальные переменные
- •Формальные параметры
- •Глобальные переменные
- •Спецификаторы хранения
- •Статические переменные
- •Статические локальные переменные
- •Статические глобальные переменные
- •Регистровые переменные
- •Оператор присваивания
- •Многочисленное присваивание
- •Преобразование типов при присваивании
- •Инициализация переменных
- •Константы
- •Символьные константы с обратным слэшем
- •Операторы
- •Арифметические операторы
- •Увеличение и уменьшение
- •Операторы отношения и логические операторы
- •Битовые операторы
- •Оператор ?
- •Операторы указания & и *
- •Оператор sizeof
- •Оператор «запятая»
- •Операторы [ ] u ()
- •Приоритеты в с
- •Выражения
- •Преобразование типов в выражениях
- •Принудительные преобразования
- •Пробелы и круглые скобки
- •Сокращенные операторы в с
- •Операторы управления программой
- •Истина и ложь в с
- •Операторы выбора
- •Вложенные if
- •Лесенка if-else-if
- •Оператор ?
- •Вложенные операторы switch
- •Вариации цикла for
- •Бесконечный цикл
- •Циклы for без тела
- •Метки и goto
- •Функции
- •Оператор return
- •Выход из функции
- •Возвращаемые значения
- •Значения, возвращаемые функцией main()
- •Правила видимости для функций
- •Аргументы функции
- •Передача по значению и передача по ссылке
- •Создание передачи по ссылке
- •Передача массивов в функции
- •Аргументы функции main()
- •Функции, возвращающие нецелые значения
- •Использование прототипов функции
- •Прототипы стандартных библиотечных функций
- •Создание прототипов функций, не имеющих параметров
- •Возврат указателей
- •Рекурсия
- •Сопоставление классического и современного объявления параметров
- •Указатели на функции
- •Особенности реализации
- •Параметризированные функции и функции общего назначения
- •Эффективность
- •Массивы
- •Одномерный массив
- •Создание указателя на массив
- •Передача одномерных массивов в функции
- •Двумерные массивы
- •Массивы строк
- •Многомерные массивы
- •Индексация с помощью указателей
- •Размещение массивов
- •Инициализация массива
- •Инициализация безразмерных массивов
- •Пример программы игры в крестики-нолики
- •Указатели
- •Указатели - это адреса
- •Переменные-указатели
- •Операторы для работы с указателями
- •Выражения с указателями
- •Присваивание указателей
- •Арифметические действия с указателями
- •Сравнение указателей
- •Динамическое выделение и указатели
- •Указатели на константы
- •Указатели на константы
- •Указатели на константы
- •Указатели и массивы
- •Указатели на символьные массивы
- •Массивы указателей
- •Указатели на указатели - многочисленное перенаправление
- •Инициализация указателей
- •Указатели на функции
- •Проблемы, связанные с указателями
- •Структуры, объединения и определяемые пользователем типы
- •Структуры
- •Доступ к членам структуры
- •Присваивание структур
- •Массивы структур
- •Программа инвентаризации
- •Передача структур в функции
- •Передача членов структур в функции
- •Передача всей структуры в функцию
- •Указатели на структуры
- •Объявление указателя на структуру
- •Использование указателей на структуру
- •Массивы и структуры в структурах
- •Битовые поля
- •Объединения
- •Перечисления
- •Использование sizeof для обеспечения переносимости
- •Ввод, вывод, потоки и файлы
- •Потоки и файлы
- •Текстовые потоки
- •Двоичные потоки
- •Консольный ввод/вывод
- •Чтение и запись символов
- •Чтение и запись строк: gets() и puts()
- •Форматированный консольный ввод/вывод
- •Печать символов
- •Вывод чисел
- •Вывод адресов
- •Спецификатор %n
- •Модификаторы формата
- •Спецификатор минимума ширины поля
- •Спецификатор точности
- •Выровненный вывод
- •Работа с другими типами данных
- •Модификаторы * u #
- •Спецификаторы формата
- •Ввод чисел
- •Ввод беззнаковых целых
- •Чтение отдельных символов с помощью scanf()
- •Чтение строк
- •Ввод адреса
- •Спецификатор %n
- •Использование множества сканирования
- •Пропуск нежелательных специальных символов
- •Обычные символы в управляющей строке
- •В scanf() следует передавать адреса
- •Модификаторы формата
- •Подавление ввода
- •Файловая система ansi с
- •Указатель на файл
- •Открытие файла
- •Запись символа
- •Чтение символа
- •Использование fopen(), getc(), putc() и fclose()
- •Использование feof()
- •Две расширенные функции: getw() и putw()
- •Работа со строками: fgets() и fputs()
- •Fseek() и произвольный доступ
- •Удаление файлов
- •Работа с консолью
- •Препроцессор и комментарии
- •Директивы условной компиляции
- •Использование defined
- •Операторы препроцессора # и ##
- •Предопределенные макросы
- •Комментарии
Форматированный консольный ввод/вывод
Стандартная библиотека С содержит две функции, выполняющие форматированный ввод и вывод стандартных типов данных: printf() и scanf(). Термин форматированный подразумевает, что эти функции могут, читать или писать данные в различных форматах, которыми можно управлять, Функция printf() используется для вывода данных на консоль, scanf() - для чтения данных с консоли. Как printf(), так и scanf() могут работать с любыми стандартными типами, включая символы, строки и числа.
printf()
Функция printf() имеет следующий прототип: int printf(const char *форматная_строка,...);
Первый аргумент форматная_строка определяет способ вывода последующих аргументов. Он часто называется форматной строкой и содержит два типа элементов: символы, выводимые на экран, и спецификаторы формата, определяющие способ вывода аргументов, следующих за форматной строкой. Спецификаторы формата начинаются со знака процент, за которым следует код формата, Спецификаторы формата приведены в таблице.
Таблица: Спецификаторы формата функции printf() |
|
Код |
Формат |
%c |
Символ |
%d |
Знаковое десятичное целое число |
%i |
Знаковое десятичное целое число |
%е |
Научная нотация (е - строчная) |
%Е |
Научная нотация (Е - прописная) |
%f |
Десятичное число с плавающей точкой |
%g |
Использует или %е, или %f, соответствующее более короткому представлению |
%G |
Использует или %Е, или %F, соответствующее более короткому представлению |
%o |
Беззнаковое восьмеричное число |
%s |
Строка символов |
%u |
Беззнаковое десятичное число |
%х |
Беззнаковое шестнадцатиричное число (строчные буквы) |
%Х |
Беззнаковое шестнадцатиричное число (прописные буквы) |
%р |
Вывод указателя |
%n |
Ассоциированный аргумент - это указатель на целое, в которое записывается число уже выведенных символов |
%% |
Выводит знак % |
Должно быть полное соответствие между числом аргументов и числом спецификаторов формата, а также спецификаторы формата и аргументы должны соответствовать друг другу слева направо. Например, вызов: printf("Hi %с %d %s", 'c', 10, "there!"); отображает «Hi с 10 there!». Функция printf() возвращает число напечатанных символов. В случае ошибки она возвращает EOF.
Печать символов
Для печати отдельных символов используйте % с. Это приводит к выводу соответствующего аргумента в не модифицированном виде на экран. Для печати строки используйте %s.
Вывод чисел
Можно использовать или %d, или %i для отображения знакового десятичного числа. Эти форматы спецификаторов эквивалентны и присутствуют оба по историческим причинам.
Для вывода беззнакового значения надо использовать %u.
Спецификатор формата %f позволяет отображать числа с плавающей точкой.
Спецификаторы %е и %Е сообщают printf() о необходимости вывода вещественного числа в научной нотации. Числа, представляющиеся в научной нотации, имеют следующий вид: x.ddddd Е+/-yy Если необходимо вывести символ «E», используйте %Е, иначе используйте %е.
Можно указать функции printf() использовать %f или %е, используя спецификаторы формата %g или %G. В результате этого printf() выбирает спецификатор формата, приводящий к более короткой форме выдачи информации. Если необходимо, чтобы в научной нотации присутствовало «Е», используйте %G, иначе используйте %g. Следующая программа демонстрирует эффект использования спецификатора формата %g: #include <stdio.h> int main(void) { double f; for(f=1.0; f<1.0e+10; f=f*10) printf ("%g", f); return 0; } В результате ее работы получаем: 1 10 100 1000 10000 100000 1e+06 1e+07 1е+08 1е+09
Можно отображать беззнаковые целые в восьмеричном или шестнадцатиричном форматах, используя %о и %х соответственно. Поскольку шестнадцатиричные числа используют буквы от А до F для представления чисел от 10 до 15, следует использовать спецификатор формата %X для вывода прописных букв, а %х - для строчных, как показано ниже: #include <stdio.h> int main(void) { unsigned num; for(num=0; num<255; num++) { printf("%o ", num); printf("%x", num); printf("%X", num); } return 0;