VisualBasic编程基础分析_第1页
VisualBasic编程基础分析_第2页
VisualBasic编程基础分析_第3页
VisualBasic编程基础分析_第4页
VisualBasic编程基础分析_第5页
已阅读5页,还剩79页未读 继续免费阅读

下载本文档

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

文档简介

VisualBasic编程基础2.7基本流程结构

控制结构可控制程序执行的流程。如果未使用控制流语句,程序便从左至右、自顶向下地贯穿这些语句。有些简单程序可以只用单向流程来编写,有些流程可以依靠运算符的优先级来控制,但任何编程语言的效力和用途皆由其通过结构和循环改变语句顺序的能力而得。2.7.1顺序结构

顺序结构中程序按照语句编写的先后顺序一条一条地执行。使用顺序结构只需要将合法语句按照合理的执行顺序排列即可一一执行。【案例2-6】二次函数计算器

按钮单击事件中的代码为PrivateSubCommand1_Click()Dimx,yAsDoubleConsta=3Constb=-5x=Val(Text1.Text)y=a*x^2+b*x+1y=y/Abs(a+b)Text2.Text=Str$(y)EndSub2.7.2条件结构VisualBasic6.0支持的条件结构有:

If…Then;

If…Then…Else;

Iif;

SelectCase;(1)用If…Then结构有条件地执行一个或多个语句,单行语法和多行块语法都可以使用。If条件Then语句If条件Then [语句块]EndIf“条件”通常是比较式,但它可以是任何计算数值的表达式。VisualBasic6.0将这个值解释为True或False。一个为零的数值为False,而任何非零数值都被看做True。若“条件”为True,则VisualBasic6.0执行“Then”关键字后面的所有“语句块”。(2)用If…Then…Else块定义几个语句块,执行其中一个语句:If条件1Then[语句块1][ElseIf条件2Then[语句块2]]...[Else[语句块n]]EndIfVisualBasic6.0首先测试“条件1”。如果它为False,VisualBasic6.0就测试“条件2”,依此类推,直到找到一个为True的条件。当它找到一个为True的条件时,VisualBasic6.0就会执行相应的语句块,然后执行EndIf后面的代码。作为一个选择,可以包含Else语句块,如果前n-1个条件都是False,则VisualBasic6.0执行Else语句块。(3)IIf函数用于实现一些简单的条件判断分支结构,其格式如下:IIf(条件,条件为真时的值,条件为假时的值)其作用是对条件进行测试,若条件成立(为真值),则取第一个值(即“条件为真时的值”),否则取第二个值(即“条件为假时的值”)。(4)VisualBasic6.0提供SelectCase结构替代If…Then…Else,从而可在多个语句块中有选择地执行其中一个。SelectCase语句的能力与If…Then…Else语句类似,但对多重选择的情况,SelectCase语句使代码更加易读。SelectCase在结构的开始便处理一个测试表达式并只计算一次。然后,VisualBasic6.0将表达式的值与结构中每个Case的值进行比较。如果相等,就执行与该Case相关联的语句块。SelectCasetest测试表达式

[Case表达式列表1[语句块1]][Case表达式列表2[语句块2]]...[CaseElse[语句块n]]EndSelect【案例2-7】求数据的绝对值

按钮单击事件中的代码为PrivateSubCommand1_Click()DimaAsInteger '定义变量

a=Val(Text1.Text) '将文本框中输入的值赋给变量aIfa<0Then '当a为负数时取其相反数

a=-aEndIfText2.Text=Str$(a)EndSub

按钮单击事件中的代码为PrivateSubCommand2_Click()Text1.Text=""Text2.Text=""EndSub【案例2-8】闰年“确定”按钮单击事件中的代码为PrivateSubCommand1_Click()DimxAsIntegerx=Val(Text1.Text)If(xMod100)Then '如果X不能被100整除

If(xMod4=0)Then '如果x能被4整除但不能被100整除

Text2.Text="yes"Else '如果x不能被4和100整除

Text2.Text="no"EndIfElseIf(xMod400=0)Then '如果x能被100整除,又能被400整除

