- •В.В. Чуркин технологии программирования
- •Содержание
- •Введение
- •Указатели. Операции над указателями Операции адресации и разыменования.
- •Арифметические операции.
- •Присваивание указателей.
- •Смещение и индексирование указателей.
- •Функции
- •Объявление функции (прототип)
- •Параметры функции
- •Встроенные функции
- •Функции с параметрами со значениями по умолчанию
- •Параметры функции main()
- •Рекурсивные функции
- •Перегрузка функций
- •Шаблоны функций
- •Указатели на функции
- •Объявление и инициализация массива указателей на функции:
- •Указатель на функцию как возвращаемое функцией значение
- •Выделение и освобождение динамической памяти
- •Символьные и строковые данные Символьные константы
- •Строковые константы (строки)
- •Символьные переменные
- •Строки – переменные
- •Специальные функции ввода-вывода строк
- •Стандартная библиотека функций языка с
- •Файлы Потоковый ввод-вывод в языке с Функции верхнего уровня файлового ввода-вывода
- •Открытие и закрытие потока
- •Текстовый режим
- •Бинарный режим
- •Закрытие файла
- •Функции в языке c для работы с файлами
- •Двоичный (бинарный) режим обмена с файлами
- •Строковый обмен с файлами
- •Форматный обмен с файлами
- •Позиционирование в потоке
- •Ввод-вывод нижнего уровня
- •Открытие / закрытие файла
- •Чтение и запись данных
- •Произвольный доступ к файлу
- •Позиционирование файлов
- •Сортировки числовых массивов Принцип наименьших привилегий
- •Обменная сортировка (SwapSort)
- •Сортировка выбором (SelectSort)
- •Пузырьковая сортировка (BubbleSort)
- •Сортировка вставками (InsertSort)
- •Быстрая сортировка (QuickSort)
- •Поиск в числовых массивах
- •Структуры
- •Форматы определения структурных типов
- •Форматы определения объектов структурных типов
- •Операции над объектами структурного типа
- •Доступ к элементам объектов структурного типа
- •Структуры, массивы и указатели
- •Объединения (смеси)
- •Оператор switch (переключатель)
- •Динамические структуры данных
- •Реализация стека с помощью массива
- •Очередь
- •Очередь приоритетов
- •Реализация очереди с помощью массива
- •Линейные списки
- •Функции для работы с двунаправленным линейным списком
- •Реализация списка с помощью массивов
- •Поиск хэшированием
- •Бинарные деревья
- •Бинарное упорядоченное дерево (дерево поиска)
- •Идеально сбалансированное дерево
- •Операции с бинарным упорядоченным деревом
- •Удаление узла из дерева
- •Обход (просмотр) дерева
- •Реализация дерева с помощью массивов
- •Вывод динамических структур в файл и чтение их из файла
- •Сбалансированные (avl) деревья
- •Алгоритм avl-вставки.
- •Повороты
- •Классы и объектно-ориентированное программирование
- •Объявление класса
- •Определение класса (реализация класса)
- •Использование класса (драйвер класса)
- •Доступ к элементам класса
- •Отделение интерфейса от реализации
- •Обслуживающие функции-утилиты
- •Конструкторы
- •Windows-программы в Builder
- •Структура головного файла проекта
- •Структура заголовочного файла модуля формы (“Unit1.H”)
- •Структура файла реализации модуля формы (“Unit1.Cpp”)
- •Области видимости (или области действия) переменных в блоках. Время жизни переменных
- •Доступ к свойствам и функциям-элементам (методам) объектов, переменным и функциям в приложении, содержащем одну форму
- •Константные объекты и константные функции-элементы
- •Перегрузка операций
- •Перегрузка унарных операций
- •Перегрузка бинарных операций
- •Перегрузка операции присваивания
- •Перегрузка операции приведения типа
- •Перегрузка операции индексирования []
- •Дружественный класс
- •Использование указателя this
- •Композиция классов
- •Дружественные функции класса
- •Статические элементы класса
- •Шаблон класса для статически и динамически создаваемых объектов
- •Конструктор 1
- •Деструктор
- •Вызовы конструкторов и деструкторов
- •Перегруженная операция присваивания
- •Конструктор 2 (конструктор копирования, конструктор копии)
- •Наследование. Иерархия классов.
- •Ключи доступа
- •Пример простого наследования (точка, круг)
- •Правила наследования функций-элементов. Вызовы конструкторов и деструкторов в иерархии
- •Виртуальные функции и полиморфизм
- •Правила определения и наследования виртуальных функций
- •Позднее (динамическое) связывание
- •Полиморфизм. Абстрактные и конкретные классы
- •Учебная литература (основная)
- •Учебная литература (для углубленного изучения)
- •Учебно-методические издания
Реализация списка с помощью массивов
Индекс первого элемента в массиве данных – 0, поэтому a=0, где a – вспомогательная переменная, содержащая индекс начала списка.
Во вспомогательном массиве i–й элемент содержит для каждого i–го элемента массива данных индекс следующего за ним элемента. Отрицательное число во вспомогательном массиве используется как признак конца списка.
Реализация списка с помощью массивов позволяет сортировать данные без их физического перемещения в памяти.
После сортировки по возрастанию получим:
После сортировки индекс первого элемента – 6, следовательно, a=6.
Поиск хэшированием
В линейном списке возможен только линейный поиск элемента по ключу со средним количеством сравнений . Идеальный поиск требует одного сравнения. Задача – стремиться к такому поиску.
Выборка элементов за одно сравнение может быть реализована при использовании в качестве индекса в массиве некоторого ключа.
Предположим, есть множество записей с целочисленными ключами:
Хэш-функция
отображает ключ в целочисленный индекс
в диапазоне
.
В хэш-функции обычно используется
деление. Например, для записей с ключами
54, 77, 94, 89, 14, 45, 76 примем, что хэш-функция
находит индекс как остаток от деления
на 11, который принимает значения от 0 до
10.
Хэширование первых пяти ключей дает пять различных индексов, по которым соответствующие записи запоминаются в хэш-таблице.
Затем (ключи 45, 76) элементы данных вставляются в соответствующие списки в качестве новых узлов. Следовательно, хэш-таблица представляет собой массив списков.
Нахождение индекса хэш-функцией можно считать сравнением, тогда общее число сравнений при заполнении таблицы 7-ю элементами равно 9, т.е. в среднем 1,3 сравнения на элемент данных.
Чтобы обнаружить (найти) элемент данных, нужно применить хэш-функцию для определения нужного связанного списка и выполнить там последовательный поиск. В среднем – 1,3 сравнения на элемент данных.
Бинарные деревья
Эта динамическая структура данных состоит из узлов (вершин), каждый из которых содержит, кроме данных, не более двух ссылок на различные бинарные деревья (поддеревья, ветви). На каждый узел (вершину) имеется ровно одна ссылка. Начальный узел (вершина) называется корнем дерева.
Узел (вершина), не имеющий поддеревьев (ветвей), называется листом. Исходящие узлы называются предками, входящие – потомками. Высота дерева определяется количеством уровней (слоев), на которых располагаются его узлы (вершины).
Бинарное упорядоченное дерево (дерево поиска)
Если дерево организовано таким образом, что для каждого узла все ключи его правого поддерева больше ключа этого узла, а все ключи его левого поддерева – меньше, то такое дерево называется упорядоченным, или деревом поиска. Одинаковые ключи не допускаются.
В дереве поиска можно найти элемент по ключу, двигаясь от корня и переходя на левое или правое поддерево в зависимости от значения ключа в каждом узле. Такой поиск гораздо эффективнее поиска по списку, поскольку время поиска определяется высотой (глубиной) дерева, а она пропорциональна , где - количество узлов.
Построим бинарное упорядоченное дерево по приходящим числам: 17, 18, 6, 5, 9, 23, 12, 7, 8.
Высота (глубина) представленного дерева равна 4.
