任务四应用过程数组循环拓展功能_第1页
任务四应用过程数组循环拓展功能_第2页
任务四应用过程数组循环拓展功能_第3页
任务四应用过程数组循环拓展功能_第4页
任务四应用过程数组循环拓展功能_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

任务四应用过程数组循环拓展功能学习目标1、掌握循环结构的使用2、掌握数组定义和应用3、掌握过程定义和调用4、了解过程调用中的参数传递循环语句

程序的另一种结构是循环结构循环结构作用是重复执行一段程序循环是有条件的、次数是有限的

VB的循环语句:For…Next、DoWhile…LoopForEach…Next循环语句-For…Next循环For…Next循环一般应用于循环次数已知的场合

For<循环变量>=初值To终值[Step步长]

语句块(循环体)

Next[循环变量]

工作原理

循环变量=初值循环变量超出范围?循环体循环变量增加一个步长NoYesStep缺省为1

循环语句-For…Next循环[例]求1+3+5+7+…+99DimSumAsInteger,IAsIntegerSum=0'保存累加和,先清零

ForI=1To99Step2Sum=Sum+INextIMsgbox("1+3+5+…+99="&Sum)

本例的特点是数据项之间相差2,即Step的值为2

思考:例中当输出出现时,I的值是多少?如果省略Step2,程序的结果如何?For语句能不能改写成ForI=99To1Step-2?

Msgbox()的作用?循环语句-For…Next循环[例]求斐波那契级数的前20项

DimA,B,I,TAsIntegerA=1:B=1'生成级数第一、二项

Debug.write(A&“”)Debug.write(B&“”)ForI=3To20T=A+B'产生级数新的一项

A=B'让B成为下一组的AB=T'原来A+B的值成为下一组的BDebug.write(B&“”)IfIMod6=0ThenDebug.writeline(“”)NextI每6个数一行斐波那契级数:第一、二项为1第三项开始,每一项的值是前两项值之和

循环语句-Do…Loop循环1.当型循环

DoWhile<条件表达式>

循环体LoopDo

循环体LoopWhile<条件表达式>

条件表达式成立?循环体NoYes条件表达式成立?循环体NoYes先判断后执行

先执行后判断特点:条件表达式成立执行循环体内容

循环语句-Do…Loop循环[例]Sum=1+2+3+…+N

求Sum不超过10000的最大整数值和数据项数N

DimSum,NAsIntegerN=0'开始时项数为0Sum=0'保存累加值的变量Sum清零

