Програмирование на Visual Basic
Рефераты >> Кибернетика >> Програмирование на Visual Basic

Index (1) = 1

Index (2) = 2 “.', Index (3) = 3 Результат использования такого массива для доступа к записям файла идентичен прямому доступу к этому файлу. Для того чтобы переставить местами, например, вторую и третью запись, вместо реальной перестановки записей достаточно изменить значения индексов следующим образом: Index (I) = 1 Index (2) = 3 Index (3) = 2 Пример программы. Добавим к предыдущей программе процедуру обработки события щелчка мыши по форме. Private Sub Form_C]-ick ( ) Dim PEREMEN As String * 15, PEREMEN1 As String * 15 Static thelndex(l To 5) As Integer Open “PrimFile” For Random As 5 Len = 15 For I = 1 To 5 thelndex(l) = I Next I 11 = Val(InputBox(“Введите номер 1-й записи для

перестановки”))

Get #5, thelndex(ll), PEREMEN

12 = InputBox(“Введите номер 2-й записи для перестановки”) Get #5, thelndex(12), PEREMEN1 Print Str(thelndex(ll)) + “-ая запись “ + PEREMEN Print Str(thelndex(12)) + “-ая запись “ + PEREMEN1 thelndex(ll) = 12 thelndex(12) = II Get #5, thelndex(ll), PEREMEN Get #5, thelndex(12), PEREMEN1 Print Str(Il) + “-ая запись “ + PEREMEN Print Str(I2) + “-ая запись “ + PEREMEN1 Close #5 Kill “PrimFile” End Sub В процедуре вводится массив thelndex для задания индексов записей используемого файла. Первоначально значениям массива последовательно присваиваются значения от 1 до 5 (индекс записи совпадает с ее реальным номером’в файле). Далее вводятся значения двух номеров записей для их перестановки, записи Private Sub Commandl_Click() Nzapisi = 1 Nzapisil = 1 Open “TestFile” For Random Access Read Write As #10 Len = 70 Text 1.Enabled = True Text2.Enabled = True Text3.Enabled = True Text4.Enabled = True Text7.Enabled—True Textl.SetFocus Commandl.Enabled = False End Sub Private Sub Command2_Click() Dim Peremen As Primer Textl.Text = “” Text2.Text = “” Text3.Text = “” Text4.Text = “” If Nzapisil < Nzapisi Then Get #10, Nzapisil, Peremen Textl.Text = Peremen.Familia Text2.Text = Peremen.Dolgnost Text3.Text = Peremen.Podrazdeienie Text4.Text = Peremen.Zarplata End If Nzapisil = Nzapisil + 1 End Sub Private Sub Command3_Click() Textl.Text = “” Text2.Text = “” Text3.Text = “” Text4.Text == “” Text5.Enabled = True Text6.Enabled = True Text5.Text = “” Text6.Text = “” Text5.SetFocus End Sub Private Sub Command4_Clicki’ Dim Peremen As Primer Dim Zaprosi As String * 20, Zapros2 As String * 20, Sum As Single Dim Pri As Integer, Pr2 As Integer, Kol As integer, Rez As Single Pri = -1: Pr2 = -1: Nzapisil = 1: Kol = 0: Sum = 0 Zaprosi = Text5.Text: Zapros2 = Text6.Text Do While Nzapisil < Nzapisi Get #10, Nzapisil, Peremen If Peremen.Podrazdeienie - Zaprosi Then Pri = 1 End If If Peremen.Doignost = Zapros2 Then Pr2 - 1 End If If Peremen.Podrazdeienie = Zdprosi And Peremen.Doignost = Zapros2 Then Kol -= Kol + 1: Sum = Sum + Val(Peremen.Zarplata): Rez = Sum / Kol End If Nzapisil = Nzapisil + 1 Loop If Pri < 0 Then • • MsgBox “Такого подразделения нет” Text5.Text = “”: GoTo Finish6 End If If Pr2 < 0 Then MsgBox “Такой должности нет” Text6.Text = “”: GoTo Finish6 End If Text7.Text = Str$(Rez) Command5.Enabled =- True Finish6: End Sub Private Sub Cun-iniand5_Ciick () Cl?Qse„#10 Kill “TeS-tFile” End End Sub .Private Sub Form_Load() ' Commandl.Enabled = True Command2.Enabled - False Command3.Enabled = False Command4.Enabled a False Хотя можно указать запись длиной 1 байт, компьютер на самом деле прочитает в буфер памяти один или более секторов. Когда программа читает данные из дискового файла, она читает их из буфера. Когда прочитывается весь буфер, компьютер читает в этот буфер следующие несколько секторов из файла. Аналогично данные записываются в дисковый файл: сначала они записываются в буфер памяти, а когда он заполняется, то записываются на диск. Предположим, что размер дискового сектора 512 байтов, а длина записи файла 260 байтов. При такой длине записи большинство записей файла будут расположены в двух секторах (например, запись 2 использует байты с 261 по 512 первого сектора и с 1 по 8 байт второго сектора) и для чтения с диска такой записи потребуется прочесть два сектора. Использование вместо 260-байтных записей 256-байтных обеспечивает упаковку в один дисковый сектор двух полных записей и позволяет для ввода одной записи читать только один сектор. Таким образом, выбор длины записи определяется типом и длиной передаваемых данных и размерами дисковых секторов. Возможно, что реальная длина передаваемых данных будет меньше длины записи, указанной параметром Len. Если длина читаемых данных меньше длины, указанной параметром Len, то место до границы следующей записи заполняется содержанием буферного файла. Это нежелательно и следует стремиться к согласованию реальной длины передаваемых данных с задаваемой длиной записи с учетом указанных выше замечаний. Пример программы. Записи файла прямого доступа содержат информацию о сотрудниках подразделения предприятия (структура записей файла: фамилия, должность, подразделение, заработная плата). Программа обеспечивает ввод исходной информации в файл и получение информации по запросу: средняя заработная плата для заданных должности и подразделения. Форма имеет вид, показанный на рис. 3.30. Текстовые окна “Фамилия”, “Должность”, “Подразделение”, “Зарплата” (имена соответственно Textl, Text2, Text3, Text4) используются для ввода исходной информации и просмотра записей файла. Текстовые окна “Должность”, “Подразделение” (имена соответственно Text5, Text6) для ввода запроса. Текстовое окно “Результат” (имя Text?) используется для Рис. з.зо вывода результата и предупреждении о не заполнении необходимых текстовых окон. Коммандные кнопки “Начало/Ввод”, “Просмотр файла”, “Ввод запроса”, “Обработка запроса”. “Конец” (имена соответственно Command I, Command2, Command3, Command4, Command5) обеспечивают переход к функциональным алгоритмам. Оператор объявления пользовательского типа данных помещаются в модуль module l.bas. Работа программы иллюстрируется на рис. 3.31—3.33. Текст процедуры обработки событий:

