国开学习网电大VisualBasic程序设计形考任务二答案

Open

【本人姓名】实验3冒泡排序程序.zip

下载:115 次
简介:[下载后请重命名添加本人姓名]
【上面答案为下列试题答案,请核对试题后再购买下载】www.botiku.com零号电大
请同学选择课程【第3章】-【实战演练】“实验3 冒泡排序程序”,在VB集成开发环境中认真完成实验。
实验完成后,将调试好的程序保存在以“姓名+实验名称”命名的文件夹下,并将该文件夹压缩成.rar或者.zip格式进行提交。 本次实验满分15分,提交后需要辅导教师批阅打分。
实验目的

1理解冒泡排序算法。

2掌握循环、分支结构的使用方法。

3掌握断点设置、监视跟踪等调试方法,深入分析该程序的运行过程、值的变化情况。

实验内容

本实验开发一个“冒泡排序”程序,并通过这个程序,巩固一下第2章所学的程序调试方法。这个程序的运行逻辑是:首先用户在Text1中输入一个整数,单击“添加到初始序列中”按钮后将该整数添加到“初始序列”List1中,如此多次后,再单击“排序”按钮,在List2中显示排序结果,我们期望的运行结果如图3.10所示。

图3.10 期望的程序运行结果
实验步骤

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语句。

回复

使用道具 举报