《Visual Basic 2005 程序设计》第3章 程序结构控制_第1页
《Visual Basic 2005 程序设计》第3章 程序结构控制_第2页
《Visual Basic 2005 程序设计》第3章 程序结构控制_第3页
《Visual Basic 2005 程序设计》第3章 程序结构控制_第4页
《Visual Basic 2005 程序设计》第3章 程序结构控制_第5页
已阅读5页,还剩164页未读 继续免费阅读

下载本文档

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

文档简介

第3章程序结构控制1本章主要内容:程序顺序结构。使用If…Then构建分支结构程序。使用SelectCase构建多分支结构程序。使用For…Next构建循环结构程序。使用Do…Loop构建循环结构程序。使用Panel容器控件。使用RadioButton控件。过程的定义与使用。变量的生存期与作用域。2通过上一章的讨论可知,算法用来描述如何对数据进行处理,以便得到期望的结果。因此,在算法中需要依次处理一些数据,或对一些数据处理结果进行判断决策,或循环处理一些数据。为此,使用VisualBasic2005实现一个算法时,需要相应的语句实现判断决策和循环处理,即对程序的流程进行控制。下面结合逐步增加功能的实例讲述程序流程的顺序结构、选择分支结构、循环结构,以及过程的定义和使用。33.1顺序结构最简单的程序流程结构是顺序结构,即各语句按照先后出现的次序执行,其执行流程如图3-1所示。语句1语句2…...语句n图3-1顺序结构流程图4例3.1通过文本框输入两个数,进行相加处理后,通过输出文本框输出。具体操作过程:⑴新建项目,选择“Windows应用程序”,并把“名称”修改为“程序流程控制1.0”,然后单击“确定”。⑵在解决方案资源管理器中把“Form1.vb”文件名改为“程序流程控制.vb”。⑶打开窗体设计视图,选择Form1窗体,在属性框中修改窗体的属性:Name改为“frmProgStruct”;StartPosition改为“CenterScreen”;Text改为“程序流程控制1.0”。⑷为窗体添加Label控件,Text改为“请输入两个数:”。⑸为窗体添加2个TextBox控件,Name分别改为“txtInput1”、“txtInput2”。⑹为窗体添加2个Button控件,修改该控件的属性:Name分别改为“btnCalculate”、“btnQuit”,Text分别改为“计算”、“退出”。⑺为窗体添加1个TextBox控件,Name改为“txtOutput”,Multiline改为“True”,ScrollBars改为“Vertical”。⑻双击“退出”按钮,在“退出”按钮Click事件过程中添加响应代码:Close()。⑼双击“计算”按钮,在代码编辑器中添加对“计算”按钮Click事件响应的代码:5

