Описание выполнения Задания 7.
Название работы: Задание 7.
Тема задания: “Обработка информации в файлах произвольного доступа ”.
Цель задания: Освоение методов создания файлов произвольного доступа и обработки содержащихся в них данных.
В качестве примера выполнения Задания 7 ниже приведено решение следующей задачи:
Условие задания:
Исходные данные о продукции: шифр, наименование, план выпуска по годам
пятилетия, выполнение плана в процентах за каждый год пятилетия. Число видов
продукции не определено. Записать данные в файл. Используя данные в файле,
найти продукцию с максимальным процентом выполнения по ней пятилетнего
плана.
Обеспечить возможность:
- добавления новых записей в файл;
- удаления записи с заданным номером из файла;
- корректировки в файле записи с заданным номером;
- сортировки записей в файле по заданному полю и ключу.
Создаем на дискете папку Задание7. Открываем новый проект и создаем на форме frmZ7r пользовательское меню следующей структуры:
В вод данных Решение задачи Преобразование файла Просмотр данных Выход
Добавление записей
Редактирование записей
Удаление записи
Сортировка данных
Располагаем на форме метку для вывода на экран условия задачи, элемент MSFlexGrid для вывода данных, хранящихся в файле, и текстовое окно для вывода на экран результата решения задачи. В разделе General кодового окна формы объявляем пользовательский тип данных (запись) и общедоступные переменные, которые для образца Задания № 7 имеют вид:
Private Type prod
shifr As String * 3
name As String * 10
pl(1 To 5) As Single
vp(1 To 5) As Single
End Type
Private pr As prod, x As prod, y As prod
Private kolzap%, n_rec%, b As Boolean
Для события загрузки формы и пунктов пользовательского меню создаем процедуры в соответствии с индивидуальным заданием. Для варианта
образца Задания № 7 они имеют вид:
Процедура загрузки формы:
Private Sub Form_Load()
Label1 = " Исходные данные о продукции: шифр, наименование, план” & _
“выпуска по годам пятилетия, выполнение плана " & vbCrLf & _
"в процентах за каждый год пятилетия. Число видов продукции не “ & _
“ определено. Записать данные в файл. Используя данные в файле, найти ” & _
“ продукцию с максимальным процентом выполнения по ней пятилетнего “ & _
“ плана." & vbCrLf & _
" Обеспечить возможность:" & vbCrLf & _
" - добавления новых записей в файл;" & vbCrLf & _
" - удаления записи с заданным номером из файла;" & vbCrLf & _
" - корректировки в файле записи с заданным номером;" & vbCrLf & _
" - сортировки записей в файле по заданному полю и ключу."
End Sub
Вид формы после ее загрузки.
Процедура создания файла и ввода в него исходных данных:
Private Sub mnuVvod_Click()
Open CurDir$ & "\produkt.dat" For Random As #1 Len = Len(pr)
Do
pr.shifr = InputBox("Введите шифр продукции")
pr.name = InputBox("Введите название продукции")
For i = 1 To 5
pr.pl(i) = InputBox("Введите план за " & i & " год")
Next i
For i = 1 To 5
pr.vp(i) = InputBox("Введите выполнение плана в % за " & i & " год")
Next i
Put #1, , pr
Loop Until MsgBox("Продолжить ввод данных ?", 36) = vbNo
Close #1
End Sub
Эта процедура создаст файл произвольного доступа в текущей папке на вашей дискете и заполнит его данными.
Процедура решения задачи:
Private Sub mnuObrab_Click()
Dim Mas!(), max!, sv!, sp!, i%, j%, M!(5)
Open CurDir$ & "\produkt.dat" For Random As #1 Len = Len(pr)
kolzap = LOF(1) \ Len(pr)
ReDim Mas(1 To kolzap)
fg.Clear: Text1.Text = ""
fg.Cols = 13: fg.Rows = 16
sv = 0: sp = 0
For i = 1 To kolzap
Get #1, , pr
For j = 1 To 5
M(j) = pr.vp(j) * pr.pl(j) / 100
sv = sv + M(j)
sp = sp + pr.pl(j)
Next j
Mas(i) = sv / sp
fg.TextMatrix(i, 0) = pr.name
fg.TextMatrix(i, 1) = Mas(i)
Next i
max = Mas(1): j = 1
For i = 2 To kolzap
If Mas(i) > max Then
max = Mas(i)
j = i
End If
Next i
Seek #1, j
Get #1, , pr
Text1.Text = " Продукция с макс. процентом выполнения плана за 5 лет: " & _
pr.name & vbCrLf & _
" Ее процент выполнения плана за 5 лет = " & Format(max, "Percent")
Close #1
End Sub
Вид формы с результатом решения задачи
Процедура добавления новых записей в файл:
Private Sub mnuAdd_R_Click()
Dim i%
Open CurDir$ & "\produkt.dat" For Random As #1 Len = Len(pr)
kolzap = LOF(1) \ Len(pr)
Seek #1, kolzap + 1
Do
pr.shifr = InputBox("Введите шифр продукции")
pr.name = InputBox("Введите название продукции")
For i = 1 To 5
pr.pl(i) = InputBox("Введите план за " & i & " год")
Next i
For i = 1 To 5
pr.vp(i) = InputBox("Введите выполнение плана в % за " & i & " год")
Next i
Put #1, , pr
Loop Until MsgBox("Продолжить ввод данных ?", 36) = vbNo
Close #1
End Sub
Процедура редактирования записей в файле:
Private Sub mnuCorrect_Click()
Dim num%, i%
num = InputBox("Введите номер корректируемой записи")
fg.Cols = 13: fg.Rows = 16
For i = 0 To 12
fg.ColWidth(i) = Int(fg.Width / 12)
Next i
fg.Clear
fg.FormatString = "^ № р/р |^ Шифр |< Наименование |^ PL1 “ & _
“|^ PL2 |^ PL3 |^ PL4 |^ PL5 |^ VP!% |^ VP2% |^ VP3% |^ VP4% |^ VP5% "
Open CurDir$ & "\produkt.dat" For Random As #1 Len = Len(pr)
Seek #1, num
Get #1, , pr
' Вывод на экран корректруемой записи
fg.TextMatrix(1, 1) = pr.shifr
fg.TextMatrix(1, 2) = pr.name
For j = 1 To 5
fg.TextMatrix(1, j + 2) = pr.pl(j)
Next j
For j = 1 To 5
fg.TextMatrix(1, j + 7) = pr.vp(j)
Next j
' Ввод корректируемых значений полей записи с отображением
‘ их на экране
pr.shifr = InputBox("Введите шифр продукции")
fg.TextMatrix(2, 1) = pr.shifr
pr.name = InputBox("Введите название продукции")
fg.TextMatrix(2, 2) = pr.name
For i = 1 To 5
pr.pl(i) = InputBox("Введите план за " & i & " год")
fg.TextMatrix(2, i + 2) = pr.pl(i)
Next i
For i = 1 To 5
pr.vp(i) = InputBox("Введите выполнение плана в % за " & i & " год")
fg.TextMatrix(2, i + 7) = pr.vp(i)
Next i
Seek #1, num
Put #1, , pr
Close #1
End Sub
Процедура удаления записи с заданным номером из файла:
Private Sub mnuDel_R_Click()
Dim num%, i%
num = InputBox("Введите номер удаляемой записи")
Open CurDir$ & "\Newprod.dat" For Random As #2 Len = Len(pr)
Open CurDir$ & "\produkt.dat" For Random As #1 Len = Len(pr)
kolzap = LOF(1) \ Len(pr)
' Циклически сдвигаем все записи, начиная с num + 1 и до конца
‘ файла, вверх
i = num + 1
Do While Not EOF(1)
Get #1, i, pr
Put #1, i - 1, pr
i = i + 1
Loop
' Переписываем все записи от первой до предпоследней из 1-го файла
‘ во 2-ой
For i = 1 To kolzap - 1
Get #1, i, pr
Put #2, i, pr
Next i
Close #1
Close #2
' Уничтожаем первый файл
Kill CurDir$ & "\produkt.dat"
' Даем второму файлу имя уничтоженного первого
Name CurDir$ & "\Newprod.dat" As CurDir$ & "\produkt.dat"
Close #1
End Sub
Процедуры, обеспечивающие сортировку записей в файле:
Private Sub Replace()
Seek #1, n_rec
Put #1, , y
Put #1, , x
b = True
End Sub
Private Sub mnuSort_F_Click()
Dim s$, ks%
Open CurDir$ & "\produkt.dat" For Random As #1 Len = Len(pr)
s = "": b = True
kolzap = LOF(1) \ Len(pr)
s = InputBox("Введите имя поля, по которому нужно сортировать" & _
vbCrLf & "записи(shifr,name)")
ks = InputBox("Введите ключ сортировки :" & vbCrLf & " -1: по “ & _
“убыванию;" & vbCrLf & " 1: по возрастанию")
Do While b = True
b = False: n_rec = 1
Seek #1, 1
Do While n_rec < kolzap
' Читаем из файла две соседние записи с номерами n_rec и n_rec + 1
Seek #1, n_rec
Get #1, , x
Get #1, , y
' Сравниваем имена полей с введенным именем и с помощью
‘ процедуры Replace меняем местами в файле прочитанные записи в
‘ соответствии с условиями сортировки
Select Case s
Case "shifr"
If ks * x.shifr > ks * y.shifr Then Replace
Case "name"
Select Case ks
Case -1
If x.name < y.name Then Replace
Case 1
If x.name > y.name Then Replace
End Select
End Select
n_rec = n_rec + 1
Loop
Loop
Close #1
End Sub
Процедура просмотра хранящихся в файле данных:
Private Sub mnuView_Click()
Dim i%, j%
Open CurDir$ & "\produkt.dat" For Random As #1 Len = Len(pr)
kolzap = LOF(1) \ Len(pr)
fg.Cols = 13: fg.Rows = 16
For i = 0 To 12
fg.ColWidth(i) = fg.Width / 13
Next i
fg.Clear
fg.FormatString = "^ № р/р |^ Шифр |< Наименование |^ PL1 |^ PL2 “ & _
“|^ PL3 |^ PL4 |^ PL5 |^ VP!% |^ VP2% |^ VP3% |^ VP4% |^ VP5% "
For i = 1 To kolzap
Get #1, , pr
fg.TextMatrix(i, 0) = i
fg.TextMatrix(i, 1) = pr.shifr
fg.TextMatrix(i, 2) = pr.name
For j = 1 To 5
fg.TextMatrix(i, j + 2) = pr.pl(j)
fg.TextMatrix(i, j + 7) = pr.vp(j)
Next j
Next i
Close #1
End Sub
Вид формы с выводом содержащихся в файле данных.
Процедура завершения работы приложения:
Private Sub mnuExit_Click()
End
End Sub
Как обычно добавляем к проекту форму-заставку frmZ7z. Процедура для ее командной кнопки должни иметь вид:
Private Sub Command1_Click()
frmZ7z.Hide
frmZ7r.Show
End Sub
Вопросы к защите Задания № 7.
1. Какие типы файлов данных существуют в файловой системе VB и чем
отличается способ хранения в них данных?
2. Что такое пользовательский тип данных и как он объявляется?
3. Операторы открытия файлов произвольного доступа, переименования
файла, уничтожения файла.
4. Операторы записи данных в файл произвольного доступа и чтения их из
файла.
5. Оператор перехода к записи с заданным номером в файле произвольного
доступа.
6. Как определить количество записей, содержащихся в файле произвольного
доступа?
7. Алгоритм удаления из файла произвольного доступа записи с заданным
номером.
Желаю успешной защиты Задания 7!