VB语言教案市公开课一等奖省赛课微课金奖课件_第1页
VB语言教案市公开课一等奖省赛课微课金奖课件_第2页
VB语言教案市公开课一等奖省赛课微课金奖课件_第3页
VB语言教案市公开课一等奖省赛课微课金奖课件_第4页
VB语言教案市公开课一等奖省赛课微课金奖课件_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

第6数组

数组是程序设计中广泛使用数据结构,它能够方便灵活地组织数据。数组与循环语句结合使用,可使程序结构简练、清楚。通常数组应先申明后使用。1/47

利用数组能够有效地存放和处理成批数据

本章主要内容

第6章数组数组概念数组申明和应用动态数组ForEach...Next循环语句控件数组程序举例退出2/47处理成批数据时,必须使用数组来处理。比如,表示100个学生成绩,采取简单变量来表示:

s1,s2,s3,…s99,s100

采取数组来表示:t(0),t(1),t(2),…t(98),t(99)

t(k)(k=0,1,2,…99)为数组元素(或称下标变量),它表示第k个学生成绩,k称为下标变量下标(默认情况下,下标从0开始)由三行四列组成二维数组y,其12个下标变量可表示为

y(0,0)y(0,1)y(0,2)y(0,3)

y(1,0)y(1,1)y(1,2)y(1,3)

y(2,0)y(2,1)y(2,2)y(2,3)只要有规则地改变下标值,就能够很方便地使下标变量(如t(k))成为所需要详细下标变量

6.1数组概念3/47

6.2.1数组申明语句

使用数组之前,普通需要定义数组,方便让系统分配对应存放单元。格式为:

Dim数组名([下界1to]上界1[,[下界2to]上界2…])[As数据类型]

功效:指定数组维数、各维上下界和数据类型

举例:

DimSum(10)AsLong‘下标号从0~10,共11个元素

DimAry(1to20)AsInteger‘下标号从1~20,共20个元素

Dimd(1to5,1to10)AsDouble‘定义二维数组

还能够使用Public、Static、Private等语句来申明数组

6.2数组申明和应用4/47

设定下界方法

OptionBase1‘设定下界为1

DimData(10)AsSingle‘下标号从1~10

6.2.2Array函数

使用Array函数能够为数组元素赋值

示例DimDAsVariant‘定义数组名(变体类型)D=Array(1,2,3,4)执行结果:1→D(0),2→D(1),3→D(2),4→D(3)5/47

例6.1输入某小组5个同学成绩,计算总分和平均分(取小数后一位)本例利用InputBox函数来输入成绩,输入完成后经过计算,再采取Print直接在窗体上输出结果

6.2.3数组应用6/47

PrivateSubForm_Load()Dimd(5)AsIntegerDimiAsInteger,totalAsSingle,averageAsSingleShowFori=1To5'输入成绩d(i)=Val(InputBox("请输入第"&Str(i)&_"个学生成绩","输入成绩"))Nextitotal=0Fori=1To5'计算总分和平均分total=total+d(i)Nextiaverage=total/5Print"总分:"&totalPrint"平均分:"&Format(average,"##.0")EndSub

例6.17/47

(1)创建应用程序用户界面和设置对象属性

例6.2输入10名学生成绩,求出最高分和最低分例6.28/47功效要求:经过Array函数输入10个分数;单击“查找”按钮(Command2)后,开始查找最高分和最低分,找到后显示在标签Label1上

OptionBase1DimscoreAsVariantPrivateSubForm_Load()Label1.Caption="单击“查找”按钮开始查找最高分和最低分"score=Array(89,96,81,67,79,90,63,85,95,83)

EndSub

(2)编写程序代码9/47

PrivateSubCommand1_Click()DimmaxAsInteger,minAsIntegermax=score(1)'设定初值min=score(1)Fori=2To10‘与后面数据逐一比较Ifmax<score(i)Then'找最高分max=score(i)EndIfIfmin>score(i)Then'找最低分min=score(i)EndIfNexti

'Chr(13)起换行作用Label1.Caption="最高分:"+Str(max)+_Chr(13)+"最低分:"+Str(min)

EndSub10/47例6.3分别计算5个学生和3门课平均分

某学习小组有5名学生,成绩如表6.1所表示

分析:用一个二维数组a(5,3)来描述。程序中设置两重循环,用以实现每行和每列上累加。本例采取赋值语句来输入学生成绩,并采取Print直接在窗体上输出结果

