Visual Basic(第六章).doc_第1页
Visual Basic(第六章).doc_第2页
Visual Basic(第六章).doc_第3页
Visual Basic(第六章).doc_第4页
Visual Basic(第六章).doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第6章 数 组前面各章使用的变量均为简单变量。在处理某些实际问题时,使用简单变量很不方便,甚至难以胜任。例如,成批数据的排序,找出高于或低于平均值的数据等。6.1 数组的概念6.1.1 数组与数组元素数组用一个统一的名称表示的、顺序排列的一组变量.将若干个具有相同性质的变量组合在一起形成的变量表格。数组名变量表格的名称,数组的命名与简单变量的命名规则相同。数组元素(下标变量)数组中的变量。下标变量在表格中的存放位置。可以用数组名及下标惟一地识别一个数组的元素。例如:S(5)代表数组S中的下标为5的数组元素。其中:S是数组名,5是下标。注意:(1)下标必须用括号括起来。S(5)是一个下标变量,而S5是一个简单变量。(2)下标可以是常量、变量或表达式,还可以是下标变量。例如:例:设A=2, A1=3, B=1, C=4。根据给出的数组X写出下列下标变量的值。X(1)57X(2)42X(3)18X(4)98X(5)76X(6)6解:1X(3)=182X(C)=X(4)=983X(A+A1)=X(5)=764X(X(A+C)-A1)=X(X(6)-A1)=X(3)=18(3)下标为整数,否则将自动取整(舍去小数部分)。(4)下标的最大值和最小值分别称为数组的上界和下界。6.1.2 数组的类型与简单变量一样,可以声明任何基本数据类型的数组,以及用户自定义类型和对象类型的数组。但在同一个数组中,所有元素的类型相同(除了Variant类型)。6.1.3 数组的维数数组的维数描述元素在数组中的位置所需的下标个数。一维数组数组元素用一个下标表示。二维数组数组元素用两个下标表示。例如,记录30个学生,每个学生5门课程的成绩(灰色部分)。语 文数 学外 语物 理化 学学生26974807679学生37786728095学生308890758882如果数组的名称为S,则有:S(i, j)表示第i个学生、第j门课程的成绩。Visual Basic最多可以使用16维的数组。数组的三要素类型、维数、每维下标的范围。6.1.4 数组的形式固定大小的数组数组中元素的个数固定不变。动态数组经重新声明后,可以改变数组的大小(下标范围)。6.2 固定大小的数组6.2.1 数组的声明一、变量的作用范围工程级(全局)变量在整个工程的所有模块中有效。窗体级(模块级)变量在声明变量的窗体内的所有过程中有效。过程级变量仅在声明变量的过程内有效。例如,声明窗体级变量:在窗体顶部的声明段中:Dim a As Integer 或Private a As Integer过程代码:Private Sub Command1_Click() Dim a As Integer 此语句将变量a声明为私有变量 a = 12End SubPrivate Sub Command2_Click() Print a & by Command2End SubPrivate Sub Command3_Click() Print a & by Command3End Sub例如,声明全局变量:在标准模块的声明段中:Public aa As IntegerForm1中的代码:Private Sub Command1_Click() aa = 12 Form2.ShowEnd SubForm2中的代码:Private Sub Command1_Click() Print aaEnd Sub二、数组的声明1建立公用数组(全局)在标准模块的通用段用Public语句声明数组:Public 数组名(维数定义) As 类型(教材图6-1有错)2建立模块级数组(窗体级)在窗体的通用段用Private或Dim语句声明数组:Private | Dim 数组名 (维数定义) As 类型3建立局部(过程级)数组在过程中用Dim语句声明数组:(不能使用Private,教材中有错)Dim 数组名(维数定义) As 类型说明:(1)数组名:遵循标准的变量命名约定。(2)维数定义:指定数组的维数以及各维的范围。下标下界1 To 下标上界1 ,下标下界2 To 下标上界2 缺省“下标下界”时,下标的下界由Option Base语句控制。缺省Option Base语句时,则缺省的下界为0。例如:Dim a(8) As Integer 等同于Dim a(0 To 8) As Integer例如:Option Base 1Dim a(8) As Integer 等同于Dim a(1 To 8) As Integer例如:Dim b(30, 5) As Single 等同于Dim b(0 To 30, 0 To 5) As Single可以使用具有一定意义的下标,例如:Dim Student(1980 To 2000) As Integer6.2.2 数组的使用使用数组时,应注意以下几点:(1)对数组元素的操作如同对简单变量的操作。(2)在声明数组时,VB已经对数组进行初始化(数值型数组的元素值初始化为0,字符型数组的元素值初始化为空等)。(3)数组名、数组类型和维数必须与数组声明时一致。(4)下标值不可越界(在声明数组时指定的范围内)。(5)在同一过程中,数组与简单变量不能同名。【例6.1】统计选票问题。设有20个候选人,代号分别为1,2,320。设-1为数据结束标记。Private Sub Command1_Click() x = InputBox(请输入选票) Do While x -1 Select Case x Case 1 a1 = a1 + 1 Case 2 a2 = a2 + 1 Case 3 a3 = a3 + 1 Case 4 a4 = a4 + 1 省略了Case 5Case 20这16个分支 End Selectx = InputBox(请输入选票) Loop List1.AddItem No1 & a1 List1.AddItem No2 & a2 List1.AddItem No3 & a3 List1.AddItem No4 & a4 省略了a5a20这16个输出语句End Sub有了数组,代码如下:Private Sub Command1_Click() Dim a(1 To 20) As Integer x = InputBox(请输入选票) Do While x -1 a(x) = a(x) + 1 Rem If x = 1 And x Max Then Max = a(i) If a(i) Aver Then c = c + 1 Next i MsgBox 超出平均值的数据有 & c & 个End Sub【例6.3】斐波纳奇(Fibonacci)数列问题(要求产生数列的前15项)。(教材P.129【例6.3】)事件代码:Private Sub Command1_Click() Dim f(15) As Integer List1.Clear f(1) = 1: f(2) = 1 List1.AddItem f(1) List1.AddItem f(2) For i = 3 To 15 f(i) = f(i - 1) + f(i - 2) List1.AddItem f(i) NextEnd Sub【例6.4】设有一个55的方阵,其中元素为随机产生的一位整数。求:(教材P.130【例6.4】)(1)主对角线与次对角线上元素之和(分别求出)。(2)各行元素之和。(3)各列元素之和。(3)方阵中最大的元素。分析:(1)主对角线与次对角线上元素的下标特征。(2)如何求各行元素之和、各列元素之和。(3)如何求方阵中最大的元素。编写代码:Private Sub Command1_Click() 声明数组 Dim a(1 To 5, 1 To 5) As Integer 数组元素赋值 Randomize For i = 1 To 5 For j = 1 To 5 a(i, j) = 10 + Int(Rnd * 90) Print a(i, j); Next j Print Next i 求两条对角线上的元素之和(方法一) For i = 1 To 5 d1 = d1 + a(i, i) d2 = d2 + a(i, 6 - i) Next i Print d1, d2 求两条对角线上的元素之和(方法二) d1 = 0: d2 = 0 For i = 1 To 5 For j = 1 To 5 If i = j Then d1 = d1 + a(i, j) If i + j = 6 Then d2 = d2 + a(i, j) Next j Next i Print d1, d2 求各行元素之和 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 j = 1 To 5 Sum = 0 For i = 1 To 5 Sum = Sum + a(i, j) Next i Print Sum; Next j Print 求数组中最大元素及其位置 Max = a(1, 1): row = 1: col = 1 For i = 1 To 5 For j = 1 To 5 If a(i, j) Max Then Max = a(i, j) row = i: col = j End If Next j Next i Print Max, row, colEnd Sub补充:求Private Sub Command2_Click() Dim x As Single n = 0: tn = 1: s = 1 x = InputBox() Do n = n + 1 tn = tn * x / n s = s + tn Loop Until tn a(j) Then t = a(i): a(i) = a(j): a(j) = t End If Next j Next i 输出数组 For i = 1 To 10 Print a(i); Next i Print: PrintEnd Sub(讨论:如何将输出合并到排序循环中)6.3 动态数组作业:P.1563,4,6,7,9如果希望在运行时能够改变数组的大小,就要用到动态数组。例如,将【例6.5】改为“由计算机产生n个两位随机整数,并将这些数按由小到大的顺序排列”。6.3.1 创建动态数组创建动态数组的步骤:(1)用Public、Dim或Static语句声明一个空维数组。(删除教材P.141第4行“在过程中”4个字)(2)用ReDim语句分配实际的元素个数(维数和每维下标范围)。ReDim语句的格式与Dim语句相同,但通常不必指定数组的类型(数组的类型应在声明空维数组时确定)【例6.6】由计算机产生n个两位随机整数,并将这些数按由小到大的顺序排列。编写代码:Private Sub Command1_Click() Dim a() As Integer 声明空维数组 n = InputBox(请输入数据的个数) ReDim a(1 To n) 确定维数及每维下标范围 给数组赋值 Randomize For i = 1 To n a(i) = Int(Rnd * 90) + 10 List1.AddItem a(i) Next i 排序并输出 For i = 1 To n - 1 For j = i + 1 To n If a(i) a(j) Then t = a(i): a(i) = a(j): a(j) = t End If Next j List2.AddItem a(i) Next i List2.AddItem a(n)End Sub说明:(1)ReDim是一个可执行语句,因此,只能出现在过程中。(2)ReDim语句可以改变数组的维数、上界和下界,但是,不能改变数组的类型。(3)执行ReDim语句后,原先存储在数组中的数据将全部丢失。为了保留数组中的原有数据,可以在ReDim语句中使用Preserve关键字(参考教材6.3.2),例如:ReDim Preserve A(1 to 20)【例6.7】编程序,输出杨辉三角形(教材【例6.11】)。分析:杨辉三角形中的各行是二项式(a + b)n展开式中各项的系数。其中,每行的第一列和斜边线上的元素值均为1,其余各项的值都是其上一行中前一列元素与上一行中同列元素之和,即:编写代码:Private Sub Command1_Click() Dim a() As Integer, n As Integer n = InputBox(请输入杨辉三角形的行数, 输入, 10) ReDim a(n, n) Cls For i = 1 To n a(i, 1) = 1: a(i, i) = 1 Next For i = 3 To n For j = 2 To i - 1 a(i, j) = a(i - 1, j - 1) + a(i - 1, j) Next Next For i = 1 To n For j = 1 To i Print Tab(j*5);a(i, j); Next j Print Next iEnd Sub教材P.142【例6.11】的代码:Private Sub Text1_KeyPress(KeyAscii As Integer) Dim a() As Integer Dim n As Integer If KeyAscii = 13 Then n = Text1.Text ReDim a(n, n) For i = 1 To n a(i, 1) = 1: a(i, i) = 1 Next p = Format(1, !) & Chr(13) p = p & Format(1, !) & Format(1, !) & Chr(13) For i = 3 To n p = p & Format(a(i, 1), !) For j = 2 To i - 1 a(i, j) = a(i - 1, j - 1) + a(i - 1, j) p = p & Format(a(i, j), !) Next p = p & Format(a(i, i), !) & Chr(13) Next MsgBox p, 0, 杨辉三角形 End IfEnd Sub修改以上代码,可以更清楚地看到如何产生杨辉三角形。6.4 控件数组6.4.1 控件数组的概念控件数组是一组具有共同名称和类型的控件。一个控件数组至少应有一个元素,其成员具有相同的事件过程。控件数组的成员具有:(1)相同的名称(Name)。(2)以下标索引值(Index)来识别各个控件。6.4.2 控件数组的建立在设计阶段,创建控件数组的方法有3种:(1)将相同名字赋予多个控件。用这种方法创建的控件数组,其成员仅仅共享数组的Name属性,其他属性与最初画出控件时的值相同。(2)复制现有的控件并将其粘贴到窗体上。利用复制、粘贴的功能建立的控件数组,其成员的大部分属性与第一个控件相同。(3)将控件的 Index 属性设置为非 Null 数值,然后利用前两种方法之一添加控件数组的成员。6.4.3 控件数组的使用控件数组共享同样的事件过程,在程序运行中,可以利用返回的索引值来识别事件是由哪个控件所引发的。【例6.8】创建一个具有3个成员的标签控件数组,输入如下代码:Private Sub Label1_Click(Index As Integer) i = Index Label1(i).Left = 360Label1(i).FontSize = 18 Label1(i).AutoSize = True Select Case i Case 0 Label1(i).Top = 120 + i * 760 Label1(i).Caption = Welcome Label1(i).ForeColor = vbRed Case 1 Label1(i).Top = 120 + i * 760 Label1(i).Caption = Welcome Label1(i).ForeColor = vbGreen Case 2 Label1(i).Top = 120 + i * 760 Label1(i).Caption = Welcome Label1(i).ForeColor = vbBlue End SelectEnd Sub可以在运行时创建控件数组中新的成员,步骤:(1)用Load语句将新的控件加载到内存中。(2)将该控件的Visible属性设置为True。例如:为了在运行时添加控件,可在上例的基础上增加如下代码:Private Sub Command1_Click() n = Label1.Count Load Label1(n) Label1(n).Left = 360 Label1(n).Top = 120 + n * 760 Label1(n).Visible = True Label1(n).Caption = Welcome & Label1.UBoundEnd Sub说明:1Lbound、Ubound属性分别返回控件数组中控件的最小、最大索引值。2函数LBound(数组名, 维数), UBound(数组名, 维数) 分别返回数组中指定维的最小、最大下标值。例如:Dim a(10 To 40)Print LBound(a), UBound(a)Dim b(1 To 40, -4 To 20)Print LBound(b, 1), UBound(b, 1)Print LBound(b, 2), UBound(b, 2)【例6.9】简易计算器(教材【例6.12】)。分析:程序中的按钮分为两大类:(1)数字类:控件组Command1(0) Command1(10)(2)运算符类:控件组Command2(0) Command2(4)。属性设置:对 象属 性属性值Form1TagTText1TextAlignment1 Right JustifyLockedTrueCommand1(0) Command1(10)Caption依次为:0、1、2、3、4、5、6、7、8、9、.(小数点)Command2(0) Command2(4)Caption依次为:+、-、*、/、=编写代码:在模块的“通用”段声明变量:Dim v As Boolean 是否第一次按运算符Dim s As Integer 存放上次按的运算符Dim x As Double 存放第一个操作数Dim y As Double 存放第二个操作数窗体的Activate事件代码:Private Sub Form_Activate() v = TrueEnd Sub数字类命令按钮组Command1() 的Click事件代码:Private Sub Command1_Click(Index As Integer) If Form1.Tag = T Then 向显示中的数追加新数。 If Index = 10 Then Text1.Text = 0. Else Text1.Text = Command1(Index).Caption End If Form1.Tag = Else a = Text1.Text Text1.Text = a & Command1(Index).Caption End IfEnd Sub运算符类命令按钮组Command2() 的Click事件代码:Private Sub Command2_Click(Index As Integer) Form1.Tag = T Tag属性可以用来存放用户的数据 If v Then 第一次按运算符 x = Text1.Text 将键入的数存入x v = Not v Else y = Text1.Text Select Case s Case 0 Text1.Text = x + y Case 1 Text1.Text = x - y Case 2 Text1.Text = x * y Case 3 If y 0 Then Text1.Text = x / y Else MsgBox (不能以0为除数) Text1.Text = x v = False End If Case 4 y = 0 v = False End Select x = Text1.Text End If s = IndexEnd Sub【例6.9】判断试卷中的客观题。Private Sub Command1_Click() Dim name(1 To 50) As String, score(1 To 50) As String Open h:计算机竞赛.txt For Input As #1 Input #1, name(1), Key Print name(1), Key i = 2 Do Input #1, name(i), answer Print name(i), answer, s = 0 For m = 1 To Len(Key) If Mid(Key, m, 1) = Mid(answer, m, 1) Then s = s + 1 Next m score(i) = s Print

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论