- •Оглавление
- •Часть 1. Краткое описание Delphi 8
- •Часть 2. Технология ado для баз данных access 186
- •9.1. Общие сведения 289
- •Введение
- •Часть 1. Краткое описание Delphi
- •1. Работа со средой delphi
- •1.1. Ознакомление с delphi
- •1.2. Вкладка дизайнера формы (design)
- •1.3. Вкладка редактора кода программы
- •1.4. Окно object inspector
- •1.5. Окно project manager
- •1.6. Окно палитры инструментов
- •1.7. Создание первого проекта приложения
- •1.8. Сохранение проекта
- •1.8. Сохранение проекта
- •1.9. Компиляция
- •2. Основа языка delphi
- •2.1. Основные понятия языка
- •2.1.1. Элементы языка
- •2.1.2. Пример простой программы
- •2.1.3. Типы данных
- •2.1.4. Операции и выражения
- •2.1.5. Стандартные функции
- •2.1.6. Ввод и вывод на дисплей
- •2.1.7. Оператор присваивания
- •2.2. Операторы языка паскаль
- •2.2.1. Составной оператор
- •2.2.2. Условный оператор
- •2.2.3. Сложные условия
- •2.2.4. Оператор выбора case
- •2.2.5. Оператор цикла for
- •2.2.6. Оператор цикла while
- •2.2.7. Оператор цикла repeat
- •2.2.8. Вложенные циклы
- •2.2.9. Прочие операторы
- •2.3. Общая структура программы
- •2.3.1. Перечень разделов программы
- •2.4. Массивы
- •2.4.1. Одномерные массивы
- •2.4.2. Сортировка массивов и поиск элемента в массиве
- •2.4.3. Многомерные массивы
- •2.5. Функции и процедуры
- •2.5.1. Описание функций
- •2.5.2. Обращение к функции
- •2.5.3. Процедуры
- •2.5.4. Параметры-значения и параметры-переменные
- •2.5.5. Локальные и глобальные переменные
- •2.5.6. Pекурсия
- •2.6. Строки символов
- •2.6.1. Задание строк
- •Var имя: string[длина];
- •2.6.2. Функции и процедуры для обработки строк
- •2.7. Порядковые типы данных
- •2.7.1. Перечисляемый тип данных
- •2.7.2. Интервальный тип данных
- •2.7.3. Порядковые типы данных
- •2.7.4. Дополнение:тип данных tDateTime (дата-время)
- •2.8. Множества
- •2.8.1. Значения типа множество
- •2.8.2. Операции на множествах
- •2.9. Записи
- •2.9.1. Поля записи
- •2.9.2. Оператор with
- •2.9.3. Последовательный поиск в массиве записей
- •2.9.4. Двоичный поиск в массиве записей
- •2.10. Файлы
- •2.10.1. Основные свойства файлов
- •2.10.2. Типизированные файлы
- •2.10.3. Текстовые файлы
- •2.10.4. Поиск файлов
- •2.11. Динамическая память
- •2.11.1. Динамические переменные и указатели
- •2.11.2. Динамические списки
- •2.11.3. Деревья
- •2.12. Программные модули
- •2.12.1. Модули, формируемые пользователем
- •2.12.2. Стандартные модули
- •2.12.3. Примеры программ
- •3. Главная форма
- •3.1. Свойства главной формы
- •3.2. События главной формы
- •4. Описание некоторых компонентов
- •4.1. Компонент tpanel (панели)
- •4.2. Компонент tbutton (кнопка)
- •4.3. Дополнительные кнопки
- •4.4. Компонент tlabel (надписи)
- •4.5. Компонент tedit (Строки ввода)
- •4.6. Компонент тМето (многостроч. Поле ввода)
- •4.7. Свойства и методы класса tstrings
- •4.8. Компонент checkbox (флажок)
- •4.9. Компонент tradiobutton (кнопки выбора)
- •4.10. Компонент MainMenu (главное меню программы)
- •4.11. Компонент timage
- •4.12. Компонент tstringgrid (сетка)
- •4.13. Компонент ttimer(таймер)
- •5. Отладка программ
- •5.1. Типы ошибок
- •5.2. Отладка программы
- •5.2.1. Трассировка программы
- •5.2.2. Точки останова программы
- •5.2.3. Наблюдение значений переменных
- •Часть 2. Технология ado для баз данных access
- •6. Создание баз данных access
- •6.1. Определение понятия баз данных
- •6.2. Интерфейс программы access
- •6.3. Создание базы данных в access 2007
- •6.3.1. Создание двухтабличной базы данных
- •6.3.2. Создание базы данных с вычисляемыми полями
- •6.4. Выбop формата для новой базы данных
- •6.5. Создание пустой базы данных
- •6.6. Открытие и закрытие базы данных
- •6.7. Создание таблиц в режиме конструктора
- •6.7.1. Выбор первичного ключа
- •6.7.2. Изменение полей и таблиц
- •6.7.3. Копирование полей
- •6.7.4. Перемещение полей
- •6.7.5. Удаление полей
- •6.7.6. Операции с таблицами
- •6.8. Создание базы данных в access 2003
- •6.9. Установление связей между таблицами
- •6.10. Обеспечение целостности записей в базе данных
- •6.11. Редактирование и удаление связей
- •7. Система доступа к данным ado
- •7.1. Общие сведения
- •7.2. Компонент adoConnection
- •7.2.1. Свойства компонента adoConnection.
- •7.2.2. Методы компонента adoConnection
- •7.3.Компонент аdоТable
- •7.3.1. Свойства компонента tadoTable
- •7.3.2. Методы компонента tadoTable
- •7.4. Компонент adoQuery
- •7.5. Компонент adoDataSet
- •7.5.1.Свойства компонента adoDataSet
- •7.5.2. Методы компонента adoDataSet
- •7.5.3. Cобытия компонента adoDataSet
- •7.6. Компонент DataSource
- •7.7.Комнонент DataGrid
- •7.7.1 Cвойства компонента DataGrid
- •7.7.2. Методы и события компонента DataGrid
- •7.8. Компонент adocommand
- •8. Управление базами данных
- •8.1. Приложение для управления базами данных
- •8.2. Свойства полей базы данных
- •8.3. Редактирование базы данных
- •8.4. Сортировка данных
- •8.5. Поиск данных в базе
- •8.5.1. Фильтрация данных в базе
- •8.5.2. Нахождения информации методом Locate
- •9.1. Общие сведения
- •9.2. Основные операторы запроса
- •9.2.1. Агрегатные функции
- •9.2.2. Подзапросы
- •9.3. Операторы наполнения баз данных sql
- •9.3.1. Ввод значений
- •9.3.2. Удаление значений
- •9.3.3. Изменение значений
- •9.4. Операторы создания баз данных sql
- •9.4.1. Команда создания таблицы.
- •9.4.2. Первичные ключи таблицы
- •9.4.3. Индексы таблицы
- •9.4.4. Добавление в таблицу новых столбцов
- •10. Реализация sql- запросов
- •10.1. Компонент tadoQuery для sql- запросов
- •10.2. Форма для реализация sql-запроса
- •11. Генератор отчетов Quick Reports
- •11.1.Описание Quick Reports
- •11.2. Печать записи с помощью Quick Reports
- •11.3. Печать таблиц с помощью Quick Reports
- •394026 Воронеж, Московский просп., 14
2.11.3. Деревья
Дерево - это иерархическая структура, состоящая из узлов и соединяющих их дуг. В каждый узел, кроме одного, ведет ровно одна дуга.
Единственный узел, в который не ведет ни одна дуга, называется корнем дерева.
Из любого узла дерева может выходить произвольное количество дуг, в том числе ни одной. Узлы, из которых не выходит ни одной дуги, называются листами дерева.
Дерево удобно использовать для представления данных, имеющих иерархическую структуру. Например, корень дерева можно сопоставить какому-либо человеку. От корня ведут две дуги, к отцу и к матери. От них дуги ведут к их родителям и т.д. Получилось генеалогическое дерево.
Или в качестве корня дерева можно представить университет. Он делится на факультеты. Каждый факультет состоит из курсов, курсы из специальностей, специальности из групп, группы из студентов. Можно составить дерево для представления структуры университета.
Компьютерную программу также можно представить в виде дерева. Корень - это программа в целом. Она делится на процедуры и функции, те, в свою очередь, на операторы. Возможно также показать вложенность операторов цикла, условных операторов, составных.
Еще одно применение деревьев — это хранение и поиск информации.
Дерево по своей сути является рекурсивной структурой данных, поэтому дадим рекурсивное определение дерева.
Пустое дерево — это отсутствие элементов.
Дерево — это или пустое дерево или узел, связанный дугами с конечным числом деревьев. '
Опираясь на рекурсивное определение дерева, можно разработать эффективные алгоритмы работы с деревьями.
Ограничимся рассмотрением деревьев, у которых из каждого узла исходит не более двух дуг. Такие деревья называются двоичными или бинарными. Они чаще других применяются для хранения и обработки информации.
Для реализации деревьев используются динамические переменные и указатели. Узлы двоичного дерева представляют в виде записей, хранящих некоторую информацию и два указателя.
Пример. Описание узла дерева.
type
PNode =^TNode; {указатель на узел дерева} TNode = record { узел дерева }
Inf: string; (здесь хранится сама информация}
Left, Right: PNode;{указатели на узлы-потомки}
end;
В качестве хранимой информации выбрана строка символов, но ничто не мешает хранить данные любого типа.
Отдельная переменная типа PNode должна указывать на корень дерева подобно переменной, указывающей на голову списка.
Прохождение дерева заключается в обходе всех его узлов. Сформулируем рекурсивный алгоритм прохождения бинарного дерева:
Посетить корень.
Пройти левое поддерево.
Пройти правое поддерево.
Двоичные деревья могут быть упорядоченными, что позволяет эффективно добавлять и находить в них информацию.
Назовем ключом признак, по которому ведется поиск информации.
Ключи должны быть сравнимы между собой, то есть для каждой пары ключей можно сказать какой из них больше, а какой меньше.
Например, если нужно найти в библиотечном каталоге книгу определенного автора, то ключом будет являться фамилия автора, а сравнение будет осуществляться по алфавиту
Двоичное дерево упорядочено, если все ключи левого поддерева каждого узла меньше, чем ключ узла, а ключи правого поддерева — больше.
Поиск в упорядоченном дереве выполняют рекурсивным алгоритмом очень похожим на алгоритм двоичного поиска.
В начале поиска взять все дерево в качестве текущего поддерева.
Если текущее поддерево не пусто, то нужно сравнить искомый ключ с тем, что в корне поддерева:
если ключи совпадают, поиск завершен;
если ключ в корне больше искомого, в качестве текущего взять левое поддерево и повторить поиск;
если ключ в корне меньше искомого, в качестве текущего взять правое поддерево и повторить поиск.
Если дерево пусто, поиск неудачен. Продолжительность поиска определяется длиной одной
ветви дерева. Если ветви примерно одинаковы (дерево сбалансировано), то время поиска в дереве с N узлами такое же, как время двоичного поиска в упорядоченном массиве из N элементов.
Алгоритм поиска легко переделать в алгоритм включения нового узла в упорядоченное дерево. Для этого достаточно слова «поиск неудачен» заменить словами «включаем новый узел в качестве правого (левого) поддерева».
При удалении узла из дерева возможны следующие случаи:
удаляемый узел не имеет поддеревьев;
удаляемый узел имеет лишь одно поддерево;
удаляемый узел имеет оба поддерева.
В первом случае достаточно убрать ссылку на удаляемый узел в родительском узле. Во втором случае следует заменить в родительском узле ссылку на удаляемый узел ссылкой на его поддерево. В третьем случае надо заменить удаляемый узел самым левым узлом его правого поддерева или самым правым узлом его левого поддерева.
Рассмотрим пример работы с двоичным упорядоченным деревом. Программа должна ввести символьные строки в произвольном порядке (прекратить после ввода пустой строки), сформировать из них упорядоченное двоичное дерево и вывести на экран введенные строки по алфавиту.
program tree type
PNode =^TNode; {указатель на узел дерева}
TNode = record { узел дерева }
Inf: string; {здесь хранится сама информация}
Left, Right: PNode; {указатели на узлы-потомки}
end;
var
Head,Curr:PNode; s: string;
{добавление узла в упорядоченное дерево}
procedure Add_Node(var Head:PNode;Curr:PNode);
begin
if Head = nil then Head:=Curr
else
begin
if Head^.Inf > Curr.^Inf
then Add_Node(Head^.Left,Curr) {вставка узла в левое поддерево}
else Add_Node(Head^.Right,Curr); (вставка узла в правое поддерево}
end;
end;
{печать дерева}
procedure Print_Tree(Head:PNode); begin
if Head <> nil then begin
Print_Tree(Head^.Left); {печать левого поддерева} writeln(Head^.Inf); {печать текущего узла} Print_Tree(Head^.Right); {печать правого поддерева} end
end;
begin
Head:=nil; {корень дерева} readln(s);
while s<>" do
begin
New(Curr); {введение нового узла} Curr^Mnf:=s;
Curr^.Left:=nil;Curr^.Right:=nil;
Add_Node(Head,Curr); {добавление нового узла в дерево}
readln(s);
end;
Print_Tree(Head); writeln;
end.