OptionBase1PrivateSubForm_Load()Dima(5,3)AsIntegerDimrAsInteger,cAsInteger,sAsIntegerk=Array("数学","英语","计算机")'输入课程名a(1,1)=69:a(1,2)=89:a(1,3)=74'输入学生成绩a(2,1)=94:a(2,2)=80:a(2,3)=90a(3,1)=57:a(3,2)=62:a(3,3)=73a(4,1)=98:a(4,2)=94:a(4,3)=90a(5,1)=73:a(5,2)=76:a(5,3)=6311/47

ShowPrint"学生","平均分"PrintString(20,"-")'输出20个减号“-”Forr=1To5s=0'累加前清0Forc=1To3

'累加同一行数据s=s+a(r,c)NextcPrintr,Format(s/3,"##.0")NextrPrintr=1c=1,2,3r=2c=1,2,3r=3c=1,2,3r=4c=1,2,3r=5c=1,2,3求5个学生平均分a(r,c)下标使用情况12/47

Print"课程","平均分"PrintString(20,"-")Forc=1To3s=0Forr=1To5

'累加同一列数据s=s+a(r,c)NextrPrintk(c),Format(s/5,"##.0")NextcEndSub13/47

程序运行结果

例6.314/471.执行以下程序段后,输出结果是______。Dima(1To3,1To3) Forj=1To3Fork=1To3a(j,k)=jPrinta(j,k);NextkPrintNextjA.321B.012C.123D.111232101212222123210321333

以下程序运行结果?想一想思索题D15/471.执行以下程序段后,输出结果是______。Dima(1To4,1To4)Forj=1To4Fork=1To4a(j,k)=Abs(j-k)Printa(j,k);NextkPrintNextj

A.3210B.0123C.0111D.3333210310121011222210322101110111110123321011100000

以下程序运行结果?想一想思索题B16/47

两种形式数组:静态数组和动态数组静态数组(前面介绍)是指数组元素个数固定不变;动态数组元素个数,在程序运行时能够改变动态数组能够在运行过程中改变数组大小,提升存放区使用效率

6.3.1建立动态数组用ReDim语句重新定义带下标动态数组

6.3.2数组刷新语句

Erase语句用来去除静态数组内容,或者释放动态数组占用内存空间

6.3动态数组17/47Dimt()AsInteger'申明一个动态数组……ReDimt(100)'用ReDim语句重新定义……ReDimt(200)'用ReDim语句重新定义静态数组和动态数组Dimt(200)AsInteger‘申明一个静态数组Fork=1To200t(k)=…Nextk……使用静态数组个数固定不变使用动态数组个数能够改变18/47PrivateSubForm_Load()Dima()AsInteger'申明一个整型动态数组ShowReDima(800)'用ReDim语句重新定义k=0Forx=200To600Step3IfxMod8=0Thenk=k+1a(k)=xEndIfNextxReDimPreservea(k)'Preserve能保留数组中原有数据Fori=1TokPrinta(i)NextiEndSub

例6.4ReDim语句应用示例例6.419/47

与前面循环语句For...Next类似,都是用来执行指定重复次数循环。但ForEach...Next语句专门作用于数组或对象集合中每一组员。语法格式:

ForEach组员In数组名

循环体

[ExitFor]

Next组员

“组员”是一个Variant变量,它实际上代表数组中每一个元素本语句能够对数组元素进行读取、查询或显示,它所重复执行次数由数组中元素个数确定在不知道数组中元素数目时非常有用

6.4ForEach...Next循环语句20/476.5控件数组

两类数组:普通数组和控件数组

6.5.1控件数组概念

控件数组是一组含有相同名称、类型和事件过程控件比如,Label1(0),Label1(1),Label1(2),……但Label1,Label2,Label3,……不是控件数组控件数组含有以下特点:

(1)相同控件名称(即Name属性);

(2)控件数组中控件含有相同普通属性;(3)全部控件共用相同事件过程。以下标索引值(Index)来标识各个控件,第一个下标索引号默认为021/476.5.2控件数组建立

建立控件数组有三种方法:

(1)给控件起相同名称

(2)将现有控件复制并粘贴到窗体等上面

(3)将控件Index属性设置为非Null数值

6.5.3控件数组使用

例6.6建立一个文本框控件数组Text1和一个文本框Text2,在控件数组Text1中输入一组数后,把累加值存放在Text2。22/47经过“复制”方法控件数组Text1。第一次单击工具栏上“粘贴”按钮(或按Ctrl+V),此时系统弹出一个以下对话框文本框控件数组Text1Text2Text1(0)Text1(1)Text1(2)Text1(3)Command1例6.623/47

控件数组Text14个元素为:Text1(0)~Text1(3)

