1、第5章 基本控制结构,学习目标:掌握If 条件语句和Select Case选择语句 掌握ForNext和DoLoop循环语句 掌握两重循环,了解多重循环,第5章 控制语句与程序调试,教学内容:5.1 选择结构与相关语句 5.2 循环语句 5.3 其他语句,顺序结构: 执行过程的次序从上到下,从左到右例: Private Sub Command1_Click()Const Pi = 5.14H = Val(Text1.Text) : R = Val(Text2.Text) Text3.Text = Pi * R 2 * HEnd Sub,5.1 选择结构,选择结构:当设定条件成立时执行某些语句,
2、条件不成立时则跳过这些语句或执行其它的语句。 选择结构中要使用选择语句,有两路分支和多路分支两种情况 ,对应的选择语句有If语句(两路出口)和Select Case语句(多路出口)。,返回目录,5.1 选择结构If条件语句,1. If Then 其中,是一个条件表达式或逻辑表达式例如,If Data=90 Then Print “优秀如果条件为真,执行Then后面的语句,如果条件为假,不执行Then后面的语句而执行End If 后面的语句。例5.1输入一个数,如果是3的 倍数则通过消息框输出。Private Sub Form_Click()Dim Data As IntegerData = I
3、nputBox(“请输入一个值:“)If Data Mod 3 = 0 Then MsgBox DataEnd Sub,返回目录,Data是3的倍数,5.1 选择结构If条件语句,2. If Then Else 例如,Dim Data As IntegerData = InputBox(“请输入成绩:“) If Data = 90 Then Print “优秀” Else Print “合格”Print “计算完毕“ 上例的If 语句可以改写为: If Data 90 Then Print “合格“ Else Print “优秀“,返回目录,说明 (1) : 关系表达式、布尔表达式数值表达式(
4、0为False,非0为True)字符串表达式(“0“为False,非“0“为True) (2) 、: 可以有多条语句,各语句之间用冒号隔开。 (3)可以没有Else部分,这时必须有。 例: If N0 Then A=A+B:B=B+A Else A=A-B:B=B-A 例: If X“aaa“ Then Print X,5.1 选择结构If条件语句,3. 块状If语句,返回目录,A = InputBox(“A值”) : B = InputBox(“B值“)Print A, BIf A B ThenT = A : A = B : B = TEnd IfPrint A, B,5.1 选择结构If条
5、件语句,4. If语句嵌套 If语句嵌套使用可形成多分支的条件语句结构 If Then ElseIf ThenElseEnd If,返回目录,说明:ElseIf之间不要加空格。Else和位于其上方的最近的If配对,5.1 选择结构If条件语句,例5.3 Weight = InputBox(“输入西瓜重量:“, “计算西瓜款“) If Weight 4 ThenPrice = 1 ElseIf Weight = 7 ThenPrice = 1.3ElsePrice = 1.1 End If Money = Price * Weight MsgBox “西瓜重” & Weight & “公斤,单价
6、” & _Price & “元,应收瓜款“ & Money & _“元“, , “计算西瓜款“,返回目录,4公斤以下:1.00元/公斤 4至7公斤: 1.3元/公斤 超过7公斤: 1.1元/公斤If Weight = 4 And Price 7 Then Price = 1.1,5.1 选择结构If条件语句,例5.4 Char = InputBox(“输入一个字符“, “测试字符值“)If Char = “0“ And Char = “A“ And Char = “a“ And Char = “z“ ThenMsgBox “输入的字符是小写字母“ElseMsgBox “输入的字符是其它符号“E
7、nd If,返回目录,判断输入的是大写字母、小写字母、数字还是其它符号,5.1 选择结构If条件语句,例5.5 Private Sub Command1_Click() 单击“正确无误”按钮If Len(TxtCode.Text) 8 ThenLblWarn.Caption = “考核证号必须输入,长度为8位“TxtCode.SetFocusElseIf Len(TxtName.Text) = 0 ThenLblWarn.Caption = “考生姓名必须输入“TxtName.SetFocusElseIf Len(TxtSeat.Text) = 0 ThenLblWarn.Caption =
8、“座位号必须输入“TxtSeat.SetFocusElseLblWarn.Caption = “Debug.Print TxtCode.TextDebug.Print TxtName.TextDebug.Print TxtSeat.TextEnd IfEnd Sub,返回目录,5.1 选择结构Select Case选择语句,语法格式:Select Case Case Case Case ElseEnd Select 功能:根据测试表达式的值,决定程序的流向。,返回目录,值的类型是数值型、字符串型、日期型等,一旦与某个Case后的值相等,则执行这个Case中的,完成后执行End Select后的
9、语句。如果所有的Case后的都不与项匹配,则执行Case Else后的。,说明: 数值或字符表达式Case 表达式表: 表中的表项为如下形式: (1) 表达式1,表达式2.如: Case 1 , 3 , 5(2) 表达式1 TO 表达式2如: Case 10 TO 30Case “A“ TO “Z“(3) Is 如: Case Is = 10Case Is = 0 与 Case 0 相同 注意: 测试表达式的类型应与Case后表达式类型一致,且三种形式可以混用,如: Case Is -5 , 0 , 5 To 100,5.1 选择结构Select Case选择语句,例5.6 学生成绩分等 Da
10、ta = InputBox(“请输入一个成绩“, “成绩分等“)Select Case Int(Data / 10)Case 10MsgBox “满分“, , “成绩分等“Case 9MsgBox “优秀“, , “成绩分等“Case 8MsgBox “良好“, , “成绩分等“Case 7MsgBox “一般“, , “成绩分等“Case 6MsgBox “合格“, , “成绩分等“Case ElseMsgBox “不合格“, , “成绩分等“End Select,返回目录,5.1 选择结构Select Case选择语句,例5.7 测试输入的字符 Char = InputBox(“请输入一个
11、字符“, “测试“) Select Case CharCase “0“ To “9“MsgBox “字符是数字“, , “测试“Case “a“ To “z“MsgBox “字符是小写字母“, , “测试“Case “A“ To “Z“MsgBox “字符是大写字母“, , “测试“Case ElseMsgBox “字符是其它符号“, , “测试“ End Select,返回目录,应用举例,【例1】设计一个口令检测程序,界面如下图,当用户输入的口令正确时,显示“恭喜!,您已成功进入本系统”,否则,显示,“口令错!,请重新输入”。如果连续两次输入了错误口令,在第三次输入完口令后则显示一个消息框,
12、提示“对不起,您不能使用本系统”,然后退出整个应用程序。,应用举例,【例2】求一元二次方程ax2+bx+c=0的解 。分析: (1) 如果a=0,则不是二次方程,此时如果b=0,则提示重新输入系数;如果b 0,则: x=-c/b(2) 如果a 0,且b2-4ac=0,则有两个相等的实根(3) 如果a 0,且b2-4ac0,则有两个不等的实根(4) 如果a 0,且b2-4ac0,则有两个共轭复根,Private Sub Command1_Click()A = Val(Text1.Text): B = Val(Text2.Text)C = Val(Text3.Text): ClsCurrentX
13、= 600: CurrentY = 1100If A = 0 ThenIf B = 0 ThenMsgBox “系数为零,请重新输入“Text1.SetFocusText1.SelStart = 0Text1.SelLength = Len(Text1.Text)ElseX = -C / BPrint “X=“; Format(X, “0.000“)End IfElse,Delta = B 2 - 4 * A * CSelect Case DeltaCase 0Print “X1=X2=“; Format(-B / (2 * A), “0.000“)Case Is 0X1 = (-B + Sq
14、r(Delta) / (2 * A)X2 = (-B - Sqr(Delta) / (2 * A)Print “X1=“; Format(X1, “0.000“)CurrentX = 600: CurrentY = 1300Print “X2=“; Format(X2, “0.000“)Case Is 0A1 = -B / (2 * A)A2 = Sqr(Abs(Delta) / (2 * A),Print “X1=“; Format(A1, “0.000“); “+“; _Format(A2, “0.000“); “i“CurrentX = 600CurrentY = 1300Print “
15、X2=“; Format(A1, “0.000“); “-“; _Format(A2, “0.000“); “i“End Select End if End Sub,应用举例,【例3】设计一个四则运算的自我练习应用程序,界面如下图所示。,要求: (1) 执行时,当在Text1中输入一种运算符后,在标签Label2中立即出现该运算符号。 (2) 单击“出题”按钮可以产生两个0,1000之间的随机整数,这时由Text2、Label2和Text3组成一个表达式。 (3) 可以通过单击“计算”按钮计算所生成的表达式的值。 (4) 也可以由用户在文本框Text4中输入运算结果通过单击“判断”按钮可以判断
16、输入的运算结果是否正确,然后在Label4上显示“正确”或“错误”。 (5) 单击“退出”按钮结束运行。,(1) 在Text1中输入加、减、乘、除符号后,在Label2中立即出现相应的运算符号。Private Sub Text1_Change()Label2.Caption = Text1.TextEnd Sub (2) 单击“出题”按钮Command1,生成两个0,1000之间的随机整数。Private Sub Command1_Click()RandomizeText2.Text = Int(Rnd * 1001)Text3.Text = Int(Rnd * 1001)Text4.Text
17、=“End Sub,(3) 单击“计算”按钮Command2得出Text4的值。 Private Sub Command2_Click()If Label2.Caption = “+“ ThenText4.Text = Val(Text2.Text) + Val(Text3.Text)ElseIf Label2.Caption = “-“ Then Text4.Text = Val(Text2.Text) - Val(Text3.Text)ElseIf Label2.Caption = “*“ ThenText4.Text = Val(Text2.Text) * Val(Text3.Text)
18、ElseIf Label2.Caption = “/“ ThenText4.Text = Val(Text2.Text) / Val(Text3.Text)Elsea = MsgBox(“运算类型错,请重输“, , “警告“)Text1.SetFocus: Text1.SelStart = 0Text1.SelLength = Len(Text1.Text)End If End Sub,(4) Text4的内容也可以由用户输入,通过单击“判断”按钮Command3判断输入结果是否正确。Private Sub Command3_Click()Select Case Label2.CaptionC
19、ase “+“If Text4.Text=Val(Text3.Text)+Val(Text2.Text) ThenLabel4.Caption = “正确“ElseLabel4.Caption = “错误“End If Case “-“If Text4.Text=Val(Text2.Text)-Val(Text3.Text) ThenLabel4.Caption = “正确“ElseLabel4.Caption = “错误“End If,Case “*“If Text4.Text=Val(Text2.Text)*Val(Text3.Text) ThenLabel4.Caption = “正确“
20、ElseLabel4.Caption = “错误“End If Case “/“If Text4.Text=Val(Text2.Text)/Val(Text3.Text) ThenLabel4.Caption = “正确“ElseLabel4.Caption = “错误“End If,Case Elsea=MsgBox(“运算类型错,请重输“, , “警告“)Text1.SetFocusText1.SelStart = 0Text1.SelLength = Len(Text1.Text)End Select End Sub,5.2 循环语句,程序的另一种结构是循环结构循环结构作用是重复执行一段
21、程序循环是有条件的、次数是有限的VB的循环语句:ForNext、Do WhileLoop 应用最多的:ForNext与Do WhileLoop,返回目录,5.2 循环语句ForNext循环,ForNext循环一般应用于循环次数已知的场合For = 初值 To 终值 Step 步长语句块(循环体)Next 循环变量 工作原理,返回目录,Step缺省为 1,5.2 循环语句ForNext循环,例5.8 求1+3+5+7+99 Private Sub Form_Click()Dim Sum As Integer, I As IntegerSum = 0 保存累加和,先清零For I = 1 To 9
22、9 Step 2Sum = Sum + INext IMsgBox “1+3+5+99=“ & Sum, , “求和“ End Sub,返回目录,本例的特点是数据项之间相差2,即Step的值为2,思考: 例中当输出对话框出现时,I 的值是多少? 如果省略Step 2,程序的结果如何? For语句能不能改写成For I=99 To 1 Step -2 ?,5.2 循环语句ForNext循环,例5.9 求平均成绩 Const N = 40 学生人数 Private Sub Form_Click()Dim Sum As Integer, I As IntegerDim Data As Integer
23、, Average As SingleSum = 0 存放累加值的变量清零For I = 1 To N 循环40次,步长值为1省略Data = InputBox(“输入第“ & I & “位同学的成绩“, “求平均分“)Sum = Sum + DataNext IAverage = Sum / NMsgBox “全班“ & N & “名学生的平均分为“ & Average, , “求平均分“ End Sub,返回目录,本例的循环变量 I 控制人数,5.2 循环语句ForNext循环,例5.11 求斐波那契级数的前20项 Private Sub Form_Click()Dim A, B, I,
24、T As IntegerA = 1 : B = 1 生成级数第一、二项Print A; B;For I = 3 To 20T = A + B 产生级数新的一项A = B 让B成为下一组的AB = T 原来A+B的值成为下一组的BPrint B;If I Mod 6 = 0 Then PrintNext I End Sub,返回目录,斐波那契级数: 第一、二项为1 第三项开始,每一项的值是前两项值之和,每6个数一行,5.2 循环语句DoLoop循环,特点:已知循环条件、未知循环次数,用Do Loop循环结构实现 1. 当型循环,返回目录,先判断后执行,先执行后判断,特点:条件表达式成立执行循环体
25、内容,5.2 循环语句DoLoop循环,例5.12 计算平均分 Private Sub Form_Click()Dim Data As Integer, Sum As Integer, N As IntegerDim Average As SingleSum = 0 : N = 0Data = InputBox(“输入第“ & N + 1 & “个同学的成绩“, “求平均分“)Do While Data -1 -1表示结束输入Sum = Sum + DataN = N + 1Data = InputBox(“输入第“ & N + 1 & “个同学的成绩“, “求平均分“)LoopAverage
26、 = Sum / NMsgBox N & “位同学的平均分为“ & Average, , “求平均分“ End Sub,返回目录,5.2 循环语句DoLoop循环,例5.13 Sum=1+2+3+N求Sum不超过10000的最大整数值和数据项数N Private Sub Form_Click()Dim Sum, N As IntegerN = 0 开始时项数为0Sum = 0 保存累加值的变量Sum清零Do While Sum = 10000N = N + 1Sum = Sum + NLoopSum = Sum - NN = N - 1Print “Sum=“; Sum, “N=“; NEnd
27、 Sub,返回目录,当Sum的值超出10000时循环才终止。因此Sum值要减去多加的一个N;而在循环过程中,N也被多加了一个1,需要减去。,5.2 循环语句DoLoop循环,2. 直到型循环,返回目录,特点:条件表达式不成立执行循环体内容,5.2 循环语句DoLoop循环,例5.14计算平均分(要求同例5.12)Private Sub Form_Click()Dim Data As Integer, Sum As Integer, N As IntegerSum = 0 : N = 0Data = InputBox(“输入成绩“, “计算总分“)Do Until Data = -1Sum =
28、Sum + DataN = N + 1Data = InputBox(“输入数据“, “计算总分“)LoopPrint “全班平均分为:“; Sum / N End Sub,返回目录,Do While Data -1 Sum = Sum + DataN = N + 1Data = InputBox(“输入数据“, “计算总分“)Loop,5.2 循环语句两重循环,两重循环:在一个循环的循环体中还包含另一个循环 例5.15 在窗体上显示一个几何图形 Private Sub Form_Click()Dim I, J As Integer I、J为循环变量For I = 1 To 8 I 控制行数(
29、8行)Print Tab(10 - I); 定每行*的起始位For J = 1 To I J 控制每行输出I个*Print “*“;Next JPrint 换行Next I End Sub,返回目录,注意:两重循环不能形成交叉,5.2 循环语句两重循环,例5.16 输出乘法口诀表 Private Sub Form_Click()Dim I As Integer, J As Integer, M As IntegerFor I = 1 To 9For J = 1 To IM = I * JPrint J Next JPrint 打印换行Next I End Sub,返回目录,5.2 循环语句两重
30、循环,求 N!( N!=123N)累乘分析: 初始化: F=1循环体: F=F I (I=1,2,3N)程序: Private Sub Command1_Click()Dim N As Integer, I As Integer, F As LongN = Val(Text1.Text)F = 1For I = 1 To NF = F * INext IText2.Text = FEnd Sub,5.2 循环语句两重循环,例5.17 计算 Private Sub Form_Click()Dim I As Integer, J As IntegerDim F As Long 阶乘值用长整型保存D
31、im e As DoubleFor I = 0 To 10F = 1 每个阶乘值先置1以便累乘For J = 1 To I F = F * JNext Je = e + 1 / FNext IPrint “e=“; eEnd Sub,返回目录,本循环计算F= I!,5.2 循环语句多重循环,多重循环:在一个循环体内又完整地包含另一个循环,称为循环的嵌套(或多重循环),返回目录,例: For I = 1 To 3For J = 1 To IFor K = -1 To -2S = S + I + J + KNext KNext JNext I 执行过程: ,内外循环不应交叉 例: FOR I=.F
32、OR J=.NEXT INEXT J,5.2 循环语句多重循环,说明 (1) 嵌套的循环可以是ForNext循环,也可以是 DoLoop循环 (2) FOR循环有一个公共端点,可使用一个NEXT语句,循环变量按从内到外排列,例:,FOR I=1 TO 3FOR J=5 TO 7PRINT I,JNEXT J NEXT I,FOR I=1 TO 3FOR J=5 TO 7PRINT I,J NEXT J,I,5.2 循环语句多重循环,(3) 嵌套循环应选用不同的循环变量 例: FOR I=1.FOR J=.NEXT J.FOR J=.NEXT JNEXT I,5.2 循环语句多重循环,例5.19
33、 计算将1角钱兑换成零钱有多少种方案 Private Sub Form_Click()Dim I, J, K, S As IntegerS = 0 统计兑换1角钱的方案数For I = 0 To 10 1分钱个数For J = 0 To 10 Step 2 2分钱个数For K = 0 To 10 Step 5 5分钱个数If I + J + K = 10 Then S = S + 1Next KNext JNext IMsgBox “1角钱兑换成零钱的方案有“ & S & “种“, , “兑换零钱“ End Sub,1角钱以下的硬币有1分、2分和5分种 1角钱全换成1分需10个 1角钱全换成
34、2分需5个 1角钱全换成5分需2个,5.2 循环语句多重循环,(例)公鸡5元钱一只,母鸡三元钱一只、小鸡一元钱三只,要用100元钱买100只鸡,问公鸡、母鸡、和小鸡各买几只? 分析: Private Sub Form_Click()Dim I As Integer, J As Integer, K As IntegerPrint Tab(5); “公鸡“; Tab(15); “母鸡“; Tab(25); _“小鸡“For I = 0 To 20For J = 0 To 33 For K = 0 To 100 Step If I*5+J*3+K3=100 And I+J+K=100 ThenPr
35、int Tab(5); I; Tab(15); J; Tab(25); KEnd IfNext K, J, I End Sub,几种循环语句比较,5.3 其他语句Exit,1. Exit语句 Exit Do:跳出DoLoop循环,Exit Do语句用于退出循环体也可以在Do语句和Loop语句之后都没有条件,这时在循环体内必须有强行退出循环的语句。Exit For 该语句用于ForNext循环,在循环体中可以出现一 次或多次。当系统执行到该语 句时,就 强制退当前循环。常见的使用格式是:If 条件 Then Exit For即当循环执行过程中满足某个条件时,就执行循环退 出语句结束循环。,返回目
36、录,5.3其他语句Exit,例5.20 判断一个正整数是否为素数(质数) Dim n as integer N = InputBox(“请输入一个正整数“, “验证素数“)For I = 2 To N - 1If N Mod I = 0 Then Exit ForEnd IfNext IIf I = N ThenMsgBox N & “是素数“, , “验证素数“ElseMsgBox N & “不是素数“, , “验证素数“End If,素数:一个正整数N除了能被1和自身所整除外,不能被其它任何数所整除。,5.3 其他语句Go to,功能:作用是无条件地转移到标号或行号指定的那行语句.标号是一个字符序列,行号是一个数字序列。格式:Go to label称为语句标号(数字或标识符) 例5.22 求若干个同学的成绩总分 Private Sub Form_Click()Dim Data, Sum As IntegerSum = 0loop1:Data = InputBox(“输入成绩“)If Data = -1 ThenGo To loop2ElseSum = Sum + DataGo To loop1End Ifloop2:Print “总分=“; SumEnd Sub,返回目录,Goto语句不符合结构化程序设计的要求,所以不提倡使用。,