- •Функции.
- •Вызов функции с переменным числом параметров
- •Функция 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).
- •Вложенное описание структур и объединений.
- •Описание структур и объединений в виде пользовательского типа.
- •Передача структур и объединений в виде параметров функции.
- •Инициализация структур и объединений.
- •Выгода от использования структур
Для чего нужен форматированный вывод.
Задание фиксированной ширины поля оказывается полезным при печати данных столбцами.
Поскольку ширина поля по умолчанию является "ширина" числа, то для печати столбиками достаточно задавать фиксированную ширину поля для каждой переменной (иначе числа будут сдвигаться)
printf("%9d %9d %9d\n",val1, val2, val3);
Результат применения такого оператора в программе следующий:
12 234 1222
4 5 23
1224 2225 10245
Если же фиксированную ширину поля не задавать, то числа в каждой строке будут печататься одно за другим, что нарушит внешний вид таблицы:
12 234 1222
4 5 23
1224 2225 10245
Функция scanf().
Осуществляет ввод значений с клавиатуры.
Синтаксис:
int scanf (const char* FormatString, [void* arg1, void* arg2,]…);
Также как для функции printf() для функции scanf() указываются строка форматирования и следующий за ней список аргументов. В отличие от функции printf функция scanf возвращает введённые с клавиатуры значения в эти переменные, поэтому в списке аргументов указываются указатели на переменные, куда необходимо вернуть значения. При вводе строк в качестве аргумента передаётся непосредственно указатель на область памяти, куда должна быть сохранена введённая строка.
Пример:
main ()
{
int age;
char name[255];
printf("Введите ваш возраст \n")
scanf("%d",&age); // Сообщаем указатель на переменную
printf("Введите ваше имя \n")
scanf("%d",name); // Сообщаем имя массива – он сам
// работает как указатель.
}
Функция scanf() использует практически тот же набор спецификаторов формата, что и функция printf(). Основные отличия в случае функции scanf() следующие:
Отсутствует спецификация %g.
Спецификации %f и %е эквивалентны.
Для чтения целых чисел типа short применяется спецификация %h.
В форматирующей строке можно указывать несколько спецификаторов, причём обычные символы, находящиеся между спецификаторами считаются разделителями. Невнимательное отношение к этим символам иногда приводит к труднонаходимым ошибкам.
Например, немного модифицируем предыдущую программу:
main ()
{
int age;
char name[255];
printf("Введите ваше имя и возраст через пробел\n")
scanf("%s %d",name,&age);
}
В данном случае для корректной работы программы необходимо ввести имя и возраст, разделяя их пробелом и закончить ввод нажатием на Enter (символом перевода строки).
Если же в функции scanf форматирующую строку записать следующим образом:
scanf("%s , %d",name,&age);
, то пользователю необходимо будет разделять вводимые значения именно комбинацией " , " (тремя символами). Иначе второй параметр вообще не будет считан, т.к. функция scanf не найдёт во введённом тексте набор символов, соответствующий разделителю, и будет воспринимать весь введённый текст как первый параметр.
Функции sprintf() и sscanf().
Эти функции используются для форматированного ввода значений из строки и вывода в строку. Функции полностью аналогичны функциям printf и scanf за исключением параметра buffer, в котором собственно и хранится строка, с которой функции работают.
int sprintf (char *buffer, const char * FormatString, [arg1, arg2,]…);
int sscanf (const char *buffer, const char* FormatString, [void* arg1, void* arg2,]…);
Пример: функция перевода чисел из десятичной системы в шестнадцатеричную. Исходное число передаваётся в виде переменной типа int, результат возвращается в виде строки по переданному указателю.
void DecToHex(int src, char *pDest)
{
sprintf(pDest,"%x",src)
}