Автор работы: Пользователь скрыл имя, 29 Декабря 2010 в 04:20, курсовая работа
Функциональный подход реализует принцип движения «от задач» и применяется, когда определен комплекс задач, для обслуживания которых создается информационная система. В этом случае можно выделить минимальный необходимый набор объектов предметной области, которые должны быть описаны.
В предметном подходе объекты предметной области определяются с таким расчетом, чтобы их можно было использовать при решении множества разнообразных, заранее не определенных задач.
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 позволяют осуществлять сортировку записей файла по нескольким подчиненным ключам.
Если необходимо выполнить вложенную сортировку по другой совокупности полей (например, в других задачах), то нужно вернуться к исходному порядку, а затем выполнить последовательные сортировки в порядке, обратном порядку рассматриваемой совокупности полей.
Заметим, однако, что при удалении записи в отсортированных данных (это возможно только в режиме просмотра в виде формы) порядок следования записей нарушается, возвращаясь к исходному виду.
На этом месте снова следует протестировать проект на работоспособность и корректность работы. Проверка правильности работы сортировок может быть осуществлена при помощи просмотра данных в виде таблицы. Особое внимание уделить корректности правки и удаления отсортированных записей.
13. Задачи, решаемые в информационной системе
В
техническом задании
Результаты решения задач оформляются в виде отчетов, вывод которых вызывается командами пункта меню «Отчеты» в строке меню главной формы.
Заметим, что первый пункт – это фактически два различных отчета: списки всех групп и список одной, указанной группы. Из-за этого мы при создании пунктов меню поставили в соответствие этому отчету два пункта меню: «Отчеты à Списки групп à Все группы» и «Отчеты à Списки групп à Одна группа».
Отчеты будем генерировать в виде текстовых файлов. Для их просмотра используем компонент RichTextBox.
Поместим этот элемент на форму frmMenu, задав ему следующие свойства:
Name = RichTextBox1 | Системное имя |
Font = Courier New | Шрифт |
ReadOnly = True | Запрет редактирования |
ScrollBars = Vertical | Вертикальная полоса прокрутки |
Visible = False | Объект невидим |
Кроме этого элемента поместим на форму еще и кнопку (Name = cmdSaveOtch, Visible = False), при нажатии которой будем сохранять просматриваемый отчет. Таким образом, макет формы frmMenu , доработанный для вывода результатов имеет вид, представленный на рисунке 8.
По нажатию кнопки «Сохранить отчет» текущий отчет (т.е. отчет, который просматривается в данный момент) должен быть сохранен. Таким образом, поскольку мы генерируем отчеты в текстовый файл с заранее заданным именем, то по нажатию кнопки должна быть сделана копия файла с отчетом.
Рисунок 8. Макет главной формы в режиме конструктора
Приведем код процедуры обработки события нажатия на кнопку «Сохранить отчет».
Private Sub cmdSaveOtch_Click(ByVal sender As System.Object,_
ByVal e As System.EventArgs) Handles cmdSaveOtch.Click
' запрос имени файла для сохранения
With SaveFileDialog1
.FileName = ""
.Filter = "Все файлы (*.*)|*.*|" + _
"Текстовые файлы. (*.txt)|*.txt|" + _
"Файлы исходных данных (*.dan)|*.dan|" + _
"Файлы результатов (*.rez)|*.rez"
.FilterIndex = 2
.ShowDialog()
End With
' если имя файла не пусто и не равно имени
' просматриваемого файла,
If SaveFileDialog1.FileName <> "" And _
richName <> SaveFileDialog1.FileName Then
' то производится копирование просматриваемого файла,
FileCopy(richName, SaveFileDialog1.FileName)
' его удаление
Kill(richName)
' и вывод в RichTextBox1 нового файла
richName = SaveFileDialog1.FileName
RichTextBox1.LoadFile(
' сообщение об успешном завершении сохранения отчета
MsgBox("Отчет сохранен", vbOKOnly + vbInformation, _
"Сохранение")
End If
End Sub
13.1. Вывод списков групп
Вывод списков групп реализован в процедуре обработки события выбора пункта меню «Отчеты à Списки групп à Все группы».
Прежде чем привести код этой процедуры, обсудим алгоритм, реализованный в ней. Идея алгоритма состоит в следующем: сначала файл с данными о студентах должен быть «отсортирован» по курсу, группе и фамилии; результатом чего станет индексный массив Ind, который позволит просматривать записи файла в отсортированном виде именно таким образом. Такая упорядоченность записей файла фактически представляет его разбитым на группы записей, самая внутренняя группа имеет одинаковые значения для курса и группы и упорядочена в алфавитном порядке фамилий. Поэтому в самом внешнем цикле перебираются курсы, во вложенном в него цикле перебираются номера групп, и в следующем по уровню вложенности цикле (для одинаковых значений курса и группы во всех записях) выбираются и выводятся в текстовый файл фамилии студентов. Код процедуры снабжен подробными комментариями.
Private
Sub mnuQueryListAllItem_Click(
System.Object, ByVal e As System.EventArgs) _
Handles mnuQueryListAllItem.Click
Dim i As Integer
Dim Ind(Nmax) As Integer
Dim NK As Byte
Dim NG As Byte
Dim NPP As Integer
Dim KeyK(Nmax) As Single
Dim KeyG(Nmax) As Single
Dim KeyFIO(Nmax) As String
Dim R As TStud = New TStud()
' открывается временный вспомогательный файл otch.ist,
' находящийся в той же папке, что и работающий проект
Path2 = CurDir() + "\otch.txt"
F4 = FreeFile()
FileOpen(F4, Path2, OpenMode.Output)
' подготовка данных для сортировки по курсу, группе и ФИО
For i = 1 To N
R.ReadFromFile(f1, i)
KeyK(i) = R.Kurs
KeyG(i) = R.Group
KeyFIO(i) = R.FIO
Ind(i) = i
Next i
' сортировка данных
Call SortStr(KeyFIO, N, Ind)
Call Sort(KeyG, N, Ind)
Call Sort(KeyK, N, Ind)
' чтение первой записи в отсортированном списке
i = 1
R.ReadFromFile(f1, Ind(i))
Do While i <= N
' фиксирование и запись в файл номера текущего курса
NK = R.Kurs
PrintLine(F4, "Курс " + CStr(NK))
Do While NK = R.Kurs And i <= N
' фиксирование и запись в файл номера
' текущей группы
NG = R.Group
PrintLine(F4, vbTab + "Группа " + CStr(NG))
' порядковый номер студентов в группе
' начинается с единицы
NPP = 1
Do While NK = R.Kurs And NG = R.Group