PrivateSubbtnCalculate_Click(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesbtnCalculate.Click'定义变量

DimobjOper1AsObjectDimobjOper2AsObjectDimobjResultAsObjectDimstrOutputAsString=""'读取输入的内容

objOper1=txtInput1.TextobjOper2=txtInput2.Text'输入内容相加

objResult=objOper1+objOper2'输出结果

strOutput=txtInput1.Text&"+"&txtInput2.Text&"="&objResult&vbCrLf

txtOutput.Text=txtOutput.Text&strOutput

EndSub6提示:“程序流程控制1.0”程序中两个数相加实现的是两个字符串的连接操作,没有实现两个数值的相加。这是因为objOper1和objOper2是Object类型,而txtInput1.Text和txtInput2.Text的类型是String类型,因此objOper1+objOper2进行的是两个字符串“+”操作,即字符串连接操作。7如果要把12和34相加按数值“+”进行运算,则需要把文本框输入的字符串转换为数值类型,如下面的代码把输入内容转换为Double数值类型后再进行相加:

'读取输入的内容

objOper1=CDbl(txtInput1.Text)'把输入的字符串内容转换为Double数值类型

objOper2=CDbl(txtInput2.Text)'把输入的字符串内容转换为Double数值类型8在对话框中输入12和34,单击“计算”按钮,则在输出文本框中显示相加结果是“46”。但如果输入的是12x(有时输入数值时可能不小心输入了一个非数字字母)和34,如果在VisualStudio2005中通过“启动调试”运行的程序,则出现从字符串“12x”到类型“Double”转换无效的异常提示对话框,如图3-4所示。9图3-4从字符串“12x”到类型“Double”转换无效的异常提示10如果是直接运行的程序流程控制1.0.exe程序,当输入的“12x”无法转换为Double类型的数值时,程序出现错误,如图3-5所示,并异常终止执行。如果是直接运行的程序流程控制1.0.exe程序,当输入的“12x”无法转换为Double类型的数值时,程序出现错误,如图3-5所示,并异常终止执行。11图3-5程序流程控制1.0.exe运行出现错误提示信息12为了防止数据转换出现错误,在程序中进行数据转换之前,应该判断输入的内容是否能够进行转换,如果不能转换,则提示错误信息,即需要选择分支。实现选择分支结构的语句有两个:If…Then语句和SelectCase语句。133.2If…Then语句If…Then语句在程序设计中,经常以单分支、双分支、多分支和嵌套的显示出现。143.2.1If…Then语句单分支结构If…Then语句单分支结构的语句格式为:If(Expression)Then语句块EndIf其中Expression是逻辑表达式或关系表达式。如对于0≤intX≤100,VisualBasic可以写成:intX>=0AndintX<=100。Expression的值只能是True或False,作为If进行测试判断的依据:如果Expression的值为True,依次执行语句块中的语句,然后执行EndIf后的语句;如果Expression的值为False,则跳过语句块直接执行EndIf后的语句。其执行流程如图3-6所示。15语句块图3-6单分支结构流程图ExpressionTrueFalse16提示:语句块中可以包含多条语句。如果语句块中只有一条语句,If…Then单分支结构可以省略EndIf,写成一行,如下格式:

If(Expression)Then语句17例3.2在例3.1的基础上,增加对文本框输入内容的判断:如果输入内容不能转换为Double类型,则退出过程调用。具体操作过程同例3.1,为了区别上述程序,项目“名称”修改为“程序流程控制2.0”。双击“计算”按钮,在代码编辑器中添加对“计算”按钮Click事件响应的代码:18

PrivateSubbtnCalculate_Click(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesbtnCalculate.Click'定义变量

DimobjOper1AsObjectDimobjOper2AsObjectDimobjResultAsObjectDimstrOutputAsString=""19

'读取输入的内容,如果输入的内容包含非数字字符则退出过程调用

IfNot(IsNumeric(txtInput1.Text)AndIsNumeric(txtInput2.Text))Then

MessageBox.Show("输入的内容包含非数字字符!","错误")'输出提示信息

ExitSub'退出过程调用

EndIfobjOper1=CDbl(txtInput1.Text)'把输入的字符串内容转换为Double数值类型

objOper2=CDbl(txtInput2.Text)'把输入的字符串内容转换为Double数值类型20

'输入内容相加

objResult=objOper1+objOper2'输出结果

strOutput=txtInput1.Text&"+"&txtInput2.Text&"="&objResult&vbCrLf

txtOutput.Text=txtOutput.Text&strOutputEndSub提示:IsNumeric函数的格式为IsNumeric(Expression),如果Expression中的内容能够转换为数值,则返回True,否则返回False。21代码说明:⑴对于Not(IsNumeric(txtInput1.Text)AndIsNumeric(txtInput2.Text)),只要txtInput1.Text和txtInput2.Text有一个不能正确转换为数值,则表达式返回True,执行If…Then后的语句,即退出过程调用。⑵如果Not(IsNumeric(txtInput1.Text)AndIsNumeric(txtInput2.Text))为False,则不执行If…Then后的语句,而是执行EndIf后面的语句。运行“程序流程控制2.0”程序,在文本框中如果输入12x和34,单击“计算”按钮后,程序不出现异常信息,而是弹出如图3-7所示对话框。223.2.2If…Then语句双分支结构If…Then语句双分支结构的语句格式为:If(Expression)Then语句块1Else

语句块2EndIf23其中Expression是逻辑表达式或关系表达式,返回值为True或False。If…Then语句双分支结构的语句的含义是:如果Expression的值为True,依次执行语句块1中的语句,然后执行EndIf后的语句;如果Expression的值为False,依次执行语句块2中的语句,然后执行EndIf后的语句。24If…Then语句双分支结构执行流程如图3-8所示。可以看出,语句块1和语句块2只能执行其中一个,不能同时执行。图3-8双分支结构流程图ExpressionFalseTrue语句块1语句块225例3.3在例3.2的基础上,增加可以选择两个数相加或相减的功能,“计算”按钮根据选择的功能进行两个数相加或相减操作。具体操作过程同例3.2,需要添加和修改的额外内容有:⑴为了区别上述程序功能的不同,把该项目“名称”修改为“程序流程控制2.1”。⑵为窗体添加Label控件,Text改为“选择操作:”。⑶为窗体添加一个Panel控制,修改“BorderStyle”为“Fix3D”。⑷在Panel控制中添加2个RadioButton控件,Text分别改为“+”、“-”,Name分别改为“rdbPlus”、“rdbSub”,其中“+”单选框的Checked改为“True”。26提示:Panel是容器控件,把其中包含的控件通过组合形成控件集合。RadioButton

控件为单选框按钮,一般包含在Panel控件中,或包含在GroupBox

控件中形成一组RadioButton

控件集合,一组RadioButton

控件集合可以确保每次只能选中一个控件。27⑸在代码编辑器中,在类声明“PublicClassfrmProgStruct”语句之后添加一个记录已选操作类型的属性:

'定义属性,记录选择的操作类型,默认为+操作

PrivatestrSelOperatorAsString="+“注意:在本例中strSelOperator默认的初始值是“+”。Private是访问控制描述关键字,说明strSelOperator只能在类frmProgStruct内使用,即类frmProgStruct内的过程可以引用strSelOperator。28⑹双击“+”,在代码编辑器中添加对“+”单选框CheckedChanged事件响应的代码:

PrivateSubrdbPlus_CheckedChanged(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesrdbPlus.CheckedChanged

strSelOperator="+"'“+”操作被选中EndSub29⑺双击“-”,在代码编辑器中添加对“-”单选框CheckedChanged事件响应的代码:

PrivateSubrdbSub_CheckedChanged(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesrdbSub.CheckedChanged

strSelOperator="-"'“-”操作被选中EndSub30⑻在例3.2实现的“计算”按钮Click事件响应代码的基础上,重新编写对输入内容进行相加、相减操作和输出的代码:

'输入内容相加、相减操作

If(strSelOperator="+")Then'如果“+”操作被选中

objResult=objOper1+objOper2Else'否则“+”操作没有被选中,则“-”操作被选中

objResult=objOper1-objOper2EndIf'输出结果

strOutput=txtInput1.Text&strSelOperator&txtInput2.Text&"="&objResult&vbCrLf

txtOutput.Text=txtOutput.Text&strOutput31提示:RadioButton只有选中、未选中两种状态,单击同一集合类的某一个RadioButton控件,则该控件被则选中,相应地其它控件则为未选中。RadioButton控件中的Checked属性记录控件选中与否的状态,当状态变化时,触发RadioButton控件的CheckedChanged事件。323.2.3If…Then语句多分支结构If…Then语句多分支结构的语句格式为:If(Expression1)Then

语句块1ElseIf

(Expression2)Then

语句块2…

ElseIf

(Expressionn)Then

语句块nElse

语句块n+1EndIf33If…Then语句多分支结构根据表达式的值确定要执行的语句块,如果表达式的值为True,则执行相应的语句块,然后退出If…Then多分支结构语句,执行EndIf后的语句;否则执行其后的判断语句ElseIf

(Expressionx)Then语句。If…Then语句多分支结构执行流程如图3-10所示。可以看出,每次只能执行其中一个语句块。34图3-10多分支结构流程图FalseTrue语句块2Expression1语句块1Expression2……ExpressionnTrueFalseTrueFalse语句块n语句块n+135例3.4在例3.3的基础上,增加可以选择两个数相加、减、乘、除的功能,“计算”按钮根据选择的功能进行两个数相应的计算。具体操作过程同例3.3,需要添加和修改的额外内容有:⑴为了区别上述程序功能的不同,把该项目“名称”修改为“程序流程控制2.2”。⑵在Panel控制中再添加2个RadioButton控件,Text分别改为“×”、“÷”,Name分别改为“rdbMultiple”、“rdbDivide”。36⑶双击“×”,在代码编辑器中添加对“×”单选框CheckedChanged事件响应的代码:

PrivateSubrdbMultiple_CheckedChanged(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesrdbMultiple.CheckedChanged

strSelOperator="×"'“×”操作被选中EndSub37⑷双击“÷”,在代码编辑器中添加对“÷”单选框CheckedChanged事件响应的代码:

PrivateSubrdbDivide_CheckedChanged(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesDivide.CheckedChanged

strSelOperator="÷"'“÷”操作被选中EndSub38⑸在例3.3实现的“计算”按钮Click事件响应代码的基础上,重新编写对输入内容进行加、减、乘、除操作的代码:

'输入内容进行+、-、×、÷操作

If(strSelOperator="+")Then'如果“+”操作被选中

objResult=objOper1+objOper2

ElseIf(strSelOperator="-")Then'如果“-”操作被选中

objResult=objOper1-objOper2

ElseIf(strSelOperator="×")Then'如果“×”操作被选中

objResult=objOper1*objOper2

ElseIf(strSelOperator="÷")Then'如果“÷”操作被选中

objResult=objOper1/objOper2Else

MessageBox.Show("选择操作有错!","错误")EndIf39如果在“程序流程控制2.2”的文本框中如果输入12和0,选择操作“÷”并单击“计算”按钮,则显示计算结果为无穷大,如图3-12所示。这是因为在除操作中,除数不能为0。为此,在“÷”运算前,需要判断除数是否为0,如果是0,则不能进行“÷”运算。403.2.4If…Then语句嵌套If…Then语句嵌套是指在If…Then语句单分支、双分支、多分支结构的Then语句后或Else语句后还可以再使用If…Then语句进行判断,构成选择分支。如:If(Expression1)Then'第1个If

语句块1Else'与第1个If配对的ElseIf(Expression1.1)Then'第2个IfIf(Expression1.1.1)Then'第3个If

语句块1.1.1Else'与第3个If配对的Else

语句块1.1.2EndIf'与第3个If配对的EndifEndIF'与第2个If配对的EndifEndIf'与第1个If配对的Endif41为了防止在“程序流程控制2.2”出现除数是0的情况,在“÷”运算前,增加判断除数是否为0的语句:

'输入内容进行+、-、×、÷操作

If(strSelOperator="+")Then'如果“+”操作被选中

objResult=objOper1+objOper2

ElseIf(strSelOperator="-")Then'如果“-”操作被选中

objResult=objOper1-objOper2

ElseIf(strSelOperator="×")Then'如果“×”操作被选中

objResult=objOper1*objOper2

ElseIf(strSelOperator="÷")Then'如果“÷”操作被选中

If(objOper2=0)Then'如果被除数是,则退出过程调用

MessageBox.Show("被除数不能为零!","错误")ExitSubElse'否则进行÷操作

objResult=objOper1/objOper2EndIfElse

MessageBox.Show("选择操作有错!","错误")EndIf423.3SelectCase语句如果要从多种备选情况中选择一种情况,或从多种备选情况中选择多种情况,可以通过If…Then语句多分支结构及嵌套实现,如例3.4。但当备选情况的量比较大时,使用If…Then语句则:效率低。如例3.4中,要判断到“÷”时,必须和前3种操作进行比较,如果使用“÷”的概率非常高,则每次要进行的无用比较操作就越多,从而造成程序执行效率的低下。程序不易阅读。如例3.4中,要知道“ElseIf(strSelOperator="÷")Then”中表达式所包含的确切逻辑含义,必须要和前面的所有判断包含的表达式的逻辑含义结合起来进行理解。43在例3.4的If…Then语句多分支结构中,进行判断的语句有一个共同的特点,即strSelOperator和一个字符串(“+”、“-”、“×”、“÷”)进行“=”(相等)比较。对于这种特点的从多种备选情况中选择一种、多种情况的判断,VisualBasic2005提供了一个更好的多分支判断结构,即SelectCase语句。443.3.1使用SelectCase语句SelectCase语句格式为:SelectCaseExpressionCaseValue1

语句块1CaseValue2

语句块2…CaseValuen

语句块nCaseElse

语句块n+1EndSelect45如果Expression与某一CaseValuex

子句匹配,则执行该Case语句后的语句块x,执行完语句块x后执行EndSelect后的语句;如果Expression没有与任何Case语句匹配,则执行CaseElse后的语句块。46例3.5用SelectCase语句替换例3.4中的If…Then多分支结构。具体操作过程同例3.4,需要添加和修改的额外内容有:⑴为了区别上述程序功能的不同,把该项目“名称”修改为“程序流程控制2.2.1”。⑵使用SelectCase语句替换If…Then多分支结构:47

'输入内容进行+、-、×、÷操作

SelectCasestrSelOperatorCase"+"'如果“+”操作被选中

objResult=objOper1+objOper2Case"-"'如果“-”操作被选中

objResult=objOper1-objOper2Case"×"'如果“×”操作被选中

objResult=objOper1*objOper2Case"÷"'如果“÷”操作被选中

If(objOper2=0)Then'如果被除数是,则退出过程调用

MessageBox.Show("被除数不能为零!","错误")ExitSubElse

objResult=objOper1/objOper2EndIfCaseElse

MessageBox.Show("选择操作有错!","错误")EndSelect48注意:SelectCase后只能有一个表达式。如SelectCasex,y

是错误的。SelectCase语句中的Case子句后还可以嵌套If…Then语句、或SelectCase语句。493.3.2多重选择前面的Expression与某一CaseValuex

子句匹配,执行该Case语句后的语句块x,如果要求Expression与某一批CaseValueKx

子句之一匹配,执行相同的语句块K,则SelectCase语句可以写成:50SelectCaseExpressionCaseValue1

语句块1…CaseValueK1,ValueK2,…,ValueKm

语句块K…CaseValuen

语句块nCaseElse

语句块n+1EndSelect即CaseValueK1,ValueK2,…,ValueKm中的多个值(多个值之间用逗号分隔)对应于同一语句块K。51例如:

DimstrMemberTypeasString……‘为strMemberType赋值

SelectCasestrMemberTypeCase"小学生","中学生","高中生","大学生"

MessageBox.Show("您选择的学生是:"&strMemberType,"学生类型")Case"教师","干部"

MessageBox.Show("您选择的工作人员是:"&strMemberType,"工作人员类型")CaseElse

MessageBox.Show("您输入的"&strMemberType&"是无效类型!","错误")EndSelect52如果Case子句要表示范围,有两种格式:⑴Exp1ToExp2格式:表示的范围是[Exp1,Exp2],即大于等于Exp1,并且小于等于Exp2。这里Exp2必须大于Exp1。如:Case60To69。⑵IsOperatorExp格式:用带比较运算符(=、<>、<、<=、>或>=)的Is关键字来指定对Expression匹配值的限制。如CaseIs<0。53提示:⑴Exp1、Exp2和Exp都可以为字符串。如“AA”To“HH”,表示“AA”到“HH”之间的所有字符串(按字母排列)。⑵在第2种格式中,如果没有输入Is关键字,系统将自动在Operator前面插入。这里Is是关键字,不是运算符!54例3.6通过文本框输入一个0到100之间的整数成绩,使用MessageBox对话框显示成绩的级别:小于60为不及格;60~69为中等;70~79为良好;80~89为优良;90~100为优秀。具体操作过程:⑴创建Windows应用程序项目,项目“名称”为“成绩分级”。⑵为窗体添加1个Label控件、1个TextBox控件和两个Button控件,Name分别为:labString,txtInputScore,btnGrade,btnQuit;Text分别为:“请输入成绩:”,“0”,“显示级别”,“退出”。为使用“退出”按钮添加退出程序代码:Close()。55⑶在编辑器中添加响应“显示级别”按钮Click事件的代码:

PrivateSubbtnGrade_Click(ByValsenderAsSystem.Object,_ByValeAsSystem.EventArgs)HandlesbtnGrade.Click'定义变量,保存输入的成绩

DimintScoreAsInteger'读取输入的成绩

IfNotIsNumeric(txtInputScore.Text)Then

MessageBox.Show("无效输入内容!","错误")ExitSubEndIf

intScore=CInt(txtInputScore.Text)'为intScore

赋值56

'根据intScore显示相应的成绩级别

SelectCaseintScoreCaseIs<0

MessageBox.Show("无效成绩!","错误")CaseIs<60

MessageBox.Show("不及格","成绩级别")Case60To69

MessageBox.Show("中等","成绩级别")Case70To79

MessageBox.Show("良好","成绩级别")Case80To89

MessageBox.Show("优良","成绩级别")Case90To100

MessageBox.Show("优秀","成绩级别")CaseElse

MessageBox.Show("无效成绩!","错误")EndSelectEndSub573.4循环结构有时程序中某些代码需要重复执行一定的次数后才能得到最终结果,这种重复执行可以通过循环结构实现。比如在例3.5中增加对输入的两个数进行累加的功能,如输入12、34,累加表示12+13+…+33+34,如果累加后的和保存在变量intSum中,则这种累加的动作可以表示成:intSum=intSum+intX,即intSum的当前值和intX相加,结果再保存到intSum中,如果intX依次取12到34之间的一个整数,重复执行上述累加动作(34-12+1)次,即可计算出12到34的累加和,即intSum的值。循环结构有两种:“For”计数型循环,即循环指定的次数后停止循环;“Do”条件型循环,即当某一条件满足时执行循环语句或退出循环。583.4.1For…Next循环

For…Next循环属于计数型循环,将语句块重复执行指定的次数,其语句格式为:Forcounter[Asdatatype]=startToend[Stepstep]

语句块Next[counter]其中counter为循环控制变量,其值从start按步长step变化到end。For…Next循环执行流程图如图3-13所示:59FalseTrue语句块counter=start是否继续循环?counter=counter+stepNext下条语句图3-13For…Next循环执行流程60说明:⑴如果step为正,“是否继续循环”的判断表达式为:counter<=end;如果step为负,“是否继续循环”的判断表达式为:counter>=end。⑵如果没有指定,则step的默认值为1。⑶counter变量一般是在For语句之前定义,但也可以在For语句中定义,例如:

ForintCounterAsInteger=0To100Step2……'循环语句块

NextintCounterintCounter在For语句中定义,则intCounter只能在For…Next循环内的语句块中使用,即intCounter的作用域是For循环体。61⑷VisualBasic仅在循环开始之前计算一次start、end和step的值,如果在循环体的语句块中更改了end或step的值,则更改不影响对循环的控制。例如:

DimintStepAsInteger=2DimintEndAsInteger=100ForintCounterAsInteger=1TointEndStepintStep

'循环步长是2,循环100次

……'循环语句块

intStep=intStep+10'intStep的值变为12,但控制循环的步长仍然是2

intEnd=200'intEnd的值变为200,但循环的次数仍然是100次

Next62例3.7在例3.5的基础上,增加两个数“累加”功能。具体操作过程同例3.3,需要添加和修改的额外内容有:⑴为了区别上述程序功能的不同,把该项目“名称”修改为“程序流程控制3.0”。⑵在Panel控制中再添加1个RadioButton控件,Text改为“累加”,Name改为“rdbConseculate”。63⑶双击“累加”,在代码编辑器中添加对“累加”单选框CheckedChanged事件响应的代码:

PrivateSubrdbConseculate_CheckedChanged(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesrdbConseculate.CheckedChanged

strSelOperator="累加"'“累加”操作被选中EndSub64⑷在“计算”按钮Click事件响应代码“SelectCasestrSelOperator”部分的“CaseElse”之前添加两个数累加的代码:

Case"累加"DimintStart,intEndAsInteger

intStart=IIf(objOper1<objOper2,objOper1,objOper2)'循环起始值为累加下界

intEnd=IIf(objOper1<objOper2,objOper2,objOper1)'循环终止值为累加上界

objResult=0'累加和初始值为0'开始累加

ForintCountAsInteger=intStartTointEnd'省略步长,则默认为1

objResult+=intCount'开始累加

Next65

提示:IIf()函数的作用是根据表达式的值,从两个值中选择一个返回,其格式为:IIf(Expression,TruePart,FalsePart)Expression为Boolean类型,如果Expression的值为True,则返回TruePart,否则返回FalsePart。663.4.2For…Next嵌套循环For…Next嵌套循环指将一个循环放在另一个循环的语句块内。在嵌套循环中,每个循环体都应具有唯一的循环控制变量,且循环体不能重叠。如下面的例子是错误的:ForintX=1To10ForintY=1To10……'循环语句块NextXNextY67例3.8创建一Windows应用程序,通过MessageBox消息对话框输出九九乘法表。具体操作过程:⑴创建一个Windows应用程序项目,项目“名称”为“九九乘法表”。⑵添加Button控件,Text改为“九九乘法表”,Name改为“btnMultipleTable”。⑶双击“九九乘法表”按钮,在代码编辑器中添加其Click事件响应的代码:68PrivateSubbtnMultipleTable_Click(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesbtnMultipleTable.Click'定义变量

DimstrOutAsString=“”‘把九九乘法表作为字符串保存在strOut中

ForintXAsInteger=1To9'九九乘法表共9行

DimstrLineAsString=""'每一行的乘法表保存在strLine中

ForintYAsInteger=1TointX'第intX

行共有intX

个乘法

strLine=strLine&intY&"×"&intX&"="&intX*intY&""

NextintY

'添加intX

行的乘法表字符串到输出字符串strOut

中,并添加换行控制

strOut=strOut&strLine&vbCrLf

NextintX'输出乘法表

MessageBox.Show(strOut,"九九乘法表")EndSub693.4.3ExitFor有时在循环执行的过程中,由于某个条件的改变而需要提前退出For…Next循环。这种情况可以通过ExitFor实现。70例3.9创建一Windows应用程序,通过文本框输入一个整数,判断该数数否是素数。具体操作过程:⑴创建Windows应用程序项目,项目“名称”为“判断素数”。⑵添加TextBox控件,Name改为“txtInput”。⑶添加Button控件,Text改为“判断素数”,Name分别改为“btnPrimeYN”。⑷双击“判断素数”按钮,在代码编辑器中添加其Click事件响应的代码:71

PrivateSubbtnPrimeYN_Click(ByValsenderAsSystem.Object,_ByValeAsSystem.EventArgs)HandlesbtnPrimeYN.Click'读取输入的内容

IfNot(IsNumeric(txtInput.Text))Then

MessageBox.Show("输入的内容包含非数字字符!","错误")ExitSubEndIfDimintNumAsInteger=CInt(txtInput.Text)'把输入的字符串内容转换为Integer数值

DimintCAsInteger

intNum=IIf(intNum<0,-intNum,intNum)'如果输入的是负数,则转换为正数72

'判断intNum

是否是素数

ForintC=2TointNum-1'如果intNum能够整除intC,则intNum不是素数,提前退出循环

If(intNumModintC=0)ThenExitFor'退出循环

EndIfNext73

'如果是提前退出,则intC的值小于intNum,否则intC的值递增到intNum时退出循环

If(intC<intNum)Then'如果是提前退出For循环

MessageBox.Show(txtInput.Text&"不是素数!")Else

MessageBox.Show(txtInput.Text&"是素数!")EndIfEndSub提示:当退出循环时,循环控制变量的值保持退出时的值,如上例中,如果是提前退出For循环则intC的值肯定小于intNum,否则如果是大于等于intNum,则是正常退出For循环。743.4.4ContinueFor有时在循环执行的过程中,由于某个条件的改变而需要忽略掉当前语句到Next之间的语句,提前进入下一次For…Next循环。这种情况可以通过ContinueFor实现。75例3.10创建一Windows应用程序,通过文本框输入一个整数,输出从2到该整数之间的所有素数。具体操作过程:⑴创建Windows应用程序项目,项目“名称”为“判断一组素数1”。⑵添加TextBox控件,Name改为“txtInput”。⑶添加Button控件,Text改为“判断一组素数”,Name分别改为“btnPrimes”。⑷双击“判断一组素数”按钮,在代码编辑器中添加其Click事件响应的代码:76PrivateSubbtnPrimes_Click(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesbtnPrimes.Click'读取输入的内容

IfNot(IsNumeric(txtInput.Text))Then

MessageBox.Show("输入的内容包含非数字字符!","错误")ExitSubEndIf

DimintNumAsInteger=CInt(txtInput.Text)'把输入的字符串内容转换为Integer数值

DimintN,intCAsIntegerDimstrOutAsString=""

intNum=IIf(intNum<0,-intNum,intNum)'如果输入的是负数,则转换为正数77'判断过程

ForintN=3TointNum'判断2—intNum之间的所有数

ForintC=2TointN/2'如果intNum能够整除intC,则intNum不是素数,提前退出循环

If(intNModintC=0)ThenExitForEndIfNextintCIfintC<=intN/2Then'如果是提前退出ForintC

循环,则intN

不是素数

ContinueFor'提前进入下一次ForintN

循环

EndIf'否则intN是素数,添加到输出字符串中

strOut=strOut&intN&""NextintNMessageBox.Show("2--"&txtInput.Text&"之间的所有素数:"&strOut)

EndSub783.4.5Do…Loop循环有时在进入循环处理时,不能确定需要执行多少次循环,则可以使用Do…Loop循环。Do…Loop属于条件型循环,其基本语句格式为:Do

语句块Loop由于Do语句中没有任何条件限制,则语句块被无限次重复执行,这种循环也称为死循环。其执行流程图如图3-15所示。79语句块DoLoop下条语句图3-15Do

…Loop死循环执行流程80提示:在Do…Loop循环中,可以使用ContinueDo语句跳转到Do语句处执行,进而忽略执行ContinueDo到Loop之间的语句。Do…Loop循环也可以嵌套。81在一些需要无限次重复执行的循环中,可能需要通过死循环的形式实现,但为了增加程序的交互性,一般在死循环中增加一定的条件判断,进而能够退出死循环,在Do…Loop循环体中退出循环使用ExitDo。如图3-16的执行流程图。82语句块1DoLoop下条语句图3-16通过ExitDo退出的Do

…Loop循环执行流程图是否继续循环?TrueFalse语句块2ExitDo83例3.11在例3.10的基础上,使用Do…Loop循环替换For…Next循环判断是否是素数。具体操作过程:⑴创建Windows应用程序项目,项目“名称”为“判断一组素数2”。⑵其它操作同例3.10。⑶“判断一组素数”按钮的Click事件响应的代码中,“判断过程”代码更改为:84

'判断过程

ForintN=2TointNum

intC=2'intC用来测试intN能否整除

Do'如果intC

的当前值能够整除intN,或intC

已经递增到intN/2,则退出Do循环

If(((intNModintC)=0)Or(intC>=intN/2))ThenExitDoElse'否则还需要继续测试

intC+=1'intC

递增

EndIfLoop85

'测试退出Do…Loop循环的原因

If((intNModintC)=0)Then'Do循环是由于intNModintC=0退出,intN不是素数

ContinueFor'继续ForintN

的下一次循环

EndIf'否则,Do循环是由于intC>=intN/2退出,则intN

是素数

strOut=strOut&intN&""NextintNMessageBox.Show("2--"&txtInput.Text&"之间的所有素数:"&strOut)863.4.6DoWhile|Until…Loop循环除上面介绍的通过ExitDo退出循环外,还可以使用关键字While或Until在Do…Loop结构中添加一个表达式来控制循环,语句格式为:DoWhile|UntilExpression

语句块Loop87⑴对于DoWhileExpression,当Expression的值为True时,执行语句块,否则退出循环,执行流程图如图3-17所示。Loop下条语句图3-17DoWhile

…Loop循环执行流程图ExpressionTrueFalse语句块88⑵对于DoUntilExpression,则当Expression的值为True时,退出循环,否则执行语句块,执行流程图与DoWhileExpression类似,只是判断条件与DoWhile循环相反。注意:由于在执行语句块之前要进行Expression判断,因此无论DoWhile,还是DoUntil,有可能语句块一次都不执行。89例3.12在例3.10的基础上,使用DoWhile…Loop循环或DoUntil…Loop循环替换For…Next循环判断是否是素数。具体操作过程:⑴创建Windows应用程序项目,项目“名称”为“判断一组素数3”。⑵其它操作同例3.10。⑶“判断一组素数”按钮的Click事件响应的代码中,“判断过程”代码更改为:90

'判断过程

ForintN=2TointNum

intC=2'intC用来测试intN能否整除

'如果使用DoUntil循环,则如果intC

的当前值能整除intN,或intC>=intN/2,则退出'循环,否则循环,控制语句为:

'DoUntil(intNModintC)=0Or(intC>=intN/2)

'如果使用DoWhile循环,则如果intC

的当前值不能整除intN,并且intC

小于intN/2,则'循环,否则退出循环,控制语句为:

DoWhile(intNModintC)<>0And(intC<intN/2)

intC+=1'intC

递增

Loop91'DoWhile循环是由于intNModintC=0退出,intN

不是素数

If((intNModintC)=0)ThenContinueFor'继续ForintN

的下一次循环

EndIf'否则DoWhile循环是由于intC>=intN/2退出,intN

是素数

strOut=strOut&intN&""NextintN923.4.7Do…LoopWhile|Until循环另一种使用关键字While或Until在Do…Loop结构中添加一个表达式来控制循环的语句格式为:Do

语句块LoopWhile|UntilExpression93⑴对于LoopWhileExpression,当Expression的值为True时,执行语句块,否则退出循环,执行流程图如图3-18所示LoopWhile下条语句图3-18DoWhile

…Loop循环执行流程图ExpressionTrueFalse语句块Do94⑵对于LoopUntilExpression,则当Expression的值为True时,退出循环,否则执行语句块,执行流程图与LoopWhileExpression类似,只是判断条件与LoopWhile循环相反。注意:由于在执行完语句块后进行Expression判断,因此无论LoopWhile,还是LoopUntil,语句块至少能执行一次。95例3.13通过MessageBox消息对话框显示一个最小的水仙花数。所谓“水仙花数”是指一个3位数,其各位数字(个位、十位、百位)的立方和等于该数。具体操作过程:⑴创建Windows应用程序项目,项目“名称”为“最小水仙花数”。⑵添加Button控件,Name为btnNum,其Click事件的响应代码为:

96PrivateSubbtnNum_Click(ByValsenderAsSystem.Object,_

ByValeAsSystem.EventArgs)HandlesbtnNum.Click'定义变量

DimintNumAsInteger=99DimintB0,intB1,intB2AsInteger97

'开始循环

Do

intNum+=1intB0=intNumMod10'计算个位数字

intB1=(intNumMod100)\10'计算十位数字

intB2=intNum\100'计算百位数字

'如果找到最小的水仙花数,或被判断的数递增到四位数,则退出循环

LoopUntil(intNum=intB0^3+intB1^3+intB2^3)OrintNum>100098

'如果找到最小的水仙花数,则通过对话框显示

If(intNum<=1000)Then'如果退出Do循环是由于找到了最小的水仙花数

MessageBox.Show("最小的水仙花数:"&intNum,"水仙花数")Else

MessageBox.Show("没有找到最小的水仙花数!","水仙花数")EndIfEndSub993.5过程在编写比较大的程序时,可能经常

温馨提示

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

评论

0/150

提交评论