第5章 Visual Basic控制结构 之 循环结构 郭清溥
5.3 循环结构 循环是客观世界普遍存在的一种客观现象。 在我们所处理的问题中,常常遇到这样一些情况,它们的计算和处理方法完全一样,只是要求重复计算多次,而每次使用的数据都按照一定的规则在改变。这就是“循环”。 程序设计中的循环,是指在程序设计中,从某处开始有规律地反复执行某一操作块(或程序块)的现象,并称重复执行的该操作块(或程序块)为循环体。
5.3 循环结构 问题1. 输入10个数求其和 I=0 : S=0 I=0 : S=0 输入 M I=10 S=S+M 输入 M I=I+1 问题1. 输入10个数求其和 I < 10 S=S+M I=I+1 I=0 : S=0 …… True False 输入 M True I=10 …… False I=0 : S=0 S=S+M I=I+1 输入 M
5.3 循环结构 得到N的值 问题2. 计算2 n K=0 : S=1 K<N 直接计算 2n 2^n S=S*2 K=K+1 …… True False 问题2. 计算2 n 直接计算 2n 2^n
5.3 循环结构 5.3.1 固定次数的循环 格式 For <循环变量>=<初值> To <终值> [Step <步长值>] <循环体> [Exit For] Next <循体变量>
5.3 循环结构 5.3.1 固定次数的循环 <循环变量>是一个数值变量,作用是:对循环进行控制,根据它的值决定是否终止循环。 For <循环变量>=<初值> To <终值> [Step <步长值>] <循环体> [Exit For] Next <循体变量> <循环变量>是一个数值变量,作用是:对循环进行控制,根据它的值决定是否终止循环。 <初值>是循环开始的值,<终值>是循环结束的值,它们可以是变量、常量、表达式; <步长>是每执行一次循环体后变量获得的增量,可以是正数、负数,可以是整数或小数,但不能为0 ,步长值为+1时可以缺省。
5.3 循环结构 5.3.1 固定次数的循环 功能 当循环变量不超过终值时,将一次增加一个步长值地重复执行循环体。 For <循环变量>=<初值> To <终值> [Step <步长值>] <循环体> [Exit For] Next <循体变量> 功能 当循环变量不超过终值时,将一次增加一个步长值地重复执行循环体。 其具体执行过程是:执行到For语句时,循环变量先得到“初值”,然后与“终值”比较。如果循环变量未“超过”终值,那么就执行循环体。执行到Next语句时,循环变量累加一个步长值。之后再与终值比较。若还未“超过”终值,则重复上述过程,直到循环变量“超过”终值。
5.3 循环结构 5.3.1 固定次数的循环 流程图 循环变量=初值 循环变量未超过终值? 循环体 循环变量累加一个步长 Next的下一语句 False True 循环体 循环变量累加一个步长 Next的下一语句
5.3 循环结构 5.3.1 固定次数的循环 说明 (1) For 和 Next 必须配对使用。 For <循环变量>=<初值> To <终值> [Step <步长值>] <循环体> [Exit For] Next <循体变量> 说明 (1) For 和 Next 必须配对使用。 (2) 当步长值 > 0 时,“超过”就是“>”; 当步长值 < 0 时,“超过”就是“<”。 (3) 循环变量应尽量使用整型变量,以免出现误差。 (4) 循环结束后,循环变量的值不变。即保持当前值。
5.3 循环结构 5.3.1 固定次数的循环 例8 编写程序,利用固定次数循环计算 分析: 这是一个典型的固定循环次数的问题。 为了简单直观起见,假设程序中我们 用S表示待求的和 用K表示累加的数据 用N表示累加的终值
5.3 循环结构 5.3.1 固定次数的循环 例 8 Dim N%, S&, K% N = Val(InputBox("", "输入 N 的值")) S = 0 For K = 1 To N Step 1 S = S + K Next K lblResult.Caption = "前 " & N & " 个数的和为:" & S Step 1可以缺省
5.3 循环结构 5.3.1 固定次数的循环 例9 相传古代印度国王舍罕要褒奖他聪明能干的宰相(国际象棋发明者)达依尔。国王问达依尔需要什么,达依尔说:国王只要在国际象棋的棋盘上第一格放一粒麦子,第二格放两粒麦子,第三格放四粒麦子,以后都按此比例每一格都是前一格的两倍,一直放到第64格为止,我将感激不尽!国王一听马上便答应下来,结果,他让扛过来的麦子,不一会儿就用完了。国王很纳闷,这到底是怎么回事呢?我们下面编程序,让计算机来算一算这笔帐,假定1.42×108粒小麦/m3,计算一下这么多小麦有多大的体积。
5.3 循环结构 根据题目的描述,我们知道: 第一格放1粒麦子,1=20 第二格放2粒麦子,2=21 第三格放4粒麦子,4=22 5.3.1 固定次数的循环 例9 根据题目的描述,我们知道: 第一格放1粒麦子,1=20 第二格放2粒麦子,2=21 第三格放4粒麦子,4=22 第四格放8粒麦子,4=23 …… 第64格应该有263粒麦子。 分析:
5.3 循环结构 5.3.1 固定次数的循环 例9 这实际上是计算: 分析: 为了简单直观起见,假设程序中我们 用S表示待求的和 用I表示累加的数据
5.3 循环结构 5.3.1 固定次数的循环 K代表第I项的累加值 这实际上是计算: 例9 Dim I%, S# ,K# Const T = 142000000# S = 0 For I = 0 To 63 S = S + 2 ^ I Next I lblTotal.Caption = lblTotal.Caption & " " & S lblVolume.Caption = lblVolume.Caption _ & " " & S / T & " 立方米" ,K# S = 1: K = 1 For I = 1 To 63 K = 2 * K S = S + K Next I
5.3 循环结构 5.3.1 固定次数的循环 例10 编写程序,判断输入的整数是否是素数。 假设程序中我们用Num表示待判断的整数。依据素数的定义,我们不难得出判断Num 是不是素数的方法:将 Num 看作被除数,用 2~Num-1作为除数,一一判断,只有当从2~Num-1 之间的所有整数除 Num 后都不为整数时,Num 才为素数。 实际上,由定理保证,只要当从2 ~ 之间的所有整数除 Num后都不为整数,那么 Num 即为素数。 分析:
5.3 循环结构 5.3.1 固定次数的循环 例10 编写程序,判断输入的整数是否是素数。 程序中设置了一个逻辑型变量“Sign”,其初始值为“True”。循环体中的选择语句用来判断 Num 能否整除循环变量 I 。如果能整除,则 Num 不为素数。此时,令Sign取值“False”。当确认了 Num 不为素数以后,循环就不需要再继续下去了。因此,程序中可以使用Exit For语句退出循环。 循环结束后,对 Sign 进行判断,如果 Sign 的值为“True”,则在标签控件“lblResult”的“Caption”中显示“是素数”;否则就显示“不是素数”。 分析:
5.3 循环结构 5.3.1 固定次数的循环 例10 编写程序,判断输入的整数是否是素数。
5.3 循环结构 转下页 5.3.1 固定次数的循环 例10 编写程序,判断输入的整数是否是素数。 Dim I&, Num& Dim Sign As Boolean Sign = True Num = Val(txtNum.Text) For I = 2 To Sqr(Num) If Num / I = Int(Num / I) Then Sign = False Exit For End If Next I 程序中设置了一个逻辑型变量“Sign”,其初始值为“True”。 当确认Num 不为素数时,令Sign取值“False”。使用Exit For语句退出循环。 转下页
5.3 循环结构 接上页 5.3.1 固定次数的循环 例10 编写程序,判断输入的整数是否是素数。 If Sign Then lblResult.Caption = "是素数" Else lblResult.Caption = "不是素数" End If 接上页
5.3 循环结构 5.3.2 条件循环 格式 While <条件> <循环体> Wend 功能 <循环体> Wend 功能 当“条件”成立时,顺序执行循环体。当“条件”不成立时,脱离循环,程序转到Wend后继续执行。
5.3 循环结构 5.3.2 条件循环 说明 (1) While和Wend必须配对使用。 (2) 为使程序正确执行,循环中必须有改变条 件的语句。 (3) 要想执行循环体,必须先执行While。
5.3 循环结构 5.3.2 条件循环 例11 有一张面积足够大的纸,如果可能,你将它不断的对折。编写程序,计算对折多少次以后可以超过珠穆朗玛峰(8844430mm)的高度? 分析: 我们用 H 表示纸张的厚度,对折一次其厚度就扩大一倍,即H=H*2,用N记录对折的次数 ,用条件控制,看折多少次以后可以超过8844430。
5.3 循环结构 5.3.2 条件循环 例11 有一张面积足够大的纸,如果可能,你将它不断的对折。编写程序,计算对折多少次以后可以超过珠穆朗玛峰(8844430mm)的高度?
5.3 循环结构 5.3.2 条件循环 例11 Private Sub cmdStart_Click() Dim H#, N% N = 0 H = Val(InputBox("输入纸的厚度(mm)")) lblPaper.Caption = "纸的厚度:" & H & "mm" While H <= 8844430 H = H * 2 N = N + 1 Wend lblH.Caption = "对折" & N & "次后的厚度为:" & H & "mm" End Sub
重复前一步直到将整个数据处理完毕(N=0) 5.3 循环结构 5.3.2 条件循环 例12 任给一自然数,编写程序,求其反序数 。 分析: 我们用N表示输入的自然数,用M表示其反序数 用N 与 10 求模,得出个位,该位计入M; 用N 除以10取整,去掉个位,然后再与10求模,得出新数据的个位,该位与M乘以10以后作和; 重复前一步直到将整个数据处理完毕(N=0)
5.3 循环结构 5.3.2 条件循环 例12 任给一自然数,编写程序,求其反序数 。
5.3 循环结构 5.3.2 条件循环 例12 任给一自然数,编写程序,求其反序数 。 这样修改条件 While N 结果会如何? Private Sub cmdStart_Click() Dim N&, M&, T% N = Val(txtN.Text) M = 0 While N <> 0 T = N Mod 10 M = M * 10 + T N = Int(N / 10) Wend txtM.Text = M End Sub 这样修改条件 结果会如何? While N
5.3 循环结构 5.3.2 条件循环 例12 任给一自然数,编写程序,求其反序数 。 能按字符处理吗? Private Sub cmdStart_Click() Dim N&, M&, T% N = Val(txtN.Text) M = 0 While N <> 0 T = N Mod 10 M = M * 10 + T N = Int(N / 10) Wend txtM.Text = M End Sub 能按字符处理吗?
5.3 循环结构 5.3.3 不固定次数的循环 先比较条件 1. 格式 格式1: Do [While|Until <条件>] <循环体> [Exit Do] Loop 格式2: Do <循环体> [Exit Do] Loop [While|Until <条件>] 后比较条件
5.3 循环结构 5.3.3 不固定次数的循环 功能 “While”,表示“当”条件成立时执行循环 (类似While-Wend循环)(当型循环); “Until”,则表示“直到”条件成立才不 执行循环 (条件为假时执行循环)(直到型循环)。
5.3 循环结构 5.3.3 不固定次数的循环 该循环的常用格式为 Do <循环体1> If <条件> Then Exit Do <循环体2> Loop 该格式中必须有一个语句决定是否退出Do循环
… 5.3 循环结构 5.3.3 不固定次数的循环 例13 编写程序, 求两个正整数的最大公约数。 我们用辗转相除的方法求出两个数A,B的最大公约数。辗转相除的方法就是求A除以B的余数,当这个余数为0时,除数即为最大公约数。 分析: 如果R≠0, A B B R … 直到R=0 则B为所求
5.3 循环结构 <>0 <>0 <>0 = 0 例如:A=72, B=28 A B R 72 28 5.3.3 不固定次数的循环 例13 编写程序, 求两个正整数的最大公约数。 例如:A=72, B=28 A 72 B 28 R 16 <>0 Mod 28 Mod 16 12 <>0 Mod 12 4 <>0 16 12 Mod 4 = 0
5.3 循环结构 5.3.3 不固定次数的循环 例13 编写程序, 求两个正整数的最大公约数。
5.3 循环结构 5.3.3 不固定次数的循环 例13 编写程序, 求两个正整数的最大公约数。 Dim A%, B%, R% A = Val(txtA.Text) B = Val(txtB.Text) Do R = A Mod B If R = 0 Then Exit Do A = B B = R Loop lblResult.Caption = "A、B 两数的最大公约数是:" & B
当条件循环中需要有中途退出时可以使用Do While语句 5.3 循环结构 5.3.3 不固定次数的循环 当条件循环中需要有中途退出时可以使用Do While语句 Do While <条件> <循环体1> If <条件> Then Exit Do <循环体2> Loop
5.3 循环结构 5.3.4 循环结构的嵌套 循环结构做为循环体的一部分出现时,就被叫做循环的嵌套。它实际上是循环结构中又包含了循环结构。这种嵌套可以是步长型循环的自身嵌套,可以是当型循环的自身嵌套,还可以是当型循环嵌套步长型循环或者步长型循环嵌套当型循环等。 包含循环结构的循环叫外循环,被包含的循环叫内循环。使用循环嵌套时一定要注意,内外循环不能交叉,各层循环的循环变量名不能相同。
5.3 循环结构 [ [ [ [ [ [ × √ 5.3.4 循环结构的嵌套 不能交叉 FOR A FOR B FOR C …… 5.3.4 循环结构的嵌套 不能交叉 [ FOR A FOR B FOR C …… NEXT C NEXT B NEXT A [ FOR A FOR B FOR C …… NEXT B NEXT A NEXT C [ [ [ [ × √
* ** *** **** ***** 5.3 循环结构 第 1 行 1 个“*”, 第 2 行 2 个“*”, …… 5.3.4 循环结构的嵌套 例14 利用循环语句编写程序,输出如下图形 : 分析: * ** *** **** ***** 第 1 行 1 个“*”, 第 2 行 2 个“*”, …… 第 5 行 5 个“*”, 第 I 行 ? 个“*” I
5.3 循环结构 5.3.4 循环结构的嵌套 例14 利用循环语句编写程序,输出如下图形 : 我们用外层 I 循环控制行数。 5.3.4 循环结构的嵌套 例14 利用循环语句编写程序,输出如下图形 : 我们用外层 I 循环控制行数。 内层 J 循环控制每行的符号“*”的个数。 有前面的分析我们知道,第 I 行 I 个“*”,也就是说,内层循环的终值与外层循环的当前值一致。同时每一行上的第一个“*“都从第一个位置开始显示。 分析:
* ** *** **** ***** 5.3 循环结构 5.3.4 循环结构的嵌套 例14 利用循环语句编写程序,输出如下图形 : 解法1 5.3.4 循环结构的嵌套 例14 利用循环语句编写程序,输出如下图形 : 解法1 …… For I = 1 To 5 For J = 1 To I Print "*" ; Next J Print Next I * ** *** **** *****
* ** *** **** ***** 5.3 循环结构 5.3.4 循环结构的嵌套 例14 利用循环语句编写程序,输出如下图形 : 解法2 5.3.4 循环结构的嵌套 例14 利用循环语句编写程序,输出如下图形 : 解法2 * ** *** **** ***** …… For I = 1 To 5 Print String(I, "*") Next I
5.3 循环结构 第1行首个“*”的位置 5, 第2行首个“*”的位置 4, 第3行首个“*”的位置 3, 第4行首个“*”的位置 2, 5.3.4 循环结构的嵌套 例15 利用循环语句编写程序,输出如下图形 : 第1行首个“*”的位置 5, 分析: 第2行首个“*”的位置 4, 第3行首个“*”的位置 3, 第4行首个“*”的位置 2, 第5行首个“*”的位置 1, 第I行首个“*”的位置 ? 6-I
5.3 循环结构 第 1 行 1 个“*”, 第 2 行 3 个“*”, 第 3 行 5 个“*”, 第 4 行 7 个“*”, 5.3.4 循环结构的嵌套 例15 利用循环语句编写程序,输出如下图形 : 分析: 第 1 行 1 个“*”, 第 2 行 3 个“*”, 第 3 行 5 个“*”, 第 4 行 7 个“*”, 第 5 行 9 个“*”, 第 I 行 ? 个“*” 2*I-1
5.3 循环结构 5.3.4 循环结构的嵌套 例15 利用循环语句编写程序,输出如下图形 : 解法1 …… For I = 1 To 5 5.3.4 循环结构的嵌套 例15 解法1 利用循环语句编写程序,输出如下图形 : …… For I = 1 To 5 Print Tab(6-I); For J = 1 To 2*I-1 Print "*"; Next J Print Next I
5.3 循环结构 5.3.4 循环结构的嵌套 例15 解法2 利用循环语句编写程序,输出如下图形 : …… For I = 1 To 5 5.3.4 循环结构的嵌套 例15 解法2 利用循环语句编写程序,输出如下图形 : …… For I = 1 To 5 Print Tab(6-I);String(2*I-1, "*") Next I
5.3 循环结构 5.3.4 循环结构的嵌套 利用循环语句编写程序,输出如下图形 : ?
5.3 循环结构 ? A BBB CCCCC DDDDDDD EEEEEEEEE M GGG CCCCC HHHHHHH QQQQQQQQQ 5.3.4 循环结构的嵌套 利用循环语句编写程序,输出如下图形 : A BBB CCCCC DDDDDDD EEEEEEEEE M GGG CCCCC HHHHHHH QQQQQQQQQ A ABC ABCDE ABCDEFG ABCDEFGHI ? ?
5.3 循环结构 While For 三种循环语句的比较 For循环语句用于循环次数已知的情况,根据指定的次数重复执行For 和Next之间的循环体。 For
5.3 循环结构 三种循环语句的比较 DO Do循环实际上是不固定次数的条件循环,但它的形式非常灵活,既可以指定循环开始的条件,也可以指定循环结束的条件;既可以先判断条件,也可以后判断条件 Do循环常常使用Do—Loop格式。 Go!
第5章作业2 P116 习题:一、二 P121 习题:三 1. 2. 3.