Text2.Text="yes"ElseText2.Text="no"EndIfEndSub“清除”按钮单击事件中的代码为PrivateSubCommand2_Click()Text1.Text=""Text2.Text=""EndSub【案例2-9】查询十二生肖Case6Text2.Text="虎"Case7Text2.Text="兔"Case8Text2.Text="龙"Case9Text2.Text="蛇"Case10Text2.Text="马"Case11Text2.Text="羊"Case0Text2.Text="猴"EndSelectEndSubPrivateSubCommand1_Click()DimyearAsInteger,aAsIntegeryear=Val(Text1.Text)a=yearMod12SelectCaseaCase1Text2.Text="鸡"Case2Text2.Text="狗"Case3Text2.Text="猪"Case4Text2.Text="鼠"Case5Text2.Text="牛"ElseIfa=6ThenText2.Text="虎"ElseIfa=7ThenText2.Text="兔"ElseIfa=8ThenText2.Text="龙"ElseIfa=9ThenText2.Text="蛇"ElseIfa=10ThenText2.Text="马"ElseIfa=11ThenText2.Text="羊"ElseText2.Text="猴"EndIfEndSub使用If…Then…Else结构,代码如下:PrivateSubCommand1_Click()DimyearAsInteger,aAsIntegeryear=Val(Text1.Text)a=yearMod12Ifa=1ThenText2.Text="鸡"ElseIfa=2ThenText2.Text="狗"ElseIfa=3ThenText2.Text="猪"ElseIfa=4ThenText2.Text="鼠"ElseIfa=5ThenText2.Text="牛"2.7.3循环结构Do…Loop;

For…Next。1.Do…Loop

用Do循环重复执行一语句块,且重复次数不定。Do…Loop语句有几种演变形式,但每种都计算数值条件以决定是否继续执行。如同If…Then条件必须是一个数值或者值为True(非零)或False(零)的表达式。在下面的Do…Loop循环中,只要“条件”为True就执行“语句块”。DoWhile(条件)[语句块]Loop

当VisualBasic6.0执行这个Do循环时会首先测试“条件”。如果“条件”为False(零),则跳过所有语句;如果“条件”为True(非零),则VisualBasic6.0执行语句,然后退回到DoWhile语句再测试条件。因此,只要“条件”为True或非零,循环可以随意执行多次;如果“条件”一开始便为False,则不会执行语句。Do…Loop语句的另一种演变形式是先执行语句,然后再在每次执行后测试“条件”。这种形式保证“语句块”至少执行一次:Do[语句块]LoopWhile(条件)

其他两种演变形式类似于前两个,所不同的是,只要“条件”为False而不是True,它们就执行循环。2.For…Next

与Do循环不同,For循环使用一个叫做计数器的变量,每重复一次循环之后,计数器变量的值就会增加或者减少。For循环的语法如下:For循环变量=初值To终值[Step步长][语句块]Next[循环变量]

参数“循环变量”、“初值”、“终值”和“步长”都是数值型的。“步长”参数可正可负。如果“步长”为正,则“初值”必须小于等于“终值”,否则不能执行循环内的语句;如果“步长”为负,则“初值”必须大于等于“终值”,这样才能执行循环体。如果没有设置“Step”(步长),则“步长”缺省值为1。每执行一个循环,“循环变量=循环变量+步长”。在执行For循环时,其执行过程如下。①设置“循环变量”等于“初值”。②测试“循环变量”是否在“初值”和“终值”之间。若不是的话,则VisualBasic6.0退出循环;若是的话执行语句。③执行完“语句块”语句,执行Next[循环变量],循环变量=循环变量+步长。④重复步骤②~步骤④。【案例2-10】人口估算假设我国现有人口约为12亿,设年增长率为1%,计算多少年后增加到20亿。PrivateSubForm_Click()DimaAsDoubleDimrAsSingleDimiAsIntegera=12r=0.01i=0DoWhilea<20'当人口数大于等于20亿时结束循环

a=a*(1+r)i=i+1LoopPrinti;"年后中国人口达到20亿"EndSub使用Do…LoopWhile结构,代码如下:PrivateSubForm_Click()DimaAsDoubleDimrAsSingleDimiAsIntegera=12r=0.01i=0Doa=a*(1+r)i=i+1LoopWhilea<20 '当人口数大于等于20亿时结束循环

Printi;"年后中国人口达到20亿"EndSub【案例2-11】累加求和求m=1+2+3+4+……100的值。PrivateSubForm_Click()DimmAsInteger,iAsIntegerm=0Fori=1To100 '步长省略,默认为1m=m+iNextiPrintmEndSub2.7.4控制结构

前面介绍了几种基本的控制语句,而应用这几种基本的控制语句,可以产生各种各样的控制结构,下面讲解几种特殊的控制结构。(1)嵌套控制结构

可以把控制结构放入另一个控制结构之内(例如在For…Next循环中的If…Then块)。一个控制结构内部包含另一个控制结构叫做嵌套(nest)。在VisualBasic6.0中,控制结构的嵌套层数没有限制。按一般习惯,为了使条件分枝结构和循环结构更具可读性,总是用缩排方式书写条件分枝结构或循环结构的正文部分。(2)退出控制结构

用Exit语句可以直接退出For循环、Do循环、子过程或函数过程。For循环变量=初值To终值[Step步长][语句块][ExitFor][语句块]Next[循环变量[,循环变量][,…]]Do[{While|Until}条件][语句块][ExitDo][语句块]LoopExitDo语句可以在Do循环语法的所有结构中使用。ExitFor和ExitDo非常有用,因为它有时适用于立即退出循环,而且不再执行循环中的任何进一步迭代或者语句。【案例2-12】人口估算

假设我国现有人口约为12亿,设年增长率为1%,计算多少年后增加到20亿。PrivateSubForm_Click()DimaAsDoubleDimrAsSingleDimiAsIntegera=12r=0.01Fori=0to1000a=a*(1+r)Ifa>=20ThenExitFor'当人口数大于等于20亿时跳出循环

NextiPrinti;"年后中国人口达到20亿"EndSub2.8数组

在VisualBasic6.0中,把一组具有同一名字、不同下标的下标变量称为数组,其一般形式如下:S(i)

其中S称为数组名,i是下标。一个数组可以含有若干个下标变量,下标用来指出某个数组元素在数组中的位置,S(8)代表S数组中的第八个元素。2.8.1数组的声明

声明固定大小的数组有3种方法,用哪一种方法取决于数组应有的有效范围。建立全局数组,在模块的声明段用Public语句声明数组。建立模块或窗体数组,在模块的声明段用Private语句声明数组。建立局部数组,在过程中用Private语句声明数组。

声明数组时,在数组名之后跟一个用括弧括起来的,其上界、下界不得超过Long数据类型的范围(-2147483648~2147483647)。例如,下列数组声明可出现在模块的声明段:DimA(4)AsInteger'同时定义了A(0),A(1),A(2),A(3),A(4)5个元素。DimS(20)AsDouble'定义了S(0)到S(20)21个元素。为建立公用数组,直接用Public取代Dim:PublicA(4)AsIntegerPublicS(20)AsDouble

第一个声明建立了一个有5个元素的数组,其索引号为0~4;第二个声明建立了一个有21个元素的数组,其索引号范围是0~20。为了规定下界,可以使用关键字“To”显式提供下界(为Long数据类型):DimA(1To5)AsIntegerDimS(100To120)AsString在前述声明中,“A”的索引值范围为1~5,而“S”的索引值范围为100~120。

有时候,可能需要知道数组的上界值和下界值,这可以通过Lbound和Ubound函数来测试,其格式如下:Lbound(数组名) '返回数组索引值的上界值Ubound(数组名) '返回数组索引值的下界值2.8.2动态数组

数组长度到底应该为多大才算合适,有些情况下很难确定,这就需要数组能够在运行时具有改变大小的能力。通过使用动态数组,可以在程序中任意改变数组的长度。在VisualBasic6.0中,动态数组是最灵活、最方便的,有助于有效管理内存。(1)如果希望数组为公用数组,则用Public语句声明数组;如果希望数组为模块级,则在模块级用Dim语句声明数组;如果希望数组为局部数组,则在过程中用Static或Dim语句声明数组。给数组赋一个空数组,这样就将数组声明为动态数组。例如:DimA()(2)用ReDim语句分配实际的元素个数。ReDimA(X+1)ReDim语句只能出现在过程中。与Dim语句、Static语句不同,ReDim语句是一个可执行语句,由于这一语句,应用程序在运行时执行一个操作。ReDim语句支持这样的语法,它与固定数组中使用的语法相同。每个ReDim语句都能改变元素数目以及上下界。2.8.3数组的基本操作

建立一个数组之后,可以对数组或数组元素进行操作。数组的基本操作包括输入、输出及复制,这些操作都是对数组进行的。此外,在VisualBasic6.0中还提供了ForEach…Next语句,可用于对数组的操作。1.数组元素的引用

引用数组元素的格式是:数组名(下标)。例如:Number(1),A(2),Num(0),B(4)等。2.给数组元素赋值(1)利用循环结构给数组元素赋值,例如为数组元素赋初值3:Fori=1to5A(i)=3Nexti(2)利用Array()函数为数组元素赋值,即把一个数据集读入某个数组。其格式为: 数组变量名=Array(数组元素值)例如:StaticNumberNumber=Array(1,2,3,4,5)说明:

Array()函数对各元素赋值,声明的数组是动态数组或连小括号都省略的数组,并且类型只能是Varient。数组下界默认为0,可通过OptionBase语句决定,上界由Array()函数括号内的参数个数决定,也可通过UBound()函数获得。“数组元素值”是需要赋给数组各元素的值,各值之间以逗号分开。

Array()函数只适用于一维数组。4.数组元素的复制(1)单个数组元素可以像简单变量一样从一个数组复制到另一个数组。例如:

Dimb(4),a(6) … b(2)=a(3)(2)要复制整个数组,要使用For循环语句。(3)要复制整个数组,也可以使用一条简单的赋值语句即可。例如:Dima(4)asinteger,b()asintegerA(0)=0:a(1)=5:a(2)=10:a(3)=13:a(4)=14B=a使用这种方法赋值时,必须要注意:赋值号两边的数据类型必须一致;如果赋值号左边的是一个大小固定的数组,则数组赋值出错;赋值号左边的必须是一个动态数组,赋值时系统将自动给动态数组分配内存空间,使之与右边数组大小相同。5.ForEach…Next语句 ForEach…Next循环与For…Next循环类似,与For…Next语句类似,两者都是用来执行指定重复次数的语句。但ForEach…Next语句是专门用于操作数组的,它的格式如下:ForEach<成员>In<数组名>[<循环体>]Next[<成员>]说明:格式中的“成员”必须是一个变体变量,是为循环提供的,代表的是数组中的每个元素。

〈数组名〉没有括号和上下界。用ForEach…Next语句可以对数组中的每个元素进行处理,它包括查询、显示和读取。它所重复的次数由数组中元素的个数决定,数组中有多少个元素,就自动重复执行多少次。【案例2-13】数组复制给数组赋初值,然后复制到另一数组中,并打印输出到窗体上。PrivateSubForm_Click()Dima(),b()'定义动态数

a=Array(1,2,3,4,5)'给数组赋初值

ReDimb(UBound(a))'给动态数组分配内存空间

Fori=0ToUBound(a)'数组复制

b(i)=a(i)NextiFori=0ToUBound(a)'数组输出

Printb(i);NextiEndSub【案例2-14】数组求和求数组A中所有元素的和。PrivateSubForm_Click()DimsumAsIntegerDimA(1To10)AsInteger'数组定义

Fori=1To10'数组赋初值

A(i)=1Nextisum=0ForEachxInA'使用ForEach…Next数组求和

sum=sum+xNextxPrintsum'输出数组和EndSub【案例2-15】数组基本操作OptionBase1PrivateSubForm_Click()Dimabc(10)AsInteger'数组定义

Fori=1To10'数组赋初值为0~100内的整数

abc(i)=Int(Rnd*100)NextiPrint"使用普通循环输出:"Fori=1To10'使用普通循环输出数组

Printabc(i);NextiPrintPrint"使用ForEach…Next输出:"ForEachxInabc'使用ForEach…Next输出数组

Printx;NextEndSub2.9过程

将公用的、能完成某一特定功能的程序设计成可供其他程序调用的、独立的程序段,这种程序段就称为子程序(也称为过程)。调用子程序的程序段称为主程序。用过程编程有两大好处。(1)过程可使程序划分成离散的逻辑单元,这样程序的结构清晰且便于调试。(2)一个程序中的过程,往往不必修改或只需稍做改动,便可成为另一个程序的构件。2.9.1子过程的分类

在VisualBasic中,有两类子过程:事件过程和通用过程。1.通用过程

在VisualBasic6.0中,通用过程分为两类,即子程序过程(Sub过程)和函数过程(Function过程)。 通用过程必须由其他过程调用,它并不与任何特定的事件直接相联系,它完成特定的任务,通用过程由用户创建。通用过程可以存储在窗体或标准模块中。2.事件过程

当用户对一个对象发出动作时,会产生一个事件,然后自动地调用与该事件相关的事件过程。事件过程就是在响应事件时执行的程序段。 默认时,事件过程是私有的。事件过程是附加在窗体和控件上的。所有的事件过程都使用相同的语法。控件事件的语法:PrivateSub控件名_事件名(参数列表)

语句块EndSub窗体事件的语法:PrivateSubForm_事件名(参数列表)

语句块EndSub2.9.2Sub过程1.定义子过程子过程的语法是:[Private|Public][Static]Sub<过程名>([<形参表>])

<语句序列> [ExitSub]EndSub2.建立Sub子过程【案例2-16】矩形面积计算

