高中信息技术第六章循环结构教学时间:授课班级:教学目标:学会用for …next语句和do…loop编写简单的程序,并会调试它教学重点、难点:1.For –next 语句的用法2.Do-loop语句的用法3.循环语句的嵌套教学过程在用计算机处理问题时,除了分支问题外,还有不少是需要重复执行某一组操作的问题。
这就要采用循环结构,VB中提供了两种语句实现循环结构,For-Next语句和Do-Loop语句。
【例6-6-1】求s=1+2+3+……+100利用赋值语句可写出如下形式的代码:sum=0sum= sum+1sum= sum+2sum=sum+3……sum=sum+100很显然,使用这种形式也能得到结果,但程序很冗长。
观察上面的代码可以发现,这段代码实际上重复了同一个操作:sum=sum+I,只不过是每次相加的自然数不同而已。
使用VB提供的循环语句可以很容易实现这种重复操作功能。
具体算法如下:①设sum=0;②设i=1;③假设i<=100如此转④,否如此算法停止,最后sum中的数值即是自然数列前100项之和;④将sum与i相加,其结果送给变量sum,即sum+i→sum;⑤使i值增加1,即i+1→i;⑥转③。
流程图如图6- 23,程序与运行结果如下:' 求1、2、3……、100之间自然数的和Private Sub Form_Click()Dim i As IntegerDim sum As Integersum = 0For i = 1 To 100sum = sum + i ' 循环体Next iPrint "sum="; sumEnd Sub运行结果为:sum= 5050一、For...Next循环这个程序中使用的是For...Next循环,它的一般形式是:For 循环变量=初值To 终值Step 循环变量增量循环体Next 循环变量循环变量的初值、终值、循环变量增量都是数值型。
其中要重复执行的操作称为循环体,增量可正可负,如果没有设置Step,如此增量的缺省值为1。
For-Next循环的执行过程是:①循环变量取初值;②循环变量与终值比拟,没有超过终值转③,否如此循环完毕,接着执行循环语句的后继语句;③执行一次循环体;④循环变量增加一个增量;⑤重复步骤②~④。
从上看出,For-Next循环变量是一种当型循环,图6-24是它的执行过程。
说明:①For语句与Next语句必须成对出现,而且它们当中的“循环变量〞必须是同一个变量,如本例中均为i;②当循环变量增量为正时,循环变量超过终值,是指循环变量的值大于终值,假设为负,如此是指循环变量的值小于终值。
图6-24从例6-6-1程序的流程图和For-Next循环的招待过程可以看出,执行For-Next循环时,先判断循环变量是否超过终值,如果没有超过终值,就执行循环体,这种循环称为当型循环,它的一般结构如图6-25所示。
循环体A执行有限次后,条件P不再成立,从而退出循环。
图6-25讨论与思考:⒈本例中循环完毕时,循环变量i的值是多少?⒉假设有如下一段代码:For j=15 to 3 Step –2Print jNext j如此循环完毕时,循环变量j的值是多少?⒊循环变量的增量能否为0,如果为0,运行结果怎样?【例6-6-2】设计一个界面如图6-26所示的程序,要求执行程序后,窗体上的星星在闪烁,单击“完图6-26毕〞按钮完毕程序。
为了实现星星闪烁的效果,本例设置了一个定时器控件,窗体启动后,每隔500ms触发一次Timer 事件,在该事件中使用循环语句随机产生50个坐标值,然后用窗体的Pset方法在这些坐标处画点,窗体上出现星星的效果,在Timer 事件的开头,使用Cls方法清屏,以产生闪烁效果。
完本钱程序需要在设计阶段设计的属性如表6-11。
程序代码如下:′星星闪烁Dim xpos As Integer, ypos As IntegerDim i As IntegerPrivate Sub Form_Load()tmrAnimation.Enabled = TrueRandomizeEnd SubPrivate Sub tmrAnimation_Timer()′清屏,产生闪烁效果ClsFor i = 1 To 50xpos = Int(frmCircle.Width * Rnd)ypos = Int(frmCircle.Height * Rnd)PSet (xpos, ypos)Next iEnd SubPrivate Sub cmdEnd_Click()EndEnd Sub二、Do...Loop循环For-Next循环的次数是确定的,有的问题只知道循环完毕的条件,重复执行的次数事先并不知道,这时需用Do-Loop循环。
格式一:Do While 条件循环体Loop当VB执行Do While -Loop循环时,先判断指定的条件是否为真,假设条件为真,执行循环体,条件为假时退出循环。
这也是一种当型循环。
【例6-6-3】设计一个界面如图6-27所示的程序,从键盘输入任意两个正整数a、b,输出它们的最大公约数。
图6-27本程序运行时,通过单击“计算〞按钮在“最大公约数〞框中显示a与b的最大公约数,因此,求最大公约数的代码就编写在“计算〞按钮的Click事件中。
完本钱程序界面需要设置的属性如表6-12。
表6-12缺省的对象名设置的对象名属性设置值Form1 frmDivisor Caption 最大公约数Label1 lbla Caption 输入ALabel2 lblb Caption 输入BLabel3 lblDivisor Caption 最大公约数Text1 txta Text 〔空白〕Text2 txtb Text 〔空白〕Text3 txtDivisor Text 〔空白〕Command1 cmdCalcu Caption 计算Command2 cmdEnd Caption 完毕求两个正整数a、b(a>b)的最大公约数的算法见例6-1-3,流程图见图6-3,程序代码如下:′求最大公约数Private Sub cmdCalcu_Click()Dim a As IntegerDim b As Integer Dim r As Integer a = Val(txta.Text) b = Val(txtb.Text) r = a Mod b Do While r <> 0 a = b b = r r = a Mod b LooptxtDivisor.Text = Str(b) End SubPrivate Sub cmdEnd_Click() End End Sub 格式二:Do 循环体Loop Until 条件这种循环的执行过程如图6-28所示,进入循环后,先执行一次循环体A ,然后再检查条件是否成立,如果不成立,就执行循环体A ,直到条件D 成立,退出循环。
这种循环结构称为直到型。
图6-28 【例6-6-4】 如果我国人口以每年平均1.5%的速度增长,问多少年后我国人口达到或超过15亿,设现在人口为12.3亿。
解决这个问题的思路是:设现在人口为p 0=12.3亿,人口增长率YAP N入口出口r=1.5%=0.015,如此一年后人口为p1=p0+p0×r=p0×(1+r),看它是否达到或超过15亿;如果未达到,再算二年后的人口p2=p1+p1×r=p1×(1+r);如果未达到,再计算三年后的人口……,直到n年后的人口数达到或超过15亿。
流程图见图6-29,程序代码如下:′直到型循环Private SubForm_Click()Dim pAs SingleDim rAs SingleDim nAs Integerp = 1230000000#r = 0.015n = 0Dop= p * (1 + r)n = n + 1Loop Until p >= 1500000000#Print n; "年后", "人口="; pEnd Sub运行结果如下;14年后人口=1.51506E+09三、循环的嵌套在一个循环中又完整地包含另一个循环,称为循环的嵌套。
前面介绍的几种类型的循环可以互相嵌套,例如可以在一个For-Next循环中包含另一个For-Next循环,也可以在一个Do-Loop循环中包含一个For-Next循环。
【例6-6-5**** 图6-29***** ******* ***** ****为解决这个问题,可以采用如下的算法:使用双重For-Next 循环,外循环确定行数和各行起始打印位置,内循环用来确定各行打印的个数。
设外循环的循环变量为i ,内循环的循环变量为j 。
由于图案上下对称,上下两半对应行的起始位置和字符个数完全一致,所以i 的取值也应对称:i=-3 To 3。
设i=0行的起始打印位置为5,如此第i 行的起始打印位置为Tab(Abs(i)+5),第i 行的字符的个数为2*(4-Abs(i))-1。
流程图如图6-30所示,程序代码如下:′打印菱形图案 Private Sub Form_Click() Dim i As Integer, j As Integer For i = -3 To 3Print Tab(Abs(i) + 5); ′确定每行的起始位置 For j = 1 To 2 * (4 - Abs(i)) - 1 Print "*"; Next jPrint ′换行 Next i End Sub【例6-6-6】求3到100之间的全部质数。
质数是除了1和它本身之外,不能被其它任何整数整除的大于1的自然数。
要验证一个自然数n 是否为质数,方法很多。
我们采用的算法是:一个数n 是否是质数,只需将n 被2~ 间全部整数除即可,如果都除不尽,n 就是质数。
图6-31先计算出k= ,然后将n 被i=2~k 除。
Flag 是个“标志变量〞,初始时Flag=0,表示n 未被任何一个整数整除,如果在某一次n 被一个整数i 整除,如此Flag 改变为1,明确该数不是质数。
如果n 不被任何一个i 整除,如此Flag 始终保持为0。
n nYYY NN NN Yn<=100因此,在完毕循环后根据Flag的值为0或1,来判断一个数是否为质数。
′求3到10之间的全部质数Private Sub Form_Click()Dim n As Integer, i As IntegerDim flag As IntegerDim kAs IntegerFor n = 3 To 100 Step 2k = Int(Sqr(n))i = 2flag = 0Do While i <= kIf n Mod i = 0 Thenflag = 1 ′n能被某一个数整除End Ifi = i + 1LoopIf flag = 0 Then Print n图6-31 Next nEnd Sub运行结果为:3 5 7 11 1317 19 23 29 3137 41 43 47 5359 61 67 71 7379 83 89 97说明:①由于偶数决不会是质数,不必对偶数进展测试,因此外循环的增量为2;②内循环中n Mod i=0中的Mod为取余运算,假设n能被i整除,如此余数为0;实践与探索请考察程序的内循环局部,如果n是一个质数,如n=11,如此内循环完毕时,标志变量flag的值仍为0;如果n不是一个质数,如n=63,如此进展第二次循环时,n能被3整除,此时flag的值为1,已经可以判断出n不是质数,但程序中的内循环仍然要执行6次,程序的效率不高。