Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Описание выполнения всех заданий по VB.doc
Скачиваний:
1
Добавлен:
21.07.2019
Размер:
1.89 Mб
Скачать

Описание выполнения Задания 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!

57