图 6-17 例 6.9 的运行结果
说明:程序运行时,用户可以在组合框的列表框部分选择学生的学位,也可以在文本框 部分输入项目列表中未列出的学位。如果用户在“特长”下面的列表框中双击一个项目,则 上面的列表框中将自动出现该项目,表示用户选中了某个特长。如果用户在上面的“已选特 长”列表框中双击一个项目,则该项目将自动消失,表示用户放弃了对某个特长的选择。
思考:如果只安排一个“特长”列表框,并且把列表框控件的 MultiSelect 属性值设置 为 1,即允许多选,此时应如何编写程序,使得可以显示用户在“特长”列表框中选择的多 个项目?
6.9 程序举例
【例 6.10】采用冒泡排序法对 n 个整数按升序排序。
分析:冒泡排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,
大数放在后面。即首先比较第 1 个和第 2 个数,将小数放前,大数放后。然后比较第 2 个数 和第 3 个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数 放后。重复以上过程,仍从第 1 对数开始比较(因为可能由于第 2 个数和第 3 个数的交换,
使得第 1 个数不再小于第 2 个数),将小数放前,大数放后,一直比较到最大数前的一对相邻 数,将小数放前,大数放后,第 2 趟结束,在倒数第 2 个数中得到一个新的最大数。如此下 去,直至最终完成排序。
由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。
Private Sub Command1_Click()
Dim a(1 To 5) As Integer, i%, j%, t%
Next j Next i
Picture1.Print "输出排序之后的数列"
For i = 1 To n Picture1.Print a(i);
Next i Picture1.Print End Sub
运行程序,结果如图 6-19 所示。
图 6-19 例 6.10 的运行结果
说明:程序中为了从 1 开始,将 Array 函数生成的数组 b 逐个复制到 a 中,a 的下标从 1 开始,其实也可以将程序改成从下标 0 开始,具体代码如下:
Private Sub Command1_Click() Dim i%, j%, t%
Dim a() As Variant
a = Array(165, 100, 102, 150, 110) n = 5
Picture1.Print "输出原数列"
For i = 0 To n - 1 Picture1.Print a(i);
Next i Picture1.Print '开始排序 For i = 0 To n - 2 For j = 0 To n - i - 2 If a(j) > a(j + 1) Then
t = a(j) 'a(j)与 a(j+1)交换 a(j) = a(j + 1)
a(j + 1) = t End If Next j Next i
Picture1.Print "输出排序之后的数列"
For i = 0 To n - 1 Picture1.Print a(i);
Next i Picture1.Print End Sub
【例 6.11】判断用户输入的文本是否为回文。如果一个文本的逆序与原文完全相同,这 样的文本就称为回文,例如“abcba”、“B2B”、“16861”等。
分析:定义一个字符串变量 a,存放输入的文本,利用 Split 函数将其分隔到数组 b 中,
用 s 代替 b 的每个元素。其次定义 2 个指示器 left 和 right,left 初始指示文本的第一个字符,
right初始指示文本的最后一个字符。在循环结构中反复判断 left 和 right 各自指示的字符是否 相同,如果不同,显然不是回文;如果相同,则 left 不断加 1 向右移动,而 right 不断减 1 向 左移动。
Private Sub Command1_Click()
Dim a As String, i%, left%, right%, flag As Boolean Dim b() As String
Dim s As String
a = Trim(Text1.Text) b = Split(a)
For i = LBound(b) To UBound(b) s = b(i)
left = 1 right = Len(s) flag = True
Do While left < right
If Mid(s, left, 1) <> Mid(s, right, 1) Then flag = False
Exit Do End If left = left + 1 right = right - 1 Loop
If flag = True Then
Picture1.Print s + "是回文"
Else
Picture1.Print s + "不是回文"
End If Next i End Sub
Private Sub Form_Load() Text1.Text = ""
End Sub
运行程序,结果如图 6-20 所示。
图 6-20 例 6.11 的运行结果
说明:第 7 章将介绍判断回文的递归解法。
【例 6.12】编写程序,输出 n 行杨辉三角形。
分析:杨辉三角形中的各个元素实际上是二项式(a+b)n的展开式中各项的系数,例如:
(x+y)1展开后:x+y (x+y)2展开后:x2+2xy+y2 (x+y)3展开后:x3+3x2y+3xy2+y3 (x+y)4展开后:x4+4x3y+6x2y2+4xy3+y4 将多项式系数排列可以得到下面的图形:
1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 其中第 m 项为:
mn n!
C =m!(n m)!
− 杨辉三角形的规律如下:
(1)第一列及对角线元素均为 1。
(2)其他元素为其所在位置的上一行对应列和上一行前一列元素之和,如图 6-21 所示 三角形中标注的三个数 4、6、10。
图 6-21 杨辉三角形分析示意图 程序代码如下:
Private Sub Command1_Click()
Dim a() As Integer, n%, i%, j%, k%
n = 10
ReDim a(1 To n, 1 To n) For i = 1 To n
a(i, 1) = 1 '第一列元素置为 1 a(i, i) = 1 '对角线元素置为 1 Next i
For i = 3 To n '从第三行开始
For j = 2 To i - 1 '从第二列开始,到对角线为止 a(i, j) = a(i - 1, j - 1) + a(i - 1, j)
Next j
Next i For i = 1 To n k = 0 For j = 1 To i
Picture1.Print Tab(k * 6); a(i, j);
k = k + 1 Next j Picture1.Print Next i
End Sub
运行程序,结果如图 6-22 所示。
图 6-22 例 6.12 的运行结果
【例 6.13】编写程序删除一个字符串中的所有数字字符。
实现该算法的方法很多,下面是其中较简单的一种:
Private Sub Command1_Click() Dim s As String, t As String, i%, j%
s = Text1.Text t = ""
For i = 1 To Len(s)
If Not (Mid(s, i, 1) >= "0" And Mid(s, i, 1) <= "9") Then t = t + Mid(s, i, 1)
End If Next i
Picture1.Print t End Sub
Private Sub Form_Load() Text1.Text = ""
End Sub
运行程序,结果如图 6-23 所示。
图 6-23 例 6.13 的运行结果
如果要求不使用中间变量 t,直接在 s 上进行删除操作呢?下面的程序可以做到这一点:
Private Sub Command1_Click() Dim s As String, t As String, i%, j%
s = Text1.Text t = ""
j = Len(s) i = 1
Do While i <= j
If Mid(s, i, 1) >= "0" And Mid(s, i, 1) <= "9" Then s = Left(s, i - 1) + Right(s, j - i)
j = Len(s) '重新计算新串的长度 Else
i = i + 1 '非数字字符时才将 i 加 1,使得 i 指向下一个字符 End If
Loop
Picture1.Print s End Sub
Private Sub Form_Load() Text1.Text = ""
End Sub
习题
1.写出单击窗体后,下列程序段的运行结果。
Private Sub Form_Load() Show
Dim a(3, 5) As Integer, i As Integer, j As Integer For i = 1 To 3
For j = 1 To 5
a(i, j) = a(i - 1, j) + j Next j
Next i Print a(3, 4) End Sub
2.将一个长度为 10 的数组逆序存储。
3.完成一个 3×3 矩阵的转置(即行列互换)。
4.编写程序,求下列矩阵各行元素之和及各列元素之和。
1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 4 5 6 7 8
5.把两个已按升序排列的数列合并为一个新数列,该数列仍按升序排列。例如数列 a 是 [1,3,6,7,9],数列 b 是[2,4,5,8,10],合并之后的新数列是[1,2,3,4,5,6,7,8,9,10]。
6.把一个数插入到一个已按升序排列的数列 a 中,并使该数列仍按升序排列。例如数列 a是[1,3,6,8,9,10],要插入的数是 4,合并之后的新数列是[1,3,4,6,8,9,10]。
7.某班有学生 60 人,学习语文、数学、英语和计算机 4 门课程。输入所有学生各门课 程的成绩,输出单科成绩的最高分以及该班每门课的平均成绩。