
- •Происхождение языка с
- •Язык среднего уровня
- •Структурированный язык
- •Язык программирования
- •Компиляторы против интерпретаторов
- •Вид программ на с
- •Библиотеки и компоновка
- •Раздельная компиляция
- •Карта памяти с-программы
- •Переменные, константы, операторы и выражения
- •Идентификаторы
- •Типы данных
- •Модификаторы типов
- •Модификаторы доступа
- •Объявление переменных
- •Локальные переменные
- •Формальные параметры
- •Глобальные переменные
- •Спецификаторы хранения
- •Статические переменные
- •Статические локальные переменные
- •Статические глобальные переменные
- •Регистровые переменные
- •Оператор присваивания
- •Многочисленное присваивание
- •Преобразование типов при присваивании
- •Инициализация переменных
- •Константы
- •Символьные константы с обратным слэшем
- •Операторы
- •Арифметические операторы
- •Увеличение и уменьшение
- •Операторы отношения и логические операторы
- •Битовые операторы
- •Оператор ?
- •Операторы указания & и *
- •Оператор 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
- •Операторы препроцессора # и ##
- •Предопределенные макросы
- •Комментарии
Спецификатор точности
Спецификатор точности следует за спецификатором минимума ширины поля (если он есть). Он состоит из точки, за которой следует целое число. Его точное значение зависит от типа данных, к которым он применяется.
При применении спецификатора точности к вещественным данным, используя спецификаторы %f, %е или %Е, он определяет число выводимых цифр дробной части. Например, %10.4f выводит числа, по крайней мере, с длиной строки в десять символов, причем под дробную часть отводится четыре символа. Если не указать точность, то по умолчанию используется шесть символов. Когда спецификатор точности применяется к %g или %G, он определяет число значимых цифр. Применение спецификатора точности к строкам ограничивает длину строки. Например, %5.7s выводит строку, по крайней мере, с пятью, но не более чем с семью символами. Если строка длиннее, чем максимальная указанная ширина, оставшиеся символы отбрасываются.
Когда спецификатор точности применяется к целым типам, он указывает минимальное число цифр, отводимых под каждое число. Для достижения требуемой длины к числу добавляются нули. Следующая программа иллюстрирует применение спецификатора точности: #include <stdio.h> int main (void) { printf ("%. 4f\n\",123.1234567); printf("%3.8d\n", 1000); printf("%10.15 s\n", "This is a simple test."); return 0; } В результате ее работы получаем: 123.1235 00001000 This is a simpl
Выровненный вывод
По умолчанию все выводимое выравнивается по правому краю. То есть, если поле имеет ширину, большую, чем выводимые данные, то данные размещаются с правого края поля. Можно заставить выводить информацию с левого края, поместив знак минус сразу после %. Например, %-10.2f приведет к выравниванию по левому краю вещественного числа с двумя числами после запятой в 10-символьном поле.
Следующая программа демонстрирует выравнивание по левому краю: #include <stdio.h> int main (void) { printf("right-justified:%8d\n", 100); printf ("left-justified: %-8d\n", 100); return 0; }
Работа с другими типами данных
Имеется два модификатора формата, позволяющие функции printf() выводить короткие и длинные целые. Эти модификаторы могут применяться к спецификаторам типа d, i, о, u и х. Модификатор l сообщает функции printf() о том, что далее следует длинный тип данных. Например, %ld означает, что будет выводиться значение типа long int. Модификатор h говорит функции printf() о необходимости вывода коротких целых. Например, %hu выводит данные типа short unsigned int.
Модификатор L может стоять перед спецификаторами плавающего типа е, f и g, тем самым указывая, что далее следуют переменные типа long double.
Модификаторы * u #
Функция printf() поддерживает два дополнительных модификатора для некоторых спецификаторов формата: * и #.
Помещение # перед g, G, f, Е или е обеспечивает наличие десятичной точки в случае отсутствия дробной части. Если перед спецификаторами формата х или X поставить #, то шестнадцатиричное число будет печататься с префиксом 0х. Если перед спецификатором о поместить #, то выведенное число будет иметь в начале 0. Нельзя применять # к остальным спецификаторам формата.
Помимо констант, спецификаторы минимальной ширины поля и точности могут предоставляться аргументами printf(). Для реализации этого следует использовать *. Когда форматная строка сканируется, функция printr() будет сопоставлять со звездочкой аргументы в порядке появления. Например, printf("%*.*f", 10,4,123.3); минимальная ширина поля равна 10, точность - 4, а вводимое значение 123.3
Следующая программа демонстрирует использование # и * #include <stdio.h> int main(void) { printf("%х %#x\n", 10, 10); printf("%*.*f", 10, 4, 1234.34); return 0; }
scanf()
Стандартный ввод с консоли, как правило, осуществляется с помощью scanf(). Она читает все стандартные типы данных и автоматически преобразует числа к правильному внутреннему формату. Чем-то она похожа на свою противоположность printf(). Стандартный вид scanf() следующий: int scanf(const char * форматная_строка,..); форматная_строка определяет способ чтения значений в переменные, на которые указывает список аргументов.
Форматная строка состоит из трех типов символов:
Спецификаторы формата
Специальные символы
Стандартные символы
Функция scanf() возвращает число введенных полей. Она возвращает EOF,.если обнаруживается преждевременный конец файла.