DoWhileSum<=10000N=N+1Sum=Sum+NLoopSum=Sum-NN=N-1Msgbox("Sum=“&Sum&“N=“&N)

当Sum的值超出10000时循环才终止。因此Sum值要减去多加的一个N;而在循环过程中,N也被多加了一个1,需要减去。

循环语句-Do…Loop循环2.直到型循环

DoUntil<条件表达式>

循环体LoopDo

循环体LoopUntil<条件表达式>

特点:条件表达式不成立执行循环体内容

先判断后执行

条件表达式成立?循环体NoYes先执行后判断条件表达式成立?循环体NoYes循环语句-Do…Loop循环[例]Sum=1+2+3+…+N

求Sum不超过10000的最大整数值和数据项数NDimSum,NAsIntegerN=0'开始时项数为0Sum=0'保存累加值的变量Sum清零

DoWhileSum<=10000N=N+1Sum=Sum+NLoopSum=Sum-NN=N-1Msgbox("Sum=“&Sum&“N=“&N)

当Sum的值超出10000时循环才终止。因此Sum值要减去多加的一个N;而在循环过程中,N也被多加了一个1,需要减去。

实训求:1+2+3+…+100的值循环语句-两重循环[例]输出乘法口诀表DimIAsInteger,JAsInteger,MAsIntegerForI=1To9ForJ=1ToIM=I*JDebug.write(J&"*"&I&"="&M&"“)NextJDebug.writeline(“”)'打印换行

NextI循环语句-两重循环[例]计算

DimIAsInteger,JAsIntegerDimFAsLong'阶乘值用长整型保存

DimrAsDoubleForI=0To10F=1'每个阶乘值先置1以便累乘

ForJ=1ToIF=F*JNextJr=r+1/FNextIMsgbox(“r(e)=“&r)

本循环计算F=I!循环语句-多重循环多重循环:循环次数在两重以上的循环结构

[例]计算将1角钱兑换成零钱有多少种方案

DimI,J,K,SAsIntegerS=0'统计兑换1角钱的方案数

ForI=0To10'1分钱个数

ForJ=0To5'2分钱个数

ForK=0To2'5分钱个数

If1*I+2*J+5*K=10ThenS=S+1NextKNextJNextIMsgbox("1角钱兑换成零钱的方案有"&S&"种”)1角钱以下的硬币有1分、2分和5分种1角钱全换成1分需10个1角钱全换成2分需5个1角钱全换成5分需2个

数组-数组的概念数组用于保存大量的、逻辑上有联系的数据数组的特点:数据中的元素在类型上是一致的数组元素在内存空间上是连续存放的数组元素的引用可通过下标进行数组在使用前必须要定义(声明)

数组-一维数组的定义和使用1.数组的定义(声明)

Dim数组名(下标)As数据类型

或Dim数组名()As数据类型={值}

例如:DimData(40)AsIntegerDimData()AsInteger={1,2,3,4}定义数组可以使用类型符例,DimData%(40)数组的下标全部从0开始例,DimSalary(1000)AsDecimal通过数组名和下标可引用数组中的元素例,Data(25)=95Debug.write(Data(25))数组-一维数组的定义和使用说明-1:数组定义后的初值:数值型数组各元素为0,逻辑型数组各元素为False,字符串数组各元素为空串(“")。可同时声明几个数组,用逗号分隔,例如

DimA%(100),B(800)AsLong定义数组时,下标的上界值只能是常数或常数表达式。下例的定义是错误的

N=100:DimData(N)AsInteger定义时,数组的上界值不得超出长整型范围。数组-一维数组的定义和使用说明-2:数组的元素个数称为数组长度。GetUpperBound是数组的一个方法,它可返回数组某个维的上界值.例如DimMatrix1(,)AsInteger={{1,2,3,4},{2,3,4,5},{3,4,5,6}}DimMatrix2(3,2)AsIntegerDimMatrix3(,)AsInteger数组-一维数组的定义和使用2.数组元素的使用通过数组名和下标[例]DimData(5)AsIntegerDimSum,IAsIntegerForI=1To5Data(I)=InputBox("输入第"&I&"个数据")Sum=Sum+Data(I)NextIDebug.writeline(Sum)

Inputbox函数运行的窗口数组-一维数组的定义和使用说明:数组实际上是用一个变量名字代表一组数,这组数是连续排列的,用顺序号作为下标区分各个数。

数组下标是一个整型量。数组常见的错误:下标出界

DimTest(3)AsIntegerTest(1)=4Test(2)=3Test(3)=2Test(4)超出定义数组-一维数组应用例题[例]输出斐波那契级数的前20项

DimF(20)AsInteger,IAsIntegerF(1)=1:F(2)=1'第一、第二项为1ForI=3To20'第三项起每项为前二项之和

F(I)=F(I-2)+F(I-1)NextIForI=1To20'在窗体上输出

Debug.write(F(I)&”,”)IfIMod5=0ThenDebug.writeline(“”)NextI数组-一维数组应用例题[例]

产生100个不重复的3位随机整数,并按每行7列的格式输出

DimData(100)AsInteger,I%,J%Randomize()'设置随机化种子,保证每组数据不重复

ForI=1To100'循环产生100个数据

Data(I)=NewSystem.Random().Next(100,1000)ForJ=1ToI-1'与已经产生的数据比较

IfData(I)=Data(J)Then'数据已存在则舍弃,重新产生

I=I-1ExitFor'提前退出数据比较的循环

EndIfNextJNextI

转下页数组-一维数组应用例题

I=1:J=1DoWhileI<=100ForJ=1To7'每行打印7列

IfI>100ThenExitForDebug.write(Data(I)&““)I=I+1NextJDebug.Writeline(“”)'打印换行

Loop接上页ForI=1To100Debug.write(Data(I)&““)IfIMod7=0ThenDebug.writeline(“”)EndIfNextI数组-一维数组应用例题[例]

统计成绩分布

DimN(10)AsInteger,IAsInteger,XAsIntegerConstm=10ForI=1TomX=InputBox("请输入"+Str(I)+"个学生的成绩")X=Int(X/10)'也可写成X=X\10N(X)=N(X)+1NextIDebug.writeline(100&"--“&100&N(10))ForI=9To0Step-1Debug.writeline(10*I&"--“&(10*I+9)&N(I))NextI用ForEach…Next循环遍历数组[例1]

使用For语句遍历数组

DimpinsAsInteger()={9,3,7,2}ForindexAsInteger=0Topins.Length–1DimpinAsinteger=pins(index)Debug.writeline(pin)Next[例2]

使用ForEach语句遍历数组DimpinsAsInteger()={9,3,7,2}ForEachpinAsIntegerInpinsDebug.writeline(pin)Next解读:ForEach语句声明了一个循环变量pin,它自动依次获得数组中每个元素的值(In是一个关键字)。使用ForEach语句来遍历数组更能高效处理数组。数组-排序问题(选学)1.选择法排序(N个数据升序)先假设第1个数据最小,依次同第2、第3、…、第N个数据进行比较,一旦第1个数据大于其它值则交换。这样,第1轮比较完毕,找出了最小数据作为第1个数据。以第2个数据为最小数据,依次同第3、第4、…、第N个数据进行比较,若第2个数据大于其它值则交换。这样,第2轮交换完毕,则找出第二小的数据作为第2个数据。依此类推,第N-1轮比较将找出第N-1小的数据,剩下的一个数据就是最大数,排列在最后。以6个数据为例:

原始序列:30,20,10,90,50,60第1轮比较结果:10|30,20,90,50,60第2轮比较结果:10,20|30,90,50,60第3轮比较结果:10,20,30|90,50,60第4轮比较结果:10,20,30,50|90,60第5轮比较结果:10,20,30,50,60|90

数组-排序问题(选学)[例]

用选择法完成10个随机数据的升序排序。

ConstN=10:DimD(N)AsInteger,I%,J%,T%Randomize()ForI=1ToND(I)=Rnd*100:Debug.write(D(I)&“,”)'排序前的数据序列

NextIDebug.writeline(“”)ForI=1ToN-1'挑出前N-1个小的数

ForJ=I+1ToNIfD(I)>D(J)Then'数据元素交换

T=D(I):D(I)=D(J):D(J)=TEndIfNextJNextIForI=1ToN'输出排序结果

Debug.write(D(I)&“,”)NextI找最小数据作为第1个数据:I=1ForJ=2ToN'这里2等价I+1IfD(1)>D(J)ThenT=D(1):D(1)=D(J):D(J)=TEndIfNextJ数组-排序问题(选学)2.冒泡法排序(N个数据升序)

第1轮比较:从第1个元素开始,两两相邻比较到N-1,值大的放在后面。比较完毕,最大的数成为第N个元素(沉底)。第2轮比较:从第1个元素开始,两两相邻比较到N-2,值大的放在后面。比较完毕,最大的数成为第N-1个元素。依此类推,直至最后一次比较。第1轮比较:原序列:30,20,10,90,50,60第1次比较结果:20,30,10,90,50,60第2次比较结果:20,10,30,90,50,60第3次比较结果:20,10,30,90,50,60第4次比较结果:20,10,30,50,90,60第5次比较结果:20,10,30,50,60,90第2轮比较:原序列:20,10,30,50,60,90第1次比较结果:10,20,30,50,60,90第2次比较结果:10,20,30,50,60,90第3次比较结果:10,20,30,50,60,90第4次比较结果:10,20,30,50,60,90数组-排序问题(选学)[例]

用冒泡法完成10个随机数的升序排序

ConstN=10:DimD(N)AsInteger,I%,J%,T%Randomize()ForI=1ToND(I)=Rnd*100:Debug.write(D(I)&“,”)NextIDebug.writeline(“”)ForI=N-1To1Step-1'大数逐个"沉底"ForJ=1ToIIfD(J)>D(J+1)ThenT=D(J):D(J)=D(J+1):D(J+1)=TEndIfNextJNextIForI=1ToN'输出排序结果

Debug.write(D(I)&“,”)NextI最大的数成为第N个元素(沉底):I=N-1ForJ=1ToN-1'这里N-1等价IIfD(J)>D(J+1)ThenT=D(J):D(J)=D(J+1):D(J+1)=TEndIfNextJ数组-动态数组1.在VB.NET中,所有数组都是变长的,也就是说所有数组都是动态数组.2.声明一个数组时可以指定它的长度,但这个长度只是初始长度,可以使用ReDim语句来修改它.3.使用ReDim语句重新定义一个数组时,不能改变数组的维数,也不能改变数组的类型.4.使用ReDim语句重新定义一个数组时,数组原有的值会丢失.但可以在ReDim语句中使用Preserve关键字来保持这些值.5.如果在ReDim语句中使用Preserve关键字,那么只能改变最后一维的长度.例:DimB(4)AsIntegerForI=0To4B(I)=INextIReDimPreServeB(6)数组-二维数组(选学)1.二维数组的定义(声明)二维数组由行和列组成,有两个下标定义格式:

Dim数组名(下标1,下标2)As数据类型

或Dim数组名(,)As数据类型=

{值}

例如,DimData(5,9)AsInteger注意:⑴下界默认为0

例如,DimSalary(30,10)AsDecimal

'31行11列⑵二维数组有行、列两维,通常需使用二重循环引用

数组-二维数组(选学)二维数组中的数据按行存储,其引用与一维数组相似。

DimA(2,3)AsInteger,I%,J%,C%ForI=0To2ForJ=0To3'数组赋值

A(I,J)=C:C=C+1NextJNextIForI=0To2'输出数组

ForJ=0To3Debug.Write(A(I,J)&““)NextJDebug.Writeline(“”)'另起一行打印

NextI

A(0,0)=0A(0,1)=1A(0,2)=2A(0,3)=3A(1,0)=4A(1,1)=5A(1,2)=6A(1,3)=7A(2,0)=8A(2,1)=9A(2,2)=10A(2,3)=11数组-二维数组(选学)2.二维数组应用举例-[例]

DimD%(9,9),I%,J%ForI=1To9ForJ=1To9IfI=JOrI=10-JThenD(I,J)=1ElseD(I,J)=5EndIfNextJNextIForI=1To9ForJ=1To9Debug.Write(D(I,J)&““)NextJDebug.Writeline(“”)NextI

过程

过程是一段程序代码,是相对独立的逻辑模块。一个完整的VB.NET应用程序由若干过程和模块组成。常用的VB.NET过程有:Sub过程和Function过程。Sub过程(子过程):完成一定的操作和功能,无返回值,通过程序调用和事件触发而执行,分为事件过程和通用过程。Function过程(函数过程):相当于用户自定义的函数,通过程序调用才能被执行,并且可将数据处理的结果返回。一个过程的代码长度不要超过64K。过程-Sub过程

过程定义格式:

[Private|Public][Shared]Sub过程名(参数表)

语句

EndSubPrivate表示模块级子过程,Public表示全局级子过程(缺省值)。过程名符合VB.NET标识符的命名约定参数表可以是空表,也可以放置若干个变量(形式参数)。如:

PublicSubSum(XAsInteger,YAsInteger,ZAsInteger)Sub过程分为:事件过程和通用过程

过程-Sub过程

1.事件过程

这类过程与对象有关,对象事件触发后被调用。事件过程的过程名由系统自动指定。建立对象的事件过程:(1)进入代码窗口方法1:双击对象方法2:“视图→代码窗口”(2)选择“对象”和“事件名称”,系统自动形成该事件过程的头和尾(3)编写该事件的程序代码“对象”“事件名称”过程-Sub过程

2.通用Sub过程这类过程不与对象相关,是用户创建的一段共享代码。过程的名称由用户自己命名建立通用Sub过程:建立过程框架在类的内部,输入过程,按回车后系统自动添加EndSub。

(2)编写该过程的程序代码过程-Sub过程

3.过程的调用方法

(1)通用Sub过程的两种调用方式:Call过程名(参数表)过程名(参数表)

(2)事件过程的调用一般由事件的触发而引起(单击、窗体加载等)也可以像通用Sub过程那样调用

过程-Function过程Function过程的实质是一个自定义函数,定义格式:

[Private|Public][Shared]Function函数过程名(参数表)As类型语句块

Return语句

EndFunction

Private、Public及参数的含义同Sub子过程Function过程具有函数值,由函数过程名返回。Function过程的建立与Sub过程的建立相似,调用方法:用Call语句

将Function返回值赋给一个变量将Function过程的返回值用在表达式中

过程-Function过程[例]计算过程-参数传递

在调用Sub过程和Function过程时,参数的传递有两种方式:按值传递、按地址传递1.按值传递主调过程的实参与被调过程的形参各有自己的存储单元调用时:主调过程的实参值复制给被调过程的形参定义被调过程时,各形参前加ByVal

2.按地址传递主调过程的实参与被调过程的形参共享同一存储单元形式参数与实际参数是同一个变量定义被调过程时,各形参前加ByRef

定义过程时,缺省的参数传递方式是按值传递过程-参数传递[例]

参数传递示例过程-参数传递1、地址传递(指针传递)或叫“引用”再看一个地址传递参数的例子:

Subtryout(ByRefXAsInteger,ByRefYAsInteger)X=X+100Y=Y*6Debug.W

温馨提示

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

评论

0/150

提交评论