? 数组的概念
? 数组的基本操作
? 动态数组
? 控件数组
? 程序示例
? 小结
? 关于期中考试
数 组 第 5章
数组的作用?
此类数据结构
来处理数据量大、
类型相同且有序排
列的数据。
回顾
时间,
5月 27日中午
要求,
60分钟做完
窗体上注明,
班级学号姓名
随机抽题
临时点题可加分
1.实验书 P52
2.实验书 P55(6--6)
3.实验书 P60
4.实验书 P63(7--5)
5.实验书 P64(7--7)
6.实验书 P72(8--4)
7.教材 P116第 9题
8.教材 P115第 2题
关于期中上机考试
数组的概念
数组可用于存储成组的有序数据。使用数组
就是用一个相同的名字引用这一组变量中的数据,
这个名字被称为 数组名 。
?数组命名与数组元素
?数组定义
?数组的结构
?数组函数及数组语句
5.1
数组命名与数组元素
? 数组名 的命名规则与简单变量命名规则一样。
? 数组内的每个成员称为 数组元素,数组元素又称
为 下标变量,数组元素的类型也就是数组的类型。
? 数组元素名的一般形式是:
其中:下标可以是常量、变量或算术表达式。当
下标的值为非整数时,会自动进行四舍五入。
5.1.1
数组名 (下标1 [,下标2 …… ])
数组定义
? 数组说明语句
? 数组的初始化
5.1.2
定义,
1、名称和数据类型
2、维数和每一维的上、
下界的取值范围。
数组类型:
静态数组和动态数组。
数组说明
? 同变量定义(地点?语句?)
? Option base 1 语句的功能
? 维的大小 =上界 --下界 +1
? 数组元素总个数 =各维数连乘
? 数组类型定义 (例 )
? 数组维说明示例
数组说明语句 示例
Dim A(6) As Integer
Private Name(1999 To 2002) As String * 8
Dim B(2,1 to 2) As Integer
A(6)A(5)A(4)A(3)A(2)A(1)A(0)
Name(2002)Name(2001)Name(2000)Name(1999)
B(2,2)B(2,1)B(1,2)B(1,1)B(0,2)B(0,1)
数组维说明示例
Dim M As integer
Const N As Integer = 5
Dim A(N) As Integer √
Dim B(1 To 6.6) As Integer √
Dim C(1 To 2 + 3) As Integer √
Dim D(0 To M) As Integer ×
数组初始化
? 数值型的数组元素初始值为零
? 变长字符类型的数组元素初始值为空
字符串
? 定长字符类型的数组元素初始值为指
定长度个数的空格
? 布尔型的数组元素初始值为 False
? 变体( Variant)类型的数组元素的初
始值是 Empty。
数组的结构
? 一维数组的结构
? 二维数组的结构
? 三维数组的结构
5.1.3
一维数组的结构
Dim StrA(8) As Integer
线性顺序
StrA(0)
StrA(1)
StrA(2)
StrA(3)
StrA(4)
StrA(5)
StrA(6)
StrA(7)
StrA(8)
StrA(8)
StrA(7)
StrA(6)
StrA(5)
StrA(4)
StrA(3)
StrA(2)
StrA(1)
StrA(0)
存储结构
逻辑结构
存储结构
二维数组的结构
? Option Base 1
Dim Table(3,4) As Integer
按列存放
Table(1,1)
Table(2,1)
Table(3,1)
Table(1,2)
Table(2,2)
Table(3,2)
Table(1,3)
Table(2,3)
Table(3,3)
Table(1,4)
Table(2,4)
Table(3,4)
Table(3,1)
Table(2,1)
Table(3,2) Table(3,3) Table(3,4)
Table(2,2) Table(2,3) Table(2,4)
Table(1,1) Table(1,2) Table(1,3) Table(1,4)
存储结构逻辑结构 存储结构
三维数组的结构
Page(3,1,1)
Page(2,1,1)
Page(1,1,2)
Page(3,2,1)
Page(2,2,1)
Page(1,2,2)
Page(3,3,2)
Page(2,3,2)
Page(1,3,2)
Page(3,1,1)
Page(2,1,1)
Page(1,1,1)
Page(3,2,1)
Page(2,2,1)
Page(1,2,1)
Page(3,3,1)
Page(2,3,1)
Page(1,3,1)
逻辑结构
存储结构
Page(1,1,1)
Page(2,1,1)
Page(3,1,1)
Page(1,2,1)
…
Page(3,3,1)
Page(1,1,2)
Page(2,1,2)
Page(3,1,2)
Page(1,2,2)
…
Page(3,3,2)
Dim Page( 3,3,2) AS Integer
(行,列,页 )
存放,逐页逐列 (先变左边下标)
逻辑结构 存储结构
数组函数及数组语句
? LBound 函数 与 UBound 函数
? Erase 语句
? For Each … Next结构语句
5.1.4
LBound 函数; UBound 函数
Lbound的 功能:
是返回数组某维的维下界的值( 例 )
Ubound的 功能:
是返回数组某维的维上界的值( 例 )
例如,dim a(-2 to 3,0 to 5)
……...
print Lbound(a),Lbound(a,2)
print Ubound(a),Ubound(a,2)
……….
Lbound函数应用示例
Private Sub Form_Click()
Dim A(5) As Integer,
Dim B(3 to 8,200 to 208)
Print LBound(A),LBound(B,1),LBound(B,2)
End Sub
程序执行结果是,0 3 200
Ubound函数应用示例
Private Sub Form_Click()
Dim A(5) As Integer,
Dim B(3 to 8,200 to 208)
Print UBound(A),UBound(B,1),UBound(B,2)
End Sub
程序执行结果是,5 8 208
Erase 语句
? Erase语句的功能是重新初始化固
定大小数组的元素,或者释放动
态数组的存储空间。
? Erase语句应用示例
Erase语句应用示例
Private Sub Form_Click()
Dim A(3) As Integer,B ( ) As Integer
A(1) = 1,A(2) = 2,A(3) = 3
ReDim B(4) ?为 B分配 4个整数单元 ( 8B)
Print A(1),A(2),A(3)
Erase A,B ?A充 0,B的单元释放
Print A(1),A(2),A(3)
End Sub
For Each … Next结构语句
? For Each … Next语句是专门用来为
数组或对象集合中的每个元素重复
执行一组语句而设置的。
? For Each … Next语句应用示例
Option Base 1
Private Sub Form_Click()
Dim A(12) As Integer,V As Variant
Dim I As Integer,Js As Integer
Js = 14
For I = 1 To 12
A(I) = Js
Js = Js + 7
Next I
Js=0
For Each V In A
Js = Js + 1
Print V;
If (Js Mod 6) = 0 Then Print
Next V
Print
End Sub
窗体上显示的结果是:
14 21 28 35 42 49
56 63 70 77 84 91
数组赋值
输出每个元素
输出 6个,换行
数组的基本操作
? 数组元素的赋值
? 数组元素的输出
? 数组元素的引用
5.2
数组元素的赋值
? 用赋值语句给数组元素赋值
? 通过循环逐一给数组元素赋值
? 用 InputBox函数给数组元素赋值
? 用 Array函数给数组赋值
5.2.1
用赋值语句给数组元素赋值
Dim Score(3) As Integer
Dim Two(1,1 to 2) as integer
Score(0) = 80
Score(1) = 75
Score(2) = 91
Score(3) = 68
Two(0,1) = Score(0)
…
K = 4
Score(K-2) = 91
Private Sub Form_Click()
Dim A(6) As Integer,I As Integer
Dim B(1 to 2,1 to 2) As Integer,J As Integer
For I = 0 To 6 ?使用循环给一维数组赋值并输出
A(I) = Int(99 * Rnd) + 1
Print A(I);
Next I
Print
For I = 1 To 2 ?利用二重循环给二维数组赋值并输出
For J = 1 To 2
B(I,J) = I * 10 + J ?外循环是 I,行
Print B(I,J);
Next J
Print
Next I
End Sub
用 InputBox函数给数组元素赋值
Private Sub Form_Click()
Dim A(6) As Integer,I As Integer
For I = 0 To 6
A(I) = InputBox("给元素赋值 ","数组 A 赋值 ")
Print A(I);
Next I
Print
End Sub 慢,适合少量数据
Option Base 1
Private Sub Form_Click()
Dim A As Variant ?A是变量
Dim B(4) As Variant ?B是数组
A = Array(5,4,3,2,1)
Print A(1); A(2); A(3); A(4); A(5)
A = Array(1.5!,2.3!,3.6!,4.1!)
Print A(1); A(2); A(3); A(4); A(5); A(6)
A =,NOArray” ?A不是数组了
Print A
B = Array(1,2,3,4,5,6) ?错误语句 原因
End Sub
注意,只对 Varian类型的变量 !
数组元素输出示例 P94
11 12 13 14 15
20 19 18 17 16
21 22 23 24 25
30 29 28 27 26
?
?
1.规律?
2.如何设计算法?
3.用什么语句实现算法?
picture1
Text1
Option Explicit, Option Base 1
Private Sub Cmd1_Click()
Dim A(4,5) As Integer,K As Integer
Dim I As Integer,J As Integer,S As String
K = 10
For I = 1 To 4
If I Mod 2 < > 0 Then ?处理奇数行
For J = 1 To 5
K = K + 1
A(I,J) = K
Next J
Else
For J = 5 To 1 Step –1 ?处理偶数行
K = K + 1
A(I,J) = K
Next J
End If
Next I
'生成数组
If Check1.Value <> 1 Then
For I = 1 To 4 '输出到 图片框
For J = 1 To 5
Picture1.Print A(I,J);
Next J
Picture1.Print
Next I
Else
For I = 1 To 4 '输出到 多行文本框
For J = 1 To 5
S = S & Str(A(I,J))
Next J
S = S & Chr(13) & Chr(10)
Next I
Text1.Text = S
End If
End Sub
'数组输出
对 text1的属性有要求 !
回顾 ( 4月 20日)
? 为什么要使用数组?
数组的特点
(程序设计 =数据结构 +算法)
? 如何定义数组?
固定大小的数组;动态数组
数组的结构(逻辑结构;物理结构)
? 如何使用数组?
函数,Ubound( ) 与 Lbound( )
数组的赋值;数组的输出
今天:数组的引用?
数组元素的引用
? 数组元素的下标在规定的维界范围之
内,否则就会产生“数组越界”的错
误。
? 【 例 5-1】
随机产生 12个两位数,存放在数组 Com中,
并从中找出一个最大数和一个最小数。
5.2.3
Option Explicit
Option Base 1
Private Sub Form_Click()
Dim Compare(12) As Integer
Dim I As Integer
Dim Max As Integer,Min As Integer
Randomize
For I = 1 To 12
Compare(I) = Int(90 * Rnd) + 10
Print Compare(I);
Next I
Print 生成 12个随机整数
Max = Compare(1),Min = Compare(1)
For I = 2 To 12
If Compare(I) > Max Then
Max = Compare(I)
ElseIf Compare(I) < Min Then
Min = Compare(I)
End If
Next I
Print "最大数是,"; Max
Print "最小数是,"; Min
End Sub
思考:
求最大数的位置?
动态数组的特点,
不知数组应有多大能满足需要,在运行程序时
改变数组的大小能力。
定义动态数组分为 两步,
1.首先定义不指明大小的数组。
Public|Private|Dim|Static 数组名 ( ) [AS 类型 ]
2.用 ReDim 语句来动态地定义数组的
ReDim [Preserve] 数组名 ( 维界定义 )
动态数组 5.3
Option Base 1
Dim DynArry() As Integer
……,
Private Sub Sub1()
Dim X As Integer,Y As Integer
ReDim DynArry(9)
……,.
X = 2, Y = 4
ReDim DynArry(X,Y)
End Sub
动态数组举例
Redim语句中 Preserve的使用
ReDim语句中缺省关键字 Preserve时,当
前存储在数组中的值全部丢失 ;
若要保留原数组的内容,应在 ReDim语
句中使用关键字 Preserve,并只能改变最
后一维的维上界。
举例
Option Base 1
Dim DynArry( ) As Integer
Private Sub Form_Click()
Dim I As Integer,J As Integer
ReDim Dynarry(3,3)
Debug.Print "数组 Dynarry(3,3) 的值 "
For I = 1 To 3
For J = 1 To 3
Dynarry(I,J) = I * 10 + J
Debug.Print Dynarry(I,J);
Next J
Debug.Print
Next I
ReDim Preserve Dynarry(3,4)
Debug.Print "数组 Dynarry(3,4) 的值 "
For I = 1 To 3
For J = 1 To 4
Debug.Print Dynarry(I,J);
Next J
Debug.Print
Next I
End Sub
Dynarry(3,3) 的值为:
11 12 13
21 22 23
31 32 33
Dynarry(3,4) 的值为
11 12 13 0
21 22 23 0
31 32 33 0
问?!
控件数组
? 基本概念
? 【 例 5-2】
使用控件数组,编写一个能进行加、
减、乘、除运算的运算器的程序
? 两条语句 (LOAD与 UNLOAD)
5.4
基本概念 5.4.1
控件数组是由一组具有 共同名称 和 相同
类型 的控件组成,数组中的每一个控件共享同
样的事件过程。
控件数组的名字由控件的 Name属性指定,
每个元素的下标则由控件的 Index属性指定,第
一个元素的下标是零( 0),最大索引值为
32767。引用方式同普通数组元素,
操作演示
Command2:有 5个元素,各元素分别表示+、
-、*,/ 和 Mod 运算符。
Command3的 Caption 属性值设为,清屏,;
Command4的 Caption 属性值是设为,=”;
Command5的 Caption 属性值设为, 退出,。
编写一个运算器的程序
Command1,
有 11个元素,前 10个元素分别表示
10个数字, 第 11个元素表示小数点 。
共享 Command1_Click()事件过程;
Load语句
格式,Load Object( Index)
功能:向控件数组添加控件
Unload语句
格式,Unload Object (Index)
功能:删除用 Load语句产生的对象数组元素
举例 P100
Option Explicit
Dim TextNum
Private Sub Command1_Click()
If TextNum <3 Then
TextNum = TextNum + 1
Load Text1(TextNum)
Text1(TextNum).Visible = True
Text1(TextNum).Top = Text1(TextNum - 1).Top + _
Text1(TextNum - 1).Height + 100
Text1(TextNum).Text = "文本框 " & Str(TextNum)
End If
End Sub
回顾
? 数组的基本 概念
? 数组的基本 操作
? 数组的 应用实例?
? 数组 与 常用算法 精妙的结合
难 点,重 点
N遍的重复 ===熟练掌握
? 排序算法的 创新 !
程序示例
【 例 5-3】 用选择法对 10个数进行排序
【 例 5-4】 顺序查找与二分查找程序
【 例 5-11】 将数组中重复元素 删除
【 例 5-6】 有关 矩阵的程序设计
【 例 5-7】 求出裴波拉契数列的前 18项
【 例 5-8】 统计字母在文本中出现的次数
【 例 5-9】 找出 100以内的所有素数
【 例 5-10】 找出 5000以内的亲密对数
5.5
用选择法对 10个数进行排序
? 设在数组 Sort中存放 10个无序的数, 要将这
10个数按 升 序重新排列 。
? 算法讲解 …,,比较次数, N*(N-1)/2
? 如何写程序
? 如何改进算法?----直接排序法
? Flash动画
? 掌握了吗?(改题 )
For I = 1 To 10
Sort(I) = Int(Rnd * (100 - 1)) + 1
Text1 = Text1 & Str(Sort(I)) ?输出
Next I
For I = 1 To 9
For J = I + 1 To 10
If Sort(I) > Sort(J) Then
Temp = Sort(I)
Sort(I) = Sort(J)
Sort(J) = Temp
End If
Next J
Text2 = Text2 & Str(Sort(I)) ?输出
Next I
交换数据
前 >后
直接排序法For I = 1 To 9
Pointer = I
For J = I + 1 To 10
If Sort(Pointer) > Sort(J) Then
Pointer = J
End If
Next J
If I <> Pointer Then
Temp = Sort(I)
Sort(I) = Sort(Pointer)
Sort(Pointer) = Temp
End If
Text2 = Text2 & Str(Sort(I))
Next I
DIM Search as Variant
Private Sub Cmd生成数据 _Click()
Dim I As Integer,Element As Variant
Search = Array(34,12,56,81,74,59,83,91,26,47)
For Each Element In Search
Text1 = Text1 & Str(Element)
Next Element
End Sub
顺序查找程序
Next
二分法
Private Sub Cmd查找 _Click()
Dim I As Integer,Find As Integer
Text2 = ""
Find = InputBox("输入要查找的数 ")
For I = 1 To UBound(Search)
If Search(I) = Find Then Exit For
Next I
If I <= UBound(Search) Then
Text2 = "要查找的数 " & Str(Search(I)) & _
" 是 Search(" & Str(I) & ")"
Else
Text2 = "在数列中没有找到 " & Str(Find)
End If
End Sub back
查找次数 =2/N
二分查找程序
? 算法说明
所谓“二分”查找,就是每次操作都将查
找范围一分为二,即将查找区间缩小一半,
直到找到或查询了所有区间都没有找到要
查找的数据为止。
? 二分查找图解说明
? 程序代码
high
high
13Find
1 3 5 7 9 11 13 15 17 19 21
low mid
1 3 5 7 9 11 13 15 17 19 21
low mid
1 3 5 7 9 11 13 15 17 19 21
low highmid
Find=a(mid)
Find>a(mid)
Find<a(mid)
a(0) a(1) a(2) a(3) a(4) a(5) a(6) a(7) a(8) a(9) a(10)
动画演示
Find = InputBox("输入要查找地数 ")
Left = 1,Right = UBound(Search)
Flg = False
Do While Left <= Right
Mid = (Right + Left) / 2
If Search(Mid) = Find Then
Flg = True
Exit Do
ElseIf Find > Search(Mid) Then
Left = Mid + 1
Else
Right = Mid - 1
End If
Loop next
If Flg Then
Text2 = "要查找的数 " & Str(Find) & _
"在 Search(" & Str(Mid) & ")中 "
Else
Text2 = Str(Find) & "不在数组中 "
End If
习题,
P115 第 1,2题 ;
实验 P64(实验 7--9) back
查找次数 =LOG2(N)
1,随机生成 15个 100以内的正整数并显示
在一个文本框中, 再将所有对称位置的两
个数据对调后显示在另一个文本框中 ( 第
1个数与第 15个数对调, 第 2个数与第 14个
数对调, 第 3个数与第 13个数对调 …… ) 。
2,随机生成 20个 100以内的两位正整数,
统计其中有多少个不相同的数 。
back
例 5-11 P113 删除数列中重复的元素
算法,
1.在 A数组中生成 N个数据
2.从数组头到数组 尾 UB(变化的 )作以下处理,
?A(n)在数组中有重复的数据吗?---定位变量 I!
?数组从 I到 UB减 1左移一个元素 (删除 )
?定义新的数组 redim preserve a(ub)
3.程序结构,多层循环 +判断 ;思路清晰,理解准确
主要程序代码如下,
Ub=Ubound(A)
N=1
Do While N<Ub
I=N+1 ‘从下一个开始
Do While I<=Ub
If A(N)=A(I) Then
For J=I to Ub-1
A(J)=A(J+1)
Next J
Ub=Ub-1
Redim Preserve A(Ub)
Else
I=I+1 ‘不同,向下扫描
endif
Loop
N=N+1 ‘开始下一轮
Loop
定位在 I
移位,删除 A(I)
重新定义数组
Ub:
数组长度
(变化 )
N:
外循环
I:
内循环
思考
1.do while N<=Ub?
2,For j=I to Ub 去掉 -1?
3.如何在升序的数组中插入一个
数据,仍然保持升序?
4.习题,P115 第 4题
5.改为 FOR循环
思考,
求出裴波拉契数列的前 18项
1 (n = 1)
F(n) = 1 (n = 2)
F(n-2)+ F(n-1) (n ≥ 3)
Fb(1) = 1,Fb(2) = 1
For I = 3 To 18
Fb(I) = Fb(I - 2) + Fb(I - 1)
Next I
For I = 1 To 18
Text1 = Text1 & str(Fb(I)) &,,
Next I
统计字母在文本中出现的次数
? 算法说明
? 程序代码
算法说明
0…100A(Idx)
25…210Idx
“COOL”
Ch Idx = Asc(Ch) - Asc("A") = 2
A(Idx) = A(Idx) + 1
C
A ZB C
字母 A B C … Z
ASCII 65 66 67 … 90
Dim A(0 To 25) As Integer…,
St = Text1.Text
L = Len(St)
For I = 1 To L
Ch = Mid(St,I,1)
If Ch >= "A" And Ch <= "Z" Then
Idx = Asc(Ch) - Asc("A")
A(Idx) = A(Idx) + 1
ElseIf Ch >= "a" And Ch <= "z" Then……,
End If
Next I
For I = 0 To 25 ?结果输出
If A(I) <> 0 Then
Js = Js + 1
Text2 = Text2 & Chr(I+Asc("A")) & ":" & Str(A(I))& " "
If Js Mod 5 = 0 Then Text2 = Text2 & Chr(13) & Chr(10)
End If
Next I
巧妙之处
恢复成字母
找出 100以内的所有素数
Prime(1) = 2
M = 1
For I = 3 To 99 Step 2
For K = 2 To Sqr(I)
If I Mod K = 0 Then Exit For
Next K
If K > Sqr(I) Then ?K是素数
M = M + 1
Prime(M) = I
End If
Next I 算法图
算法说明
3 5 7 9 11 13 … 99
2 3 … Sqr(I)
I:
J:
I Mod J = 0?
如果对所有的 有J I Mod J ≠ 0
为素数I
…
找出 5000以内的亲密对数
220的因子和:
1+ 2+ 4+ 5+ 10+ 11+ 20+ 22+ 44+ 55+ 110= 284
284的因子和:
1+ 2+ 4+ 71+ 142= 220
0.I从 1到 5000循环找,
1.如何 I求因子?用数组存放各因子,(为了输出 )
求和结果放在 sum1.
2.再对 sum1求因子和,如果 I=sum2且 I<sum1
表示找到,输出结果
变量作用
? I:1-----5000
? 动态数组 F和 S来分别存放甲数的因子与乙数
的因子 ;
? 变量 F_Idx和 S_Idx分别用于累计甲数与乙数的
因子个数 ;
? 用 sum1和 sum2分别存放两个数的因子和 ;
For I = 1 To 5000 ?I的作用?
Sum1 = 0,Sum2 = 0
F_Idx = 0,S_Idx = 0
For J = 1 To I-1
If I Mod J = 0 Then
F_Idx = F_Idx + 1
ReDim Preserve F(F_Idx)
F(F_Idx) = J
Sum1 = Sum1 + J
End If
Next J
For J = 1 To Sum1-1
If Sum1 Mod J = 0 Then
S_Idx = S_Idx + 1
ReDim Preserve S(S_Idx)
S(S_Idx) = J
Sum2 = Sum2 + J
End If
Next J
If I = Sum2 And I < Sum1 Then
Picture1.Print I; ":";
For J = 1 To F_Idx
Picture1.Print Str(F(J));
Next J
Picture1.Print
Picture1.Print Sum1; ":";
For J = 1 To S_Idx
Picture1.Print Str(S(J));
Next J
Picture1.Print
Picture1.Print
End If
Erase F,S
Next I back
关于矩阵的程序设计
1.求每行 (每列 )最大 (小 )的元素
2.求每行 (每列 )的和
3.求转置矩阵
4.求特定数组元素的和 …
5.求两个矩阵的和,差,积
6.练习,
P115:6,7,9,10,11,12
For I=1 to 5
max=a(I,1)
for j=2 to 5
if max<a(I,j) then
max=a(I,j)
next j
print max;
next I
print
For I=1 to 5
max=a(1,i)
for j=2 to 5
if max<a(j,i) then
max=a(I,j)
next j
print max;
next I
print
求每行 (每列 )最大 (小 )的元素
For I=1 to 5
sum=0
for j=1 to 5
sum=sum+a(I,j)
next j
print sum;
next I
print
For I=1 to 5
for j=I+1 to 5
t=a(I,j)
a(i,j)=a(j,I)
a(j,I)=t
next j,i
print
求每行的和 求转置矩阵
改为,J=1?
For I=1 to 5
for j=1 to 5
IF I=J then
sum1=sum1+a(I,j)
if I+j=5 then
sum2=sum2+a(I,j)
next j
next I
print sum1,sum2
求特定数组元素的和
求两个矩阵的和,差
Dim a(3,5),b(3,5),c(3,5)
For I=1 to 3
for j=1 to 5
c(I,j)=a(I,j)+b(I,j)
next j
next I
Dim a(3,2),b(2,3)c(3,3)
For I = 1 To 3
For J = 1 To 3
For K = 1 To 2
C(I,J) = C(I,J)+A(I,K) * B(K,J)
Next K
Next J
Next I
求两个矩阵的积
总结
? 数组的基本概念:
数组元素与下标变量、维数、逻辑结构与
存储结构、数组说明
? 动态数组的定义与重定维
? 控件数组的创建与应用
? 数组应用:
求素数等数字游戏、顺序查找与二分查
找、字符处理、排序、矩阵,……
? 读 P114例 5--12;, 学习指导书, P33---P50
2011-7-18 Visual Basic Programming 77
END
2003年 5月 19日
A是 3× 2矩阵,B是 2× 3矩阵,求
A·B
? 算法说明
根据线形代数已知,
若 A是一个 m× k的矩阵,
B是一个 k× n的矩阵,
那么 A·B得到一个 m× n
的矩阵。设,C = A·B
则 C矩阵的每一个元素可根据下面的公式计算:
Cij = Ai1·B1j + Ai2·B2j …… + Aik·Bkj
? 程序代码
? 数组的基本操作
? 动态数组
? 控件数组
? 程序示例
? 小结
? 关于期中考试
数 组 第 5章
数组的作用?
此类数据结构
来处理数据量大、
类型相同且有序排
列的数据。
回顾
时间,
5月 27日中午
要求,
60分钟做完
窗体上注明,
班级学号姓名
随机抽题
临时点题可加分
1.实验书 P52
2.实验书 P55(6--6)
3.实验书 P60
4.实验书 P63(7--5)
5.实验书 P64(7--7)
6.实验书 P72(8--4)
7.教材 P116第 9题
8.教材 P115第 2题
关于期中上机考试
数组的概念
数组可用于存储成组的有序数据。使用数组
就是用一个相同的名字引用这一组变量中的数据,
这个名字被称为 数组名 。
?数组命名与数组元素
?数组定义
?数组的结构
?数组函数及数组语句
5.1
数组命名与数组元素
? 数组名 的命名规则与简单变量命名规则一样。
? 数组内的每个成员称为 数组元素,数组元素又称
为 下标变量,数组元素的类型也就是数组的类型。
? 数组元素名的一般形式是:
其中:下标可以是常量、变量或算术表达式。当
下标的值为非整数时,会自动进行四舍五入。
5.1.1
数组名 (下标1 [,下标2 …… ])
数组定义
? 数组说明语句
? 数组的初始化
5.1.2
定义,
1、名称和数据类型
2、维数和每一维的上、
下界的取值范围。
数组类型:
静态数组和动态数组。
数组说明
? 同变量定义(地点?语句?)
? Option base 1 语句的功能
? 维的大小 =上界 --下界 +1
? 数组元素总个数 =各维数连乘
? 数组类型定义 (例 )
? 数组维说明示例
数组说明语句 示例
Dim A(6) As Integer
Private Name(1999 To 2002) As String * 8
Dim B(2,1 to 2) As Integer
A(6)A(5)A(4)A(3)A(2)A(1)A(0)
Name(2002)Name(2001)Name(2000)Name(1999)
B(2,2)B(2,1)B(1,2)B(1,1)B(0,2)B(0,1)
数组维说明示例
Dim M As integer
Const N As Integer = 5
Dim A(N) As Integer √
Dim B(1 To 6.6) As Integer √
Dim C(1 To 2 + 3) As Integer √
Dim D(0 To M) As Integer ×
数组初始化
? 数值型的数组元素初始值为零
? 变长字符类型的数组元素初始值为空
字符串
? 定长字符类型的数组元素初始值为指
定长度个数的空格
? 布尔型的数组元素初始值为 False
? 变体( Variant)类型的数组元素的初
始值是 Empty。
数组的结构
? 一维数组的结构
? 二维数组的结构
? 三维数组的结构
5.1.3
一维数组的结构
Dim StrA(8) As Integer
线性顺序
StrA(0)
StrA(1)
StrA(2)
StrA(3)
StrA(4)
StrA(5)
StrA(6)
StrA(7)
StrA(8)
StrA(8)
StrA(7)
StrA(6)
StrA(5)
StrA(4)
StrA(3)
StrA(2)
StrA(1)
StrA(0)
存储结构
逻辑结构
存储结构
二维数组的结构
? Option Base 1
Dim Table(3,4) As Integer
按列存放
Table(1,1)
Table(2,1)
Table(3,1)
Table(1,2)
Table(2,2)
Table(3,2)
Table(1,3)
Table(2,3)
Table(3,3)
Table(1,4)
Table(2,4)
Table(3,4)
Table(3,1)
Table(2,1)
Table(3,2) Table(3,3) Table(3,4)
Table(2,2) Table(2,3) Table(2,4)
Table(1,1) Table(1,2) Table(1,3) Table(1,4)
存储结构逻辑结构 存储结构
三维数组的结构
Page(3,1,1)
Page(2,1,1)
Page(1,1,2)
Page(3,2,1)
Page(2,2,1)
Page(1,2,2)
Page(3,3,2)
Page(2,3,2)
Page(1,3,2)
Page(3,1,1)
Page(2,1,1)
Page(1,1,1)
Page(3,2,1)
Page(2,2,1)
Page(1,2,1)
Page(3,3,1)
Page(2,3,1)
Page(1,3,1)
逻辑结构
存储结构
Page(1,1,1)
Page(2,1,1)
Page(3,1,1)
Page(1,2,1)
…
Page(3,3,1)
Page(1,1,2)
Page(2,1,2)
Page(3,1,2)
Page(1,2,2)
…
Page(3,3,2)
Dim Page( 3,3,2) AS Integer
(行,列,页 )
存放,逐页逐列 (先变左边下标)
逻辑结构 存储结构
数组函数及数组语句
? LBound 函数 与 UBound 函数
? Erase 语句
? For Each … Next结构语句
5.1.4
LBound 函数; UBound 函数
Lbound的 功能:
是返回数组某维的维下界的值( 例 )
Ubound的 功能:
是返回数组某维的维上界的值( 例 )
例如,dim a(-2 to 3,0 to 5)
……...
print Lbound(a),Lbound(a,2)
print Ubound(a),Ubound(a,2)
……….
Lbound函数应用示例
Private Sub Form_Click()
Dim A(5) As Integer,
Dim B(3 to 8,200 to 208)
Print LBound(A),LBound(B,1),LBound(B,2)
End Sub
程序执行结果是,0 3 200
Ubound函数应用示例
Private Sub Form_Click()
Dim A(5) As Integer,
Dim B(3 to 8,200 to 208)
Print UBound(A),UBound(B,1),UBound(B,2)
End Sub
程序执行结果是,5 8 208
Erase 语句
? Erase语句的功能是重新初始化固
定大小数组的元素,或者释放动
态数组的存储空间。
? Erase语句应用示例
Erase语句应用示例
Private Sub Form_Click()
Dim A(3) As Integer,B ( ) As Integer
A(1) = 1,A(2) = 2,A(3) = 3
ReDim B(4) ?为 B分配 4个整数单元 ( 8B)
Print A(1),A(2),A(3)
Erase A,B ?A充 0,B的单元释放
Print A(1),A(2),A(3)
End Sub
For Each … Next结构语句
? For Each … Next语句是专门用来为
数组或对象集合中的每个元素重复
执行一组语句而设置的。
? For Each … Next语句应用示例
Option Base 1
Private Sub Form_Click()
Dim A(12) As Integer,V As Variant
Dim I As Integer,Js As Integer
Js = 14
For I = 1 To 12
A(I) = Js
Js = Js + 7
Next I
Js=0
For Each V In A
Js = Js + 1
Print V;
If (Js Mod 6) = 0 Then Print
Next V
End Sub
窗体上显示的结果是:
14 21 28 35 42 49
56 63 70 77 84 91
数组赋值
输出每个元素
输出 6个,换行
数组的基本操作
? 数组元素的赋值
? 数组元素的输出
? 数组元素的引用
5.2
数组元素的赋值
? 用赋值语句给数组元素赋值
? 通过循环逐一给数组元素赋值
? 用 InputBox函数给数组元素赋值
? 用 Array函数给数组赋值
5.2.1
用赋值语句给数组元素赋值
Dim Score(3) As Integer
Dim Two(1,1 to 2) as integer
Score(0) = 80
Score(1) = 75
Score(2) = 91
Score(3) = 68
Two(0,1) = Score(0)
…
K = 4
Score(K-2) = 91
Private Sub Form_Click()
Dim A(6) As Integer,I As Integer
Dim B(1 to 2,1 to 2) As Integer,J As Integer
For I = 0 To 6 ?使用循环给一维数组赋值并输出
A(I) = Int(99 * Rnd) + 1
Print A(I);
Next I
For I = 1 To 2 ?利用二重循环给二维数组赋值并输出
For J = 1 To 2
B(I,J) = I * 10 + J ?外循环是 I,行
Print B(I,J);
Next J
Next I
End Sub
用 InputBox函数给数组元素赋值
Private Sub Form_Click()
Dim A(6) As Integer,I As Integer
For I = 0 To 6
A(I) = InputBox("给元素赋值 ","数组 A 赋值 ")
Print A(I);
Next I
End Sub 慢,适合少量数据
Option Base 1
Private Sub Form_Click()
Dim A As Variant ?A是变量
Dim B(4) As Variant ?B是数组
A = Array(5,4,3,2,1)
Print A(1); A(2); A(3); A(4); A(5)
A = Array(1.5!,2.3!,3.6!,4.1!)
Print A(1); A(2); A(3); A(4); A(5); A(6)
A =,NOArray” ?A不是数组了
Print A
B = Array(1,2,3,4,5,6) ?错误语句 原因
End Sub
注意,只对 Varian类型的变量 !
数组元素输出示例 P94
11 12 13 14 15
20 19 18 17 16
21 22 23 24 25
30 29 28 27 26
?
?
1.规律?
2.如何设计算法?
3.用什么语句实现算法?
picture1
Text1
Option Explicit, Option Base 1
Private Sub Cmd1_Click()
Dim A(4,5) As Integer,K As Integer
Dim I As Integer,J As Integer,S As String
K = 10
For I = 1 To 4
If I Mod 2 < > 0 Then ?处理奇数行
For J = 1 To 5
K = K + 1
A(I,J) = K
Next J
Else
For J = 5 To 1 Step –1 ?处理偶数行
K = K + 1
A(I,J) = K
Next J
End If
Next I
'生成数组
If Check1.Value <> 1 Then
For I = 1 To 4 '输出到 图片框
For J = 1 To 5
Picture1.Print A(I,J);
Next J
Picture1.Print
Next I
Else
For I = 1 To 4 '输出到 多行文本框
For J = 1 To 5
S = S & Str(A(I,J))
Next J
S = S & Chr(13) & Chr(10)
Next I
Text1.Text = S
End If
End Sub
'数组输出
对 text1的属性有要求 !
回顾 ( 4月 20日)
? 为什么要使用数组?
数组的特点
(程序设计 =数据结构 +算法)
? 如何定义数组?
固定大小的数组;动态数组
数组的结构(逻辑结构;物理结构)
? 如何使用数组?
函数,Ubound( ) 与 Lbound( )
数组的赋值;数组的输出
今天:数组的引用?
数组元素的引用
? 数组元素的下标在规定的维界范围之
内,否则就会产生“数组越界”的错
误。
? 【 例 5-1】
随机产生 12个两位数,存放在数组 Com中,
并从中找出一个最大数和一个最小数。
5.2.3
Option Explicit
Option Base 1
Private Sub Form_Click()
Dim Compare(12) As Integer
Dim I As Integer
Dim Max As Integer,Min As Integer
Randomize
For I = 1 To 12
Compare(I) = Int(90 * Rnd) + 10
Print Compare(I);
Next I
Print 生成 12个随机整数
Max = Compare(1),Min = Compare(1)
For I = 2 To 12
If Compare(I) > Max Then
Max = Compare(I)
ElseIf Compare(I) < Min Then
Min = Compare(I)
End If
Next I
Print "最大数是,"; Max
Print "最小数是,"; Min
End Sub
思考:
求最大数的位置?
动态数组的特点,
不知数组应有多大能满足需要,在运行程序时
改变数组的大小能力。
定义动态数组分为 两步,
1.首先定义不指明大小的数组。
Public|Private|Dim|Static 数组名 ( ) [AS 类型 ]
2.用 ReDim 语句来动态地定义数组的
ReDim [Preserve] 数组名 ( 维界定义 )
动态数组 5.3
Option Base 1
Dim DynArry() As Integer
……,
Private Sub Sub1()
Dim X As Integer,Y As Integer
ReDim DynArry(9)
……,.
X = 2, Y = 4
ReDim DynArry(X,Y)
End Sub
动态数组举例
Redim语句中 Preserve的使用
ReDim语句中缺省关键字 Preserve时,当
前存储在数组中的值全部丢失 ;
若要保留原数组的内容,应在 ReDim语
句中使用关键字 Preserve,并只能改变最
后一维的维上界。
举例
Option Base 1
Dim DynArry( ) As Integer
Private Sub Form_Click()
Dim I As Integer,J As Integer
ReDim Dynarry(3,3)
Debug.Print "数组 Dynarry(3,3) 的值 "
For I = 1 To 3
For J = 1 To 3
Dynarry(I,J) = I * 10 + J
Debug.Print Dynarry(I,J);
Next J
Debug.Print
Next I
ReDim Preserve Dynarry(3,4)
Debug.Print "数组 Dynarry(3,4) 的值 "
For I = 1 To 3
For J = 1 To 4
Debug.Print Dynarry(I,J);
Next J
Debug.Print
Next I
End Sub
Dynarry(3,3) 的值为:
11 12 13
21 22 23
31 32 33
Dynarry(3,4) 的值为
11 12 13 0
21 22 23 0
31 32 33 0
问?!
控件数组
? 基本概念
? 【 例 5-2】
使用控件数组,编写一个能进行加、
减、乘、除运算的运算器的程序
? 两条语句 (LOAD与 UNLOAD)
5.4
基本概念 5.4.1
控件数组是由一组具有 共同名称 和 相同
类型 的控件组成,数组中的每一个控件共享同
样的事件过程。
控件数组的名字由控件的 Name属性指定,
每个元素的下标则由控件的 Index属性指定,第
一个元素的下标是零( 0),最大索引值为
32767。引用方式同普通数组元素,
操作演示
Command2:有 5个元素,各元素分别表示+、
-、*,/ 和 Mod 运算符。
Command3的 Caption 属性值设为,清屏,;
Command4的 Caption 属性值是设为,=”;
Command5的 Caption 属性值设为, 退出,。
编写一个运算器的程序
Command1,
有 11个元素,前 10个元素分别表示
10个数字, 第 11个元素表示小数点 。
共享 Command1_Click()事件过程;
Load语句
格式,Load Object( Index)
功能:向控件数组添加控件
Unload语句
格式,Unload Object (Index)
功能:删除用 Load语句产生的对象数组元素
举例 P100
Option Explicit
Dim TextNum
Private Sub Command1_Click()
If TextNum <3 Then
TextNum = TextNum + 1
Load Text1(TextNum)
Text1(TextNum).Visible = True
Text1(TextNum).Top = Text1(TextNum - 1).Top + _
Text1(TextNum - 1).Height + 100
Text1(TextNum).Text = "文本框 " & Str(TextNum)
End If
End Sub
回顾
? 数组的基本 概念
? 数组的基本 操作
? 数组的 应用实例?
? 数组 与 常用算法 精妙的结合
难 点,重 点
N遍的重复 ===熟练掌握
? 排序算法的 创新 !
程序示例
【 例 5-3】 用选择法对 10个数进行排序
【 例 5-4】 顺序查找与二分查找程序
【 例 5-11】 将数组中重复元素 删除
【 例 5-6】 有关 矩阵的程序设计
【 例 5-7】 求出裴波拉契数列的前 18项
【 例 5-8】 统计字母在文本中出现的次数
【 例 5-9】 找出 100以内的所有素数
【 例 5-10】 找出 5000以内的亲密对数
5.5
用选择法对 10个数进行排序
? 设在数组 Sort中存放 10个无序的数, 要将这
10个数按 升 序重新排列 。
? 算法讲解 …,,比较次数, N*(N-1)/2
? 如何写程序
? 如何改进算法?----直接排序法
? Flash动画
? 掌握了吗?(改题 )
For I = 1 To 10
Sort(I) = Int(Rnd * (100 - 1)) + 1
Text1 = Text1 & Str(Sort(I)) ?输出
Next I
For I = 1 To 9
For J = I + 1 To 10
If Sort(I) > Sort(J) Then
Temp = Sort(I)
Sort(I) = Sort(J)
Sort(J) = Temp
End If
Next J
Text2 = Text2 & Str(Sort(I)) ?输出
Next I
交换数据
前 >后
直接排序法For I = 1 To 9
Pointer = I
For J = I + 1 To 10
If Sort(Pointer) > Sort(J) Then
Pointer = J
End If
Next J
If I <> Pointer Then
Temp = Sort(I)
Sort(I) = Sort(Pointer)
Sort(Pointer) = Temp
End If
Text2 = Text2 & Str(Sort(I))
Next I
DIM Search as Variant
Private Sub Cmd生成数据 _Click()
Dim I As Integer,Element As Variant
Search = Array(34,12,56,81,74,59,83,91,26,47)
For Each Element In Search
Text1 = Text1 & Str(Element)
Next Element
End Sub
顺序查找程序
Next
二分法
Private Sub Cmd查找 _Click()
Dim I As Integer,Find As Integer
Text2 = ""
Find = InputBox("输入要查找的数 ")
For I = 1 To UBound(Search)
If Search(I) = Find Then Exit For
Next I
If I <= UBound(Search) Then
Text2 = "要查找的数 " & Str(Search(I)) & _
" 是 Search(" & Str(I) & ")"
Else
Text2 = "在数列中没有找到 " & Str(Find)
End If
End Sub back
查找次数 =2/N
二分查找程序
? 算法说明
所谓“二分”查找,就是每次操作都将查
找范围一分为二,即将查找区间缩小一半,
直到找到或查询了所有区间都没有找到要
查找的数据为止。
? 二分查找图解说明
? 程序代码
high
high
13Find
1 3 5 7 9 11 13 15 17 19 21
low mid
1 3 5 7 9 11 13 15 17 19 21
low mid
1 3 5 7 9 11 13 15 17 19 21
low highmid
Find=a(mid)
Find>a(mid)
Find<a(mid)
a(0) a(1) a(2) a(3) a(4) a(5) a(6) a(7) a(8) a(9) a(10)
动画演示
Find = InputBox("输入要查找地数 ")
Left = 1,Right = UBound(Search)
Flg = False
Do While Left <= Right
Mid = (Right + Left) / 2
If Search(Mid) = Find Then
Flg = True
Exit Do
ElseIf Find > Search(Mid) Then
Left = Mid + 1
Else
Right = Mid - 1
End If
Loop next
If Flg Then
Text2 = "要查找的数 " & Str(Find) & _
"在 Search(" & Str(Mid) & ")中 "
Else
Text2 = Str(Find) & "不在数组中 "
End If
习题,
P115 第 1,2题 ;
实验 P64(实验 7--9) back
查找次数 =LOG2(N)
1,随机生成 15个 100以内的正整数并显示
在一个文本框中, 再将所有对称位置的两
个数据对调后显示在另一个文本框中 ( 第
1个数与第 15个数对调, 第 2个数与第 14个
数对调, 第 3个数与第 13个数对调 …… ) 。
2,随机生成 20个 100以内的两位正整数,
统计其中有多少个不相同的数 。
back
例 5-11 P113 删除数列中重复的元素
算法,
1.在 A数组中生成 N个数据
2.从数组头到数组 尾 UB(变化的 )作以下处理,
?A(n)在数组中有重复的数据吗?---定位变量 I!
?数组从 I到 UB减 1左移一个元素 (删除 )
?定义新的数组 redim preserve a(ub)
3.程序结构,多层循环 +判断 ;思路清晰,理解准确
主要程序代码如下,
Ub=Ubound(A)
N=1
Do While N<Ub
I=N+1 ‘从下一个开始
Do While I<=Ub
If A(N)=A(I) Then
For J=I to Ub-1
A(J)=A(J+1)
Next J
Ub=Ub-1
Redim Preserve A(Ub)
Else
I=I+1 ‘不同,向下扫描
endif
Loop
N=N+1 ‘开始下一轮
Loop
定位在 I
移位,删除 A(I)
重新定义数组
Ub:
数组长度
(变化 )
N:
外循环
I:
内循环
思考
1.do while N<=Ub?
2,For j=I to Ub 去掉 -1?
3.如何在升序的数组中插入一个
数据,仍然保持升序?
4.习题,P115 第 4题
5.改为 FOR循环
思考,
求出裴波拉契数列的前 18项
1 (n = 1)
F(n) = 1 (n = 2)
F(n-2)+ F(n-1) (n ≥ 3)
Fb(1) = 1,Fb(2) = 1
For I = 3 To 18
Fb(I) = Fb(I - 2) + Fb(I - 1)
Next I
For I = 1 To 18
Text1 = Text1 & str(Fb(I)) &,,
Next I
统计字母在文本中出现的次数
? 算法说明
? 程序代码
算法说明
0…100A(Idx)
25…210Idx
“COOL”
Ch Idx = Asc(Ch) - Asc("A") = 2
A(Idx) = A(Idx) + 1
C
A ZB C
字母 A B C … Z
ASCII 65 66 67 … 90
Dim A(0 To 25) As Integer…,
St = Text1.Text
L = Len(St)
For I = 1 To L
Ch = Mid(St,I,1)
If Ch >= "A" And Ch <= "Z" Then
Idx = Asc(Ch) - Asc("A")
A(Idx) = A(Idx) + 1
ElseIf Ch >= "a" And Ch <= "z" Then……,
End If
Next I
For I = 0 To 25 ?结果输出
If A(I) <> 0 Then
Js = Js + 1
Text2 = Text2 & Chr(I+Asc("A")) & ":" & Str(A(I))& " "
If Js Mod 5 = 0 Then Text2 = Text2 & Chr(13) & Chr(10)
End If
Next I
巧妙之处
恢复成字母
找出 100以内的所有素数
Prime(1) = 2
M = 1
For I = 3 To 99 Step 2
For K = 2 To Sqr(I)
If I Mod K = 0 Then Exit For
Next K
If K > Sqr(I) Then ?K是素数
M = M + 1
Prime(M) = I
End If
Next I 算法图
算法说明
3 5 7 9 11 13 … 99
2 3 … Sqr(I)
I:
J:
I Mod J = 0?
如果对所有的 有J I Mod J ≠ 0
为素数I
…
找出 5000以内的亲密对数
220的因子和:
1+ 2+ 4+ 5+ 10+ 11+ 20+ 22+ 44+ 55+ 110= 284
284的因子和:
1+ 2+ 4+ 71+ 142= 220
0.I从 1到 5000循环找,
1.如何 I求因子?用数组存放各因子,(为了输出 )
求和结果放在 sum1.
2.再对 sum1求因子和,如果 I=sum2且 I<sum1
表示找到,输出结果
变量作用
? I:1-----5000
? 动态数组 F和 S来分别存放甲数的因子与乙数
的因子 ;
? 变量 F_Idx和 S_Idx分别用于累计甲数与乙数的
因子个数 ;
? 用 sum1和 sum2分别存放两个数的因子和 ;
For I = 1 To 5000 ?I的作用?
Sum1 = 0,Sum2 = 0
F_Idx = 0,S_Idx = 0
For J = 1 To I-1
If I Mod J = 0 Then
F_Idx = F_Idx + 1
ReDim Preserve F(F_Idx)
F(F_Idx) = J
Sum1 = Sum1 + J
End If
Next J
For J = 1 To Sum1-1
If Sum1 Mod J = 0 Then
S_Idx = S_Idx + 1
ReDim Preserve S(S_Idx)
S(S_Idx) = J
Sum2 = Sum2 + J
End If
Next J
If I = Sum2 And I < Sum1 Then
Picture1.Print I; ":";
For J = 1 To F_Idx
Picture1.Print Str(F(J));
Next J
Picture1.Print
Picture1.Print Sum1; ":";
For J = 1 To S_Idx
Picture1.Print Str(S(J));
Next J
Picture1.Print
Picture1.Print
End If
Erase F,S
Next I back
关于矩阵的程序设计
1.求每行 (每列 )最大 (小 )的元素
2.求每行 (每列 )的和
3.求转置矩阵
4.求特定数组元素的和 …
5.求两个矩阵的和,差,积
6.练习,
P115:6,7,9,10,11,12
For I=1 to 5
max=a(I,1)
for j=2 to 5
if max<a(I,j) then
max=a(I,j)
next j
print max;
next I
For I=1 to 5
max=a(1,i)
for j=2 to 5
if max<a(j,i) then
max=a(I,j)
next j
print max;
next I
求每行 (每列 )最大 (小 )的元素
For I=1 to 5
sum=0
for j=1 to 5
sum=sum+a(I,j)
next j
print sum;
next I
For I=1 to 5
for j=I+1 to 5
t=a(I,j)
a(i,j)=a(j,I)
a(j,I)=t
next j,i
求每行的和 求转置矩阵
改为,J=1?
For I=1 to 5
for j=1 to 5
IF I=J then
sum1=sum1+a(I,j)
if I+j=5 then
sum2=sum2+a(I,j)
next j
next I
print sum1,sum2
求特定数组元素的和
求两个矩阵的和,差
Dim a(3,5),b(3,5),c(3,5)
For I=1 to 3
for j=1 to 5
c(I,j)=a(I,j)+b(I,j)
next j
next I
Dim a(3,2),b(2,3)c(3,3)
For I = 1 To 3
For J = 1 To 3
For K = 1 To 2
C(I,J) = C(I,J)+A(I,K) * B(K,J)
Next K
Next J
Next I
求两个矩阵的积
总结
? 数组的基本概念:
数组元素与下标变量、维数、逻辑结构与
存储结构、数组说明
? 动态数组的定义与重定维
? 控件数组的创建与应用
? 数组应用:
求素数等数字游戏、顺序查找与二分查
找、字符处理、排序、矩阵,……
? 读 P114例 5--12;, 学习指导书, P33---P50
2011-7-18 Visual Basic Programming 77
END
2003年 5月 19日
A是 3× 2矩阵,B是 2× 3矩阵,求
A·B
? 算法说明
根据线形代数已知,
若 A是一个 m× k的矩阵,
B是一个 k× n的矩阵,
那么 A·B得到一个 m× n
的矩阵。设,C = A·B
则 C矩阵的每一个元素可根据下面的公式计算:
Cij = Ai1·B1j + Ai2·B2j …… + Aik·Bkj
? 程序代码