- •Функции.
- •Вызов функции с переменным числом параметров
- •Функция 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).
- •Вложенное описание структур и объединений.
- •Описание структур и объединений в виде пользовательского типа.
- •Передача структур и объединений в виде параметров функции.
- •Инициализация структур и объединений.
- •Выгода от использования структур
Блочный потоковый ввод-вывод
Средсва потокового ввода-вывода позволяют пользовательской программе оперировать с блоками фиксированной длины. Для этого служат следующие функции:
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream ); где
buffer – буфер для хранения принимаемой или отправляемой информации.
size – размер одного блока.
count - количество блоков.
stream – указатель на идентификатор потока.
Функция fwrite() последовательно записывает в поток count блоков, каждый размером size байт, т.е. всего записывает count*size байт. Информация для записи берётся из области памяти, на которую указывает buffer. Аналогично, fread() читает count*size байт в область памяти, на которую указывает buffer. Обе функции возвращают количество полностью записанных/прочитанных на самом деле блоков (не байт !).
Смена текущей позиции в файле. Проверка конца файла.
Иногда возникает потребность установить позицию курсора в какое-либо конкретное место файла, например, когда необходимо прочитать какой-либо участок из середины большого файла. Смена текущей позиции в файле осуществляется с помощью функции fseek():
int fseek( FILE *stream, long offset, int origin ); где
stream – указатель на поток.
offset – смещение, на которое необходимо сместить курсор в файле.
origin – флаг, указывающий от какой позиции отсчитывать смещение:
SEEK_CUR – отсчитывать от текущей позиции курсора.
SEEK_END - отсчитывать от конца файла.
SEEK_SET - отсчитывать от начала файла.
Функция возвращает 0 в случае успешного завершения и ненулевое значение в случае ошибки.
Например:
fseek(stream, 0,SEEK_END); установит курсор на конец файла,
fseek(stream, -4, SEEK_CUR); сместит курсор на 4 символа назад.
Функция ftell() возвращает текущую позицию курсора в файле:
long ftell( FILE *stream );
Для определения конца файла можно воспользоваться возвращаемым значением функций чтения из файла – они возвращает признак ошибки (обычно это и есть символ EOF) при достижении конца файла (в большинстве случаев это и есть единственная ошибка, которая может случиться).
Другой вариант – воспользоваться функцией feof():
int feof( FILE *stream );
Эта функция по сути дела повторяет результат чтения из потока последней операции чтения. Она возвращает ненулевое значение, если последняя операция чтения пыталась прочитать символ в то время как был достигнут конец файла. Если же конец файла не был достигнут, то она возвращает 0.
Пример:
// Программа вывода символьного файла на экран дисплея
#include <stdio.h>
int main()
{
FILE *fp; // Указатель на поток
char str[255];
// Открыть файл для чтения:
if ((fp = fopen(“MyFile.txt”,"r")) = = NULL)
{
printf(“Error!”);
return 1;
}
// Цикл чтения строк из файла и вывода их на экран:
while ((fgets(str,254,fp)) != NULL)
puts(str);
fclose(fp); /* Закрыть файл */
return О;
}
Последние строки можно переписать в виде:
do
{
if(fgets(str,254,fp))
puts(str);
}
while(!feof(fp));
Функции доступа к файлам нижнего уровня.
Функции доступа к файлам нижнего уровня аналогичны функциям потокового ввода-вывода, однако в их наборе отсутствуют функции форматированного и посимвольного ввода-вывода. Операции ввода-вывода производятся только в виде поблочного доступа. Вся функциональность функций ввода-вывода нижнего уровня входит в функциональность функций потокового уровня, тем не менее, функции нижнего уровня работают несколько быстрее (что практически незаметно на современных компьютерах).
Прототипы функций нижнего уровня находятся в файле "io.h". Поскольку функции аналогичны выше описанным, то приведём лишь их краткое описание.
Открытие / закрытие сессии работы с файлом:
creat()
open()
sopen()
close()
В отличие от вышерассмотренных функций, в данном случае режим доступа (чтение, запись и т.д.) задаются не в виде строки, а в виде набора целочисленных констант, объединённых с помощью операции побитового или |. Эти константы определены в файле "io.h". Например, открытие файла в бинарном режиме для чтения выглядит так:
fh=open("file.txt",_O_BINARY | _O_RDONLY);
Функции позиционирования курсора в файле:
eof()
lseek()
tell()
Функции чтения / записи
read()
write()
commit()
Более подробно об этих функциях можно прочитать в MSDN. Отметим, что здесь приведена классическая запись имён функций ввода-вывода нижнего уровня. В среде Visual C Microsoft пропагандирует новое написание их имён – с подчёркиванием в начале (например, _open()). Именно в таком виде они и представлены в MSDN, хотя в самих программах можно использовать любую из этих форм записи.
Методы сортировки данных. Сравнение производительности методов. Пример алгоритма сортировки и его программная реализация.