PrivateSubCommand1_Click()s=0Fori=0To3s=s+Val(Text1(i).Text)NextiText2.Text=sEndSub24/47注意:控件数组元素表示方法与列表框表项有所不一样

列表框List1表项内容为:List1.List(0)、List1.List(1)、……。下标要求为次序号0,1,2,……。一个列表框控件,其List属性是一个数组。

控件数组Text1元素内容为:Text1(0).Text、Text1(1).Text、……。下标可由用户指定,不一定为次序号。多个控件组成一个数组,相同名称。使用这些控件Text属性。25/47

例6.7

按图6.6设计窗体,其中一组(共3个)单项选择按钮组成控件数组,要求当单击某个单项选择按钮时,能够改变文本框汉字字大小例6.7控件数组26/47设计步骤:

(1)设计控件数组Option1,其中包含3个单项选择按钮对象设置控件数组各元素(从上而下)Caption属性分别为12,20和28

(2)建立一个文本框Text1,其Text属性设置为“控件数组使用”。再建立一个标签,其Caption属性为“字号控制”

(3)编写程序代码27/47PrivateSubForm_Load()Option1(0).Value=True'选定第一个单项选择按钮Text1.FontSize=12'设定文本框中字号EndSub

PrivateSubOption1_Click(IndexAsInteger)SelectCaseIndex'系统自动返回Index值Case0Text1.FontSize=12Case1Text1.FontSize=20Case2Text1.FontSize=28EndSelect

EndSub控件数组事件过程28/47

数组是程序设计中广泛使用一个数据结构,它能够方便灵活地组织数据。数组应用一个主要内容:排序与查找

排序:将一组数按递增或递减次序排列查找:从数组中查找所需数据

6.6

程序举例排序查找次序查找折半查找……选择法排序冒泡法排序……29/47随机产生十个10~100整数,用“选择排序法”按值从小到大次序排序,最终输出结果。解题方法:

(1)利用Int(91*Rnd+10)产生值为10到100随机整数

使用Randomize得到不一样随机数序列(2)按值从小到大进行排序。排序方法:

将10个数放入数组a中,对以下下标变量进行排序处理:

a(1),a(2),a(3),…,a(8),a(9),a(10)①从这10个下标变量中,选出最小值,经过交换把该值存入a(1)中②除a(1)之外(a(1)已存放最小值),从其余9个下标变量中选出最小值(即10个数中次小值),经过交换把该值存入a(2)中

③选出a(3)~a(10)中最小值,经过交换,把该值存入a(3)中④重复上述处理,至a(8),可使a(1)~a(8)按小到大排列

⑤第9次处理,选出a(9)及a(10)中最小值,经过交换把该值存入a(9)中,此时a(10)存放就是最大值例6.8选择排序法30/47排列要求

小大示例:a(1)a(2)a(3)a(4)

906461591.a(1)与a(2)~a(4)比较,选出最小值,结果

596461902.a(2)与a(3)~a(4)比较,选出次小值,结果

596164903.a(3)与a(4)比较,选出较小值,结果5961

6490i=1j=2,3,4i=2j=3,4i=3j=4Fori=1to3Forj=i+1to4……NextjNexti程序结构循环体比较a(i)与a(j)若a(i)大于a(j)则a(i)与a(j)交换值假设要对4个数排序两重循环对4个数排序外循环i次数为3内循环j次数为i+1~431/47完成上述比较及排序处理过程,能够采取两重循环结构,外循环循环变量i从1到9,共循环九次;内循环循环变量j从i+1到10。

本例采取默认用户界面,所需数据由随机函数产生,处理后结果信息经过Print方法直接输出在窗体上。

PrivateSubForm_Load()ShowRandomizeDima(1To10)AsIntegerPrint"原始数据:"Fori=1To10'产生10个随机数a(i)=Int(91*Rnd+10)Printa(i);Nexti

(3)程序结构32/47

Print:PrintFori=1To9Forj=i+1To10Ifa(i)>a(j)Thent=a(i):a(i)=a(j):a(j)=t'交换位置EndIfNextjNextiPrint"排序结果:"Fori=1To10Printa(i);NextiEndSub例6.833/47

改写中间程序段“Fori=1To9”~“Nexti”(共7个程序行)

Fori=1To9k=i

'k用来统计每次选择最小值下标

Forj=i+1To10Ifa(k)>a(j)Thenk=jEndIfNextjt=a(k):a(k)=a(i):a(i)=t

'交换位置

Nexti

变量k统计每一次选出最小值下标,在此次比较结束后,使a(i)与a(k)一次换位即可例6.8a34/47