Type Primer

Familia As String * 20

Dolgnost As String * 20

Podrazdelenie As String * 20

Zarpiata As String * 10 End Type Dim Nzapisi, Nzapisil As Integer Dim Peremen As Primer Private Sub Coirimandl_Cllck () Nzapisi = 1 Nzapibil 1 Open “TestFile” For Random Access Read Write As #10 Len = 70 Textl.Enabled - True Text2.Enabled -= True Text3.Enabled—True Text 4.Enablea = True Text?.Enabled - True Textl.SetFocus Commandl.Enabled -= False End Sub Private Sub Command2_Click ( ) Dim Peremen As Primer Textl.Text = “” Text2.Text - “” Text3.Text - “” Text4.Text = “” If Nzapisil <” Nzapisi Then Get #10, Nzapisil, Peremen Textl.Text = Peremen.Familia Text2.Text =- Peremen.Dolgnost Text3.Text = Peremen.Podrazdeleni Text4.Text = Peremen.Zarplata End If Nzapisil = Nzapisil + 1 End Sub Private Sub Command3 Click() Textl.Text = “” Text2.Text = “” Text3.Text =• “” Text4.Text = “” Text5-Enabled = True Text 6.Enabled = True Text5.Text = “” TextG.Text = “” Text5.SetFocus End Sub Private Sub Conmand4_Clic1 Dim Peremen As Primer Dim Zaprosi As baring - ^.u, ^аргоь^ as String * 20, Sum As Sinqie Dim Pri As Integer, Pr2 As Integer, Koi As Integer, Rez As Single Pri - -1: Pr2 - -1: Nzapisil = 1: Kol = 0: Sum - О Zciprosi - Text’).Text: Zapros2 = Text6.Text Do While N^dpibil “•’zapisi ‘^rit #1’, Nzdpisil, Peremen If Peremen. Pcmra^aeienie - Z^prosi Th>.’n t’rl -= 1 End If If Peremen.Dolgnost = Zapros2 Then Pr2 - 1 End If If Peremen. Podrazdelenie - Zciprosi And Peremen.Dotqnosr Zdpros2 Then Kol k’)i + 1 : Sun suit + Val ( E’fc r emen . Zdrplata ) : Rez - iiiim / Koi End If


Страница: