第 5 章循环结构程序设计 一 实验目的 (1) 掌握 For 语句的使用 (2) 掌握 Do While/Until Loop 与 Do Loop While/Until 两种循环语句的使用 (3) 加深理解循环的概念, 掌握循环的规则及其执行过程 (4) 掌握多重循环的规则和程序设计方法 (5) 学会如何控制循环条件, 防止死循环或不循环 二 相关知识在指定条件下多次重复执行一组相同的语句可以通过循环来实现 Visual Basic 提供了下面几种形式的循环语句 : 1.Do Loop 循环语句 Do While/Until< 条件 > Do 语句块语句块 [Exit Do] 或 [Exit Do] 语句块语句块 Loop Loop While/Until< 条件 > 2.FOR 循环语句 For 循环变量 = 初值 To 终值 [Step 步长 ] 语句块 [Exit For] 语句块 Next 循环变量 3. 循环嵌套的注意事项内循环和外循环的变量不能同名 ; 外循环必须完全包含内循环, 不能交叉 ; 循环的转移遵循 允许循环内转移, 允许转出, 禁止转入 的原则 4. 列表框控件列表框控件显示一个项目列表, 让用户从其中选择一项或多项 列表框最主要的特点只能从其中选择, 而不能直接写入或修改其中的内容, 因此, 它从现有选项快速选择的好工具 列表框的 AddItem 方法用于添加列表框中的项目 ;RemoveItem 方法用于删除列表框中的项目 通过查看 ListIndex 属性可以取得用户选中的列表框项目的索引 ; 对 List ListCount
第 5 章循环结构程序设计 35 和 ListIndex 属性进行设置则可以对列表框中的项目进行操作 5. 组合框控件组合框文本框和列表框组合而成的控件, 它有三种不同的类型, 可以通过组合框的 Style 属性设置 组合框输入控件中使用相当广泛的一种, 它比文本框规范, 比列表框灵活而节省空间, 所以使用组合框规范内容的输入一个好的选择 三 实验内容实例 1 求从键盘输入的自然数 n 的阶乘 程序运行时分别输入 5 15, 观察结果 流程如图 5-1 所示 开始 输入 n s=1 i=1 i<=n s = s * i i = i + 1 输出阶乘结果 s 结束图 5-1 实例 1 流程图程序代码如下 : Private Sub Form_Click() Dim s As Single,n As Integer,i As Integer n = Val(InputBox(" 输入自然数 n"," 求 n 的阶乘 ",0)) s = l i = 1 Do While i<=n s = s * i i = i + 1
36 Visual Basic 语言程序设计实验教程 Loop Print "n = ";n,n;"!=";s 程序解读 : 在该程序中,s 用来存放累乘积的结果, 因此在初始化时 s=1;i 控制循环的循环变量 ;i<=n 循环条件 ;s =s*i,i= i+1 循环体 ; 因为循环结构的关键字 While, 所以当 i<=n 条件满足时, 执行循环体, 当 i>n 时, 退出循环, 执行后继语句输出结果 如果将程序中的 Do While 改成 Do Until, 程序的其他地方应该做怎样的修改呢? 请自己完成 实例 2 计算 e, 要求其误差小于 0.00001, 公式如下 : 分析 : 该实例涉及两个问题 1 1 1 1 e= 1+ + + + + + n! 2! 3! n! (1) 用循环结构求级数和的问题 求级数和的项数和精度都有限的, 则有可能 1 会造成溢出或死循环 这道题使用精度控制循环 因为事先我们不知道要循环多少次 n! 才会小于 0.00001, 所以循环语句只能选择用于人为约束条件控制循环的 Do Loop 语句 (2) 累加与连乘 累加在原有和的基础上再增加一个数, 如 s=s+i 连乘则在原有积的基础上再乘以一个数, 如 p=p*i 为了保证程序运行能得到正确的结果, 一般在循环体外对存放累加和的变量清零, 对存放连乘的变量置 1 流程图如图 5-2 所示, 程序运行结果如图 5-3 所示 开始 e=0:i=0:n=1:t=1 t > 10^-5 e = e+t i =i+1 n = n * i t = 1 / n 输出结果 结束 图 5-2 实例 2 流程图
第 5 章循环结构程序设计 37 图 5-3 程序运行界面操作步骤 : (1) 新建一个标准 EXE 工程 (2) 在窗体上放置一个标签和一个命令按钮 (3) 双击命令按钮, 进入代码编辑窗口, 编写程序代码 Private Sub Command1_Click() Dim i%, n&, t!, e! e = 0: i = 0: n = 1: t = 1 Do While t > 0.00001 e = e + t i = i + 1 n = n * i t = 1 / n Loop Label1.Caption = Label1.Caption & e & "( 计算了 " & i & " 项的和 )" Private Sub Form_Load() Command1.Caption = " 计算 e 的近似值 " Label1.Caption = "e 的近似值 =" (4) 运行调试程序, 直到满意为止 实例 3 在文本框中输入字符串, 统计其中数字字符出现的个数 分析 : 本题需要对输入的字符串的每个字符逐个进行判断, 因此判断语句需要重复执行, 这就需要用循环结构来控制 循环体的内容从字符串中取一个字符, 再判断该字符的类型 ; 循环次数已知的, 就字符串中的字符个数, 因此使用 For Next 循环语句 流程如图 5-4 所示, 程序运行结果如图 5-5 所示 代码如下 : private Sub Command1_Click() Dim c As String, c1 As String, p As Integer, n As Integer c = Text1.Text For p = 1 To Len(c) c1 = Mid(c, p, 1)
38 Visual Basic 语言程序设计实验教程 If c1 >= "0" And c1 <= "9" Then n = n + 1 Next p Label1.Caption = " 数字字符的个数为 :" & Str(n) 开始 c=text1.text p=1 p<=len(c) c1=mid(c,p,1) c1 数字字符 n=n+1 p=p+1 显示结果 结束 图 5-4 实例 3 流程图 图 5-5 实例 3 程序运行界面 实例 4 单击窗体, 在窗体上画出如图 5-6 所示由星号组成的三角形 ( 三角形必须由循环语句计算生成 )
第 5 章循环结构程序设计 39 图 5-6 实例 4 程序运行界面分析 : 本题需要输出 6 行内容, 重复 6 次在每行输出空格和星号, 所以控制结构用 For Next 循环语句控制 循环次数与总行数相等, 为 6 次 ; 循环体部分就每行输出空格和星号, 空格个数与该行的行号之间的关系为 6- 行号, 星号个数与该行的行号之间的关系为 2* 行号 -1 程序流程如图 5-7 所示 开始 i = 1 i<=6 打印每行所需个数的星 结束 图 5-7 实例 4 流程图代码如下 : Private Sub Form_Click() Dim i As Integer For i = 1 To 6 Print Tab(16 - i); String(2*i-1, "*") Next i 实例 5 将可打印的 ASCII 码制成表格输出, 使每个字符与它的编码值对应起来, 每行打印 7 个字符 分析 : 在 ASCII 码中, 只有 ( 空格 ) 到 ~ 可打印的字符, 其余为不可打印的控制字符 可打印的字符的编码值为 32~126, 可通过 Chr() 函数将编码值转换成对应的字符输出
40 Visual Basic 语言程序设计实验教程 程序流程如图 5-8 所示 开始 asc=32 asc<=126 在图片框中打印字符及其 ASCII 值 i=i+1 结束 i=7 换行 asc=asc+1 图 5-8 实例 5 流程图操作步骤 : (1) 新建一个标准 EXE 工程 (2) 在窗体上画一个图片框, 并使图片框与窗体几乎一样大 (3) 双击图片框, 进入代码编辑窗口, 编写图片框的单击事件驱动程序, 其代码如下 : Private Sub Picture1_Click() Dim Asc As Integer, i As Integer Picture1.Print " ASCII 码对照表 " For Asc = 32 To 126 Picture1.Print Tab(7 * i + 2); Chr(Asc); "="; Asc; i = i + 1 If i = 7 Then i = 0: Picture1.Print Next Private Sub Form_Load() Picture1.BackColor = &HFFFFFF (4) 运行调试程序, 直到满意为止
第 5 章循环结构程序设计 41 程序解读 : 在该程序中, 循环次数确定的, 就将 ASCII 代码为 32~126 的字符逐个输出, 因此使用 For Next 循环来控制 ; 循环体中三条语句的作用分别 :Picture1.Print 用于输出字符, 其中的 Tab 用于指定输出位置, 变量 i 的作用记录在一行中已经输出的字符个数,If 语句用于判断在一行中已经输出了 7 个字符, 如果输出了 7 个字符, 就换行输出 程序运行界面如图 5-9 所示 图 5-9 实例 5 程序运行界面 实例 6 在窗体上画一个标签和一个列表框 程序运行后, 在列表框中添加若干列表项 当双击列表框中的某个项目时, 在标签 Label1 中显示选中的项目, 如图 5-10 所示 图 5-10 实例 6 程序运行图分析 : 本题涉及到对列表框的使用 列表框的重要属性有存放列表框中各项内容的 List(), 存放选中项序号的 ListIndex, 存放选中内容的 Text, 存放列表框中总项数的 ListCount 列表框的重要方法有添加项的 AddItem, 删除项的 RemoveItem, 删除所有内容的 Clear 操作步骤 : (1) 新建一个标准 EXE 工程 (2) 在窗体上画一个标签和一个列表框 (3) 进入代码编辑窗口, 编写程序代码 Private Sub Form_Load() List1.AddItem " 北京 " List1.AddItem " 上海 " List1.AddItem " 河北 "
42 Visual Basic 语言程序设计实验教程 Private Sub List1_Click() Label1.Caption = List1.Text (4) 运行调试程序, 直到满意为止 四 实验程序设计与调试 ( 一 ) 看图写程序 1. 统计资料显示,2005 年日本 GDP 为 4,7528 亿美元, 年增长率为 2.8% ; 中国 GDP 为 2,2257 亿美元, 年增长率为 9.8% 编程计算, 若年增长率保持不变, 多少年后中国 GDP 将超过日本? 流程如图 5-11 所示, 请写出相应代码, 并上机调试运行 程序运行界面如图 5-12 所示 开始 Jp=47528:Cn=22257:Y=0 Jp=Jp*1.028 Cn=Cn*1.098 Y=Y+1 Cn<=Jp 在标签中显示结果 结束 图 5-11 看图写程序第 1 题流程图 图 5-12 看图写程序第 1 题程序运行界面
第 5 章循环结构程序设计 43 2. 有一堆苹果, 个数在 50 至 500 之间, 按 5 人均分余 4 个, 按 6 人均分余 3 个, 按 7 人均分余 2 个, 用穷举法设计程序, 输出苹果有多少个? 共有几种分法? 流程如图 5-13 所示, 请写出相应程序, 并上机调试 程序运行界面如图 5-14 所示 开始 n=0 k=50 k<=500 k mod 5=4 and k mod 6=3 and k mod 7=2 n=n+1 print k k=k+1 输出 n 结束 图 5-13 看图写程序第 2 题流程图 图 5-14 看图写程序第 2 题程序运行界面 3. 在窗体上已经建立了两个文本框 (Text1 及 Text2) 和一个命令按钮 (Command1), 用户在文本框 Text1 中输入文本, 单击命令按钮后, 将文本框 Text1 中的非英文字母替换成 *, 并按输入顺序显示在文本框 Text2 中 例如, 输入 12aA3b4B5, 在文本框 Text2
44 Visual Basic 语言程序设计实验教程 中显示为 **aa*b*b* 流程如图 5-15 所示, 请写出相应程序, 并上机调试 程序运行界面如图 5-16 所示 开始 s=text1.text t=" " k=1 k<=len(s) c=mid(s, k, 1) c 非英文字符 c="*" t=t & c k=k+1 Text2.Text=t 结束 图 5-15 看图写程序第 3 题程流程图 图 5-16 看图写程序第 3 题程序运行界面 ( 二 ) 根据程序画流程图 1. 在文本框 Text1 中输入一个正整数 N, 单击 计算 命令按钮 Command1, 计算 1
第 5 章循环结构程序设计 45 到 N 所有自然数中的偶数 ( 不包括 0) 的乘积 :2 * 4 * 6 * * m (m<=n), 结果显示在标签 Label1 中 程序运行界面如图 5-17 所示, 请画出相应流程图 图 5-17 根据程序画流程图第 1 题程序运行界面 Private Sub Command1_Click() Dim fact As Double, k As Integer, n As Integer n = Val(Text1) fact = 1 For k = 2 To n Step 2 fact = fact * k Next k Label1.Caption = " 累乘结果 =" & fact 2. 单击窗体, 输出 100 到 500 之间的所有完全平方数, 并显示在窗体上, 要求每行打印 3 个数 ( 一个整数若另一个整数的平方, 则这个数就完全平方数, 例如 :400=20 2, 400 完全平方数 ) 程序运行界面如图 5-18 所示, 请画出相应流程图 图 5-18 根据程序画流程图第 2 题程序运行界面 Private Sub Form_Click() Dim i As Integer, k As Integer k = 0 Print " 100-500 的完全平方数有 :" For i = 100 To 500 If Sqr(i) = Int(Sqr(i)) Then Print i;
46 Visual Basic 语言程序设计实验教程 k = k + 1 If k Mod 3 = 0 Then Print End If Next i 3. 指定一个初始值, 从该数值开始 ( 包括该数值 ) 找出 100 个不能被 7 整除的自然数 要求通过文本框接收初始值, 找出的自然数显示在列表框中 程序运行界面如图 5-19 所示, 请画出相应流程图 图 5-19 根据程序画流程图第 3 题程序运行界面 Private Sub Command1_Click() Dim n As Integer, count As Integer n = Val(Text1) count = 0 Do While count < 100 If n Mod 7 = 0 Then List1.AddItem n count = count + 1 End If n = n + 1 Loop ( 三 ) 阅读分析程序 1. 执行下面的程序, 单击窗体后, 窗体上显示的内容 ( ) Private Sub Form_Click() For I = 0 To 10 Step -2
第 5 章循环结构程序设计 47 I = I + 2 Next Print I 2. 运行下面的程序后, 单击命令按钮 Command1, 则在标签框 Label1 中显示的结果 ( ) Private Sub Command1_Click ( ) X = "BASIC" L = Len (X ) For k= 1 To L V = Mid ( X, k, 1 ) W = V + W + "-" Next k Label1.Caption = W 3. 运行程序后, 单击窗体, 则在窗体上显示的结果为 ( ) Private Sub Form_Click() For x = 1 To 4 num = Int(Rnd + x) Select Case num Case 4 y = "W" Case 3 y = "X" Case 2 y = "Y" Case 1 y = "Z" End Select Next x Print y ( 四 ) 程序填空 1. 重庆市 2004 年 GDP 为 2650 亿元, 比上年增长 12% 在增长率保持不变的情况下, 计算重庆市 GDP 达到或超过 5000 亿元的年份 程序流程如图 5-20 所示, 程序运行界面如图 5-21 所示, 请将程序填充完整
48 Visual Basic 语言程序设计实验教程 开始 GDP=2650?? Y=Y+1? 在标签中显示结果 结束 图 5-20 程序填空第 1 题流程图 图 5-21 程序填空第 1 题程序运行界面 Private Sub Command1_Click() Dim GDP As Single, Y As Integer GDP = 2650 Do Y = Y + 1 Loop While Label1.Caption = Str(Y) + " 年 GDP 达到 " + Str(GDP) + " 亿元 " Label1.Caption = Str(Y) + " 年 GDP 达到 " + Str(GDP) + " 亿元 "
第 5 章循环结构程序设计 49 2. 在窗体上已经建立两个文本框 (Text1 及 Text2) 和一个命令按钮 (Command1), 用户在文本框 Text1 中输入文本, 单击命令按钮后, 从文本框 Text1 中取出英文字母, 并按输入顺序显示在文本框 Text2 中 例如, 输入 12aA3b4B5, 在文本框 Text2 中显示为 aabb 程序运行界面如图 5-22 所示, 流程图如图 5-23 所示, 请通过上机调试来完善下列程序代码 图 5-22 程序填空第 2 题运行结果 开始 s = Trim(? ) k=1 k<=? Mid(s, k, 1)?? k=k+1 显示结果 结束 Private Sub Command1_Click() 图 5-23 程序填空第 2 题流程图
50 Visual Basic 语言程序设计实验教程 Dim s As String, y As String s = Trim( ) y = "" For k = 1 To x = Mid(s, k, 1) If Then y = End If Next Text2.Text = y 3. 下述程序能够验证一个输入的数为素数 ( 素数只能被 1 和自身整除的自然数 ), 程序流程图如图 5-24 所示, 程序运行界面如图 5-25 所示, 请通过上机调试完善下列程序代码 开始 f = True 输入 n i=2 i<=? n Mod i =? i=i+1 f=false 素数 f=? 不素数 结束 图 5-24 程序填空第 3 题流程图
第 5 章循环结构程序设计 51 图 5-25 程序填空第 3 题程序运行界面 Private Sub Command1_Click() Dim n As Integer, i As Integer, f As Boolean f = True n = Val(InputBox(" 请输入一个正整数 " + vbcrlf + "( 大于 1)", " 素数 ", 2)) For i = 2 To If n Mod i = Then f = False Exit For End If Next i If f = Then Print n; " 素数 " Else Print n; " 不素数 " ( 五 ) 程序改错 1. 以下程序的功能将用户键盘输入的十进制整数转换成二进制数, 并在窗体上输出, 请将给定程序中不正确的地方进行修改, 使之能完成预定功能 Private Sub Form_Click() Dim B As Long, D As Boolean 'Error1 D = Val(InputBox(" 请输入一个十进制数 ", " 输入 ")) Do While D >= 0 'Error2 B = B & D / 2 'Error3 D = D / 2 'Error4 Loop Print B 要求 : 根据上述程序代码改错, 改错时不得增加和删除语句 2. 验证级数 : 1 1 1 1 1 1+ + + + + + = 2 1 2 3 4 n 2 2 2 2 2
52 Visual Basic 语言程序设计实验教程 在文本框 Text1 中输入 n, 单击 计算 命令按钮 Command1 计算级数的值, 计算所得级数值与 2 之差的绝对值显示在标签框 Label1 中 Private Sub Command1_Click ( ) n = Asc ( Text1.Text ) 'Error1 S = 1 For k = 0 To n 'Error2 V = k ^ 2 'Error3 S = 1 / S + 1 / V 'Error4 Next k D = 2-Abs (S) 'Error5 Label1.Caption = D 要求 : 根据上述程序代码改错, 改错时, 不得增加和删除语句 ( 六 ) 程序设计 1. 在文本框 Text1 和 Text2 中分别输入任意正整数 N1 和 N2(N1<N2), 然后单击命令按钮 Command1, 计算出 N1 到 N2 之间所有数 ( 不包括 N1 和 N2) 的累加和, 结果在标签 Label1 中显示, 如图 5-26 所示 要求 : 画出流程图, 并设计程序上机调试 图 5-26 程序设计第 1 题程序运行界面 2. 单击窗体, 在窗体上打印出如图 5-27 所示的内容 要求 : 画出流程图, 并用循环结构设计出程序再上机调试 图 5-27 程序设计第 2 题程序运行界面
第 5 章循环结构程序设计 53 3. 在窗体的单击事件中求级数 S=1/(1+4)+1/(1+2 4)+1/(1+3 4)+ +1/(1+n 4)+ 的前 100 项之和, 将结果显示在窗体上, 如图 5-28 所示 要求 : 画出流程图, 并设计出程序再上机调试 图 5-28 程序设计第 3 题程序运行界面 ( 七 ) 高级应用 1. 如果一个三位整数等于它的各位数的立方和, 则此数称为 水仙花数, 如 153=1 3 +5 3 +3 3 编写程序求所有的水仙花数, 将水仙花数显示在列表框中, 如图 5-29 所示 要求 : 分别用单层循环结构和多层循环结构完成此题的程序设计 图 5-29 高级应用第 1 题程序运行界面 2. 凡满足 x 2 +y 2 =z 2 的正整数数组 (x,y,z) 称为勾股数组 ( 如 3,4,5) 请找出任意一个正整数 n( 通过 InputBox 函数输入 ) 以内的所有勾股数组, 把这些数组显示在列表框中, 如图 5-30 所示 图 5-30 高级应用第 2 题程序运行界面 3. 设计程序, 在窗体上建立一个列表框 List1 和一个 显示 命令按钮 Command1 列表框高 (Height) 为 1770, 宽 (Width) 为 1300, 字体为 黑体, 字号为 14, 列表框中
54 Visual Basic 语言程序设计实验教程 已有 5 个列表项, 依次为 表项 1 至 表项 5 要求程序运行后, 可以通过多次单击选中多个列表项 单击 显示 按钮, 在窗体上输出所有选中的列表项, 如图 5-31 所示 图 5-31 高级应用第 3 题程序运行界面 4. 用迭代法求 x = a 求平方根的迭代公式为: 1 a x n+ 1= x n + 2 x n 要求 : 通过 InputBox 函数输入 a 值, 并以 a 作为 x 的初值 要求前后两次求出的 x 的差的绝对值小于 10-5, 如图 5-32 所示 图 5-32 高级应用第 4 题程序运行界面 五 实验思考题 1. 设计循环结构的三要素什么? 2. 循环结构对条件的控制分为哪两种情况? 什么时候使用 Do Loop 循环语句, 什么时候使用 For Next 循环语句? 3. 在使用 Do Loop 循环语句时, 关键字 While 和 Until 的区别什么? 4. 在 For Next 循环中, 试分析循环初值 终值和步长的关系 5. 在编写循环体时, 哪些语句需要放在循环体内? 哪些变量的初值需要在循环体外赋值? 6.Exit Do 语句的作用什么? 它可以在哪些循环中使用?