1 / 34

# 第五章 VB 中的数组 - PowerPoint PPT Presentation

I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.

## PowerPoint Slideshow about ' 第五章 VB 中的数组' - yen

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.

- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

5.2 静态数组

[程序代码]

Private Sub Command1_Click()

Dim maxa As Integer, mina As Integer, x As Integer, i As Integer

Form1.Cls ‘每单击一次清除原来内容

maxa = 50 ‘假设较小的数为最大

mina = 100 ‘假设较大的数为最小

Randomize

For i = 1 To 20

x = Int(Rnd * 51 + 50)

Print x;

IF i Mod 10 = 0 Then Print

IF x > maxa Then maxa = x

F x < mina Then mina = x

Next i

Print

Print "最大值为"; maxa

Print "最小值为"; mina

End Sub

x是一个简单变量，存放的是最后一个随机数

5.2.1 一维数组的声明和引用

1. 静态数组及声明

Option Base 1

(2)错误的声明，下标是变量

n =Inputbox("输入n "）：Dim x(n) As Single

• Dim数组名（[下界 to ]上界）[As类型]（也可使用类型符号）

• 上界>=下届
• 上界/下届必须为常数，不可以为表达式和变量
• 如果声明数组时省略类型，则为variant变体型。
• 可以在一条dim语句中同时定义多个数组，用逗号分隔

dim c(15) as integer, b(5) as single

5.2.1 一维数组的声明和引用
• 2．一维数组元素的引用

a(1)=1:a(i)=x+y:a(i+1)=t

print a (1);a(i)

x(10)=100 \' 对x(10)这个数组元素赋值

5.2.2使用一维数组

1．一维数组的赋值

（1）对数组中的元素逐个赋值

arr(0)=5 : arr(1)=4 : arr(2)=-2 : arr(3)=1 : arr(4)=-8 : arr(5)=6

（2）使用循环语句对数组元素赋值

For i=0 to 5

arr(i)=Int(Rnd*90)+10

Next i

（2）使用循环语句对数组元素赋值
• 例如：
• For i=1 to 5
• a(i)=val(inputbox(“请输入一个数字”))
• Next i
• 例如：
• For i=1 to 50
• a(i)=5
• Next I
• 例如：
• For i=1 to 50
• a(i)=100+i
• Next I
2．一维数组的输出

For i=0 to 5

Print arr(i)

Next i

Private Sub Form_Click()

Dim a%(1 To 50), i%, sum%, ave%

sum = 0

For i = 1 To 50

a(i) = Int(Rnd * 101)

sum = sum + a(i)

Print Tab(5 * ((i - 1) Mod 10)); a(i);

If i Mod 10 = 0 Then Print

Next i

ave = sum / 50

Print

Print "总和为："; sum; "平均值为："; ave

End Sub

Private Sub Form_Click()

Dim a%(1 To 50), i%, sum%, ave%

sum = 0

For i = 1 To 50

a(i) = Int(Rnd * 101)

Print Tab(5 * ((i - 1) Mod 10)); a(i);

If i Mod 10 = 0 Then Print

Next I

for i=1 to 50

sum=sum+a(i)

next i

ave = sum / 50

Print

Print "总和为："; sum; "平均值为："; ave

End Sub

3.静态一维数组的复制

Dim a(1 to 10) as integer,b(1 to 10) as integer

For i=1 to 10

a(i)=val(inputbox(“请输入一个数”))

Next i

For i=1 to 10 ‘开始复制数组

b(i)=a(i)

Next i

5.3.1动态数组的声明

Redim语句的格式：

ReDim数组名（下标1[，下标2…]）[As类型]

其中下标可以是常量，也可以是有了确定值的变量，类型可以省略，若不省略，必须与Dim中的声明语句保持一致。

Dim x( ) As Single

n =Inputbox(“输入n”）

ReDim x(n)

End Sub

• Dim、Private、Public变量声明语句是说明性语句，可出现在过程内或通用声明段；ReDim语句是执行语句，只能出现在过程内。
• 在过程中可多次使用ReDim来改变数组的大小和维数。

Dim a() as integer

Redim a(10):改变数组大小

Redim a(3,4):改变数组大小和维度

Redim a(4,5)

• 可使用redim来改变数组的格式和维度，但不能改变数组的数据类型
• 使用ReDim语句会使原来数组中的值丢失，可以在ReDim语句后加Preserve参数来保留数组中的数据。使用Preserve只能改变最后一维的大小，前面几维大小不能改变。 ReDim中的下标可以是常量，也可以是有了确定值的变量。
• 静态数组在程序编译时分配存储单元，动态数组在运行时分配存储单元。
5.3.1动态数组的声明
• 要保留原来数组中的数据，使用Preserve。但只能改变最后一维的大小，不能改变维度。
• 格式：Redim Preserve 数组名(下标)
• 例如：

Dim a() as integer, Dim b() as integer

Redim a(10) ’动态改变数组大小

Redim Preserve a(4) ‘改变数组大小,并保存原来数组中的数据

Redim b (3,5)

Redim Preserve b (3,6) ‘只能改变最后一维的大小

Redim Preserve b(3) ’出错

5.3.2与动态数组操作相关的函数

1.Array函数(p98)

（1）用Array函数给动态数组赋值后，该数组被确定为一维数组，其下标下界由Option Base n语句决定，下标上界由参数个数决定。

（2）用Array函数也可给Variant类型的变量赋值，此时该变量也表示一个Variant类型的动态数组。

a=Array(1,”abc”,3)

b=Array(5,6)

a=Array(9,8,7,6) ‘重新改变数组a的元素个数

ReDim Preserve a(2),b(1 To 5)： 改变数组a、b的大小，并保留原来的数据。

2.Lbound()函数和Ubound()函数

Lbound()函数和Ubound()函数帮助用户确定数组每一维下标的变化范围，Lbound()函数返回数组的下界，Ubound()函数返回数组上界。

For i=Lbound (a) To Ubound(a)

Print a(i)

Next i

a=array(3,4,5)

For i=Lbound (a) To Ubound(a)

Print a(i)

Next i

a=array(12,43,56,86,87)

For i=Lbound (a) To Ubound(a)

Print a(i)

Next i

Dim a()

a = Array(-3, -6, 2, 4, 8, 12)

Print "原数组中的元素为："

For i = 0 To 5

Print a(i);

Next i

Print

End Sub

Private Sub Command1_Click()

Dim i%, j%, x%

x = Val(Text1.Text)

For i = 0 To UBound(a)

If x <= a(i) Then Exit For

Next i

ReDim Preserve a(UBound(a) + 1)

For j = UBound(a) To i Step -1

a(j) = a(j - 1)

Next j

a(i) = x

Print "插入元素后的数组为："

For i = 0 To UBound(a)

Print a(i);

Next i

Print

End Sub

Private Sub Command2_Click()

i = 0

Do While (i <= UBound(a))

If a(i) < 0 Then

If i < UBound(a) Then

For j = i To UBound(a) - 1

a(j) = a(j + 1)

Next j

End If

ReDim Preserve a(UBound(a) - 1)

n = n - 1

Else

i = i + 1

End If

Loop

Print "删除负数后数组为："

For i = 0 To UBound(a)

Print a(i);

Next i

End Sub

5.4 数组的基本操作

1. 数组元素的赋初值

(1)用循环

For i = 1 To 10

iA(i)=0

Next i

(2) Array函数

Dim ib As Variant

ib = Array("abc", "def", "67")

For i = 0 To UBound(ib)

Picture1.Print ib(i); " ";

Next i

• 注意：
• 利用Array对数组各元素赋值，声明的数组是可调数组或连圆括号都可省，并且其类型只能是Variant。
• 数组的下阶为零，上界由Array函数括号内的参数个数可决定，也可通过函数Ubound获得。

Redim b(UBound(a))

For i = 0 To UBound(a)

b(i) = a(i)

Next i

• 2．数组的赋值(p101 注意）
• 在VB6.0中，提供了数组直接对数组的赋值。例如：
• Dim a() As Variant, b() As Variant, i%
• a = Array(1, 2, 3, 4, 5)
• b = a
• 3. 数组的输出
• 输出方阵sC中的下三角元素
• For i = 0 To 4
• For j = 0 To i
• sc(i, j) = i * 5 + j
• Print sc(i, j); " ";
• Next j
• Print \' 换行
• Next I

4. 求数组中最大元素及所在下标

Dim Max As Integer,iMax As Integer

Max=iA(1)：iMax=1

For i = 2 To 10

If iA(i)>Max Then

Max=iA(i)

iMax=i

End If

Next I

5. 将数组中各元素交换

For i =1 To 10\2

t=iA(i)

iA(i)=iA(10-i+1)

iA(10-i+1)=t

Next I

• 1.静态数组声明下标出现变量
• n = InputBox("输入数组的上界")
• Dim a(1 To n) As Integer
• 2．数组下标越界
• 引用的下标比数组声明时的下标范围大或小。
• Dim a(1 To 30) As Long, i%
• a(1) = 1: a(2) = 1
• For i = 2 To 30
• a(i) = a(i - 2) + a(i - 1) a(0)不存在
• Next i
• 3．数组维数错
• 数组声明时的维数与引用数组元素时的维数不一致。
• Dim a(3, 5) As Long
• a(i)=10
• 4．Aarry函数与Split函数使用问题
• 只能对Variant 的变量或动态数组赋值。
• 5．获得数组的上界、下界
• Ubound 、Lbound函数

1.数组排序（选择法）

(1) 从n个数的序列中选出最小的数(递增)，与第1个数交换位置；

(2) 除第1个数外，其余n-1个数再按(1)的方法选出次小的数，与第2个数交换位置；

(3) 重复(1)n-1遍，最后构成递增序列。

For i = 1 To n - 1

iMin= i

For j = i+1 To n

If a(j) <a(iMin) Then iMin = j

Next j

t= a(i): a(i) = a(iMin) : a(iMin) = t

Next I

2.排序（冒泡法）

Private Sub Command1_Click()

Dim b As Variant, n As Integer

Cls

b = Array(17, 10, 45, 27, 60, _

18, 79, 41, 59, 21)

Print " 数组输出："

n = UBound(b)

For i = 0 To n

Print b(i);

Next i

Print

For i = 0 To n - 1 \'开始排序

For j = n To i + 1 Step -1

If b(j - 1) > b(j) Then

t = b(j - 1): b(j - 1) = b(j): b(j) = t

End If

Next j

Next i

Print " 冒泡法排序后输出："

For i = 0 To n

Print b(i);

Next i

Print

End Sub

3. 查找

Private Sub Command1_Click()

Dim i As Integer, tofind As Integer, found As Boolean

tofind = Val(InputBox("查找", "请输入要查找的数"))

found = False

For i = 0 To UBound(a)

If a(i) = tofind Then

found = True

Exit For

End If

Next i

If found = True Then

Form1.Print "您要找的数是"; tofind; "。在数组中找到，在第"; i + 1; "个元素"

Else

Form1.Print "您要找的数是"; tofind; "。抱歉，在数组中未找到"

End If

End Sub

4. 统计

• 例5-5输入字符串分别统计该字符串中每个数字字符(“0” ~“9”)出现的次数。用num(0)来统计字符“0”的个数，用num(1)来统计字符“1”的个数，…，用num(9)来统计字符“9”的个数，并显示最后的统计结果。程序运行结果如图所示。

Private Sub Command1_Click()

Dim num%(0 To 9), i%, j%, a As String * 1

Picture1.Cls

lg = Len(Text1.Text)

For i = 1 To lg

c = Mid(Text1, i, 1)

If c >= "0" And c <= "9" Then

j = Asc(c) - 48

num(j) = num(j) + 1

End If

Next i

For i = 0 To 9

If num(i) > 0 Then Picture1.Print """"; Chr\$(i + 48); """"; "="; num(i);

Next i

End Sub

4.数组元素的插入与删除

• (1) 插入(例5-4)
• 在有序数组a(1 to n)(原有n-1个元素)插入一个值Key元素，算法：
• 查找要插入的位置k（1<=k<=n-1）
• 腾出位置，把最后一个元素开始到第k个元素往后移动一个位置
• 第k个元素的位置腾出，就可将数据Key插入

(2) 删除

5.4控件数组
• 5.4.1控件数组的概念

控件数组是一组相同类型的控件，共用同一个控件名，共享同样的事件过程，完成相似的操作，每个控件都有一个唯一的下标，即Index属性，第一个元素的下标为0。控件数组适用于若干个控件执行的操作相似的场合。

5.4.2控件数组的建立

1.在设计阶段静态创建

（1）在窗体上创建控件数组中的第一个控件，并设置好控件名等相关属性。

（2）选择该控件，执行 “复制”命令。

（3）根据需要执行若干次 “粘贴”命令。

（4）进行事件过程的编程。

2.在运行阶段动态添加

（1）在窗体上创建控件数组中的第一个控件，设置好控件名等相关属性后，设置其Index属性值为0，表示这是一个控件数组。

（3）设置新添加控件的相关属性，可通过Left属性和Top属性确定其位置，并将Visible属性设置为True。

5.4.3控件数组的引用

（2）把3个命令按钮的Caption属性依次设置为“命令按钮1”，“命令按钮2”和“退出”

（3）双击任一命令按钮，打开代码编辑窗口，键入如下事件过程：

Private Sub comtest_Click(Index As Integer)

FontSize=12

If Index=0 Then

Print “单击第一个命令按钮”

ElseIf Index=1 Then

Print “单击第二个命令按钮”

Else

End

End If

End Sub

5.2.3二维数组的声明和引用

1.静态二维数组的声明

2．二维数组的赋值和引用

例如：

Dim s(5,6)As integer

For i= 0 To 5

For j=0 To 6

s(i,j)=InputBox("输入第" & i & "行第" & j &"列的值")

form1.print s(i,j)

Next j

Next i

Option Base 1

Dim a%()

Dim n%

Private Sub Command1_Click()

Dim i%, j%

Picture1.Cls

n = Val(Text1.Text)

ReDim a(n, n)

For i = 1 To n

For j = 1 To n

a(i, j) = (i - 1) * n + j

Picture1.Print Tab(4 * j); a(i, j);

Next j

Picture1.Print

Next i

ReDim Preserve a(n, n)

Command2.Enabled = True

Command3.Enabled = True

End Sub

• 例5-3：在文本框中输入矩阵的行列数n，根据文本框内输入矩阵的行列数n，用1～n×n的自然数生成1个n×n矩阵（数组），并显示在图形框中， 并分别能显示上、下三角矩阵。程序运行界面如图所示。

Command2.Enabled = False

Command3.Enabled = False

End Sub

Private Sub Command2_Click()

Picture1.Cls

For i = 1 To n

For j = i To n

a(i, j) = (i - 1) * n + j

Picture1.Print Tab(4 * j); a(i, j);

Next j

Picture1.Print

Next i

End Sub

• 变换为上三角及下三角矩阵的程序代码：

Private Sub Command3_Click()

Picture1.Cls

For i = 1 To n

For j = 1 To i

a(i, j) = (i - 1) * n + j

Picture1.Print Tab(4 * j); a(i, j);

Next j

Picture1.Print

Next i

End Sub

Private Sub Command1_Click()

Dim a%(1 To 5, 1 To 5), t(1 To 5) As Integer

Picture1.Print "生成的原始矩阵为：" & vbCrLf

For i = 1 To 5

For j = 1 To 5

a(i, j) = 5 * (i - 1) + j

Picture1.Print Tab(5 * (j - 1)); a(i, j);

Next j

Picture1.Print

Next i

Picture2.Print "变换后的矩阵为：" & vbCrLf

For j = 1 To 5 \'保存第一行数据于数组t()

t(j) = a(1, j)

Next j

For j = 1 To 5

a(5, j) = t(j)

Next j

For i = 1 To 5

For j = 1 To 5

Picture2.Print Tab(5 * (j - 1)); a(i, j);

Next j

Picture2.Print

Next i

End Sub

• 例5-2用1～25的自然数生成1个5×5按自然排列的二维矩阵，并输出到Picture1上；然后将该矩阵循环上移一行，第一行元素换到最后一行，结果在Picture2上输出。程序运行界面如图所示。

For i = 1 To 4

For j = 1 To 5

a(i, j) = a(i + 1, j)

Next j

Next i

5.2.4多维数组的声明和引用

我们把三维以上的数组统称为多维数组，在应用程序中，多维数组的使用与二维数组非常相似。

1.静态多维数组的声明

Dim数组名（下标1，下标2，……，下标n）[As类型]

2. 静态多维数组的引用

（1）下标个数决定数组的维数，最多60维（即n≤60）。

（2）每一维的元素个数=上界-下界+1；数组的元素个数=每一维的元素个数的乘积。