
- •В.В. Чуркин технологии программирования
- •Содержание
- •Введение
- •Указатели. Операции над указателями Операции адресации и разыменования.
- •Арифметические операции.
- •Присваивание указателей.
- •Смещение и индексирование указателей.
- •Функции
- •Объявление функции (прототип)
- •Параметры функции
- •Встроенные функции
- •Функции с параметрами со значениями по умолчанию
- •Параметры функции main()
- •Рекурсивные функции
- •Перегрузка функций
- •Шаблоны функций
- •Указатели на функции
- •Объявление и инициализация массива указателей на функции:
- •Указатель на функцию как возвращаемое функцией значение
- •Выделение и освобождение динамической памяти
- •Символьные и строковые данные Символьные константы
- •Строковые константы (строки)
- •Символьные переменные
- •Строки – переменные
- •Специальные функции ввода-вывода строк
- •Стандартная библиотека функций языка с
- •Файлы Потоковый ввод-вывод в языке с Функции верхнего уровня файлового ввода-вывода
- •Открытие и закрытие потока
- •Текстовый режим
- •Бинарный режим
- •Закрытие файла
- •Функции в языке c для работы с файлами
- •Двоичный (бинарный) режим обмена с файлами
- •Строковый обмен с файлами
- •Форматный обмен с файлами
- •Позиционирование в потоке
- •Ввод-вывод нижнего уровня
- •Открытие / закрытие файла
- •Чтение и запись данных
- •Произвольный доступ к файлу
- •Позиционирование файлов
- •Сортировки числовых массивов Принцип наименьших привилегий
- •Обменная сортировка (SwapSort)
- •Сортировка выбором (SelectSort)
- •Пузырьковая сортировка (BubbleSort)
- •Сортировка вставками (InsertSort)
- •Быстрая сортировка (QuickSort)
- •Поиск в числовых массивах
- •Структуры
- •Форматы определения структурных типов
- •Форматы определения объектов структурных типов
- •Операции над объектами структурного типа
- •Доступ к элементам объектов структурного типа
- •Структуры, массивы и указатели
- •Объединения (смеси)
- •Оператор switch (переключатель)
- •Динамические структуры данных
- •Реализация стека с помощью массива
- •Очередь
- •Очередь приоритетов
- •Реализация очереди с помощью массива
- •Линейные списки
- •Функции для работы с двунаправленным линейным списком
- •Реализация списка с помощью массивов
- •Поиск хэшированием
- •Бинарные деревья
- •Бинарное упорядоченное дерево (дерево поиска)
- •Идеально сбалансированное дерево
- •Операции с бинарным упорядоченным деревом
- •Удаление узла из дерева
- •Обход (просмотр) дерева
- •Реализация дерева с помощью массивов
- •Вывод динамических структур в файл и чтение их из файла
- •Сбалансированные (avl) деревья
- •Алгоритм avl-вставки.
- •Повороты
- •Классы и объектно-ориентированное программирование
- •Объявление класса
- •Определение класса (реализация класса)
- •Использование класса (драйвер класса)
- •Доступ к элементам класса
- •Отделение интерфейса от реализации
- •Обслуживающие функции-утилиты
- •Конструкторы
- •Windows-программы в Builder
- •Структура головного файла проекта
- •Структура заголовочного файла модуля формы (“Unit1.H”)
- •Структура файла реализации модуля формы (“Unit1.Cpp”)
- •Области видимости (или области действия) переменных в блоках. Время жизни переменных
- •Доступ к свойствам и функциям-элементам (методам) объектов, переменным и функциям в приложении, содержащем одну форму
- •Константные объекты и константные функции-элементы
- •Перегрузка операций
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Перегрузка операции приведения типа
- •Перегрузка операции индексирования []
- •Композиция классов
- •Дружественные функции класса
- •Дружественный класс
- •Использование указателя this
- •Статические элементы класса
- •Шаблон класса для статически и динамически создаваемых объектов
- •Конструктор 1
- •Деструктор
- •Вызовы конструкторов и деструкторов
- •Перегруженная операция присваивания
- •Конструктор 2 (конструктор копирования, конструктор копии)
- •Наследование. Иерархия классов.
- •Ключи доступа
- •Пример простого наследования (точка, круг)
- •Правила наследования функций-элементов. Вызовы конструкторов и деструкторов в иерархии
- •Виртуальные функции и полиморфизм
- •Правила определения и наследования виртуальных функций
- •Позднее (динамическое) связывание
- •Полиморфизм. Абстрактные и конкретные классы
- •Учебная литература (основная)
- •Учебная литература (для углубленного изучения)
- •Учебно-методические издания
Форматный обмен с файлами
В этом случае информацию записывают в файл в виде, пригодном для непосредственного (без преобразования) отображения на мониторе, т.е. в символьном виде. Используются функции:
int fprintf (указатель_на_поток, форматная_строка,
список_переменных); //форматированный вывод в файл
int fscanf (указатель_на_поток, форматная_строка,
список_переменных); //форматированный ввод из файла
Для форматного обмена с дисплеем и клавиатурой используются функции:
int printf( форматная_строка,
список_переменных); //форматированный вывод на экран
int scanf (форматная_строка,
список_переменных); //форматированный ввод с клавиатуры
В качестве примера приведем программу, создающую файл int.dat и записывающую в него символьные изображения чисел от 1 до 10 и их квадратов:
#include <stdio.h>
int main()
{ FILE *fp;
int n;
if((fp=fopen(“int.dat”, “w”))==NULL)
{ perror(“int.dat”);
return 1;
}
for(n=1; n<11; n++)
fprintf(fp,”%d %d\n”, n, n*n);
fclose(fp);
return 0;
}
Приведем также программу для форматного чтения данных из файла, используя функцию fscanf ():
#include <stdio.h>
int main()
{ FILE *fp;
int n, nn, i;
if((fp=fopen(“int.dat”, “r”))==NULL)
{ perror(“int.dat”);
return 1;
}
for(i=1; i<11; i++)
{ fscanf(fp,”%d %d”, &n, &n*n);
printf(“ %d %d \n”, n, nn);
}
fclose(fp);
return 0;
}
Позиционирование в потоке
Выше были рассмотрены посимвольный, построчный и форматный обмены с файлами, организованными в виде потока байтов. Эти средства позволяли записать в файл данные и читать из него информацию только последовательно.
Операция чтения (или записи) для потока всегда производится, начиная с текущей позиции в потоке. Начальная позиция чтения/записи в потоке устанавливается при открытии потока и может соответствовать начальному или конечному байту потока в зависимости от режима открытия потока. При открытии потока в режимах “r” или “w” указатель текущей позиции чтения/записи в потоке устанавливается на начальный байт потока, а при открытии в режиме “a” – в конец файла (за конечным байтом). При выполнении каждой операции ввода-вывода указатель текущей позиции в потоке перемещается на новую текущую позицию в соответствии с числом прочитанных (записанных) байтов.
Средства позиционирования в потоке позволяют перемещать указатель (индикатор) текущей позиции в потоке на нужный байт, т.е. дают возможность работать с файлом на диске, как с обычным массивом, осуществляя доступ к содержимому файла в произвольном порядке. В библиотеке языка C имеется функция fseek() для перемещения (установки) указателя текущей позиции в потоке на нужный байт потока (файла). Её прототип:
int fseek(указатель_на_поток, смещение, начало_отсчета);
Смещение задается переменной или выражением типа long и может быть отрицательным, т.е. возможно перемещение по файлу в прямом и обратном направлениях. Начало отсчета задается одной из предопределенных констант, размещенных в заголовочном файле stdio.h:
SEEK_SET (имеет значение 0) – начало файла;
SEEK_CUR (имеет значение 1) – текущая позиция;
SEEK_END (имеет значение 2) – конец файла.
Функция fseek() возвращает 0, если перемещение в потоке (файле) выполнено успешно, в противном случае возвращается ненулевое значение.
Перемещение к началу потока (файла) из произвольной позиции:
fseek(fp, 0L, SEEK_SET);
Перемещение к концу потока (файла) из произвольной позиции:
fseek(fp, 0L, SEEK_END);
Пусть struct str{……} st; Указатель текущей позиции в потоке будет перемещен на одну структуру назад относительно текущей позиции:
fseek(fp, -(long)sizeof(st), SEEK_CUR);
Кроме функции fseek(), в библиотеке языка C имеются функции для работы с указателями текущей позиции в потоке:
long ftell(FILE* fp) – получить значение указателя текущей позиции в потоке;
void rewind(FILE* fp) – установить указатель текущей позиции в потоке на начало потока.