- •Оглавление
- •Часть 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.4.2. Сортировка массивов и поиск элемента в массиве
Сортировка — это перестановка элементов массива в порядке их возрастания или убывания.
Известно много разных алгоритмов сортировки.
Одним из простейших является алгоритм сортировки выбором.
Сортировка выбором элементов массива в порядке их возрастания выполняется следующим образом:
Установить номер наименьшего элемента массива.
Поменять местами наименьший и первый элементы массива.
Выполнить пункты 1 и 2 над остатком массива (массивом без первого элемента).
Пункт 3 повторять, пока остаток массива не сократится до одного элемента.
Предположим, что имеется массив из пяти элементов со значениями (30, 20, 10, 50, 40). По мере повторения пункта 3 элементы меняются местами:
40 50 10 20 30 10 50 40 20 30 10 20 40 50 30 10 20 30 50 40 10 20 30 40 50
Подчеркнута область поиска наименьшего элемента.
Из примера видно, что работа алгоритма состоит из последовательных шагов. На каждом шаге наименьший элемент области поиска перемещается в уже отсортированную часть массива, за счет этого упорядоченная часть массива растет, а неупорядоченная сокращается на 1 элемент. Для сортировки массива из N элементов потребуется ровно N-1 шагов алгоритма.
program sort_select;
const N=100;
type masl=array[l.. N] of real;
var a:masl;
tmp, min:real;
i, j, jmin:integer;
begin
for i:=l to N do read(a[i]); (*ввод элементов массива*)
for i:=l to N-l do
begin
min:=a[i]; jmin:=i;
for j :=i to N do (* поиск минимального элемента*)
if [a|j]<min then
begin
min:=a[j]; jmin:=j; end;
tmp:=a[jmin]; (*перестановка элементов*) a[jmin]:=a[i]; a[i]:=tmp;
end;
for i:=l to N do writeln(a[i]); (*вывод элементов *)
(*отсортированного массива*) end.
Время выполнения одного шага прямо пропорционально размеру неупорядоченной части массива.
Размер неупорядоченной части равен N в начале работы и 2 - в конце. Общее время сортировки выбором
Т = k*N + k*(N-l) +...+ k*3 + k*2,
где k — коэффициент пропорциональности, не зависящий от N.
По формуле для арифметической прогрессии получим
T=k*(N+2)*(N-l)/2,
что примерно равно C*N2, где С — константа, не зависящая от N.
Полученная формула не дает нам абсолютного значения времени, но показывает, как меняется продолжительность сортировки с изменением размера массива.
Зависимость вида
T=f(N),
где N — объем входных данных, называется временной сложностью алгоритма.
О временной сложности сортировки выбором говорят, что она квадратичная, так как время сортировки пропорционально квадрату числа сортируемых элементов.
Разберем еще один алгоритм сортировки массива - так называемой обменной или пузырьковой сортировки. Как и предыдущий, он состоит из отдельных шагов. На каждом шаге проходят массив от начала к концу, сравнивая пары соседних элементов. Если очередная пара нарушает требуемый порядок, ее элементы меняют местами. Шаги повторяют до тех пор, пока очередной проход не вызовет ни одного обмена.
Порядок элементов массива (30, 20, 10, 50, 40) изменяется на каждом шаге сортировки следующим образом:
Исходное значение: 40 50 10 20 30 - После 1-го шага : 40 10 20 30 50
После 2-го шага : 10 20 30 40 50
В отличие от сортировки выбором количество шагов обменной сортировки зависит от первоначального значения массива, поэтому оценим временную сложность алгоритма в худшем случае (в лучшем случае она равна временной сложности одного шага).
При обратном порядке чисел потребуется (N-1) шагов для сортировки массива из N элементов. Это и есть худший случай, так как за каждый шаг по крайней мере один элемент «становится» на свое место. Значит, сложность обменной сортировки
T = (N-l)*t(N), где - временная сложность одного шага, пропорциональная N.
t(N) = k*N
Значит Т » k*N2,
то есть сложность обменной сортировки тоже квадратичная.
Program sort_exchange;
const N=100;
type masl=array[l.. N] of real; var a:masl;
tmp:real;
i,j:integer;
flag:boolean;
begin
for i:=l to N do read(a[i]); (*ввод элементов массива*)
flag:=trae;
i:=l;
while (i<N) and flag do begin
flag:=false; (* сброс флага перестановки элементов*) for j:=l to N-1 do
if a[j]>a[j+l] then
begin
tmp:=a|j];
a[j]:=a|j+l];
a[j+l]:=tmp;
flag:=true; (*установка флага перестановки *)
(* элементов *) end;
i:=i+l; •
end;
for i:=l to N do writeln(a[i]); (*вывод элементов *)
(*отсортированного массива*) end.
Кроме сортировки массивов, часто возникает задача поиска заданного элемента в массиве. При этом необходимо определить, имеется ли такой элемент в массиве и если да, то каков его индекс.
Пример. Определить наличие или отсутствие целого числа в массиве из целых чисел. При наличии числа определить его индекс.
program search; const N=100;
type masl=array[l.. N] of integer; var a:masl;
b:real;
i:integer;
flag:boolean;
begin
read(b); (*ввод элемента для поиска*)
for i:=l to N do read(a[i]); (*ввод элементов массива*)
flag=false; (*сброс флага нахождения элемента *) i:=0;
while (i<N) and (not flag) do begin
i:=i+l;
if a[i]=b then
flag:=true; (*установка флага нахождения элемента *) end;
if flag then Writeln('Элемент находится в позиции ',i) else writeln('Элемент отсутствует');
end.