Visual Basic入门 第七讲 数组.ppt_第1页
Visual Basic入门 第七讲 数组.ppt_第2页
Visual Basic入门 第七讲 数组.ppt_第3页
Visual Basic入门 第七讲 数组.ppt_第4页
Visual Basic入门 第七讲 数组.ppt_第5页
免费预览已结束,剩余67页可下载查看

下载本文档

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

文档简介

VisualBasic6 0程序设计 1 第8章数组 本章要点 数组的基本概念数组的定义数组的输入 输出控件数组 2 数组的基本概念 1 定义 一组性质相同的有序的数例 多项式y a0 a1x a2x2 a3x3 anxn系数A a0 a1 a2 an 可以构成一个数组表示 A 0 A 1 A 2 A n 例 全班40名同学的英语成绩G 1 G 2 G 3 G 40 所有班级 如6个班 每班40人 同学的英语成绩表示1 G 1 G 2 G 3 G 240 表示2 G 1 1 G 1 2 G 1 40 G 2 1 G 2 2 G 2 40 G 6 1 G 6 2 G 6 40 3 例 矩阵B 矩阵中各元素b11 b33可表示成 B 1 1 B 1 2 B 1 3 B 2 1 B 2 2 B 2 3 B 3 1 B 3 2 B 3 3 其中 B 1 1 23 4 数组的一般形式 S n 数组名 一组数用一个统一的名称表示 称数组名 如S 数组元素 下标变量 数组中的每一个元素 表示成 数组名 下标 下标的取值可以是常数 变量 表达式如 A 8 B I C 3 K 下标还可以是下标变量如 A A 5 令A 5 4 A A 5 A 4 数组的维数 下标个数一维数组 由一个下标组成 如A 2 C 6 二维数组 由两个下标组成 如B 2 3 三维数组 由三个下标组成 如G 3 4 23 三维以上的数组称为多维数组 最多60维 5 控件中数组 List控件的List i Selected i 都是数组 PrivateSubCommand1 Click Fori List1 ListCount 1To0Step 1IfList1 Selected i ThenList2 AddItemList1 List i List1 RemoveItemiEndIfNextEndSub 6 数组的定义 数组在使用之前必须先定义 声明 定义数组的目的是为数组分配存储空间 数组名即为这个存储空间的名称 而数组元素即为存储空间的每一个单元 每个单元的大小与数组的类型有关 例如 定义某数组X为整型 Integer 数组 共有10个元素 则每个元素占2个字节 整个数组占20个字节的存储空间 按数组占用存储空间的方式不同 分为两种数组 静态数组和动态数组 两种数组的定义方法不同 使用方法也略有不同 7 静态数组的定义 1 格式 Public Private Dim As 2 功能 声明数组名称 维数 维大小 类型 为数组分配存储空间 3 说明 合法的变量名 简单定义 完整定义 To To 8 静态数组的第一种定义格式对于数组的每一维省略下界 只给出上界 如无下界 则使用默认下界 定义默认下界 OptionBase 0 1 不加任何定义时 默认下界为0例如 dima 10 as dimb 3 3 as OptionBase语句 必须位于数组声明之前 用于设置数组维数下标的下界 数组下标下界默认为0 9 静态数组的第二种定义格式Dim数组名 下界1To 上界1 下界2 To上界2 可根据需要指定数组的下界 不受OptionBase语句限制 下界1To上界1 下界2To上界2 例如 DimHeight 1987To2007 Dimb 0To3 4To6 AsInteger 10 和数组有关的两个函数 LBound 数组 维 函数UBound 数组 维 函数这两个函数分别返回一个数组中指定维的下界和上界 例如 OptionBase1Dima 10 5 M LBound a 1 N UBound a 2 PrintM NDimb 1To10 Fori LBound b ToUBound b b i b i 1NextPrinti b i 1 11 IntegerLongSingleDoubleBooleanStringString nDateVariantObject用户定义类型 数组在定义后自动被初始化 例如 将数值型数组元素值置为0将字符串类型数组元素值置为零长度字符串分配固定的存储空间 在运行期大小不能改变数组元素个数 上界1 下界1 1 上界2 下界2 1 12 例 DimC 9 AsInteger一维整型数组 下界0 上界为9元素 C 0 C 1 C 2 C 9 例 DimA 4TO10 AsInteger一维整型数值数组 下界 4 上界10元素A 4 A 3 A 0 A 1 A 10 例 DimB 0to8 0to3 AsString DIMB 8 3 AsString二维字符串类型数组第一维 下界0 上界8 第二维 下界0 上界3元素B 0 0 B 0 1 B 0 2 B 0 3 B 1 0 B 1 1 B 1 2 B 1 3 B 8 0 B 8 1 B 8 2 B 8 3 13 例 DimC 99TO 5 3TO0 AsBoolean第一维下界 99 上界 5 第二维下界 3 上界0元素 C 99 3 C 99 2 C 99 1 C 99 0 C 98 3 C 98 2 C 98 1 C 98 0 C 5 3 C 5 2 C 5 1 C 5 0 例 DIMS1 50 ASLONGDIMM 3TO10 DIMABC 20 ASSTRINGDIMST2 7 0TO14 ASSTRING 20例 CONSTY1 10CONSTY2 50DIMABC Y1TOY2 ASINTEGER 14 特殊数组 默认数组 默认数组就是数据类型为Variant 默认 的数组 在一般情况下 定义数组应该指明其类型 如 Dima 1to9 AsInteger如果定义数组时 未指明类型 则系统默认其数据类型是Variant 即变体类型 默认数组可以存放不同类型的数据 如 Dima 5 a 1 100 a 2 234 56 a 3 Ok a 4 20a i Next 15 1 定义分以下两步进行 1 在模块级或过程级定义一个没有下标的数组Public Private Dim As 2 在过程级使用ReDim语句定义数组的实际大小ReDim Preserve As 2 说明 常包含明确值的变量或表达式可以用ReDim反复改变数组元素及维数的数目ReDim不能改变数组类型执行ReDim语句时 无Preserve时 重新对数组元素进行初始化 动态数组的定义 16 Preserve 可选的关键字 有时 希望改变数组的大小又不丢失数组中原有的数据 使用带Preserve关键字的ReDim语句就可以做到这一点 用Preserve关键字时只能改变多维数组中最后一维的上界 如果改变了其他维或最后一维的下界 那么运行时就会出错 17 例 DimA AsIntegerPrivateSubCommand1 Click N 4ReDimA N ForI 0ToNA I 1 PrintA I NextIPrintN 8ReDimA N N 18 ForI 0ToNForJ 0ToNA I J 2 PrintA I J NextJPrintNextIReDimPreserveA N N 4 Printa N N EndSub 19 格式 Erase功能 对静态数组使用Erase语句将对其中的所有元素进行初始化 清除数组中的元素值 例如 将数值型数组元素值置为0 将可变长度字符串类型数组元素值置为零长度字符串 注意 Erase语句不能释放静态数组所占的存储空间 对动态数组使用Erase语句将释放动态数组所占的存储空间 在下次引用该动态数组之前 必须使用ReDim语句重新定义该数组 数组的删除 20 数组的输入输出 数组在声明之后 VB对其进行了初始化 但在实际应用中 往往要给数组元素赋一定的初始值 例如 在处理学生成绩时 首先需要向数组中输入所有的成绩 在使用二维数组表示矩阵时 要向数组中输入矩阵中各元素的值 对数组元素的输入可以有多种方法 例如 赋值语句 文本框 InputBox函数 Array函数等 可以对数组的个别元素输入数据 也可以对整个数组输入数据 数组元素经过处理后 常需要将结果显示给用户 即输出数组元素的值 输出方法如 Print方法 标签 文本框等 21 例 输入10个单词 按相反的次序输出方法1 DimA 1To10 AsStringA 1 one A 2 two A 3 three A 4 four A 5 five A 6 six A 7 seven A 8 eight A 9 nine A 10 ten ForI 10To1Step 1PrintA I NextI 适合于对数组的个别元素赋初值适合于输出少量数据 22 方法2 DimA 1To10 AsStringForI 1To10A I InputBox 请输入单词 在此输入 NextIText1 Text ForI 10To1Step 1Text1 Text Text1 Text A I Space 1 NextI 使用文本框显示多个数据时 常需要给文本框设置滚动条 依据滚动条的方向 要注意每显示一个或多个数据后是否要在文本框中加上回车换行符号 23 方法3 利用Array函数DimA A称为数组变量 只能是可变类型A Array one two three four five six seven eight nine ten Label1 Caption ForI UBound A ToLBound A Step 1Label1 Caption Label1 Caption A I NextI 数组变量只能是一维数组 使用默认下界常需要设置标签的以下属性 Autosize TrueWordWrap True 24 输出数组的所有元素使用For循环始值和终值分别由LBound UBound函数获得 多维数组应使用多重循环 Fori LBound A toUBound A PrintA i Next输出数组的所有元素使用数组下标的方法 PrintA 9 25 1 格式ForEachIn ExitFor Next 使用ForEach Next循环处理数组 只能是一个可变类型的变量 2 功能 首先将数组中的第一个元素赋给 然后进入循环体中执行其中的语句 如果数组中还有其他元素 则继续将下一个元素赋值给后执行循环体 当针对数组中的所有元素都执行完了 便会退出循环 然后执行Next之后的语句 26 例 以下程序段使用ForEach Next语句打印一维数组X中的所有元素 DimX 15 ForEachAInXPrintA NextA例 求二维数组Y的所有元素之和 DimY 10 10 ForEachAInYSum Sum ANextAPrintSum 使用ForEach Next循环处理数组时 适合于不关心数组元素的处理次序的问题 27 数组应用举例 例8 1 生成100个 10到10之间的随机整数 存于一维整型数组A中 统计这100个数中 10 5 5 10的个数 分析 计数变量 保存某数在数组中出现的次数 本例要设4个计数变量 统计过程 逐一取数组元素与指定的数进行比较 如果相同 则对相应的计数变量加1 28 1 首先在代码窗口的通用声明段声明数组A为具有100个元素的整型数组 DimA 1To100 AsInteger 2 在窗体加载时生成随机整数 所以相应的代码写在窗体的Load事件过程中 PrivateSubForm Load RandomizeText1 Text ForI 1To100A I Int Rnd 21 10 Text1 Text Text1 Text Str A I NextIEndSub 29 3 单击 统计 按钮开始进行统计 PrivateSubCommand1 Click num1 0 num2 0 num3 0 num4 0ForI 1To100SelectCaseA I Case 10num1 num1 1Case 5num2 num2 1Case5num3 num3 1Case10num4 num4 1EndSelectNextI 30 显示统计结果Picture1 Print 10的个数 num1 Tab 15 5的个数 num2Picture1 Print 5的个数 num3 Tab 15 10的个数 num4EndSub 31 例8 2 从键盘上输入10个整数 用冒泡排序法升序排序 分析 见P202PrivateSubCommand1 Click Staticnumber 1To10 AsIntegermsg Enternumberforsort msgtitle Sortdemo Fori 1To10number i InputBox msg msgtitle Nexti 32 Fori 10To2Step 1Forj 1Toi 1Ifnumber j number j 1 Thent number j 1 number j 1 number j number j tEndIfNextj Nexti Fori 1To10Printnumber i Nexti EndSub 33 PrivateSubCommand1 Click Staticnumber 1To10 AsIntegermsg Enternumberforsort msgtitle Sortdemo Text1 Text Fori 1To10number i InputBox msg msgtitle Text1 Text Text1 Text number i Nexti Fori 1To9Forj 10Toi 1Step 1Ifnumber j number j 1 Thent number j 1 number j 1 number j number j tEndIfNextj Nexti Fori 1To10Printnumber i Nexti EndSub 本程序为 冒泡 排序的另一种解法 选找到最小的元素并放到数组的左端 最终完成排序 控件 一个命令按钮和一个文本框 34 例8 3 在窗体上输出一个N行 N列 主对角线和次对角线元素为1 其余元素均为零的矩阵 N由用户指定 分析 1 在窗体模块的声明段声明 OptionBase1DimA AsInteger 2 设单击窗体生成矩阵 窗体的Click事件过程如下 PrivateSubForm Click ClsDimNAsInteger IAsInteger JAsIntegerN Val InputBox 请输入N 生成矩阵 4 ReDimA N N AsInteger 根据N定义数组大小 35 生成矩阵ForI 1ToNForJ 1ToNA I J 0IfI JThenA I J 1 主对角线元素EndIfIfI J N 1ThenA I J 1 次对角线元素EndIfNextJ I 36 按N行N列的格式显示矩阵ForI 1ToNForJ 1ToNPrintA I J NextJPrintNextIEndSub 运行时单击窗体 输入N值6 在窗体上打印结果如图所示 37 例8 4 求两个矩阵的和 分析 M行N列的矩阵A与M行N列的矩阵B的和 结果为一个M行N列的矩阵C C矩阵中第I行第J列的元素 等于A矩阵中第I行第J列的元素与B矩阵中第I行第J列的元素相加 即 C I J A I J B I J 38 1 由于数组A B和C要在两个事件过程中使用 因此需要在代码的通用声明段声明 同时声明M和N表示矩阵的行数和列数 DimMAsInteger NAsInteger A AsInteger B AsInteger C AsInteger 2 在窗体的Load事件过程中用输入框输入M和N的值 再根据该值定义动态数组A B和C的大小 生成矩阵中的数据 保存在数组A和B中 同时显示在文本框Text1和Text2中 39 PrivateSubForm Load M Val InputBox 请输入行数 矩阵相加 N Val InputBox 请输入列数 矩阵相加 ReDimA 1ToM 1ToN B 1ToM 1ToN C 1ToM 1ToN 在文本框Text1中生成矩阵AText1 Text ForI 1ToMS1 S1用于保存矩阵的第I行ForJ 1ToNA I J Int Rnd 11 S1 S1 Str A I J NextJText1 Text Text1 Text S1 vbCrLfNextI 注 vbCrLf Chr 13 Chr 10 回车符与换行符 40 在文本框Text2中生成矩阵BText2 Text ForI 1ToMS1 S1用于保存矩阵的第I行ForJ 1ToNB I J Int Rnd 11 S1 S1 Str B I J NextJText2 Text Text2 Text S1 vbCrLfNextIEndSub 41 3 求和 按钮的Click事件过程如下 PrivateSubCommand1 Click 求A矩阵与B矩阵的和C矩阵 显示在Text3中Text3 Text ForI 1ToMs1 ForJ 1ToNC I J A I J B I J s1 s1 Str C I J NextJText3 Text Text3 Text s1 vbCrLfNextIEndSub 42 例8 5 输入N个整数作为原始数据 存于数组A中 在数组A中查找指定的元素Number 分析 这是一个查找问题 查找的方法有很多种 如顺序查找 折半查找 分块查找等 不同的查找方法效率不同 顺序查找 算法 从数组的第一个元素开始 按顺序依次与Number比较 如果第I个数与Number相等 即A I Number 则显示找到的位置I 否则 执行I I 1 再重复以上比较过程 若直到I N 则结束查找 说明数组中不存在Number这个数 43 设计界面 44 在窗体的通用声明段声明数组A及其个数N DimA AsInteger NAsInteger在窗体的Load事件过程中输入并显示数组元素 PrivateSubForm Load N Val InputBox 请输入N ReDimA 1ToN AsIntegerForI 1ToNA I Val InputBox 请输入第 Str I 个数 Text1 Text Text1 Text Str A I NextIEndSub 45 单击按钮Command1用InputBox输入要查找的数Number 然后开始查找 用消息框显示查找结果 PrivateSubCommand1 Click Number Val InputBox 请输入要查找的数 k 0ForI 1ToNIfNumber A I Then 如果找到k I 保存找到的位置ExitFor 退出循环EndIfNextIIfk 0ThenMsgBox 所找的数在第 Str k 个位置 ElseMsgBox 没找到 EndIfEndSub 46 控件数组 控件数组的定义 控件数组的表示 控件数组的创建1 将多个控件取相同的名称2 复制 粘贴现有的控件3 给控件设置一个Index属性值控件数组的使用同一个控件数组的所有控件共享同一事件过程 该过程返回参数Index表示在哪个控件上发生该事件 47 例如 命令按钮数组Command1的单击事件过程为 PrivateSubCommand1 Click IndexAsInteger 在此过程中可以根据Index的值决定 当前按下哪个按钮 以便做相应的处理EndSub 例8 6 设计如图所示的界面 创建一选项按钮控件数组 Option1 运行时 当按下某一选项按钮时 对图形设置相应的填充颜色 48 PrivateSubOption1 Click IndexAsInteger SelectCaseIndexCase0Shape1 FillColor vbWhiteCase1Shape1 FillColor vbBlue Case6Shape1 FillColor vbYellowEndSelectEndSub 49 常数值描述vbBlack h00黑色vbRed hFF红色vbGreen hFF00绿色vbYellow hFFFF黄色vbBlue hFF0000蓝色vbMagenta hFF00FF洋红色vbCyan hFFFF00青色vbWhite hFFFFFF白色 VB中常用的颜色常数 50 51 p209PrivateSubCommand1 Click StaticmaxidxIfmaxidx 0Thenmaxidx 1maxidx maxidx 1Ifmaxidx 7ThenExitSubLoadOptbutton maxidx MsgBoxmaxidxOptbutton maxidx Top Optbutton maxidx 1 Top 360Optbutton maxidx Visible TrueEndSub 52 PrivateSubOptbutton Click IndexAsInteger Dimh wPicture1 ClsPicture1 FillStyle Indexw Picture1 ScaleWidth 2h Picture1 ScaleHeight 2Picture1 Circle w h w 2EndSub 53 本章小结 1 数组的基本概念数组名 数组元素 下标 数组的维数2 静态数组的定义Public Private Dim As 3 动态数组的定义 1 Public Private Dim As 2 ReDim As 4 数组的输入输出5 数组的删除 Erase 1 固定大小数组使用Erase语句初始化 2 动态数组使用Erase语句释放存储空间 54 6 使用ForEach Next循环处理数组ForEachIn Next7 用户定义类型的数组8 控件数组 1 控件数组的表示 2 控件数组的建立a 将多个控件取相同的名称b 复制 粘贴现有的控件c 给控件设置一个Index属性值 3 控件数组的使用同一个控件数组的所有控件共享同一事件过程 注意使用该过程返回的参数Index 55 用户定义类型的数组就是数组中的每个元素都是用户定义类型 例如 在学生成绩表中 每一个学生的信息可以包含学号 姓名 数学成绩和英语成绩 如下表所示 8 6用户定义类型的数组 56 假设用一个一维数组来表示学生成绩表 每个元素保存一个学生的信息 即表格中的一行或一条记录 则每个数组元素应包含学号 姓名 数学和英语四个值 为此 可以先定义一个数据类型StudScore如下 TypeStudScoreStudNumberAsString 2StudNameAsString 10MathAsIntegerEnglishAsIntegerEndType接着 定义一个具有StudScore类型的数组 DimScore 1To40 AsStudScore 57 引用第i个学生的姓名 Score i StudName例如 给Score数组的第一个元素赋值 Score 1 StudNumber 01 Score 1 StudName 张三 Score 1 Math 89Score 1 English 90也可以使用With语句来简化书写 WithScore 1 StudNumber 01 StudName 张三 Math 89 English 90EndWith 58 With语句可以对某个对象执行一系列的语句 而不用重复指出对象的名称 格式 With语句 WithEndWith例 PrivateSubCommand1 Click WithForm1 BackColor vbRed FontSize 30 ForeColor vbGreenEndWithPrint 改变一个对象的多个属性 EndSub 59 例8 7 输入N名学生的成绩 求平均分 最高分 最低分 N可以任意指定 分析 求平均值 最大值 最小值方法 设N名学生的成绩存于一维数组Score中 因学生人数可以任意指定 因此将Score定义成动态数组 60 OptionBase1DimScore AsIntegerDimNAsInteger MaxAsInteger MinAsInteger AverageAsSinglePrivateSubForm Load N Val InputBox 请输入总人数 ReDimScore N ForI 1ToNScore I Val InputBox 请输入第 Str I 个学生的成绩 成绩统计 NextITotal 0Max Score 1 Min Score 1 61 通过循环依次比较 求最大 最小值 求总和ForI 1ToNIfScore I MaxThenMax Score I IfScore I MinThenMin Score I Total Total Score I NextIAverage Total N 求平均值 以两位小数显示平均值Text1 Text Format Average 0 00 Text2 Text MaxText3 Text MinEndSub 62 例8 2 输入N名学生的成绩 显示于文本框Text1中 按成绩从低到高的次序排序 并将结果显示于另一个文本框Text2中 63 比较交换法 对N个数进行排序 1 将第1个数与第2个数到第N个数依次比较 如果X 1 X J J 2 3 N 则交换X 1 X J 的内容 2 将第2个数与第3个数到第N个数依次比较 如果X 2 X J J 3 4 N

温馨提示

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

评论

0/150

提交评论