




已阅读5页,还剩100页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VB程序设计教程,主编:陈素教授,第三章VB程序结构控制,VB程序设计采用结构化程序设计的思想,结构化程序设计的特点是程序结构清晰,易读性强,并易于查错纠错。在VB中有三种基本的程序控制结构:顺序结构、选择结构和循环结构。VB所有的程序都可以由这若干个这三种基本结构的组合,通过各种算法,以解决不同的实际问题。,3VB程序结构控制,3.1顺序结构3.2选择结构3.3循环结构3.4数组3.5常用算法,3.1顺序结构,顺序结构是一种线性结构,也是程序设计中最简单、最常用的基本结构。它在程序运行过程中,按照语句出现的顺序从上到下依此执行。顺序结构流程图如图3-1所示,先执行语句A,再执行语句B。,3.1.1赋值语句,顺序结构中主要的语句是赋值语句,通过赋值语句,可以在程序中改变变量的值,或改变对象属性值。其语法格式为:Let变量表达式Let对象.属性表达式其中表达式中可以包含变量、常量、属性。此时等号称为赋值等号。例如:DimAAsStringA=Text1.TextLabel1.Caption=A,3.1.1赋值语句,说明:(1)赋值语句兼有计算和赋值双重功能。(2)“”是赋值等号,与数学上的等号意义不同。(3)赋值等号两边的数据类型通常要求一致,但VB提供的对某些数据类型的自动转换机制,可强制变量转换为适当的数据类型。例如,当逻辑型赋值给数值型时,True转换为-1,False转换为0;反之,非0转换为True,0转换为False;(4)赋值等号左边的只能是变量或对象的属性,不能是常量、常数符号、表达式,否则出错。,3.1.2注释、结束与暂停语句,1.注释语句注释语句用于对程序的注解和说明。有两种格式:格式1:Rem内容格式2:内容格式1形成一个语句行。格式2使用一个撇号,可以用在语句行的末尾,也可以单独占据一行。注释语句不被编译成二进制代码,它只出现在源程序中。适量的注释可以增加程序的可读性。例如:Rem通过设置文本框的Text属性用来显示HelloTxtInput.Text=Hello,今天是这是奇数Case2,4,6,8,10Printx;这是偶数EndSelect表达式1To表达式2例如:变量stringc中存放了一个字符,判断该字符类型。SelectCasestringcCaseaToz,AToZPrintstringc+isaletterCase0To9Printstringc+isanumberCaseElsePrintstringc+“isonlyacharEndSelect,3.2.3SelectCase语句,Is关系表达式用Is关系表达式实现学生成绩等次的评定。score=inputbox(输入一个学生成绩)SelectCasexCaseis=90Printscore;成绩等次为:ACaseis=80Printscore;成绩等次为:BCaseis=70Printscore;成绩等次为:CCaseElsePrintscore;成绩等次为:DEndSelect对于VB中的两种选择语句If语句和SelectCase语句的应用选择,一般来说,SelectCase语句主要应用于对单一条件表达式的结果有多个判断(因此也称多分支语句)的情况,结构清晰;而If语句可以对多个条件表达式的结果进行判断,应用更广泛。一般情况下,能使用SelectCase语句来判断的也可以使用If语句。,3.3循环结构,循环结构是程序设计中的一种基本结构。当程序中出现需要反复执行相同的代码解决同一问题时,就可以用循环结构来实现。循环结构既可以简化程序,又可以提高程序的效率。VB继承了所有Basic语言中的各种循环语句,而且在VB中实现循环结构的语句最多。循环结构可分为计数型和条件型两种基本的结构,实现计数型循环结构的语句是ForNext,而实现条件型循环结构的语句有DoLoop及WhileWend。,3.3.1ForNext语句,ForNext语句按指定的循环次数或按变量变化的范围执行循环体,在循环体中使用一个计数器来控制循环执行的次数。ForNext语句执行过程:开始时,循环控制计数器为初值。每执行完一次循环体内所有语句后,循环控制计数器自动增加一个步长值,然后与终值进行比较。如果循环控制变量小于终值,则继续循环,直到循环控制变量的值大于终值,才退出循环,去执行Next语句后的语句。在循环的过程中,可以使用Exit语句随时退出循环。ForNext语句流程图如图3-11所示。,3.3.1ForNext语句,3.3.1ForNext语句,语法格式:For计数器=初值To终值Step步长语句序列1ExitFor语句序列2Next计数器说明:(1)计数器一般为数值型。(2)步长一般为正值,初值小于终值;若为负值,初值大于终值;缺省步长为1;循环次数=int(终值-初值)/步长+1)。(3)语句序列可以是一个或多个语句,称为循环体。(4)ExitFor是可选项,表示当程序执行过程中遇到该语句时,退出循环体,执行Next的下一句。,3.3.1ForNext语句,例如,计算1到100的和(本例未使用循环退出语句ExitFor)。Sum=0Fori=1To100step1Sum=Sum+iNextiPrintSum再如,计算1到100的和,当和大于2000时终止循环(本例使用循环退出语句ExitFor)。Sum=0Fori=1To100step1Sum=Sum+iIfSum=2000ThenExitForNextiPrintSum,3.3.1ForNext语句,(5)退出循环后,计数器的值保持退出时的值。(6)在循环体内对计数器可多次引用,但不要对其赋值,否则影响循环执行的次数,从而影响程序运行结果。例如:PrivateSubCommand1_Click()Count1=0Fori=1To20Step2i=i+2Count1=Count1+1Print第;Count1;次循环i=;iNextiPrint退出循环后i=;iEndSub以上程序循环的次数不是10次,而是5次,原因是代码中的i=i+2改变了步长。程序运行结果如图3-12所示。,3.3.1ForNext语句,3.3.1ForNext语句,【范例3-5】设计程序,输入一个班(设全班人数不超过100人)学生的VB学习成绩,统计其中及格的学生人数,并计算出全班的平均分。由于学生人数不定,输入负数时截止。(1)用户界面及数据测试如图3-13,3-14,3-15所示。,3.3.1ForNext语句,3.3.1ForNext语句,(2)设置界面对象属性,如表3-4所示。,3.3.1ForNext语句,(3)程序代码设计如下:PrivateSubCommand1_Click()DimGradeAsSingle,PassCountAsInteger,totalAsIntegerDimiAsInteger,SumAsSingleSum=0PassCount=0Average=0total=0Fori=1To100当输入学生成绩个数大于100时停止循环Grade=Val(InputBox(请输入学生的VB成绩:)IfGrade=60ThenPassCount=PassCount+1计算及格学生人数total=total+1计算总人数Sum=Sum+Grade计算总分EndIfNextiIftotal0ThenAverage=Sum/total防止用户未输入值时溢出Text1.Text=Str(total)Text2.Text=Str(PassCount)Text3.Text=Str(Average)EndSub,3.3.2DoLoop语句,对于在程序中循环的次数事先不能确定的,不能使用ForNext语句实现循环,这时使用DoLoop循环(条件循环)语句。DoLoop语句有2种形式,即当型循环(While结构)和直到型(DoWhile结构)循环。当型循环结构流程图如图3-16所示,直到型循环结构流程图如图3-17所示。,3.3.2DoLoop语句,语法1(当型循环):DoWhileUntil条件表达式语句序列1ExitDo语句序列2Loop说明:(1)先测试条件表达式,当条件为True时就执行语句序列,否则退出循环。(2)While循环在条件成立时执行循环体语句,否则退出循环执行Loop后的语句。而Until循环相反,在条件不成立时进入循环,直到条件成立时才退出循环。(3)在程序执行过程中,若遇到Exitdo语句时,表示退出循环,执行Loop后的语句。,3.3.2DoLoop语句,例:用当型循环语句计算1到100的和DimSumasinteger,iasintegerSum=0:i=1DoWhilei=100Sum=Sum+ii=i+1LoopPrintSum语法2(直到型循环):Do语句序列1ExitDo语句序列2LoopWhileUntil条件表达式说明:(1)先执行语句序列后判断条件表达式,语句序列至少执行一次。(2)While循环在条件成立时执行循环体语句,否则退出循环执行Loop后的语句。而Until循环相反,在条件不成立时进入循环,直到条件成立时才退出循环。(3)在程序执行过程中,若遇到Exitdo语句时,表示退出循环,执行Loop后的语句。例:用直到型循环语句计算1到100的和DimSumasinteger,iasintegerSum=0:i=1DoSum=Sum+ii=i+1LoopWhileimaxThen找到新的最大数,则保存在max中,并同时记录位置max=a(i,j)r=i:c=jEndIfNextjNextiPrint最大数是NextPrintReDimPreservearr(15)再次定义数组arr,保留之前arr(0)arr(10)的值Fori=0To15Printarr(i);NextEndSub,3.4.3动态数组,程序运行的界面如下:图3-25范例3-12运行界面若语句ReDimPreservearr(15)去掉保留字Preserve,那么arr数组的元素值将被重置为0。,3.4.4数组相关函数,1.Array函数语法:Array(参数表)功能:给一个Variant型的数组赋值。说明:参数表是一个用逗号隔开的值表,如果不提供参数,则创建一个长度为0的数组。请看下面的语句:DimAAsVariantA=Array(10,20,30)在上面的示例中,第一条语句创建一个Variant的变量A。第二条语句将一个数组赋给变量A。,3.4.3动态数组,2.IsArray函数语法:IsArray(变量名)功能:判断一个指定的变量是否为数组。说明:如果待判断的变量指向一个数组,则IsArray函数返回true,否则返回false。对于以下语句:Dima,bb=1a=Array(1,2,3,4,5)PrintIsArray(b),IsArray(a)程序运行结果为falsetrue,3.4.4数组相关函数,2.动态数组使用举例【范例3-13】打印裴波纳契数列。裴波纳契数列具有以下特点:它的第一个数为0,第二个数为1,第三个数以后的数是前两个数的和。在程序中将使用InputBox输入的值来确定要打印的数列项数,产生的数列存放在一维数组中。程序代码如下:OptionBase1PrivateSubForm_Click()DimnAsInteger,mAsInteger,kAsInteger,f()AsLongm=InputBox(请输入要打印的数列项数,输入项数,10)ReDimf(m)f(1)=0:f(2)=1给数组第1、2位元素赋值Forn=3Tom利用循环计算3-m位数组元素f(n)=f(n-1)+f(n-2)NextnClsPrintTab(10);裴波纳契数列Print,3.4.4数组相关函数,k=1给打印定位变量k赋初值Forn=1Tom利用循环打印数组元素PrintTab(k*10);f(n);Ifk=4Then每行打印4个数值后换行Printk=0EndIfk=k+1更改打印位置NextnEndSub,3.4.4数组相关函数,3.LBound函数语法:LBound(数组名,dimension)功能:返回数组指定的维dimension的最小下标。说明:如果省略dimension参数,默认返回数组第一维的最小下标例如:DimaAsVariantDimb(1To3,2To4)AsIntegerDimc(-1To2,1To3)AsIntegera=Array(1,2,3,4,5)PrintLBound(a),LBound(b,2),LBound(c)运行的结果为02-1,3.4.4数组相关函数,4.UBound函数语法:UBound(数组名,dimension)功能:返回数组指定的维dimension的最大下标。说明:如果省略dimension参数,默认返回数组第一维的最大下标此函数与上述的Lbound函数一起使用可以确定一个数组的大小。例如:Dimb(1To3,2To4)AsIntegerPrint(UBound(b,1)-LBound(b,1)+1)*(UBound(b,2)-LBound(b,2)+1)程序将输出9,3.4.4数组相关函数,5.Erase函数语法:Erase(数组名1,数组名2,)功能:重新初始化静态数组以及释放动态数组对应的内存空间。说明:(1)对于静态数组,Erase函数将按表3-5重新初始化数组的值。,3.4.4数组相关函数,(2)对于动态数组,Erase释放动态数组所使用的内存。在下次引用该动态数组之前,程序必须使用ReDim语句来重新定义该数组变量的维数。例如:DimaAsVarianta=Array(1,2,3,4,5)EraseaReDima(1,2)语句APrintLBound(a)上述程序段,如果没有语句A,编译时就会出现下标越界的错误。,3.4.5用户自定义类型,除了Integer,String等标准的数据类型,VB还支持用户自定义类型。所谓的自定义类型,类似于C语言中的结构(struct),这种类型的数据由若干个不同类型的基本数据组成。自定义类型由Type语句来实现:1.自定义类型的声明形式Type类型名元素名1As类型名元素名2As类型名元素名nAs类型名EndType,3.4.5用户自定义类型,例如要定义一个存放学生信息的类型,可以自定义类型student:TypeStudentNumAsLong学号NameAsString*10姓名,用长度为10的定长字符串来存储SexAsString*5性别,用长度为5的定长字符串来存储ScoreAsSingle得分,用单精度数来存储EndType说明:(1)自定义类型一般在标准模块中定义。(2)自定义类型变量的声明,与普通变量一样,使用Dim语句定义。例如使用上述的Student类型定义变量Stu,可以表示为:DimStuAsStudent。(3)要访问自定义类型中的元素,应使用变量名.元素名的方法表示。例如要为上述的Stu变量中的Num赋值,可以写成:Stu.Num=1,3.4.5用户自定义类型,2.自定义类型数组的使用同样可以使用自定义类型来定义数组。例如:Dima(1to10)asStudent。范例3-14说明了自定义类型数组的使用方法。,3.4.5用户自定义类型,【范例3-14】已知5种草药的名称、销售量和单价,计算各种草药的销售额。定义一个类型Herb,它包含name,salenum,price,total等5个元素。使用Herb说明数组a,将草药的信息存放在数组中。其中total元素的值通过计算得出,其他元素的值通过inputbox接收。程序代码如下:PrivateTypeherb定义类型HerbnameAsStringsalenumAsIntegerpriceAsSingletotalAsSingleEndTypePrivateSubForm_Click()Dima(1To5)AsherbDimiAsInteger,3.4.5用户自定义类型,Fori=1To5为a数组的每个元素赋值a(i).name=InputBox(输入草药名,数据录入,)a(i).salenum=InputBox(输入销售数量,数据录入,)a(i).price=InputBox(输入草药单价,数据录入,)a(i).total=a(i).salenum*a(i).priceNextPrint草药名;Tab(10);销售数量;Tab(30);草药单价;Tab(50);总额Fori=1To5Printa(i).name;Tab(10);a(i).salenum;Tab(30);a(i).price;Tab(50);a(i).totalNextEndSub,3.4.5用户自定义类型,程序运行的结果如下:图3-26范例3-14运行界面:,3.4.6控件数组,控件数组是一组具有共同名称和类型的控件。它们的事件过程也相同。在设计时,使用控件数组,可以让一组类型相同的控件执行相同的代码。1.控件数组的创建设计时可以使用以下方法创建控件数组:(1)对同一类型的控件使用相同的名字。创建步骤如下:绘制控件数组中要添加的控件(必须为同一类型的控件)。选择其中一个作为第一个控件,并使用其名字命名其它控件。在为其它控件输入现有名称时,VisualBasic将显示一个对话框,要求确认是否要创建控件数组。例如:在窗体上放置若干个CommandButton控件,将其中一个名称改为bcmd,并将其它的控件名称均改为bcmd,此时VB将自动创建控件数组(2)使用复制的方法添加控件。创建步骤如下:绘制控件数组中的控件。当控件获得焦点时,选择“编辑”菜单中的“复制”命令。在“编辑”菜单中,选择“粘贴”命令。VisualBasic将显示一个对话框询问是否创建控件数组。,3.4.6控件数组,2.控件数组的使用举例【范例3-15】设计图3-27界面,实现单击“重置”按钮时,实现清空所有Text控件的文本信息。图3-27范例3-15界面设计,3.4.6控件数组,程序实现步骤如下:(1)先在窗体上绘制一个TextBox控件。(2)选择TextBox控件,使用复制的方法再绘制另外两个TextBox控件。在询问是否创建控件数组时,选择“是”(3)在窗体上绘制CommandButton控件,并将Caption属性设置为“重置”。(4)在CommandButton控件的Click事件中加入以下代码:PrivateSubCommand1_Click()ForEachxInText1x.Text=NextxEndSub或者使用下面的代码:PrivateSubCommand1_Click()Fori=0ToText1.Count-1Text1(i).Text=NextiEndSub使用ForEachNext语句不需要知道控件数组的元素个数,而使用ForNext语句则必须通过访问控件数组的Count方法获得控件数组中元素的个数(注意控件数组索引从0开始),并使用控件数组名(下标)方式访问数组中每个元素。,3.5常用算法,在本节中,将介绍检索以及排序中常用的算法。3.5.1检索算法3.5.2排序算法,3.5.1检索算法,检索是数据处理中经常使用的一种重要运算。所谓的检索,就是根据给定的关键字,在指定的集合中找出值为关键字的过程。如果找到则检索成功,否则检索失败。下面将介绍顺序检索以及二分检索两种算法。,3.5.1检索算法,1.顺序检索算法顺序检索的基本思想是:从集合的一端开始顺序扫描,将集合中的元素与给定值比较,如果相等则检索成功,当扫描结束时,未找到给定值,则检索失败。【范例3-16】设计如图3-28的界面,随机产生10个1-20之间的整数,从键盘上输入要查找的数,如果找到,则显示其位置。控件属性设置如表3-6所示。,3.5.1检索算法,3.5.1检索算法,程序代码如下:Dima(1To10)AsInteger通用模块中定义数组PrivateSubCommand1_Click()DimkeyAsInteger,IAsInteger,findAsIntegerkey=Val(Text1.Text)key为要查找的数find=0find值为1表示查找成功,为0表示失败ForI=1To10Ifa(I)=keyThenLabel3.Caption=这个数在第&I&个位置上find=1ExitForEndIfNextIIf(find=0)ThenLabel3.Caption=找不到EndSubPrivateSubForm_Activate()RandomizeForI=1To10a(I)=Int(20*Rnd)+1产生随机数Label1.Caption=Label1.Caption&a(I)&,在Label上显示数组NextIEndSub,3.5.1检索算法,2.二分检索算法二分检索算法又称为折半查找,这个算法要求检索的集合是一个有序序列。算法的基本思想是:将给定的值与集合中间位置上的元素比较,如果相等,则检索成功。否则,如果给定值比中间位置元素小,则在集合的前半部分继续检索,否则在集合后半部分检索。这样每次检索缩小一半的查找范围,重复这个过程,直到检索成功或者失败。例如:在有序集合(1,4,10,20,25,30,32,45,56,57,60)中查找数字20方括号表示查找范围,带下划线的数字为中间位置元素。经过3次比较后检索成功。查找过程如下:1,4,10,20,25,30,32,45,56,57,601,4,10,20,25,30,32,45,56,57,601,4,10,20,25,30,32,45,56,57,60若查找数字37,经过4次比较后检索失败。查找过程如下:1,4,10,20,25,30,32,45,56,57,601,4,10,20,25,30,32,45,56,57,601,4,10,20,25,30,32,45,56,57,601,4,10,20,25,30,32,45,56,57,60,3.5.1检索算法,【范例3-17】使用二分检索法在集合(1,4,10,20,25,30,32,45,56,57,60)中查找给定数字。界面设计参照范例3-16。程序代码如下:DimaPrivateSubCommand1_Click()DimkeyAsInteger,IAsInteger,findAsIntegerDimlowAsInteger,highAsInteger,midAsIntegerkey=Val(Text1.Text)key为要查找的数find=0find值为1表示查找成功,为0表示失败low=0:high=10low,high表示查找范围DoWhilelowkeyThenhigh=mid-1要检索元素在左半区Else:low=mid+1要检索元素在右半区EndIfLoopIf(find=0)ThenLabel3.Caption=找不到EndSubPrivateSubForm_Activate()a=Array(1,4,10,20,25,30,32,45,56,57,60)ForI=0To10Label1.Caption=Label1.Caption&a(I)&,在Label上显示数组NextIEndSub,3.5.2排序算法,排序是将一组无序的序列转换为有序序列的过程。排序的算法有很多,本书中只介绍直接选择排序与冒泡排序两种算法。,3.5.2排序算法,1.直接选择排序以从小到大排序为例,算法的基本思想可以描述为:从待排序序列中选出值最小的,与第一个元素交换,然后在其余的元素中再选出最小的,与第二个元素交换,重复这个过程,直到序列有序。例如:序列1,5,7,2,6用直接选择排序方法排序,方括号表示有序的集合,带下划线的数字为无序集合中最小元素。排序过程如下:(1)1,5,7,2,6最小为1,不用交换(2)1,5,7,2,6最小为2,与5交换(3)1,2,7,5,6最小为5,与7交换(4)1,2,5,7,6最小为6,与7交换(5)1,2,5,6,7最小为7,不用交换(6)1,2,5,6,7有序集合,3.5.2排序算法,【范例3-18】使用直接选择排序法,对一组包含10个数的随机序列排序。界面设计如图3-29,控件属性设置如表3-7所示。,3.5.2排序算法,程序代码如下:PrivateSubCommand1_Click()Dima(1To10)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 IEC 60794-1-214:2025 EN Optical fibre cables - Part 1-214: Generic specification - Basic optical cable test procedures - Environmental test methods - Cable UV resistance tes
- 【正版授权】 IEC 61169-23:2025 FR Radio-frequency connectors - Part 23: Pin and socket connector for use with 3,5 mm rigid precision coaxial lines with inner diameter of outer conductor
- 【正版授权】 IEC 61169-23:2025 EN Radio-frequency connectors - Part 23: Pin and socket connector for use with 3,5 mm rigid precision coaxial lines with inner diameter of outer conductor
- GB/T 14976-2025输送流体用不锈钢无缝钢管
- 新解读《GB-T 30641-2014食品机械 多功能电动压面机》
- 暑假专项重点提升训练:填空题(含解析)-2024-2025学年西师大版六年级数学下学期
- 新解读《GB-T 7715-2014工业用乙烯》
- 新解读《GB 30862-2014坠落防护 挂点装置》
- 重庆大学安全知识培训课件
- 重大危险源基本知识培训课件
- 静配中心细胞毒性药物的配置方法
- 短视频制作实战课件
- 面试礼仪与求职技巧讲义
- 严重创伤的急诊管理课件
- 江西省普通高中学生综合素质评价手册
- 急性阑尾炎【普外科】-课件
- 文化人类学课件完整版
- 四年级语文下册课外阅读《青铜葵花》导读课 课件(共24张PPT)
- 《Section B 1a-1e》获奖教案初中英语九年级全一册-九年级英语教案
- 中医儿科学 手足口病
- GB/T 14842-2007铌及铌合金棒材
评论
0/150
提交评论