使用Sub过程计算矩形的面积,输入矩形的长和宽,输出矩形的面积。在【通用】/【声明】中定义模块级变量:DimareaAsSingle在窗体模块中建立Sub过程,并编写Sub过程响应代码:Subrecarea(rlen,rwid)area=rlen*rwidEndSub“确定”按钮单击事件中的代码为PrivateSubCommand1_Click()DimaAsSingle,bAsSinglea=Val(Text1.Text)b=Val(Text2.Text)recareaa,b'Callrecarea(a,b)Text3.Text=areaEndSub“清除”按钮单击事件中的代码为PrivateSubCommand2_Click()Text1.Text=""Text2.Text=""Text3.Text=""EndSub【案例2-17】打印等腰三角形

在同一窗体建立两个过程,Triangle是通用过程,Form_Click是窗体事件过程,执行程序时,单击窗体将在窗体显示两个等腰三角形,如图所示。PrivateSubtriangle(StrAsString,nAsInteger)DimiAsInteger,jAsIntegerFori=lTonPrintTab(16-i);Forj=1To2*i-1PrintStr;NextjPrintNextiEndSubPrivateSubForm_Click()DimcharAsString*1,nAsIntegerchar="*"n=5Calltriangle(char,n)char="+"trianglechar,3EndSub2.9.3Function函数过程 VisualBasic6.0包含内置的或内部的函数,如Sqr,Cos或Chr。此外,还可用Function语句编写自己的Function函数过程。 与Sub过程一样,Function过程也是一个独立的过程,可读取参数,执行一系列语句并改变其参数的值。与子过程不同,Function过程可返回一个值到调用的过程。1.定义Function过程函数过程的语法是:[Static][Public|Private]Function<函数过程名>([<参数列表>])[As<类型>]<语句块>

函数名=返回值[ExitFunction]EndFunction其中,

As类型:函数返回值的类型,若类型说明默认,则返回变体类型值。参数列表形式同Sub过程。在函数体内至少对函数名赋值一次。2.建立Function过程

前一节提到建立Sub过程的两种方法也可以建立Function过程,只是当用第一种方法建立时,在【添加过程】对话框的【类型】栏内应选择【函数】单选按钮;另外,两种方法中的Sub应换成Function。3.调用Function过程

通常,调用自行编写的函数过程的方法和调用VisualBasic6.0内部函数过程(例如Cos)的方法一样,即在表达式中写上它的名字。下面的语句都调用函数Txt。Print10*TxtX=TxtIfTxt=10ThenPrint"OutofRange";"X=";10*Txt

像调用Sub过程那样,也能调用函数。下面的语句都调用同一个函数:CallSin(x)Sinx【案例2-18】矩形面积计算本案例使用Function过程计算矩形面积。输入矩形的长和宽,输出矩形的面积。在窗体模块中建立Function过程,并编写过程响应代码:Functionrecarea(rlen,rwid)AsSinglerecarea=rlen*rwidEndFunction“确定”按钮单击事件中的代码为PrivateSubCommand1_Click()DimaAsSingle,bAsSinglea=Val(Text1.Text)b=Val(Text2.Text)Text3.Text=Str(recarea(a,b))EndSub“清空”按钮单击事件中的代码为PrivateSubCommand2_Click()Text1.Text=""Text2.Text=""Text3.Text=""EndSub2.9.4参数使用

参数传递可以实现调用过程和被调过程之间的信息交换,在过程的调用中,调用其他过程的过程称为主过程,被调用的过程称为子过程。当被调用的子过程要使用主过程中的数据时,就必须使用参数传递。参数分为形式参数和实际参数。形式参数(简称形参):在子过程中的参数,出现在Sub过程和Function过程中。形式参数可以是变量名和数组名。实际参数(简称实参):在主过程中的参数,过程调用时实参数据会传递给形参。在VisualBasic6.0中,实参与形参的结合有两种方法,即传址(ByRef)和传值(ByVal),其中传址又称为引用,是默认的方法。1.按值传递参数

用“ByVal”关键字指出参数是按值来传递的。按值传递参数时,传递的只是变量的副本。当调用一个过程时,系统将实参的值复制给形参,实参与形参断开了联系。被调过程中的操作是在形参自己的存储单元中进行的,当过程调用结束时,形参所占用的存储单元也同时被释放。因此在过程体内对形参的任何操作不会影响到实参。2.按地址传递参数

按地址传递参数在VisualBasic6.0中是缺省的,即不用“ByVal”关键字。按传址方式时,则是把变量在内存中的地址传递给形参。这时,形参将与原变量使用内存中的同一地址。也就是说,如果在过程中改变了

温馨提示

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

评论

0/150

提交评论