КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Практическая часть. Разработать простейшую базу данных с помощью файла произвольного доступа
· Постановказадачи.
Разработать простейшую базу данных с помощью файла произвольного доступа. Каждая запись включает в себя фамилию, имя, дату рождения, информацию о стипендии и адрес студента, который отображаются в массиве объектов Combo1. Элементы интерфейса позволяют перемещаться от записи к записи, осуществлять быстрый переход назад (на последнюю запись) и вперед (на первую запись). Кроме этого предусмотрены возможности: v ввода данных через диалог InputBox; v добавление записи в список элементов ComboBox; v удаление записи из списка ComboBox; v удаление всех записей из списка ComboBox; v записать все записи из списка ComboBox в файл Stud.dat; v чтения записей из файла Stud.dat; v поиск записей по критерию (список фамилий из диапазона первых букв от “К” до “Ч”) и занесение их в список ComboBox. v Установите для всех элементов массива ComboBox свойство Combo1.Style=0
· Код программы.
Private Type Person Surname As String * 15 'Фамилия myName As String * 15 'Имя BirthDay As Date 'Дата рождения = 8 байт Stip As Boolean 'Стипендия = 2 байта Address As String * 40 'Дополнительные данные End Type Dim Student As Person, k As Integer Private Sub Ввод_Click() Dim List As String K = 0 ‘Счетчик записей Do ‘Запускаем бесконечный цикл формирования записей For j% = 0 To 4 ‘j - номер индекса Combo1 Select Case j Case 0 List = "фамилий" Case 1 List = "имен" Case 2 List = "дат рождения (27.12.88)" Case 3 List = "стипендий (1-да,0-нет)" Case 4 List = "адресов" End Select S$ = InputBox("Введите очередное значение:", "Ввод данных в список " & List) IF j = 0 And S = "" Then Exit Do Combo1(j).AddItem S Next j k = k + 1 Loop Until False For j = 0 To 4 Combo1(j).ListIndex = 0 ‘Установить указатель в каждом из элементов массива Combo1 на первую запись Next j End Sub Private Sub Добавить_Click() For j% = 0 To 4 Combo1(j).AddItem Combo1(j).Text Combo1(j).ListIndex = Combo1(j).TopIndex ‘Добавляем новую запись в качестве элемента списка Next j ‘ и устанавливаем указатель на начало списка End Sub Private Sub Удалить_Click() k% = Combo1(0).ListCount IF k > 0 Then For j% = 0 To 4 Combo1(j).RemoveItem Combo1(j).ListIndex ‘Удалить подсвеченную запись во всех полях массива Combo1 Next j End IF k = Combo1(0).ListCount If k > 0 Then For j = 0 To 4 Combo1(j).ListIndex = 0 Next j End If End Sub Private Sub В_начало_Click() For j% = 0 To 4 Combo1(j).ListIndex = 0 Next j End Sub Private Sub В_конец_Click() k% = Combo1(0).ListCount For j% = 0 To 4 Combo1(j).ListIndex = k - 1 Next j End Sub Private Sub Назад_Click() If Combo1(0).ListIndex > 0 Then For j% = 0 To 4 Combo1(j).ListIndex = Combo1(j).ListIndex - 1 Next j End If End Sub Private Sub Вперед_Click() k% = Combo1(0).ListCount If Combo1(0).ListIndex < k - 1 Then For j% = 0 To 4 Combo1(j).ListIndex = Combo1(j).ListIndex + 1 Next j End If End Sub Private Sub УдалитьВсе_Click() k% = Combo1(0).ListCount For j% = 0 To 4 Combo1(j).ListIndex = 0 Next j Do For j = 0 To 4 Combo1(j).RemoveItem 0 Next j k = Combo1(0).ListCount Loop Until k = 0 End Sub Private Sub Записать_Click() X% = Len(Student) 'Если вновь создаешь тот же файл, но меньшего размера, он не записывается 'Если вновь создаешь тот же файл большего размера, то будет все в порядке Kill "C:\Stud.dat" 'Сначала уничтожим старый файл Open "C:\Stud.dat" For Random As #1 Len = X K% = Combo1(0).ListCount ‘Определяем количество записей в Combo1 For I% = 1 To K With Student .Surname = Combo1(0).List(i - 1) .myName = Combo1(1).List(i - 1) .BirthDay = CDate(Combo1(2).List(i - 1)) .Stip = CBool(Combo1(3).List(i - 1)) .Address = Combo1(4).List(i - 1) End With Put #1, i, Student Next i Close #1 End Sub Private Sub ЧитатьФайл_Click() X% = Len(Student) Open "C:\Stud.dat" For Random As #1 Len = X K% = LOF(1) \ X For I% = 1 To K Get #1, i, Student Combo1(0).AddItem Student.Surname Combo1(1).AddItem Student.myName Combo1(2).AddItem Student.BirthDay Combo1(3).AddItem Student.Stip Combo1(4).AddItem Student.Address Next i Close #1 For j% = 0 To 4 Combo1(j).ListIndex = 0 Next j End Sub Private Sub Поиск_Click() X% = Len(Student) Open "C:\Stud.dat" For Random As #1 Len = x K% = LOF(1) \ x For I% = 1 To K Get #1, i, Student If Student.Surname > "К" And Student.Surname < "Ч" Then Combo1(0).AddItem Student.Surname Combo1(1).AddItem Student.myName Combo1(2).AddItem Student.BirthDay Combo1(3).AddItem Student.Stip Combo1(4).AddItem Student.Address End IF Next i Close #1 For j% = 0 To 4 Combo1(j).ListIndex = 0 Next j End Sub Private Sub Выход_Click() End ‘Выход End Sub
· Индексирование записей
Заполнение базы данных (в виде файлов с произвольным доступом) производится чаще всего стихийно (беспорядочно). Отыскать какую-либо запись при большом их количестве бывает сложно. Очевидно, для удобства работы с файлами их как-то нужно упорядочить. Самый распространенный способ – переставить записи файла так, чтобы значения какого-нибудь поля были расположены в алфавитном (лексикографическом) порядке, а если значение поля числовое – в порядке возрастания или убывания. Такой способ упорядочивания называется сортировкой файла. А выбранное для этой цели поле называют ключом сортировки. Какое поле следует выбрать в качестве ключа? Поле Фамилия может быть им? Очевидно, нет, так как студенты могут носить одинаковые фамилия. Тогда можно взять объединение полей: Фамилия и Имя. Но лучшим решением проблемы является введение еще одного специального поля, которое называют идентификатором записи – это число, которое однозначно определяет запись (счетчик). Пусть все же у нас ключом сортировки будут два поля: Фамилия и Имя. Для того, чтобы представить записи файла в упорядоченном виде, вместо сортировки всего файла (а это процесс на диске довольно длительный) удобнее использовать следующий алгоритм: v создать в памяти так называемый индекс – множество коротких записей, каждая из которых состоит из Ключа и НомераДлиннойЗаписи. Длинная запись – полная запись файла, для которой создается индекс, состоящая из полей: Фамилия, Имя, Дата рождения, Стипендия, Адрес. Короткие записи – это Ключ и НомерДлиннойЗаписи). v Затем отсортировать этот индекс по возрастанию (убыванию) Ключа. v Вывести длинные записи файла в том порядке, в каком будут расположены их короткие представители в индексе после сортировки. В раздел описаний предыдущей программы добавим новый пользовательский тип (ТипИндекса), переменную этого типа (Index) и процедуру сортировки записей, как показано ниже.
· Дополнительный код программы.
Private Type Person Surname As String * 15 'Фамилия myName As String * 15 'Имя BirthDay As Date 'Дата рождения = 8 байт Stip As Boolean 'Стипендия = 2 байта Address As String * 40 'Дополнительные данные End Type Private Type ТипИндекса FIO As String * 40 Number As Integer End Type Dim Student As Person, k As Integer Dim Index() As ТипИндекса ………… ……………. ……………. ……………. Private Sub ЧитатьСортФайл_Click() X% = Len(Student) ‘Длина записи Open "C:\Stud.dat" For Random As #1 Len = x K% = LOF(1) \ x ‘Число записей ReDim Index(K) As ТипИндекса Cls ‘Очистка формы For I% = 1 To K Get #1, i, Student Index(i).FIO = UCase(Trim(Student.Surname) + Trim(Student.myName)) Index(i).Number = i Next i 'Пузырьковая сортировка файла по индексу For i = 1 To k - 1 For j% = i + 1 To k If Index(i).FIO > Index(j).FIO Then Index(0) = Index(j): Index(j) = Index(i): Index(i) = Index(0) End If Next j Next i Print vbCrLf, vbCrLf, vbCrLf, vbCrLf, vbCrLf ‘пропуск на форме 6-ти пустых строк For i = 1 To k Get #1, Index(i).Number, Student Print " " & Trim(Student.Surname) & " " & Trim(Student.myName), _ Trim(Student.BirthDay), Trim(Student.Address) Next i Close #1 End Sub
· Задание на самостоятельную работу. v Ввод начальных значений полей и запись их на диск осуществляется с клавиатуры через диалог InputBox. v Все введенные записи должны быть отображены в списках массива управляющих элементов ComboBox. v Для ввода новой записи используют список ComboBox, после чего она должна быть записана на диск. v Предусмотреть поиск записей на диске по критерию, а также перемещение от записи к записи в начало и в конец. v Осуществить вывод на форму отсортированных записей по ключу.
Дата добавления: 2014-12-23; Просмотров: 473; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |