第五章数组
主要内容
●数组的概念
●静态数组及声明
●动态数组及声明
●数组的基本操作
●控件数组
●自定义数据类型
●常用算法(二)
●常见错误
5.1 数组的概念
1.引例
若我们要求一个班100个学生的平均成绩,然后统计高于平均分的人数。按以前简单变量的使用和循环结构相结合,求平均成绩程序段如下:
aver = 0
For i = 1 To 100
mark = Val(InputBox("输入第" & i & " 位学生的成绩"))
aver = aver + mark
Next i
aver = aver / 100
但若要统计高于平均分的人数,则无法实现。mark是一个简单变量,存放的是最后一个学生的成绩。
从已有知识解决方法:再重复输入成绩,逐一与平均分比较。这样带来两个问题:(1)输入数据的工作量成倍增加;
(2)若本次输入的成绩与上次不同,则统计的结果不正确。
解决此问题的根本方法是:始终保持输入的数据,一次输入,多次使用,为此必须引入有关数组的内容。
2.数组的概念
数组并不是一种新的数据类型,而是一组相同类型的变量的集合。数组必须先声明后使用。
在VB中有两类数组,一类是静态(定长)数组另一类称为动态(可变长)数组。
5.2 静态数组及声明
在声明数组时就确定了数组元素的个数的数组称为静态数组。
定义格式: Dim 数组名(下标1[,下标2…]) [As 类型]
数组维数:定义数组是用几个下标就表示数组是几维数组,最多60维。
定义数组是下标的形式为[下界 To ] 上界省略下界则系统默认下界为0,下界上界的值必须为数值常数或常数表达式(也可含逻辑常数或数值字符串)。
数组每一维大小:上界-下界+1。数组元素的个数(或称大小):每一维大小的乘积
[例]Dim mark(1 to 100) As Integer
定义数组mark为一维整型数组,其下界为1,上界为100,大小为100(即mark
有100个元素)。
Dim lArray( 0 To 3, 0 To 4) As Long
它等价于: Dim lArray(3, 4) As Long
类型为长整型,二维数组,行下界为0,行上界为3,列下界为0,,列上界为4,共有4×5个元素。
又如定义, Dim a(-3.5 To 9, 7)
定义了数组a为两维变体数组(这样数组内的元素的值类型可以不同,如a(-1, 4) = "aa": a(-1, 5) = 3),其中行下界为-4,行上界为9;列下界为0,列上界为7。
数组mark在内存中的分配形式(连续的一个区域):
(1)下界缺省为0 ,也可在定义数组时改变确省的下界值为1(注意:下界缺省值只能
是0或1)。这就要求在窗体或模块的通用部分写上:Option Base 1。
(2)错误的声明(下标是变量)
n =Inputbox(“输入n”)
Dim x(n) As Single
(3)在数组声明中的下标说明了数组的整体,即每一维的大小;而在程序其他地方出现的下标表示数组中的一个元素。两者写法形式相同,但意义不同。
[例如]
Dim x(10) As Integer'声明了x数组有11个元素
x(10)=100 ' 对x(10)这个数组元素赋值
(4)数组声明以后,就可以使用数组中的元素了,但要注意不要使数组的下标越界,以免程序在运行时出错(运行时系统会报下(上)界错误)。
[例如]Dim score( 1 to 50) as single
score(1), scor(15)是正确的使用数组元素,但score(0)则不是正确的使用数组元素,而score(I+j*m)则应注意其表达式的结果是否在1~50之内,是则是正确引用,不是,则犯下标越界错误。数组的下标表达式结果可以是一个实数或数值型字符串,但是最终对这个值四舍五入成整数。(特例,只有一位小数时,整数是偶数时则五舍)如元素a(2.5), a(3.5), a(-2.5), a(-3.5)分别相当于a(2)、a(4)、a(-2)、a(-4)。这一点对于定义数组也是适用的。考查定义:Dim a(-6.5 To 7.5)
As Single,它的下界是 -6,上界是8。
(5) 在通常情况下,数组中的各元素类型必须相同,但若数组类型为Variant 时,可包含不同类型的数据。
5.3 动态数组及声明
动态数组指在声明数组时未给出数组的大小(省略括号中的下标),当要使用它时,随时用ReDim语句重新指出数组大小。
使用动态数组的优点:有效地利用存储空间,它在程序执行到ReDim语句时分配存储空间,而静态数组是在程序编译时分配存储空间的。
动态数组的定义:
建立动态数组的方法是:使用Dim、Private或Public语句声明时括号内为空的数组,然后在过程中用ReDim语句指明该数组的大小。
ReDim 形式如下:
ReDim 数组名(下标[,下标2…]) [As 类型]
[例]Sub Private Form_Load( )
Dim sArray( ) As Single ‘定义sArray为单精度动态(不定长)数组…
ReDim sArray(4,8)
‘重新定义sArray为数组5行9列共45个元素的二维数组存储空间
…
ReDim sArray(5)‘重新定义sArray为6个元素的一维数组
…
End Sub
说明:
(1) Dim、Private、Public变量声明语句是说明性语句,可出现在过程内或通用声明段;而ReDim语句是执行语句,只能出现在过程内。
(2) 在过程中可多次使用ReDim来改变数组的大小,也可改变数组的维数。
(3) 每次使用ReDim语句都会使原来数组中的值丢失,可以在ReDim语句后加Preserve参数用来保留数组中的数据,但使用Preserve只能改变最后一维的大小,前面几维大小不能改变。
(4) ReDim中的下标可以是常量,也可以是有了确定值的变量。
(5)ReDim中As类型可以省略不写,如不省略,则类型必须与dim 定义时的类型一致(即重定义数组不能改变其原来的存储类型)。
(6)一个变体变量可以重定义为具有不同类型的数组。但如果是一个变体数组,在重定义时也只能是变体数组。例如:
Dim a() As Variant 或 Dim a()
ReDim a(8) As Variant 或 ReDim a(8) 正确
而
Dim a() As Variant
ReDim a(8) as integer 则错误
但
Dim a或Dim a As Variant
ReDim a(8) As integer 正确(可继续重定义a为其他类型的数组,但如类型不同就不能使用Presever来保留原数组的非覆盖部分的值了,如硬性使用关键字Presever系统则按出错处理。)如:
Private Sub Form_click()
Dim a
ReDim a(8) As String
a(1) = "12": a(2) = "4": a(3) = #1/2/2003 12:03:00 PM#
Print a(1), a(2), a(3) ‘显示 12 4 2003-1-2 12:03:00
ReDim Preserve a(9) As boolean ‘去掉Preserve 即可运行
Print a(1), a(2), a(7), a(8) ‘显示 False False False False
End Sub
[例 5.2] 输入若干名学生的成绩。计算平均分和高于平均分的人数并将这两项放在数组的后面。
[例5.2] 在myvb\vb5\ex5_2下
Private Sub Form_Load()
Form2.Caption = "动态数组的应用(请单击)"
End Sub
Private Sub Picture1_Click()
Dim mark() As Integer
Dim n%, i%, aver!, num%, n1 As String
Picture1.Cls '可以求不同的人数,而不退出程序
Randomize ‘随机数发生器,以系统时钟为参数
Do '保证输入的内容可用预定义数组
n1 = InputBox(prompt:="输入学生人数", Default:=10, _
Title:="输入", xpos:=1000, ypos:=2000)
Loop Until n1 <> Empty And IsNumeric(n1) And Val(n1) > 1
n = n1
For i = 1 To n '产生n个学生的成绩
mark(i) = Rnd * 101
Next i
For i = 1 To n
aver = aver + mark(i)
Next i
'重新定义数组大小,Preserve位置是固定的
ReDim Preserve mark(1 To n + 2)
mark(n + 1) = aver / n
For i = 1 To n
If mark(i) > aver / n Then mark(n + 2) = mark(n + 2) + 1
Next i
For i = 1 To n
Picture1.Print Tab(10); "mark("; i; ")="; mark(i)
Next i
Picture1.Print Tab(10); "平均成绩:"; mark(n + 1)
Picture1.Print Tab(10); "高于平均分成绩人数:"; mark(n + 2)
End Sub
5.4 数组的基本操作
设有以下声明语句:
Dim iA(1 TO 10) As Integer
Dim Sb(3,4) As Single,Sc(4,4) As Single
Dim i%,j%,t%
1.数组元素的赋初值
(1 ) 用循环结构
For i = 1 To 10
iA(i)=0 Array Next i
(2)利用Array函数
[例5.3] 在myvb\vb5\ex5_3下
Option Base 1 '改变系统默认数组下界为1
Private Sub Form_Load()
Form2.Caption = "赋初值并显示(单击)"
End Sub
Private Sub Picture1_Click()
'要想通过Array函数给数祖赋初值,必须说明数组是变体变量
Dim a As Variant, b As Variant, i%, m%
a = Array(InputBox(prompt:="输入", Default:=15, xpos:=1000, ypos:=2000), 2, 3, 4)
‘数组a的第一个元素值通过inputbox函数输入
b = Array("abc", #10/1/2002#, 26) ‘数组b有三种类型的数据
Picture1.Cls
Picture1.Print " arrar a list"
Picture1.Print "---------------"
For i = 1 To UBound(a)
Picture1.Print a(i); Spc(2);
Next i
Picture1.Print
Picture1.Print " arrar a vartype list"
Picture1.Print "-----------------------"
For i = 1 To UBound(a)
m = VarType(a(i))
Call type1(m)
Next i
Picture1.Print: Picture1.Print
'列出数组 a 各个元素的类型
Picture1.Print " arrar b list"
Picture1.Print "---------------"
For i = 1 To UBound(b)
Picture1.Print b(i); Spc(2);
Next i
Picture1.Print
'列出数组b各个元素的类型
Picture1.Print " arrar b vartype list"
Picture1.Print "-----------------------"
For i = 1 To UBound(b)
m = VarType(b(i))
Call type1(m)
Next i
End Sub
Private Sub type1(k As Integer) '显示数据类型名称常数过程,顺回顾函数Switch Dim strtype As String
strtype = Switch(k = 0, "vbEmpty", k = 1, "vbNull", k = 2, "vbInteger", _
k = 3, "vbLong", k = 4, "vbSingle", k = 5, "vbDouble", k = 6, "vbCurrency", _
k = 7, "vbDate", k = 8, "vbString", k = 9, "vbObject", k = 10, "vbError", _
k = 11, "vbBoolean", k = 12, "vbVariant", k = 13, "vbDataObject", _
k = 14, "vbDecimal", k = 17, "vbByte", k = 8192, "vbArray")
Picture1.Print strtype; Space(2);
End Sub
注意:
(1)利用Array对数组各元素赋值,声明的数组是可调数组或连圆括号都可省并且其类型只能是Variant。
(2) 数组的下界为0,也可通过option Base声明来决定由Array所产生的数
组的下界,这一点与Split函数不同(下界必须是0)。上界由Array函数括号内的参数个数可决定,也可通过函数Ubound获得。
2.数组的输入
可以通过文本控件输入,也可通过InputBox函数输入。
[例]利用For Each 变体变量 in 数组名… Next 语句给一个数组A赋值。Private Sub Command1_Click()
Dim N%, i, k%
Cls
N = Val(InputBox("输入数组A的上界", , 4, 1000, 2000))
ReDim A(N), B(N)
k = 0
参见MYVB\VB5\EX5_14
'For Each的变量i必须是变体且i的值由系统自动计算,
'用语句是不能改变其值的;数组B和变量K必须开辟,B的下界必须是0。 'For Each是不能保留数组B的值的。
For Each i In B
B(i) = Val(InputBox("输入数组元素的值"))
A(k) = B(i)
Print A(k) & " , ";
k = k + 1
Next i
Print "----------------------"
For k = 0 To UBound(A)
Print A(k) & " , ";
Next
ReDim B(0)
Print "---------------------"
Print LBound(B), UBound(B)
End Sub
在VB6.0中,提供了直接对数组的赋值。
[例如]
Dim a() As Variant, b() As Variant, i%
a = Array(1, 2, 3, 4, 5)‘使用Array时a必须
是变体
ReDim b(UBound(a))
b=a
数组对数组赋值时应注意:
(1)赋值号两边的数组的数据类型必须一致
(2)如果赋值号左边的数组必须定义成动态数组,则赋值时系统自动将动态数组Redim成右边同样大小的数值。
(3)如果赋值号的左边的是一个大小固定的数组,则数组赋值出错。
[例子]
Private Sub Picture1_Click()
'a,b数据类型必须相同,b必须是动态数组
Dim a(5) As Integer, b() As Integer, i%
For i = 0 To 5
a(i) = i
Next i
b = a
For i = 0 To 5
Picture1.Print b(i); Spc(3);
Next i
End Sub
4. 数组的输出
输出方阵sc中的下三角元素
For i = 0 To 4
For j = 0 To i
sc(i, j) = i * 5 + j
Next j
Print ' 起换行效果
Next i
5. 求数组中最大元素及所在下标
Dim Max As Integer,iMax As Integer
…
Max=iA(1):iMax=1 ‘Max存放最大元素的值,iMax 存放最大元素的下标
For i = 2 To 10
If iA(i)>Max Then
Max=iA(i)
iMax=i
End If
Next I
6. 将数组中各元素交换
[例5.4]将数组iA 的各元素倒排。即若iA各元素的值依次为1,5,7,35,-26,0,78。经过倒排后iA内的各元素依次是78,0,-26,35,7,5,1。[例5.4] 在myvb\vb5\ex5_4下
Private Sub Picture1_Click()
Dim iA As Variant, i%, j%, k%
iA = Array(1, 5, 7, 35, -26, 0, 78) '给数组赋初值
Picture1.Cls
Picture1.Print Tab(2); " 交换前数组中的值 "
For i = LBound(iA) To UBound(iA) '打印原数组值
Picture1.Print iA(i); Spc(2);
Next i
k = UBound(iA) '实现倒排
For i = LBound(iA) To k \ 2
j = iA(i): iA(i) = iA(k - i): iA(k - i) = j
Next i
Picture1.Print : Picture1.Print
Picture1.Print Tab(2); " 交换后数组中的值 "
Picture1.Print Tab(2); "--------------------------"
For i = LBound(iA) To UBound(iA) '打印倒排后的数组值
Picture1.Print iA(i); Spc(2);
Next i
End Sub
5.5控件数组
1.控件数组的概念
控件是由一组相同类型的控件组成。它们共用一个控件名,具有相同的属性,建立时系统自动给每个元素赋一个唯一的索引号(Index)。
控件数组共享同样的事件过程,通过返回的下标值(系统赋予的索引号)来区分控件数组中的各个元素。
[例] Private Sub cmdName _Click(Index As Integer)
…
If Index=3then
‘处理第四个命令按钮的操作,第一个命令按钮的Index=0
End If
…
End Sub
2.控件数组的建立
(1)在设计时建立控件数组
在窗体上画出控件,进行属性设置,这是建立控件数组的第一个元素
●选中该控件,使用“Copy”和“Paste”命令操作若干次,建立所需控件数组元素的
个数,然后对各元素的位置进行适当调整。
●对事件过程进行编程。
[例5.5] 建立含有四个命令按钮的控件数组,当单击某个命令按钮,分别显示不同的图形或结束操作。
[例5.5] 在myvb\vb5\ex5_5下
Private Sub Command1_Click(Index As Integer)
Picture1.Cls
Picture1.FillStyle = 6 '用交叉线填充
Picture1.FillColor = RGB(255, 255, 0)
Select Case Index
Case 0
Picture1.Print "画直线"
Picture1.Line (200, 200)-(1600, 1600)
Case 1
Picture1.Print "画矩形"
Picture1.Line (500, 200)-(1600, 1600), , B 'BF F标是画实心矩形
Case 2
Picture1.Print "画圆"
'画长椭圆,大于1,Y轴长;小于1,x轴长
Picture1.Circle (1200, 800), 700, QBColor(5), , , 0.7
Case Else
End
End Select
End Sub
Private Sub Form_Load()
Command1(0).Caption = "直线"
Command1(1).Caption = "矩形"
Command1(2).Caption = "园"
Command1(3).Caption = "结束"
Form2.Caption = "设计时建立的控件数组"
End Sub
(2)运行时添加控件数组
建立的步骤如下:
●在窗体上画出某控件,设置该控件的Index值为0(一般设其visible属
性=False),表示该控件为数组,这是建立的第一个元素。
●在编程时通过Load方法添加其余的若干个元素,也可以通过Unload方法删除某个添加的元素。
●每个新添加的控件数组通过Left和Top属性确定其在窗体的位置,并将Visible 属性设置为True。
[例5.6]利用在运行时产生控件数组,构成一个国际象棋棋盘。当单击棋格,显示对应的序号,并且将所有棋格颜色变反。
[例5.6] 在myvb\vb5\ex5_6下
程序代码
Private Sub Form_Load() ‘产生控件数组
Dim mtop%, mleft%, i%, j%, k As Integer
Form2.Caption = "运行时产生控件数组"
mtop = 0
Label1(0).Visible = False '使label1(0)仅仅是为了运行时产生控件数组而设计的引子,不可少
For i = 1 To 8
mleft = 50
For j = 1 To 8
k = (i - 1) * 8 + j
Load Label1(k) '加载一个控件数组元素。QBColor(0)色为黑,QBColor(15) 色为白
Label1(k).BackColor = IIf((i + j) Mod 2, QBColor(0), QBColor(15)) '设置颜色 Label1(k).Visible = True '使加载的控件可见,不可少
Label1(k).Top = mtop '确定加载控件的位置
Label1(k).Left = mleft
Label1(k).Caption = ""
mleft = mleft + Label1(0).Width
Next j
mtop = mtop + Label1(0).Height
Next i
End Sub
Private Sub Label1_Click(index As Integer) ‘点击任一个标签,均使全体标签反色 Dim tag As Boolean, i%, j%, k%
Label1(index) = index '被点击的标签置其caption属性为数组序号值
For i = 1 To 8
For j = 1 To 8
k = (i - 1) * 8 + j
If Label1(k).BackColor = &H0& Then '黑色
Label1(k).BackColor = &HFFFFFF '白色
Else
Label1(k).BackColor = &H0&
End If
Next j
Next i
End Sub
5.6自定义数据类型
数组能够存放一组类型相同的数据集合,要想存放一组能够存放不同类型的数据,例如,存放一个学生的学号,年龄,家庭住址,手机号码,个人爱好,社会背景等,就必须要用自定义数据类型。因此可以说自定义数据类型是一组类型不同的变量的集合。
1.自定义类型的定义
形式如下:
[Public|Private]Type 自定义类型名
元素名[(下标)] As 类型名
…
[元素名[(下标)] As 类型名]
End Type
例如以下定义了一个有关学生信息的自定义类型:
Type StudType
No As Integer' 学号
Name As String * 20 ' 姓名
Sex As String * 1 ' 性别
Mark(1 To 4) As Single ' 4门课程成绩
Total As Single ' 总分
End Type
注意:
(1)自定义类型一般在标准模块(.BAS)中定义,默认是Public;在窗体必须是Private。
(2)不要将自定义类型名和该类型的变量名混淆,前者表示了如同Integer、
Single等的类型名,后者VB根据变量的类型分配所需的内存空间,存贮数据。
(3)自定义类型一般和数组结合使用,简化程序的编写。
2.自定义类型变量的声明和使用
(1) 声明形式:
Dim 变量名 As 自定义类型名
[例] Dim Student As StudType
(2) 引用方式:
形式:变量名.元素名
[例] 要表示Student变量中的姓名,第4门课程的成绩,则用如下形式:https://www.wendangku.net/doc/199332884.html,,Student.Mark(4)
[示例]
Private Type MANType
No As Integer ' 学号
Name As String ' 姓名
Sex As String * 1 ' 性别
Birthdate As Date '出生年月
Speciality as string ‘特长
End Type
Private Sub Command1_Click()
Dim Man As MANType
With Man
.No = 25000: .Name = "秦雪梅": .Sex = "女": .Speciality="鉴赏书画"
. Birthdate = #8/13/1800#
Print .No; " "; .Name; " "; .Sex; " "; Format(.Birthdate, "yyyy年mm月dd日")
End With
End Sub
说明:
同种自定义类型变量可相互赋值。它相当于将一个变量中的各元素的值对应的赋给另一个变量中的元素。
3.自定义类型数组的应用
自定义一个学生纪录类型,有姓名、专业、总分组成,声明一个存放最多100个学生纪录的数组;要求,按“新增”按钮,将文本框输入的学生信息加到数组中;按“前一个”或“后一个”按钮,显示当前元素的前或后的纪录;按“最高”按钮则显示总分最高的纪录;任何时候在窗体上显示数组中输入的纪录和当前数组元素的位置。
[例5.7]利用自定义类型数组,编一类似数据管理(输入、显示、查询)的程序。myvb\vb5\ex5_7
Type StudType
Name As String * 10
Special As String * 10
Total As Single
End Type ‘该定义在lbc5_7.bas中,是全局类型的Dim n%, i% ‘窗体级变量
Dim stud(100) As StudType
Private Sub Command1_Click(Index As Integer)
Dim max%, maxi%, j
Select Case Index
Case 0 ‘新增
If n < 100 Then ‘总条数
If Text1.Text <> "" Then n = n + 1 '必须有姓名
Else
MsgBox prompt:="人数已经达到100了"
End If
If n = 0 Or n = i Then Exit Sub
i = n
With stud(n)
.Name = Text1
.Special = Text2
.Total = Val(Text3)
End With
Text1.Text = "": Text2.Text = "": Text3.Text = ""
Case 1 ‘前一个
If i = 0 Then Exit Sub
If i > 1 Then i = i - 1
With stud(i)
Text1 = .Name
Text2 = .Special
Text3 = .Total
End With
Case 2 ‘后一个
If i = 0 Then Exit Sub
If i < n Then i = i + 1
With stud(i)
Text1 = .Name
Text2 = .Special
Text3 = .Total
End With
Case 3 ‘最高
If n = 0 Then Exit Sub
max = stud(1).Total
maxi = 1
For j = 2 To n
If stud(j).Total > max Then
maxi = j
End If
Next j
With stud(maxi)
Text1.Text = .Name
Text2.Text = .Special
Text3.Text = .Total
End With
i = maxi
End Select
Label5.Caption = i & "/" & n ‘位置
End Sub
Private Sub Form_Load() ‘准备
Dim stud(1 To 100) As StudType
Label1.Caption = "姓名": Label2.Caption = "专业": Label3.Caption = "总分"
Label4.Caption = "位置": Label5 = ""
Text1.Text = "": Text2.Text = "": Text3.Text = ""
Command1(0).Caption = "新增": Command1(1).Caption = "前一个"
Command1(2).Caption = "后一个": Command1(3).Caption = "最高"
End Sub
5.7常用算法(二)
1. 统计
[例5.8]输入一串字符,统计各字母出现的次数,大小写字母不区分。
分析:
(1) 统计26个字母出现的个数,先声
明一个具有26个元素的数组,每个元
素的下标表示对应的字母,元素的值
表示对应字母出现的次数。
(2) 从输入的字符串中逐一取出字
符,转换成大写字符(使得大小写不
区分),进行判断。
(3) 运行界面设计:一个文本框(用
于输入),一个图片框(用于显示),
两个命令按钮(统计和退出)
[例5.8]在myvb\vb5\ex5_8下
Private Sub Form_Load()
Text1.Text = ""
Text1.TabIndex = 0
'Text1.ScrollBars = 1,只读属性
Command1.Caption = "统计"
Command2.Caption = "退出"
Form2.Caption = "统计输入各字母的个数"
End Sub
Private Sub Command1_Click()
Dim Aph(1 To 26) As Integer, i%, length%, j%, c As String * 1
length = Len(Text1.Text)
For i = 1 To length
c = UCase(Mid(Text1.Text, i, 1))
If c >= "A" And c <= "Z" Then j = Asc(c) - 64 : Aph(j) = Aph(j) + 1'大写字符A=65 Next i
Picture1.Cls'清除已显示的内容
j = 0
For i = 1 To 26
If Aph(i) <> 0 Then
Picture1.Print Spc(2); Chr(i + 64); "="; Format(Aph(i), "@@"); '格式输出强拍占2位 j = j + 1
If j Mod 8 = 0 Then Picture1.Print '每行输出8个
End If
Next i
End Sub
2.大量数据的输入
[例 5.9] 输入一系列的数据,并将它们分离后存放在数组中。对输入的数据允许修改和自动识别非数字数据。
分析:
(1)利用文本框输入和编辑数据,输入时去除非法数字,只允许输入0~9、小数点、负号,逗号为分隔符。
(2)输入结束利用Replace函数去除重复输入的分隔符;
(3)对利用Split函数按分隔符分离,放到数组中;
(4)还可利用Join函数将数组中各元素合并成一个字符串。
[例5.9]在myvb\vb5\ex5_9\中lbc5_9.vbp
Dim A As Variant ‘A是窗体级变量
Private Sub Command1_Click() '分隔
Dim temp As String, i%
Picture1.Cls
Do '循环的作用是修改输入的数字串使其之间只能有一个逗号分割
temp = Text1.Text
Text1.Text = Replace(Text1.Text, ",,", ",")
Loop Until temp = Text1.Text
A = Split(Text1, ",")
For i = 0 To UBound(A)
Picture1.Print A(i)
Next i
End Sub
Private Sub Command2_Click() '合并用空格分隔
Text2.Text = Join(A, " ") '有待优化
End Sub Array Private Sub Command3_Click()
End
End Sub
Private Sub Form_Load()
Label1.Caption = "输入数字串"
Label2.Caption = "显示数组内容"
Label3.Caption = "合并结果"
Text1.Text = ""
Text2.Text = ""
Command1.Caption = "分隔"
Command2.Caption = "合并"
Command3.Caption = "退出"
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
'在输入数字串文本框中输入合法的数字字串,否则不能拆分成正确的数字 Dim lenstr As Integer, j%
Dim stra As String, s As String * 1
s = Chr(KeyAscii)
Select Case s
Case "0" To "9", ",", ".", "-"
Case Else
KeyAscii = 0 '非数字类字符,销去。 End Select End Sub
3.数组排序
(1)选择法排序
[例5.10] 对已知存放在数组中的n 个数,用选择法按递增(从小到大)顺序排序。
方法:
(1) 从n 个数的序列中选出最小的数(
递增),与第1个数交换位置; (2) 除第1个数外,其余n-1个数再
(3)
按(1)的方法选出次小的数,与第2个数交换位
置; (4) 重复(1)n-1遍,最后构成递增序列。 [例5.10]在myvb\vb5\ex5_10下
'窗体级变量a
Dim A As Variant '本题数组A 只能为Variant ,且下界从0开始 Private Sub Command1_Click() '显示(输入)
Dim temp As String, i% Picture1.Cls
Do '循环的作用是修改输入的数字串之间只能有一个逗号 temp = Text1.Text
Text1.Text = Replace(Text1.Text, ",,", ",") Loop Until temp = Text1.Text A = Split(Text1, ",") For i = 0 To UBound(A)
If i Mod 3 = 0 Then Picture1.Print ‘演示
程序将picture1改为text2了
Picture1.Print A(i); Spc(1); Next i
End Sub
Private Sub Command2_Click() ‘排序 Dim i%, j%, n%, m%, iMin, t%
'用split 函数分解成的数组元素都是字符型的,要想变成数值必须定义一个数值数组 Dim ab() As Integer '定义动态数值数组定义 n = UBound(A) '字符数组的上界
m = n + 1 '数值数组的上界
ReDim ab(1 To m) '重新定义数值数组
For i = 0 To n
ab(i + 1) = val(A(i))
Next i
'选择法排序:
For i = 1 To m - 1
iMin = i
For j = i + 1 To m
If ab(j) < ab(iMin) Then iMin = j
Next j
t = ab(i): ab(i) = ab(iMin): ab(iMin) = t
Next i
Picture2.Cls
For i = 1 To m
Picture2.Print ab(i) ‘演示程序将picture2改为text3了Next i
End Sub
Private Sub Command3_Click()
End
End Sub
Private Sub Form_Load()
Label1.Caption = "输入内容,数字之间用逗号隔开"
Label2.Caption = "显示数组内容"
Label3.Caption = "排序结果"
Text1.Text = ""
Command1.Caption = "显示"
Command2.Caption = "排序"
Command3.Caption = "退出"
End Sub
‘输入数据:
Private Sub Text1_KeyPress(KeyAscii As Integer)
'在输入数字串文本框中要注意输入合法的数字字串
Dim lenstr As Integer, j%
Dim stra As String, s As String * 1
s = Chr(KeyAscii)
Select Case s
Case "0" To "9", ",", "-" '只允许输入整型数串
Case Else
KeyAscii = 0'非数字类字符,销去。
End Select
End Sub
(2)冒泡法排序
冒泡法排序是对m个数进行m-1轮排序,每一轮将对为未排好的数进行两两比较,只要次序不对立即进行交换,一轮下来,该轮最后一个的次序就可确定下来,也此也就象冒泡一样而得名冒泡法。
冒泡法的核心程序段是(从小到大):
For i = 1 To m – 1 ‘进行m-1轮比较
For j = m To i+1 step –1 ‘从m~i个元素进行两两比较
If ab(j) < ab(j-1) Then t = ab(j): ab(j) = ab(j-1): ab(j-1) = t
Next j
Next i
[例5.11]在myvb\vb5\ex5_11下
Private Sub Form_Click() ‘生成数组值
Dim i%
m = 10
For i = 1 To 10
ab(i) = Int(Rnd * 1000) - 300
Next i
Call original_numeric(Picture1)
Call bubble_method
End Sub
Private Sub Form_Initialize()
Form2.Caption = "冒泡排序(单击窗体)"
Label1.Caption = "原始数据:"
Label2.Caption = "排序结果:"
End Sub
Private Sub original_numeric(obj As Object)'输出过程,使用了一个对象型形参
Dim i%
obj.cls
For i = 1 To m
If i Mod 6 = 0 Then obj.Print
vb课后习题答案 第一章习题参考答案 一、填空题 1、对象事件驱动 2、编译运行模式解释运行模式 二、简答题 1、简述VB的特点。 答:①可视化的程序设计方法 ②面向对象的程序设计思想 ③事件驱动的编程机制 ④结构化的程序设计语言 ⑤高度的可扩充性 ⑥强大的数据库访问能力 ⑦支持动态数据交换 ⑧支持对象链接与嵌入 2、简述VB的安装过程。 答:①向光驱中放入VB安装光盘; ②计算机将运行自动安装程序,若没有,执行VB目录下的Setup.exe; ③根据提示逐一回答问题,并点击“下一步”; ④点击“完成”; 2、如何启动VB。 答:三种方法: ①单击“开始”按钮,选择“程序”菜单下的“Microsoft Visual Basic 6.0 中文版”菜单项并单击; ②双击桌面上的VB6.0快捷图标; ③在“开始”菜单的运行对话框中输入命令来启动VB; 第二章习题参考答案 一、选择题: 1-10、DCACD BCBBC 11-20、BADCA BBABA 21-27、ACBBD DC 二、填空题 1.窗体、控件 2.属性值 3.属性窗口设置、代码窗口设置 4.事件过程 5.对象名、下划线、事件名 6.Form_Click 第三章习题参考答案 一、选择题
1、B 2、C 3、A 4、B 5、A 6、C 7、C 二、填空题 1、11 字符型、字节型、整型、长整型、单精度型、双精度型、货币型、逻辑型、日期型、对象型、变体型。String、Byte、Integer、Long、Single、Double、Currency、Boolean 、Date、Object、Variant 2, 双引号(英文)、# 3、ASCII、1、2 4、public、通用、Dim、Static、Private、Static 5、&、+、+ 6、Now()、Time、日期型 三、解答题 1、(3) 2、(1 ) 3、(1)常量(关键字)(2)字符型常量(3)逻辑型常量(4)变量(5)字符串常量(6)变量 (7)字符串常量(8)变量(9)日期型常量(题目应是#11/16/1999#)(10)数值型常量(单精度) 4、31 5、(1)(1+y/x)/(1-y/x) (2)x^3+3*x*y/(2-y) (3)sqr(abs(a*b-c^3)) (4)sqr(s*(s-a)*(s-b)*(s-c)) 6、 7、(1)13 (2)17 (3)#1999-11-12# (4)zxy123ABC 8、(1)19 (2)8.16666666666667 (3)5.25 (4)2 9、(1)-4 (2)2 . 82842712474619 (3)-3 (4)49 (5)“-459.65”(6)”hello” (7)He 8)16 (9)5 10、(4) 11、(2) 12、(4) 第四章习题参考答案 一、选择题: 1—7: DAABBCD 二、填空题 1.500.00% 2.将字号扩大为原来的二倍 3.B 三、编程题(略) 1.文本框、标签和命令按钮的名称分别为text1、label1、command1 Private Sub Command1_Click() Label1.caption=text1.text Command1.caption=text1.text End Sub
《VB 程序设计》课后习题答案 第一章 习题参考答案 一、 填空题 1、对象 事件驱动 2、编译运行模式 解释运行模式 第二章 习题参考答案 一、选择题: 1-10、 DCACD BCBBC 11-20、BADCA BBAAB 21-29、AACBB CDDC 二、填空题 1. 窗体、控件 2. 属性值 3. 属性窗口设置、代码窗口设置 4. 事件过程 5. 对象名、下划线、事件名 6. Form_Click 第三章 习题参考答案 一、选择题 1、B 2、C 3、A 4、B 5、A 6、C 7、C 二、填空题 1、 11 字符型、字节型、整型、长整型、单精度型、双精度型、货币型、逻辑型、日期型、对象型、变体型。String 、Byte 、Integer 、Long 、Single 、Double 、Currency 、Boolean 、Date 、Object 、V ariant 2、 双引号(英文)、# 3、 ASCII 、1、2 4、 public 、通用、Dim 、Static 、Private 、Static 5、 &、+、+ 6、 Now()、Time 、日期型 三、解答题 1、(3) 2、(1 ) 3、(1)常量(关键字) (2)字符型常量 (3)逻辑型常量 (4)变量 (5)字符串常量 (6)变量 (7)字符串常量 (8)变量 (9)日期型常量 (题目应是#11/16/1999#) (10)数值型常量(单精度) 4、31 5、(1)(1+y/x)/(1-y/x) (2)x^3+3*x*y/(2-y) (3)sqr(abs(a*b-c^3)) (4)sqr(s*(s-a)*(s-b)*(s-c)) 6、 f e d c b a ++
第二章 一、问答题 1.叙述建立一个完整的应用程序的过程。 答:界面设计编写事件过程代码运行、调试保存文件 2.当建立好一个简单的应用程序后,假定该工程仅有一个窗体模块。问该工程涉及到几个文件要保存?若要保存该工程中的所有文件,正确的操作应先保存什么文件?再保存什么文件?若不这样做,系统会出现什么信息? 答:涉及到两个文件要保存。先保存窗体文件(.frm),再保存工程文件(.vbp)。若先保存工程文件,系统也会先弹出“文件另存为”对话框,要求把窗体文件先保存。 3.假定在W indows环境中,要保存工程文件时,若不改变目录名,则系统默认的目录是什么? 答:VB98 4.当标签框的大小由Caption属性的值进行扩展和缩小,应对该控件的什么属性进行何种设置? 答:将标签的Autosize设置为True. 5.VB6.0提供的大量图形文件在哪个目录下?若你的计算机上没有安装,则怎样安装这些图形文件? 答:VB6.0提供的图形文件在Graphics目录。 6.在VB6.0中,命令按钮的显示形式可以有标准和图形两种选择,这通过什么属性来设置?若选择图形的,则通过什么属性来装入图形?若已在规定的属性里装入了某个图形文件,但该命令按钮还是不能显示该图形,而显示的是Caption属性设置的文字,怎样改正?答:按钮Style的属性设置为Graphical(或1)。通过Picture属性来装入图形。不能显示图形是因为Style的属性设置为Standard(或0),只要改为Graphical(或1),一般还将Caption 属性的值设置为空。 7.标签和文本框的区别是什么? 答:文本是否可编辑。 8.当窗体上有三个文本框和一个命令按钮,若程序运行时,需把焦点定位在第三个文本框处,应对何控件的什么属性进行何种设置? 答:应对Text3控件进行Text3.TabIndex=0的设置。 9.简述文本框的change与keypress事件的区别。 答:文本框内容变化,change与keypress事件都会发生,所不同的是Keyprees还将返回一个Keyasii参数 10.当某文本框输入数据后(按了回车键),进行判断认为数据输入错,怎样删除原来数据?怎样使焦点回到该文本框重新输入? 答:假定文本框的名称为Text1,则事件过程如下: Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then If 出错条件判断成立Then Text1=””…先删除原来数据 Text1.SetFocus …焦点回到Text1 End If …… End If End Sub
《VB程序设计》课程练习题 上表中的题号所对应题目的题干: 1、叙述Visual Basic的特点。 2、当窗体上有三个文本框和一个命令按钮,若程序运行时,焦点定位在第三个文本框(Text3)处,应对何控件的什么属性进行何种设置? 3、若要对窗体上的三个文本框输入数据,个控件焦点的移动可通过Tab键(系统本身具有的),也可通过回车键,则要对文本框的什么事件编程? 4、当某文本框输入数据后(按了回车键),进行判断认为数据输入错,怎样删除原来数据?怎样使焦点回到文本框重新输入? 5、怎样把关于Command命令按钮的Enabled属性的帮助示例代码复制到你的代码窗口?已知帮助中的代码如下: Private Sub Form_Load() Text1.Text = ””…消除文本框的内容 Command1.Caption = “Save”…在按钮上放置标题 End Sub Private Sub Text1_Change() If Text1.Text = “” Then …查看文本框是否为空 Command1.Enabled = False …使按钮无效 Else Command1.Enabled = True …使按钮有效 End If End Sub 6、当运行程序前,对某些控件设置属性值,除了在窗体中直接设置外,还可以通过代码设置,这些代码一般放在什么事件中?例如,程序要将命令按钮定位在窗体的中央,请写出事件过程。 7、在KeyPress事件中,如何取消用户刚键入的字符?
8、静态数组与动态数组的区别是什么?在声明静态数组、重定义动态数组时的下标都可以用变量来表示吗? 9、函数过程和子过程的区别是什么? 10、子过程调用有哪两种形式? 11、什么是形参?什么是实参?什么是值引用?什么地址引用?地址引用时,对应的实参有没有限制? 12、如果要时钟控件每半分钟发生一个Timer事件,则Interval属性应设置为多少? 13、如果在KeyDown事件过程中将KeyCode设置为0,KeyPress的KeyAscii参数会不会受影响?如果输入的对象是文本框,那文本框的内容是否有影响? 14、构造满足下列条件的Open语句。 (1)建立一个新的顺序文件SEQNEW.DA T,供用户写入数据,指定文件号为1。 (2)打开一个老的顺序文件SEQOLD.DA T,用户将从该文件读出数据,指定文件号为2。(3)打开一个老的顺序文件SEQAPPEND.DA T,用户将在该文件后面添加数据,文件号通过调用FreeFile函数获得。 15、请写出程序代码片段,将磁盘上的两个文件合并。(提示:把它们作为二进制文件打开) 16、PictureBox控件和Image控件有什么区别? 17、Visual Basic可处理哪些格式的图形文件? 18、在程序运行时怎样在图形(像)框中装入或删除图形? 19、简述Printer对象与Printers集合对象的区别。 20、当要在ToolBar控件中添加一个按钮,如何实现? 21、当要修改ToolBar控件某按钮的图像,如何实现? 22、Visual Basic中记录集有几种类型?有何区别?
第四章 VB程序设计基础 第一节数据类型 一.基本数据类型 1.字符串(string) 1)在VB中,字符串是放在双引号内的若干个字符,其中长度为0(即不含任何字符)的字符串称为空串 2) VB中字符串分别变长字符串和定长字符串。其中变长字符串的长度是不确定的,而定长字符串含有确定个数的字符,最大长度不超过65535个字符 2. 数值 VB的数值型数据分为整型数和浮点数两类。期中整型数又分为长数型和整数,浮点数分为单精度浮点数和双精度浮点数 1)整型数 (1)整数(integer):两个字节、取值范围:-32768——32767 (2)长整数(long):四个字节 2)浮点数 (1)单精度(single):四个字接、用“E”表示 例:123.45E3 123.45*10*10*10 (2)双精度(double):八个字节,用“D”表示 例:123.45678D3 123.45678*10*10*10 3.货币(currency) 1)货币数据类型是为表示钱款而设置的,该数据类型一8个字节存储,精确到小数点后4位,在小数点后4位以后的数字将会被舍去 2)浮点数中的小数点是“浮动”的,即小数点可以出现在数的任何位置,而货币类型数据的小数点是固定的,因此称为定点数据类型 4. 变体(variant) 变体数据类型是一种可变数据类型,可以表示任何值,包括数值、字符串、日期/时间等 5.其他数据类型 1)字节(byte) 字节实际上是一种数值类型,以1字节的无符号二进制数存储,其取值范围是0——255 2)布尔(bollean) 布尔型数据是一个逻辑值,用两个字节存储,它只取两种值,即Ture(真)或Flase (假) 3)日期(date) 日期存储为8个字节浮点值形式,日期文字以符号“#”括起来 二.用户定义的数据类型 1.用户可以利用Type语句定义自己的数据类型,其格式如下: Type 数据类型名称 数据类型元素名 As 类型名 数据类型元素名 As 类型名 …… End Type
《VB程序设计》第四章第四节参数的传递 最后修改: 2010-6-2 23:16:59 第四节参数的传递 参数是在本过程有效的局部变量,用于传递信息。在调用一个有参数的过程时,首先进行的是“形参和实参结合”,实现调用过程的实参与被调过程的形参之间的数据传递,数据传递有两种方式:按值传递和按地址传递。 例如,下面实例由于传递的参数个数不匹配而出错。 Private Function Divisor(ByVal x As String,ByVal y As Integer) ′ 函数Divisor计算最大公约数 … End Function Divisor有两个参数,而调用语句中形参个数只有一个,代码如下: Private Sub Form_Click() Dim m As Integer, n As Integer, E As Integer N=InputBox("请输入N" ) M=InputBox("请输入M" ) g=Divisor(n) ′未提供m参数 Print n;"和";m;"的最大公约数是:" ;g End Sub 单击窗体运行程序时,则会显示出错信息,如图4-4-1所示。 图 4-4-1 一、形参和实参 1.形参 在被调用过程中的形参,出现在Sub过程和Function过程中。在过程被调用之前,形参并未被分配内存,只是说明形参的类型和在过程中的作用。形参列表中的各参数之间用逗
号(,)分隔,形参可以是变量名和数组名,定长字符串变量除外。 2.实参 实参是在主调过程中的参数,在过程调用时实参将数据传递给形参。 形参列表和实参列表中的对应变量名可以不同,但实参和形参的个数、顺序以及数据类型必须相同。因为“形实结合”是按照位置结合,即第一个实参与第一个形参结合,第二个实参与第二个形参结合,依此类推。 例如,在求最大公约数的[例Ex_Divisor1] 中被调用函数和调用过程如下: Private Function Divisor(ByVal x As Integer,ByVal y As Integer) End Sub Private Sub Form_Click() G=Divisor(n,m) End Sub 当运行单击窗体事件调用Divisor过程时,首先进行“形实结合”。形参与实参的结合对应关系是:n→>x,m→y。 3.形参的数据类型 在创建过程时,如果没有声明形参的数据类型,则默认为Variant型。 例如,将[例Ex_Divisor1]函数过程中的x为Variant型,y为Integer型: Private Function Divisor(ByVal x,ByVal y As Integer) End Function 对于实参数据类型与形参定义的数据类型不一致时, VB会按要求对实参进行数据类型转换,然后将转换值传递给形参。 例如,将[例Ex_Divisor1]函数的实参n的数据类型改为Single型,被调函数如下: Private Sub Form_Click() Dim n As Single,m As Integer, g As Integer N=InputBox(″请输入N″ ) M=InputBox(″请输入M″ ) G=Divisor(n,m) Print n;″和″ ;m;″的最大公约数是:″ ;g End Sub 被调函数过程如下:
V B程序设计教程第四 版课后答案 集团标准化工作小组 [Q8QX9QT-X8QQB8Q8-NQ8QJ8-M8QMN]
vb课后习题答案 第一章习题参考答案 一、填空题 1、对象事件驱动 2、编译运行模式解释运行模式 二、简答题 1、简述VB的特点。 答:①可视化的程序设计方法 ②面向对象的程序设计思想 ③事件驱动的编程机制 ④结构化的程序设计语言 ⑤高度的可扩充性 ⑥强大的数据库访问能力 ⑦支持动态数据交换 ⑧支持对象链接与嵌入 2、简述VB的安装过程。
答:①向光驱中放入VB安装光盘; ②计算机将运行自动安装程序,若没有,执行VB目录下的; ③根据提示逐一回答问题,并点击“下一步”; ④点击“完成”; 2、如何启动VB。 答:三种方法: ①单击“开始”按钮,选择“程序”菜单下的“Microsoft Visual Basic 中文版”菜单项并单击; ②双击桌面上的快捷图标; ③在“开始”菜单的运行对话框中输入命令来启动VB; 第二章习题参考答案 一、选择题: 1-10、 DCACD BCBBC 11-20、BADCA BBAAB 21-29、AACBB CDDC
二、填空题 1.窗体、控件 2.属性值 3.属性窗口设置、代码窗口设置 4.事件过程 5.对象名、下划线、事件名 6. Form_Click 第三章习题参考答案 一、选择题 1、B 2、C 3、A 4、B 5、A 6、C 7、C 二、填空题 1、 11 字符型、字节型、整型、长整型、单精度型、双精度型、货币型、逻辑型、日期型、对象型、变体型。String、Byte、Integer、Long、Single、Double、Currency、Boolean