假定在磁盘上已建立了一个通信录文件,文件中的每个记录包括编号、用户名、电话号码和地址等4项内容。试编写一个程序,用自己选择的检索方法(如二分法)从文件中查找指定的用户的编号,并在文本框中输出其名字、电话号码和地址。

    解:我们假定已建立了通信录文件,并且知道该文件中记录的个数。通信录文件名为comm.txt,该文件中记录的个数存放在tel.txt文件中,这两个文件均位于d:\目录下。
comm.txt的内容如下:
1602,"张三","13776541255","解放路15号"
1609,"李四","13987651543","建国大道123号"
1601,"王五麻子","13598769988","张家巷98号"
1603,"江学民","18977650876","胜利路19号附3号"
1606,"李小明","18632781234","和平路88号"
1605,"潘小东","12587654455","北京路129号"
1608,"胡鑫","18798765432","青年大道45号"
1604,"龚小英","13298231877","重庆东路8号"
1607,"朱明","18976541234","韶山北路1号"

tel.txt文件的内容为:9

  按以下步骤操作。

(1)在窗体画三个命令按钮,其标题分別为“添加数据”、“检索数据”和“退出”,在属性窗口中设置适当的字体和字号,完成后的窗体如下图所示。


(2)执行“工程”菜单中的“添加窗体”命令,添加一个窗体(Form2),在窗体上画4个标签、3个文本框和一个命令按钮,如下图所示。


(3)执行“工程”菜单中的“添加模块”命令,添加一个标准模块,在该模块中定义如下类型和变量:
Type Tel_Addr
num As Integer
User_Name As String
Tel As String
User_Addr As String
End Type

Option Base 1
Public Tel_Addr_Rec() As Tel_Addr
Public n As Integer

 (4)编写第一个窗体的Form_Load事件过程:

Private Sub Form_Load()
     Command1.Enabled = False
 End Sub

在该过程中,把第一个命令按钮(即“添加数据”)的Enabled属性设置为False。也就说,在程序开始运行时,该按钮是禁用的。只有在单击“检索数据”按钮后才能启用“添数据”按钮(见后)。

(5)编写第一个窗体中“添加数据”按钮的事件过程:

Private Sub Command1_Click()
    num = InputBox("请输入要添加的用户数量")
    num = CInt(num)
    n = n + num
    ReDim Tel_Addr_Rec(num) As Tel_Addr
    Open "d:\comm.txt" For Append As #1
    For i = 1 To num
        Tel_Addr_Rec(i).num = InputBox("输人编号:")
        Tel_Addr_Rec(i).User_Name = InputBox("请输人用户名字")
        Tel_Addr_Rec(i).Tel = InputBox("请输人用户电话号码")
        Tel_Addr_Rec(i).User_Addr = InputBox("请输人地址")
        Write #1, Tel_Addr_Rec(i).num, _
              Tel_Addr_Rec(i).User_Name, _
              Tel_Addr_Rec(i).Tel, _
              Tel_Addr_Rec(i).User_Addr
    Next i
    Close #1
    Open "d:\tel.txt" For Output As #1
    Print #1, n
    Close #1
End Sub


 
该程序用来向通信录文件中添加数据。如前所述,只有在执行“检索数据”按钮的事件过程后才能执行这个事件过程。过程中的全局变量n在执行“检索数据”事件过程时得到,新添加的id录个数为num,添加完数据后,文件中记录的个数为n = n + mun。在过程的最后,把n写人存放记录个数的文件(tel.txt),以备下次检索时使用。

(6)编写第一个窗体中“检索数据”按钮事件过程:

