1、第5章 程序的控制结构,本章教学目的 了解顺序结构的程序设计方法 掌握Goto语句实现分支的方法 掌握If条件分支语句的多种使用形式 掌握Select语句的语法结构 了解If语句与Goto构成循环的结构形式 掌握Do-Loop循环的几种使用方法 掌握While循环的结构形式 掌握For-Next语句的语法形式及其嵌套形式 了解几种循环出口语句的使用方法,本章主要内容 顺序结构 分支结构 Goto语句; 条件分支结构;多分支结构 循环结构 If语句与Goto语句实现的循环 Do WhileLoop循环 Do-Loop While循环 Do Until-Loop循环 Do-Loop Until循环
2、 While循环 For-Next循环 循环出口语句 本章小结,5.1 顺序结构1.顺序结构:语句是按照程序中的排列顺序由上至下逐条执行。2.常用语句:赋值语句、输入/输出语句和一些计算性的语句等。3.举例 【例5.1】已知三角形三边的长度分别为3,4,5,求三角形面积。 程序设计 Private Sub Form_Click()Dim A As IntegerDim B As IntegerDim C As IntegerDim S As DoubleDim Area As DoubleA=3B=4C=5S=(A+B+C)/2Area=SQR(S*(S-A)*(S-B)*(S-C)Print
3、 “Area=”;Area End Sub 程序首先给A,B,C赋初值,再计算S和Area的值(SQR()计算平方根),最后通过Print语句输出面积Area。, 操作过程 (1)建立工程启动VB系统,然后在“新建工程”对话框窗口中选择“标准EXE”,并单击“打开”命令按钮。 (2)建立对象直接将窗体Form1作为对象。 (3)建立事件过程双击Form1, 在显示的窗口左上端的下拉列表框中选择“Form”,在窗口右上端的下拉列表框中选择“Click”,将显示建立窗体工程的窗口。 (4)添加程序代码在事件过程的代码窗中,输入已经编写的程序代码。,(5)执行程序在VB窗口中,选择【运行】【启动】,
4、显示Form1窗体。单击窗体,显示程序运行结果“Area=6” 。,5.2分支结构顺序结构很简单,仅用它只能编写一些简单的程序。对于一些稍微复杂一点的问题,顺序结构就显得力不从心,必须利用Visual Basic中一些比较复杂的结构解决。本节主要介绍Visual Basic中的分支结构。 5.2.1 Goto语句Goto语句为无条件转移语句。当程序执行到Goto后,无条件的转移到Goto之后语句标号处继续执行。Goto语句的语法格式为:Goto 标号 其中,标号分两种: 字符串标号:字符串和冒号组成,符合VB中标识符命名规则。 语句行标号:基本Basic中的语句行标号(数字),不代表执行顺序。
5、 应注意以下两个问题: (1)在Goto和循环混合的结构中,Goto语句只能从循环体内部转向循环体之外,禁止从循环体外转向循环体之内; (2)Goto语句只能转向本函数或本过程中的标号处。,【例5.2】用Goto语句编写程序,求解 利用Goto语句编写的程序代码如下: Private Sub Command1_Click() Dim I As Integer Dim S As Long S=0:I=1 Loop1: If I=100 ThenS=S+I2I=I+1Goto Loop1 End If Text1.Text = “Sum=:“ + Str(S) End Sub 程序中:Loop1是
6、Goto语句转向的语句标号;第4条语句是一个多重语句(多条语句间用冒号分隔);Str()将S转换成字符串;倒数第2条语句:用文本框Text1的Text显示结果。,操作过程(1) 建立工程 (2)建立对象在 “Form1”中,分别单击“工具箱”中的CommandButton和TextBox工具,在窗体中建立命令对象Command1和文本框对象Text1。 (3)设置对象属性在Form1中选择Command1,显示“属性Command1”对话框,将Caption属性改为“执行程序”。在Form1中选择Text1,显示“属性Text1”对话框,将Text属性清空。 (4)建立事件过程在Form1中双
7、击“执行程序”对象,进入代码设计窗口,并在以下结构中输入程序代码: Private Sub Command1_Click() End Sub (5) 执行程序 在VB中执行程序,显示Form1窗体。 在Form1窗体中,单击“执行程序” 按钮,在文本框中显示Sum=338350,5.2.2 条件分支结构通过对给定条件的判断,决定下一步要执行的操作。 1. 简单的IF语句If Then 条件为真或为非0数值,就执行Then后的语句,否则,执行IF下面语句。语句中的“条件”既可以是简单的关系表达式,也可以是比较复杂的逻辑表达式。 2. 块IF语句If Then ElseIf ThenElseIf
8、ThenElseEnd If,在实际应用中,还允许在If语句中再使用If语句(嵌套)。嵌套形式为: If ThenIf ThenElse / 条件2的Else语句End If Else / 条件1的Else语句If ThenElse / 条件3的Else语句End If End If *在嵌套形式中,Else与If配对遵循算法语言中“最近匹配”原则。,【例5.6】设计一个程序,从键盘上输入每个学生某门课程成绩,通过程序统计学生中及格人数和不及格人数,并计算学生平均分数。 Sub Form_Click() Dim Score, Total, n , nl, n2 As Single Dim st
9、udentNum As String n=n+1 Start: StudentNum=“学生的编号为:“+Str(n)+Chr(13)+Chr(10) Score=Val(InputBox$(studentNum+“编号“+Str(n)+“成绩)“) If Score = -1 ThenGoTo Finish ElseIf Score 100 ThenX=msgBox(“输入数据不在0,100范围内,重新输入!“,21,“ 数据错“)GoTo Start ElseTotal = Total + Score: n = n + 1If Score = 60 Thenn1 = n1 + 1,Else
10、n2 = n2 + 1End If End If GoTo Start Finish: Average=Total/(n-1):Text1.Text=“平均成绩:“+Str(Average) Text2.Text=“及格人数“+Str(n1):Text3.Text=“不及格人数:“+Str(n2) End Sub 程序中: (1)使用了If的嵌套形式; (2)n,n1,n2分别保存学生人数、及格人数和不及格人数; (3)Start,Finish为语句标号; (4)MsgBox()函数在程序执行中输出告警信息。 操作过程(主要部分) (1) 建立对象在空“Form1”窗体中建立一个命令对象Com
11、mand1和3个文本框对象Text1、Text2和Text3,并将Command1的Caption属性改为“执行程序”,将Text1、Text2和Text3的Text属性清空。,(2)程序执行结果,5.2.3 多分支结构当程序中的分支较多时,经常使用Select语句和On-Goto语句。 1 Select语句在Visual Basic语言中,Select的语法形式为: Select Case Case Case Case Case ElseEnd Select 语法功能见右图:,【例5.7】学生的考察课成绩分为A、B、C、D和E,试用程序将考察成绩转换成百分形式分数分档形式。 Sub Form
12、_Clike() Case “E”Dim G, Grate As String Grade= “0-59” Start: Case “END”G=Ucase(InputBox$(“G:”) Goto FinishSelect Case G Case ElseCase “A” Grade= “输入数据错!”Grade= “90-100” End Select Case “B” Print GradeGrade= “80-89” Goto startCase “C” Finish:Grade=“70-79” Print “转换结束!“Case “D” End Sub Grade= “60-69”
13、其中:Ucase() 将小写字母转换为大写字母。,操作过程 (1)建立工程建立新工程,并在“新建工程”对话框窗口中选择“标准EXE”,并单击“打开”命令按钮。 (2)建立对象在(1)之后,就建立了包含一个空的“Form1”的“工程1”。本例将窗体Form1作为一个对象。 (3)建立事件过程双击Form1窗体,显示“工程1-Form1(Code)”窗口。在窗口上端的左下拉列表框中选择“Form”,在窗口上端的右下拉列表框中选择“Click”,显示 Private Sub Form_Click() End Sub (4)添加程序代码在(3)产生的事件过程的框架中,输入编写的程序代码。 (5)执行程
14、序在Microsoft Visual Basic窗口中,选择【运行】【启动】,显示Form1窗体。单击窗体,程序根据用户输入的字母A,B,C,D,E,将它们分别转换为百分分档形式。,2. OnGoto语句On-Goto语句与Select语句类似,也属于多分支语句。当程序执行到On-Goto语句后,就对On后的表达式求值,然后根据所求的值,转向Goto后的对应标号。On-Goto语句的语法格式为:On 表达式 Goto 标号1,标号2,标号n在On-Goto语句的语法格式中,表达式是一个返回值为0-255之间的数值表达式。如果表达式的值为小数,则必须利用四舍五入转换成整数。当返回值为1时,转向标
15、号1所指示的程序段;当返回值为2时,转向标号2所指示的程序段,依次类推。若返回值不在0-255之间,程序自动执行On-Goto下的一条语句。On-Goto语句的执行过程详见图5.10。,【例5.8】设计一个对学生某门课程分数进行分档统计的程序。 Sub Form_Click()I=0:I100=0:I90=0:I80=0:I70=0:I60=0:I0=0Sum=0:Average=0SNO=Val(InputBox$(“Please input number of student:”) Loop:If ISNO ThenAverage=Sum/IGoto OutputNumberElseI=I
16、+1S=Val(InputBox$(“Please input Grade of student:”)Sum=Sum+SIf S=60 ThenM=11-Int(S/10)ElseM=6End IfOn M Goto L100,L90,L80,L70,L60,L0 L100: I100=I100+1Goto NextStudent L90: I90=I90+1Goto NextStudent,L80: I80=I80+1Goto NextStudent L70: I70=I70+1Goto NextStudent L60: I60=I60+1Goto NextStudent L0: I0=I0
17、+1 NextStudent:Goto LoopEnd If OutputNumber: Print “100”;I100:Print “90-99”;I90 Print “80-89”;I80: Print “70-79”;I70 Print “60-69”;I60: Print “ 0-59”;I0 Print “Average”;Average End Sub 其中:I100I0各档人数;Sum:总分,I:学生人数,Average为全班平均成绩;。InputBox$()是输入函数,供用户输入信息;Val()是将字符串转换成数字的函数;Int()为将数值取整的函数;On-Goto根据m值实
18、现多分支,对不同档次进行学生人数统计。,操作过程 (1)建立工程 单击【程序】【Microsoft Visual Basic 6.0 中文版】【Microsoft Visual Basic 6.0 中文版】,然后在“新建工程”对话框窗口中选择“标准EXE”,并单击“打开”命令按钮。 (2)建立对象 在(1)之后,就建立了包含一个空的“Form1”的“工程1”。本例比较简单,就直接将窗体Form1作为一个对象。 (3)建立事件过程 双击Form1窗体,显示“工程1-Form1(Code)”窗口。在窗口上端的左下拉列表框中选择“Form”,在窗口上端的右下拉列表框中选择“Click”,显示 Pri
19、vate Sub Form_Click() End Sub (4)添加程序代码 在(3)产生的事件过程的框架中,输入编写的程序代码。 (5)执行程序 在Microsoft Visual Basic窗口中,选择【运行】【启动】,显示Form1窗体。单击窗体,显示全班学生该门课程的分档统计情况。,5.3 循环结构循环是指对同一段程序按照一定的条件重复执行,重复执行的部分为循环体。在Visual Basic中有多种循环形式,下面将对各种循环详细介绍。 5.3.1 If语句与Goto语句实现的循环在用If语句和Goto语句实现循环时,If语句进行循环结束条件的判断,Goto语句实现部分语句的重复执行。
20、If语句和Goto语句实现循环的程序结构如图:,程序结构由两部分组成:循环部分和退出循环的条件。在左面结构中,当满足循环条件时,就执行Goto语句实现循环,否则执行End If之下语句退出循环结构。在右边结构中,用和Goto 实现循环。当出口条件为真时,执行Goto ,退出循环结构。,5.3.2 Do WhileLoop循环Do While与Loop也可实现循环,与If语句与Goto语句实现的循环相比,Do WhileLoop的循环结构简单,概念清晰。它的语法格式为:Do While 循环体Loop 其中:条件为具有真值的表达式。条件为真执行循环体,条件为假时,退出循环,执行Loop下面的语句
21、。 【例5.9】输入两个正整数,设计一个求它们最大公约数的程序。最大公约数的求法常用“辗转相除”法。根据以上思想编写程序: Sub Form_Click() r = m Mod nmsg$ = “Enter Integer“ Do While r 0m = Val(InputBox$(msg$ + “ m:“) m = n:n = r:r = m Mod nn = Val(InputBox$(msg$ + “ n:“) LoopIf m = n Then Print “HCF=“; nt = m:m = n:n = t End Sub End If 在程序中的Do While就是实现辗转相除。
22、当r0时循环结束。程序中的mod实现求余运算。,操作过程 (1)建立工程单击【程序】【Microsoft Visual Basic 6.0 中文版】【Microsoft Visual Basic 6.0 中文版】,然后在“新建工程”对话框窗口中选择“标准EXE”,并单击“打开”命令按钮。 (2)建立对象在(1)之后,就建立了包含一个空的“Form1”的“工程1”。本例比较简单,就直接将窗体Form1作为一个对象。 (3)建立事件过程双击Form1窗体,显示“工程1-Form1(Code)”窗口。在窗口上端的左下拉列表框中选择“Form”,在窗口上端的右下拉列表框中选择“Click”,显示 Pr
23、ivate Sub Form_Click() End Sub (4)添加程序代码在(3)产生的事件过程的框架中,输入编写的程序代码。 (5)执行程序在Microsoft Visual Basic窗口中,选择【运行】【启动】,显示Form1窗体。单击窗体,分别显示输入整数m和n的输入窗口,然后根据输入的m和n输出最大公约数。,5.3.3 Do-Loop While循环用Do语句和Loop While语句实现循环的语法格式为:Do循环体Loop While 在Do-Loop While循环中,首先无条件的执行一次循环体中的语句,然后再对条件进行测试。当条件为真时,重复执行循环体;当条件为假时跳出循
24、环,执行Loop While之后的语句。 【例5.10】求的近似值。的计算公式为: 当计算到某一项的值小于10-5时为止,然后再求的近似值。 Sub Form_Click()Sum=0: I=1Term=1/I2DoSum=Sum+TermI=I+1Term=1/I2Loop While Term0.00001PI=Sqr(Sum*6)Print “PI=”;PI End Sub,5.3.4 Do Until-Loop循环Do Until-Loop循环是一种直到型循环结构,其语法形式为:Do Until 循环体Loop 程序先测试循环条。条件假执行循环体;条件真时跳出循环。 【例5.11】斐波
25、那数列是一个前两项都为1,从第3项开始,以后每项都是前两项之和的一个数列。该数列的形式为:1,1,2,3,5,8,。请编写一个程序,计算该数列的前30项。斐波那数列递推公式如下:F(n)=程序如下: Sub Form_Click()F1 = 1:F2 = 1: n = 3Print F1; F2;Do Until n 30F = F1 + F2:Print F;If n Mod 5 = 0 Then PrintF1 = F2:F2 = F:n = n + 1Loop End Sub,5.3.5 Do-Loop Until循环Do-Loop Until的语法形式为:Do循环体Loop Until
26、 在Do-Loop Until循环中,必须无条件的执行一次循环,然后再对条件进行测试。条件成立时退出循环,否则重新执行循环体中语句。 【例5.12】用Do-Loop Until实现例5.11。Sub Form_Click()F1 = 1: F2 = 1: n = 3Print F1; F2; DoF = F1 + F2Print F;If n Mod 5 = 0 Then PrintF1 = F2:F2 = F: n = n + 1Loop Until n 30End Sub,5.3.6 While循环While循环的语法格式为:While 循环体Wend 在While执行时,先测试条件。条件
27、真时执行循环体并再测试条件;条件假时退出循环。 【例5.13】编写一个程序,判断从键盘上输入的数n(n3)是否为素数。素数只能被1和自身整除的正整数数。只要用2到 之间的整数整除,就可判断n是否为素数。 Private Sub Form_Click()Dim n As Integern = InputBox(“请输入一个大于3的整数“)k = Int(Sqr(n): i = 2:Swit = 0 While i = k And Swit = 0If n Mod i = 0 ThenSwit = 1Elsei = i + 1End IfWend,If Swit = 0 ThenPrint n;
28、“是一个素数。“ElsePrint n; “不是一个素数。“End If End Sub 在程序中:i是一个取值在2到 之间的变量;Swit为标志,n不是素数其值为1,否则Swit为0。,5.3.7 For-Next循环For-Next是一种循环次数固定的循环结构,其语法格式为:For Var=n0 To n Step s循环体Next Var 在语法格式中:Var是循环变量,是一数值型变量,不允许是下标变量和记录元素;n0,n,s分别为Var的初值、终值和步长(整型、浮点型、货币型等),对非整型变量,VB自动取整;括号中为可选项,当s1时,步长可以省略,但是步长不允许为0。For-Next循
29、环的执行过程如下:(1)对n0,n和s求值,将n0赋值给变量Var,并记录下n和s;(2)比较Var与n。若Varn,则跳出循环,执行Next之后的语句;(3)若Varn,则执行循环体中语句;(4)当执行到Next语句时,将n+s赋值给变量Var;(5)在进入第2步继续执行。,【例5.15】找出从100到999之间的所有“水仙花”数。所谓“水仙花”数是指在一个三位数中,各位术立方之和等于该数本身。例如153=13+53+33,所以153是“水仙花”数。解此题的关键是从一个三位数中分离出百位数字、十位数字和个位数字。假设三位数为i,其百位数为a,十位数为b,个位数为c,则a,b,c可通过一下各式
30、计算:aInt(i/100)bInt(I-100*a)/10)cia*100-b*10 根据以上思想,可编写出如下程序:Sub Form_Click()PrintFor i = 100 to 999a = Int(i/100)b = Int(i-100*a)/10)c = ia*100-b*10If i = a3+b3+c3 Then Print “ 水仙花数“, iEnd If Next iEnd sub,应注意的几个问题: (1)步长可正可负; (2)For-Next循环先检查循环变量是否超过终值,再决定是否执行; (3)循环次数k由初值、终值和步长决定,即:kInt(n-n0)/s+1
31、(4)在循环语句和转向语句联合使用时,可从循环体内部转向循环体之外,而不允许从循环体之外转向循环体之内。 (5)For-Next循环可以嵌套使用,但不允许内外层间互相“交叉”。一般形式 省略Next后变量的形式For I1= For I1=For I2= For I2=For I3= For I3= Next I3 NextNext I2 NextNext I1 Next公用Next的形式For I1=For I2=For I3=Next I3,I2,I1 *I3,I2,I1不能省略,并且顺序不能颠倒。,5.3.8 循环出口语句如果要退出循环,除了用除了用Goto语句进行强行转向之外,还可以使
32、用一些出口语句,可根据实际问题的需要退出循环语句。出口语句可以在For-Next循环和Do循环中使用,也可在事件或通用过程中使用。它有两种使用形式,一种为无条件形式,另一种为条件形式。表5.1中列出了VB中常见的出口语句。,出口语句的设置具有两方面的含义。首先,出口语句可以方便程序设计,在循环体中的任何地方,只要需要退出循环,都可方便地退出循环语句;其次,在循环体中设置了出口语句之后,增加了程序的可读性,利于复杂程序的设计。,【例5.17】编写一个程序,测试出口语句的使用方法。 Private Sub Form_Click()Dim I, NumDoFor I = 1 To 1000Num =
33、 Int(Rnd * 100)Print Num;Select Case NumCase 7: Exit ForCase 29: Exit DoCase 54: Exit SubEnd SelectNext IPrint: Print “Program execute Exit For because num is 7.“LoopPrint: Print “Program execute Exit Do because num is 29.“ End Sub 在程序中的Rnd用来生成随机数。当随机数为7时,退出For循环;随机数为29时,退出Do循环;当随机数为54时,程序运行结束。,本章小结
34、程序的控制结构包括程序的顺序结构、分支结构和循环结构。它们是程序设计中最基本的结构,也是进行任何复杂程序设计的基础。本章通过三节的内容对Visual Basic中程序设计的三种基本结构进行了介绍,并结合大量的例子说明了这三种结构的使用方法。 1顺序结构顺序结构是按照语句在程序中的排列顺序自上而下执行,是程序设计中最简单和最基本的结构。顺序结构很简单,仅利用它只能编写一些简单的程序。 2分支结构分支结构是一种比较复杂的程序控制结构。在分支结构中根据对某“条件”的判断结果,选择程序中不同的部分执行。在Visual Basic中分支结构有以下几种基本形式。 (1) Goto语句Goto语句的语法格式
35、为:Goto 标号 在格式中,标号可以是字符串标号或语句行标号,其中字符串标号必须符合Visual Basic中标识符命名规则。当程序执行Goto后,就无条件的将程序流程转移到标号处继续执行。,(2)条件分支结构条件分支结构是通过对给定条件的判断,选择程序的相应部分执行。实际上,Visual Basic中条件分支结构有两种形式: (a)If Then (b)If Then ElseIf ThenElseIf ThenElseEnd If 形式a是一种简单的分支结构,只要条件为真,就执行Then后的语句,否则就执行IF下面的语句。形式b是多分支形式,当条件1为真时,执行语句块1,否则,如果条件2
36、为真,则执行语句块2,依次类推。当所有条件都为假时,执行Else后的语句块n+1。,(c) Select语句在Visual Basic语言中,Select的语法形式为:Select Case Case Case Case Case ElseEnd Select Select语句根据变量或表达式的值与Case后的值的匹配情况,选择执行相应的语句。如果和前面n种都不匹配,则执行语句块n+1。 (d)OnGoto语句On-Goto语句根据表达式的值转向对应语句标号,其语法格式为:On 表达式 Goto 标号1,标号2,标号n 其中,表达式是一个返回值为0-255之间的数值表达式。若返回值不在0-25
37、5之间,程序执行On-Goto下的一条语句。,3循环结构所谓循环是指对同一段程序按照一定的条件重复执行,重复执行的部分为循环体。在Visual Basic中有多种循环形式,它包括: (1)If语句与Goto语句实现的循环在用If和Goto构成循环时,If用来进行循环条件测试,Goto实现程序执行流程的转移,是If语句和Goto语句的一种联合应用。 (2)DoLoop循环有Do WhileLoop、Do-Loop While、Do Until-Loop、Do-Loop Until等4种循环形式,是根据一定的条件进行循环。循环次数没有明确指出。 (a)While循环语法格式为:While 循环体W
38、end While循环的语法功能与Do While-Loop语法功能相同。 (b)For-Next循环语法格式为:For Var=n0 To n Step s循环体Next Var 其中, Var是一数值型循环变量;n0,n,s分别Var的初值,终值和步长。当s1时,步长可以省略。循环次数为Int(n-n0)/s+1。,(4)循环出口语句在Visual Basic中如果要强行退出循环,除了用Goto语句之外,还可以用Exit For和Exit Do可根据实际需要退出循环。设置循环出口语句可方便程序设计,在循环体中的任何地方,只要需要退出循环,都可方便地退出循环,另外,设置循环出口语句之后,增加了程序的可读性,便于程序的设计。,