例6.9查找考场教室号某课程统考凭准考证入场,考场教室安排如表6.2。编制程序,查找准考证号码所对应教室号码

(1)分析:为便于查找,经过二维数组rm建立这两种号码对照表。数组rm由Form_Load事件过程来建立,它每一行存放了一个教室资料(包含准考证号码范围和教室号码)。当判断到某个给定准考证号码落在某一行准考证号码范围内时,则该行中教室号码为所求35/47

Rm(1,1)Rm(1,2)Rm(1,3)Rm(2,1)Rm(2,2)Rm(2,3)Rm(3,1)Rm(3,2)Rm(3,3)先用给定号码与第1行Rm(1,1)及Rm(1,2)比较若在此范围内,则Rm(1,3)为所求若不是第1行,则与第2行Rm(2,1)及Rm(2,2)比较若在此范围内,则Rm(2,3)为所求依这类推……

次序比较36/47

(3)编写程序代码

功效要求:用户在文本框Text1中输入准考证号码,单击“查找”按钮(Command1)后,则查找出对应教室,并将教室号码输出在文本框Text2中

Dimrm(6,3)AsIntegerPrivateSubForm_Load()

‘输入数组数据,一行存放1个教室信息

rm(1,1)=2101:rm(1,2)=2147:rm(1,3)=102rm(2,1)=1741:rm(2,2)=1802:rm(2,3)=103rm(3,1)=1201:rm(3,2)=1287:rm(3,3)=114rm(4,1)=3333:rm(4,2)=3387:rm(4,3)=209rm(5,1)=1803:rm(5,2)=1829:rm(5,3)=305rm(6,1)=2511:rm(6,2)=2576:rm(6,3)=306

EndSub例6.9(2)创建用户界面和设置对象属性37/47

PrivateSubCommand1_Click()DimnoAsInteger,flagAsIntegerflag=0'查找标识,0表示未找到no=Val(Text1.Text)Fori=1To6Ifno>=rm(i,1)Andno<=rm(i,2)ThenText2.Text=rm(i,3)'显示教室号码flag=1‘1表示找到ExitForEndIfNextiIfflag=0ThenText2.Text="无此准考证号码"EndIfText1.SetFocus‘设置焦点

EndSub38/47

某学习小组10名学生成绩情况如表6.3所表示,现要求采取折半查找法,经过学号查询学生成绩

(1)分析:折半查找法也称对半查找法,是一个效率较高查找方法。对于大型数组,它查找速度比次序查找法(例6.8采取是次序查找法)快得多

假设要查找数据个数为n=1000次序查找平均次数为500,即1000/2折半查找最大次数为x=10,即2x=1000在采取折半查找法之前,要求将数组按查找关键字(如本例学号)排好序(从大到小或小到大)例6.10

采取折半查找法查询学生成绩39/47

·先从数组中间开始比较,判别中间那个元素是不是要找数据:

是,则查找成功否,若被查找数据是在该数组上半部,则从上半部中间继续查找,不然从下半部中间继续查找

·照此进行下去,不停缩小查找范围

·至最终,因找到或找不到而停顿查找

对于n个数据,若用变量Top、Bott分别表示每次“折半”首位置和末位置,则中间位置M为

M=Int((Top+Bott)/2)这么就将[Top,Bott]分成两段,即[Top,M-1]和[M+1,Bott],若要找数据小于由M指示数据,则该数据在[Top,M-1]范围内,反之,则在[M+1,Bott]范围内

折半查找法过程40/47

折半查找法过程学号h()1201120212031205120612071209121012111215先排好序数学d(x,1)语文d(x,2)9286787183746775715562809883998057678078m=Int((Top+Bott)/2)要找学号Noh(m)=m为所求m<Bott=m-1>Top=m+1Top=1Bott=1041/47

42/47

(2)创建应用程序用户界面和设置对象属性(3)编写程序代码例6.1043/47

Dimh(10)AsInteger,d(10,2)AsInteger‘模块级变量

PrivateSubForm_Load()'学号存放在数组h()中h(1)=1201:h(2)=1202:h(3)=1203h(4)=1205:h(5)=1206:h(6)=1207h(7)=1209:h(8)=1210:h(9)=1211:h(10)=1215'成绩存放在数组d(,)中d(1,1)=92:d(1,2)=86d(2,1)=78:d(2,2)=71d(3,1)=83:d(3,2)=74d(4,1)=67:d(4,2)=75d(5,1)=71:d(5,2)=55

温馨提示

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

评论

0/150

提交评论