Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
хороший пример по созданию БД.doc
Скачиваний:
17
Добавлен:
13.05.2015
Размер:
1.02 Mб
Скачать

12. Сортировка данных

Сортировка данных в данной информационной системе производится при помощи индексного массива Ind, описанного в модуле Declar. В этом случае результатом сортировки будет не отсортированный файл, а вспомогательный массив номеров (индексов) Ind, показывающий в каком порядке следует выбирать записи файла, чтобы они образовывали отсортированную последовательность.

Алгоритмы сортировки опишем в стандартном модуле, который необходимо добавить в проект под именем Sorting. Для сортировки данных будем использовать алгоритм сортировки обменом (метод «пузырьковой» сортировки).

Приведем код процедуры сортировки по числовым полям.

Public Sub Sort(Key() As Single, N As Integer, Ind() As Integer)

Dim i As Integer

Dim j As Integer

Dim k As Integer

For j = 1 To N - 1

For i = 1 To N - j

If Key(Ind(i)) > Key(Ind(i + 1)) Then

k = Ind(i)

Ind(i) = Ind(i + 1)

Ind(i + 1) = k

End If

Next i

Next j

End Sub

Перед обращением к этой процедуре необходимо инициализировать массив Ind и занести элементы ключевого поля сортируемого файла во вспомогательный массив Key. Благодаря описанию массива Key как вещественного в него можно записывать числовые данные любого типа: как Single, так и Integer и Byte.

Кроме того, эта процедура пригодна и для сортировки по убыванию ключа; для этого достаточно при инициализации массива Key умножить значения ключевых полей на минус единицу.

Для процедур сортировки по строковым полям и полям типа даты приведем только заголовки, так как код тела этих процедур полностью совпадает с кодом тела процедуры сортировки по числовым полям.

Заголовок процедуры сортировки по строковым полям имеет вид:

Public Sub SortStr(Key() As String , N As Integer, _

Ind() As Integer)

Заголовок процедуры сортировки по полям типа даты имеет вид:

Public Sub SortDate(Key() As Date, N As Integer, _

Ind() As Integer)

Опишем теперь работу с указанными процедурами сортировки. Т.е. опишем процедуры обработки событий выбора пунктов меню «Сортировка  По курсу», «Сортировка  По группе», «Сортировка  По ФИО» и «Сортировка  Исходный порядок». При этом необходимо предусмотреть корректное выполнение вложенных сортировок.

Выбор пункта меню «Сортировка  По курсу»

Private Sub mnuSortKursItem_Click(ByVal sender As _

System.Object, ByVal e As System.EventArgs) _

Handles mnuSortKursItem.Click

Dim i As Integer

Dim KeyK(Nmax) As Single

Dim R As TStud = New TStud()

' подготовка к сортировке

For i = 1 To N

R.ReadFromFile(f1, i)

KeyK(i) = R.Kurs

Next i

' вызов процедуры сортировки

Sort(KeyK, N, Ind)

End Sub

Выбор пункта меню «Сортировка  По группе»

Private Sub mnuSortGroupItem_Click(ByVal sender As _

System.Object, ByVal e As System.EventArgs) _

Handles mnuSortGroupItem.Click

Dim i As Integer

Dim KeyK(Nmax) As Single

Dim R As TStud = New TStud()

' подготовка к сортировке

For i = 1 To N

R.ReadFromFile(f1, i)

KeyK(i) = R.Group

Next i

' вызов процедуры сортировки

Sort(KeyK, N, Ind)

End Sub

Выбор пункта меню «Сортировка  По ФИО»

Private Sub mnuSortFIOItem_Click(ByVal sender As System.Object,_

ByVal e As System.EventArgs) Handles mnuSortFIOItem.Click

Dim i As Integer

Dim KeyK(Nmax) As String

Dim R As TStud = New TStud()

' подготовка к сортировке

For i = 1 To N

R.ReadFromFile(f1, i)

KeyK(i) = Trim(R.FIO)

Next i

' вызов процедуры сортировки

SortStr(KeyK, N, Ind)

End Sub

Выбор пункта меню «Сортировка  Исходный порядок»

Private Sub mnuSortUnsorted_Click(ByVal sender As _

System.Object, ByVal e As System.EventArgs) _

Handles mnuSortUnsorted.Click

Dim i As Integer

' возвращение исходных значений массивам Ind и Del

For i = 1 To Nmax

Ind(i) = i

Del(i) = 0

Next i

End Sub

Теперь, при выборе любого из этих пунктов меню, записи в исходном файле будут выводиться в порядке, определяемом значениями индексного массива Ind, как при просмотре в виде формы, так и при просмотре в виде таблицы.

В команды меню «Сортировка» вынесены сортировки по одному полю (ключу) данных. А если необходимо выполнить сортировку по набору ключей, т.е. представить данные о студентах так, что сначала идут записи по возрастанию номера курса, записи в пределах одного курса – по возрастанию номера группы, а записи в пределах одной группы – по фамилиям в алфавитном порядке. Здесь мы встречаемся с сортировкой по набору ключей.

Для выполнения вложенной сортировки (сортировки по набору ключей) можно воспользоваться описанными выше универсальными процедурами без каких-либо их модификаций. Это связано с тем, что используемый в процедурах алгоритм сортировки является устойчивым, т.е. в процессе сортировки относительное расположение элементов с одинаковыми ключами не изменяется.

Допустим, нужно выполнить сортировку по набору ключей: «Курс», «Группа», «Фамилия И.О.». Предположим, что исходный файл отсортирован по последнему ключу (в нашем случае по полю «Фамилия И.О.). Сортируя полученный файл по предшествующему ключу (по полю «Группа»), мы можем быть уверены, что в пределах одного значения данного ключа записи сохраняют упорядоченность по последнему ключу (это следует из свойства устойчивости алгоритма). Т.е. данные будут отсортированы по полю «Группа», а внутри каждой группы – по полю «Фамилия И.О.». Повторяя процесс сортировки по всем ключам от последнего к первому (т.е. в порядке, обратном требуемому), мы получим файл, отсортированный по набору ключей. Опять же напомним, что файл на самом деле не сортируется, а сортируется индексный массив. Подчеркнем, что в описанном процессе индексный массив, являющийся результатом сортировки по некоторому ключу, является исходным для сортировки по очередному ключу.

Таким образом, процедуры модуля Sorting позволяют осуществлять сортировку записей файла по нескольким подчиненным ключам.

Если необходимо выполнить вложенную сортировку по другой совокупности полей (например, в других задачах), то нужно вернуться к исходному порядку, а затем выполнить последовательные сортировки в порядке, обратном порядку рассматриваемой совокупности полей.

Заметим, однако, что при удалении записи в отсортированных данных (это возможно только в режиме просмотра в виде формы) порядок следования записей нарушается, возвращаясь к исходному виду.

На этом месте снова следует протестировать проект на работоспособность и корректность работы. Проверка правильности работы сортировок может быть осуществлена при помощи просмотра данных в виде таблицы. Особое внимание уделить корректности правки и удаления отсортированных записей.