1、1,Visual Basic 可视化程序设计,任课教师: 陈歆,2,第4-2讲 程序的循环结构,主要内容 4-2.1 ForNext循环语句 4-2.2 DoLoop循环语句 4-2.3 多重循环 4-2.4 其它辅助控制语句 4-2.5 程序的简单调试方法,3,第4-2讲 程序的循环结构,教学目标 掌握ForNext 掌握DoLoop循环语句 掌握两重循环 了解多重循环 了解Exit、End和Goto语句 掌握程序的简单调试方法,4,第4-2讲 程序的循环结构,程序的另一种结构是循环结构循环结构作用是重复执行一段程序循环是有条件的、次数是有限的VB的循环语句:ForNext、Do While
2、Loop For EachNext、WhileWend 应用最多的:ForNext与Do WhileLoop,5,4-2.1 ForNext循环语句,For循环语句一般用于循环次数已知 形式:For 循环变量初值 to 终值 Step 步长语句块Exit For语句块Next 循环变量 说明: 循环变量必须是数值型 步长:一般为正数,初值小于终值 ;若为负数,初值大于终值;Step 缺省时默认为1。 语句块:重复执行的部分,构成循环体,可以是一句或多句。 Exit For :退出循环,执行Next 后的下一条语句。循环次数:nInt( +1 ),6,4-2.1 ForNext循环语句,例:求1
3、+3+5+7+99 Private Sub Form_Click()Dim Sum As Integer, i As IntegerSum = 0 保存累加和,先清零For i = 1 To 99 Step 2Sum = Sum + iNext iMsgBox “1+3+5+99=“ & Sum, , “求和“ End Sub,思考: 例中当输出对话框出现时,i 的值是多少? 如果省略Step 2,程序的结果如何? For语句能不能改写成For i=99 To 1 Step -2 ?,4-2.1 ForNext循环语句,例 将可打印的ASCII 码制成表格输出,使每个字符与它的编码值对应起来,
4、每行打印7个字符。,7,Private Sub Form_Click() Dim Asc As Integer, i As Integer Print Tab(20); ASCll码对照表 For Asc = 32 To 126 Print Tab(7 * i + 2); Chr(Asc); =; Asc; i = i + 1 If i Mod 7 = 0 Then i = 0: Print Next Asc End Sub,在ASCll码中,只有空格到“”符号是可以打印的字符,其余为控制符,可以打印的字符的编码值为32126,通过Chr()函数将编码值转换成对应的字符,通过Tab 函数定位输
5、出,8,4-2.1 ForNext循环语句,例:求平均成绩 Const N = 10 学生人数 Private Sub Form_Click()Dim Sum As Integer, i As IntegerDim Data As Integer, Average As SingleSum = 0 存放累加值的变量清零For i = 1 To N 循环N次,步长值为1省略Data = InputBox(“输入第“ & i & “位同学的成绩“, “求平均分“)Sum = Sum + DataNext iAverage = Sum / NMsgBox “全班“ & N & “名学生的平均分为“
6、& Average, , “求平均分“ End Sub,本例的循环变量 i 控制人数,9,4-2.1 ForNext循环语句,例:求斐波那契级数的前20项,Private Sub Form_Click()Dim A, B, i, 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 第三项开始,每
7、一项的值是前两项值之和,10,4-2.1 ForNext循环语句,例:通过循环变量的变化在窗体上输出七彩字,运行界面如下图所示。 Private Sub Form_Click() Dim i%,green%, blue % Randomize For i=1 to 800green=Int(255*Rnd+1)blue=Int(255*Rnd+1)CurrentX=500+iCurrentY=500+iForeColor=RGB(I,green,blue)Print “hello” Next i End Sub,11,4-2.2 DoLoop循环语句,当型循环,特点:条件表达式成立执行循环体内
8、容,12,4-2.2 DoLoop循环语句,2. 直到型循环,先判断后执行,条件表达式 成立?,循环体,No,Yes,先执行后判断,条件表达式 成立?,循环体,No,Yes,特点:条件表达式不成立执行循环体内容,13,4-2.2 DoLoop循环语句,例:计算平均分 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
9、 Data -1 -1表示结束输入Sum = Sum + DataN = N + 1Data = InputBox(“输入第“ & N + 1 & “个同学的成绩“, “求平均分“)LoopAverage = Sum / NMsgBox N & “位同学的平均分为“ & Average, , “求平均分“ End Sub,14,4-2.2 DoLoop循环语句,例:计算平均分 Private Sub Form_Click()Dim Data As Integer, Sum As Integer, N As IntegerSum = 0 : N = 0Data = InputBox(“输入成绩“
10、, “计算总分“)Do Until Data = -1Sum = Sum + DataN = N + 1Data = InputBox(“输入数据“, “计算总分“)LoopPrint “全班平均分为:“; Sum / N End Sub,15,4-2.2 DoLoop循环语句,例: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 + NL
11、oopSum = Sum - NN = N - 1Print “Sum=“; Sum, “N=“; NEnd Sub,当Sum的值超出10000时循环才终止。因此Sum值要减去多加的一个N;而在循环过程中,N也被多加了一个1,需要减去。,16,4-2.3 多重循环,如果在一个循环内完整地包含另一个循环结构,则称为多重循环,或循环嵌套,嵌套的层数可以根据需要而定,嵌套一层称为二重循环,嵌套二层称为三重循环。,17,4-2.3 多重循环,前面介绍的几种循环控制结构可以相互嵌套,下面是几种常见的二重嵌套形式:,(1)For I=.For J=.Next JNext I,(2)For I=.Do Wh
12、ile/Until .LoopNext I,(3)Do While.For J=.Next JLoop,(4)Do While/Until.Do While/Until .LoopLoop,18,4-2.3 多重循环,例:在窗体上显示一个几何图形 Private Sub Form_Click()Dim i, j As Integer i、j为循环变量For i = 1 To 8 i 控制行数(8行)Print Tab(10 - i); 定每行*的起始位For j = 1 To i j 控制每行输出i个*Print “*“;Next jPrint 换行Next i End Sub,注意:两重循环
13、不能形成交叉,19,4-2.3 多重循环,例:输出乘法口诀表 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,20,4-2.3 多重循环,例:计算 Private Sub Form_Click()Dim I As Integer, J As IntegerDim F As Long 阶乘值用长整型保存Dim e As DoubleFor I = 0 To 1
14、0F = 1 每个阶乘值先置1以便累乘For J = 1 To I F = F * JNext Je = e + 1 / FNext IPrint “e=“; eEnd Sub,21,4-2.3 多重循环,例:计算将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 + 1Ne
15、xt KNext JNext IMsgBox “1角钱兑换成零钱的方案有“ & S & “种“, , “兑换零钱“ End Sub,1角钱以下的硬币有1分、2分和5分 1角钱全换成1分需10个 1角钱全换成2分需5个 1角钱全换成5分需2个,22,4-2.4 其它辅助控制语句,1. Exit语句 Exit Do:跳出DoLoop循环 Exit For:跳出ForNext循环 例 判断一个正整数是否为素数(质数) N =val( InputBox(“请输入一个正整数”, “验证素数”)For I = 2 To N - 1If N Mod I = 0 Then Exit ForEnd IfNext
16、 IIf I = N ThenMsgBox N & “是素数“, , “验证素数“ElseMsgBox N & “不是素数“, , “验证素数“End If,素数:一个正整数N除了能被1和自身所整除外,不能被其它任何数所整除。,23,4-2.4 其它辅助控制语句,2. End语句 End:终止程序的运行 End Sub:终止一个过程; End Function:终止函数过程 End If:终止条件语句 End Type:终止类型声明 End Select:终止情况语句 End Property:终止属性过程 End With:终止With语句,例如: Private Sub Command1_
17、Click()End End Sub,24,4-2.4 其它辅助控制语句,2. Goto语句 功能:无条件转向格式:Goto label称为语句标号(数字或标识符) 例 求若干个同学的成绩总分 Private Sub Form_Click()Dim Data, Sum As IntegerSum = 0loop1:Data = InputBox(“输入成绩“)If Data = -1 ThenGoTo loop2ElseSum = Sum + DataGoTo loop1End Ifloop2:Print “总分=“; SumEnd Sub,Goto语句不符合结构化程序设计的要求,所以不提倡使
18、用。,25,4-2.5 程序的简单调试方法,程序的错误类型,语法错误 运行错误,中文逗号,逻辑错误:算法不正确。显然系统不会报告这类出错信息。,26,4-2.5 程序的简单调试方法,简单调试方法:在程序中适当插入Print语句跟踪变量值的变化,27,4-2.5 程序的简单调试方法,使用调试工具断点调试 断点:程序执行到该此自动暂停单击“继续”按钮 ,程序可继续执行。,设置断点:在代码窗口中单击该语句左侧的阴影边框。暂停时,将鼠标指针移动到程序中的各个变量上略作停留,系统将以浮动标签的方式显示该变量的值。,28,4-2.5 程序的简单调试方法,2.逐语句执行启动逐语句执行:“调试逐语句” 或 按F8终止逐语句执行: “调试跳出” 3. 使用立即窗口 程序运行处于暂停状态时,在立即窗口中输入:Print 或 ? 4. 逐过程执行启动逐过程执行:“调试逐过程”或 按Shift+F8终止逐过程执行: “调试跳出”,29,实验六 程序的循环结构,