1界面设计
(1)首先请同学们参照图3.11完成排序程序的界面设计。
图3.11 排序程序的界面设计2编写事件代码
“添加到初始序列中”按钮的Click事件:
Private Sub Command1_Click()
List1.AddItem Text.Text
End Sub
“排序”按钮的Click事件;
Private Sub Command2_Click()
Dim i, j As Integer
'定义数组,以List1的项目个数为数组维数
Dim strList(List1.ListCount) As Integer
'定义中间临时变量,用于数据交换
Dim strTmp As Integer
'将List1中的项目导入到strList数组中
For i = 0 To List1.ListCount
strList(i) = List1.List(i)
Next i
'按“冒泡”算法完成排序工作
For i = 0 To UBound(strList)
For j = i + 1 To UBound(strList)
If strList(i) > strList(j) Then
strTmp = strList(i)
strList(i) = strList(j)
strList(j) = strTmp
End If
Next j
Next i
'将排序结果输出到List2中
For i = 0 To UBound(strList)
List2.AddItem strList(i)
Next i
End Sub
3运行程序并调试程序语法错误
(1)运行程序,在Text1文本框中输入一个整数,比如1,然后单击“添加到初始序列中”按钮,此时会出现如图3.12所示的错误提示。
[i图3.12 实时错误(2)单击“调试”按钮,进入中断模式,VB编译器将自动标识出引发错误的语句行,如图3.13所示窗体。
图3.13 自动定位引发错误的语句行(3)分析错误原因,很容易发现该行语句的正确写法应该是:
List1.AddItem Text1.Text
(4)修改错误后,按F5键继续执行程序,将出现如图3.14所示界面。
图3.14 排序程序运行界面(5)依次输入整数序列21、9、8、6后,将出现如图3.15所示界面。
图3.15 输入初始序列后的界面(6)单击“排序”按钮后,又出现如图3.16所示的运行错误。
图3.16 编译错误(7)单击“确定”按钮后,再次进入中断模式,编译器以加重显示的形式指出了引发错误的位置,如图3.17所示。
图3.17 以加重显示的形式定位错误(8)分析如图3.16所示的错误提示“要求常数表达式”后,发现引用错误的原因是不能用变量作为数组的下标,即下列数组声明语句不符合VB语法约定:
Dim strList(List1.ListCount) As Integer
为此我们作如下选择,即采用动态数组声明的方法。
Dim strList() As Integer
ReDim strList(List1.ListCount) As Integer
(9)选择完成后,按F5键继续执行,又会出现如图3.18所示的错误提示。
图3.18 类型不匹配错误提示(10)单击“调试”按钮后,错误定位如图3.19所示。
图3.19 类型不匹配错误定位(11)分析错误原因发现,我们将数组strList()声明为Integer数据类型,而List1.List()表示的是字符型数据,VB无法进行自动类型转换,因此我们只能通过Val函数进行转换:
strList(i) = Val(List1.List(i))
(12)按F5键继续,程序成功运行,出现如图3.20所示界面。这说明语法错误已基本排除了。但是观察运行结果,发现“排序结果”序列中多出了一个数值0。这种结果并不是我们期望的。
图3.20 有问题的运行结果(13)关闭程序,重新运行,仍然出现图3.20的问题,这说明程序中存在逻辑问题,需要进一步调试。
4设置断点,分析逻辑错误
逻辑错误是最难定位的,对于那些逻辑稍微复杂的程序,常常需要花费大量的时间和精力查找分析。一般要用到设置断点、单步执行和立即调试窗等工具或技术。
(1)单击如图3.21所示位置,设置断点。
图3.21 设置断点(2)按F5键运行程序并输入一组整数,比如5、4、3、2。单击“排序”按钮后,程序将进入中断模式,出现如图3.22所示界面。
图3.22 程序遇到断点(3)在VB集成环境的“立即”窗口中,使用“?”打印strList数组的上界和相关的值,如图3.23所示。当然也可以使用Print、Debug.Print命令,它们等效于“?”。
[图3.23 在“立即”窗中观察变量的值(4)仔细分析不难发现,List1.ListCount的最大值是4,说明数字序列中共有4个数,即5、4、3、2。但是List1.List()的下标是从0开始的,下标最大值应该为3,即:
List1.ListCount – 1
为此,我们需要选择strList()数组的上界和循环次数。
'个性数组声明
ReDim strList(List1.ListCount - 1) As Integer
'修改循环次数
For i = 0 To List1.ListCount - 1
strList(i) = Val(List1.List(i))
Next i
(5)修改后的完整代码及运行结果如图3.24、图3.25[并排这两个图]所示。
图3.24 修改后的代码
图3.25 最终的运行结果
5程序的进一步完善
这个程序经过调试能够正常运行了,但还是存在一些不足,比如我们可以在Text1中输入非整数、字符和汉字等。另外,当重新单击“排序”按钮后,数字序列会被重复添加到List2中。上述情况下,应用程序并不会报错,但这与我们的设计要求是不相符的,因此需要进一步完善程序功能,主要有以下两种措施,这些知识将在后续章节介绍。请同学们先提前思考一下。
(1)通过Keypress事件控制Text1控件的输入,使它只能接收数字。
(2)在“排序”按钮的Click事件中加入List2.Clear语句。