visual basic程序设计教程第四版答案(刘炳文)
假定在磁盘上已建立了一个通信录文件,文件中的每个记录包括编号、用户名、电话号码和地址等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
本站文章搜索: