• 沒有找到結果。

图 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 门课程。输入所有学生各门课 程的成绩,输出单科成绩的最高分以及该班每门课的平均成绩。

相關文件