Private Sub Command2_Click()

    Command1.Enabled = True
    Open "d:\tel.txt" For Input As #1
    Input #1, n
    Close #1

    ReDim Tel_Addr_Rec(n) As Tel_Addr
    Open "d:\comm.txt" For Input As #2
    x = 1
    '读数据
    Me.Cls
    Print "文件中原来的数据"
    Do While Not EOF(2)
        Input #2, Tel_Addr_Rec(x).num, _
              Tel_Addr_Rec(x).User_Name, _
              Tel_Addr_Rec(x).Tel, _
              Tel_Addr_Rec(x).User_Addr

        Print Tel_Addr_Rec(x).num, _
              Tel_Addr_Rec(x).User_Name, _
              Tel_Addr_Rec(x).Tel, _
              Tel_Addr_Rec(x).User_Addr
        x = x + 1
    Loop
    Close #2

    '排序

    For i = n To 2 Step -1
        For j = 1 To i - 1
            If Tel_Addr_Rec(j).num > Tel_Addr_Rec(j + 1).num Then
                T = Tel_Addr_Rec(j + 1).num
                Tel_Addr_Rec(j + 1).num = Tel_Addr_Rec(j).num
                Tel_Addr_Rec(j).num = T

                T = Tel_Addr_Rec(j + 1).User_Name
                Tel_Addr_Rec(j + 1).User_Name = Tel_Addr_Rec(j).User_Name
                Tel_Addr_Rec(j).User_Name = T

                T = Tel_Addr_Rec(j + 1).Tel
                Tel_Addr_Rec(j + 1).Tel = Tel_Addr_Rec(j).Tel
                Tel_Addr_Rec(j).Tel = T

                T = Tel_Addr_Rec(j + 1).User_Addr
                Tel_Addr_Rec(j + 1).User_Addr = Tel_Addr_Rec(j).User_Addr
                Tel_Addr_Rec(j).User_Addr = T
               
            End If
        Next j
    Next i

    '排序后输出
    Print "---------------------------"
    Print "排序后的数据:"
    For i = 1 To n
        Print Tel_Addr_Rec(i).num, _
              Tel_Addr_Rec(i).User_Name, _
              Tel_Addr_Rec(i).Tel, _
              Tel_Addr_Rec(i).User_Addr
    Next i

    '检索
    flag = 0
    ta = InputBox("请输人要检索的编号", "输入査找内容", , 5000, 6000)
    lo = 1
    hi = n + 1 
     i = Int(n / 2 + 1)
    For k = 1 To Int(n / 2)
        If Tel_Addr_Rec(i).num = ta Then
            Form2.Show
            Form2.Text1.Text = Tel_Addr_Rec(i).User_Name
            Form2.Text2.Text = Tel_Addr_Rec(i).Tel
            Form2.Text3.Text = Tel_Addr_Rec(i).User_Addr
            flag = 1
            Exit For
        Else
            If Tel_Addr_Rec(i).num < ta Then
                lo = i
            Else
                hi = i
            End If
        End If
        i = Int((hi - lo) / 2) + lo
    Next k
    If flag = 0 Then
        MsgBox "没有要査找的编号", , ""
    End If

End Sub

Private Sub Command3_Click()
    End
End Sub

Private Sub Form_Load()
    Command1.Enabled = False
End Sub

该过程代码较多,实际上执行了3种操作,即:
1.把通信录中的数据读到内存,放到记录数组 Tel_Addr_rec中,然后在窗体上显示出来。
2.对记录按编号从小到大的顺序迸行排序。二分法(折半法)只能对排过序的记录进行检索,因此,在检索前必须对记录排序。
3.用二分法检索数据。二分法检索的基本思路是:首先把要检索的数据项与文件中位于中部(二分之一处)的记录进行比较,如果相等,则它就是要检索的数据;如果大于,则要査找的数据项位于文件的后半部,否则位于前半部,然后再取后半部 或前半部继续检索,直至找到所需要的数据项(如果有的话)。找到所需要的数据 (编号)后,将打开第二个窗体,显示记录的内容;如果没有找到,则显示相应的信息。

(7)编写第一个窗体中“退出”按钮事件过程:
Private Sub Command3_Click()
     End
 End Sub
该过程用来结束程序运行。

(8)编写第二个窗体的事件过程:
Private Sub Command1_Click()
 Unload Me
End Sub

Private Sub Form_Load()
    Label1.FontSize = 16
    Label1.Caption = "姓名"
    Label2.FontSize = 16
    Label2.Caption = "电话"
    Label3.FontSize = 16
    Label3.Caption = "地址"
    Label4.FontSize = 16
    Label4.FontName = "幼圆"
    Label4.FontBold = True
    Label4.Caption = "要査找的用户为:"
    Text1.FontSize = 16
    Text2.FontSize = 16
    Text3.FontSize = 16
    Command1.Caption = "返回"
    Command1.FontSize = 18
    Command1.FontName = "隶书"
End Sub

最后运行此程序,效果如下图所示。

来源:visual basic程序设计教程第四版答案(刘炳文)

本文链接:http://www.wb98.com/vb1/post/vb_14.10.html

本站文章搜索:

<< 上一篇下一篇 >>

搜索

Tags列表

扫我手机登录

赞助商链接