第5章 循环结构 本章要点: For循环 While循环 Do循环
所谓循环结构,表示在执行语句时,需要对其中的某个或某部分语句重复执行多次。对于此类情况可以利用各种循环结构来实现。 循环结构可以分为For循环、While循环和Do循环语句结构。
6.1 For循环 1. 格式 For <循环变量>=<初值> To <终值> [Step <步长>] <语句组1> [Exit For] <语句组2> Next [<循环变量>] 初值 循环变量 T 循环变量值超过终值? F 2. 功能: 执行过程如流程图所示 执行循环体 循环变量+步长 循环变量 后续语句
3. 说明 1) 循环变量——数值型变量 2) 初始值——数值型变量 3) 终值——数值型变量 4)步长——数值型变量 5) 循环体——需要重复执行的部分 4) Exit For——退出循环,常放在条件语句中 5) Next循环变量——之后的循环变量应与For语句中的循环变量一致,也可以省略
例5.1,编写程序,在窗体上输出一行由6个“*”组成的图形 Private Sub Form_Click() For I = 2 To7 Print "*"; Next I End Sub
例5.2 以“顺序输出10以内所有奇数”为例,来进一步理解For循环的执行过程。 程序语句及执行过程如下: 程序语句: For i = 1 To 10 Step 2 Print i; Next i
执行过程: (1)系统把初值1赋给循环变量i,记下终值10和步长2。 (2)判断i是否大于终值10。 i > 10则时转到(5)。 i ≤ 10时执行循环体“Print i;”。 (3)执行Next语句,相当于执行语句“i = i + 2”。 (4)转到(2),继续执行。 (5)结束循环,执行Next后面的语句。 上述程序语句在执行时,共进行6次判断,执行5次循环体,分别输出1、3、5、7、9这5个奇数,循环变量的值最终为11。
例5.3 计算S=1+2+3+…+n。(n由用户输入) 这是一个“累加求和”的问题。解决这类程序时,通常是引入一个用来存放“和”值的单元S,然后循环地向S中加入一个加数,最后,在变量S中存放的就是累加的结果。 程序代码如下: n = InputBox("input n") S =0 For I = 1 To Val(n) S = S + I Next I Print S
例: 判断以下程序段的执行结果: For i = 5 To 1 Step -1 Print i * i; Next i Print Print i 例: 判断以下程序段的执行结果: X = 6 For K = 1 To 10 Step -2 X = X + K Next K Print K,X K=1;超过终值 不进入循环
累加分析: 流程图: 输入N的值,求1+2+3+4+…+N 累加器(变量)初始化 Sum=0 重复执行(循环体) Sum=Sum+I (I=1,2,…,N) 流程图: F 0Sum ,1I I>N? I+1I Sum+ISum T 输入N 输出Sum
设计界面: Text1 Label3 Command1 运行界面:
代码: Private Sub Command1_Click() Dim N As Integer, I As Integer, Sum As Integer N = Val(Text1.Text) ' 输入累加总项数 Sum = 0 ' 设累加和初值为0 For I = 1 To N Sum = Sum + I ' 循环体:和值=和值+累加项 Next I Label3.Caption = Sum ' 输出累加结果 End Sub
5.2 While循环 问题: 求12+22+32+42+…大于某数N的最小值,N由用户指定。 特点: 已知循环条件、未知循环次数, 1. 格式 While <条件> [<语句组>] Wend 2. 功能 F 条件? 语句组 T
例如: Private Function Sum2(n As Integer ) As Integer Dim s, i As Integer i=1 While( i<=n) s=s + i ; i= i+ 1 Wend Sum2=s End Function
流程图: F I<=N S=S+I T 输入N I=I+1 0S,1I 输出S
例5.4 Private Sub Form _ Click() a = 1000 found = 0 While ( found<>10) a =a-1 If a Mod 13 = 0 And a Mod 7 = 0 Then found = found + 1 Print a ‘输出每次找到的数字 End If Wend End Sub
例5.5 Private Sub Form_Click() '单击窗体时执行 Dim n%, f% While f < 500 '不断执行循环体,直到f >= 500为止 n = n + 1 f = f * n Wend Print n; "! ="; f '显示阶乘第一次大于500的数及其阶乘 f = f / n '求此数前一个数的阶乘 n = n - 1 '求此数的前一个数 Print n; "! ="; f '显示阶乘最接近500但又不大于500的数及其阶乘 Print “ N =”; n ‘显示要找的正整数N End Sub
While...Wend循环可以使用Do...Loop循环来代替,但Do...Loop循环具有更多的形式。
5.3 Do循环 1. 格式 2. 功能 格式一: Do While <条件> F [<语句组1>] 条件? 循环体 T F 格式一: Do While <条件> [<语句组1>] [Exit Do] [<语句组2>] Loop 条件? 循环体 F T 格式二: Do Until <条件> [<语句组1>] [Exit Do] [<语句组2>] Loop
格式 功能 条件? 循环体 T F 格式三: Do [<语句组1>] [Exit Do] [<语句组2>] Loop While <条件> 条件? 循环体 T F 格式四: Do [<语句组1>] [Exit Do] [<语句组2>] Loop Until<条件>
3. 说明 1) Exit Do语句用于退出循环体 2) 也可以在Do语句和Loop语句之后都没有条件, 这时在循环体内必须有强行退出循环的语句即: Do [<语句组1>] Exit Do [<语句组2>] Loop 3) 当型循环可能一次都不执行;而直到型循环至少要执行一次循环体。多数情况下,当型循环和直到型循环可互相代替。
Private Function Sum4(n As Integer) As Integer Dim s,i As Integer i=1 例如: Private Function Sum3(n As Integer) As Integer Dim s,i As Integer If n=1 Then Sum3=1 Else i=1 Do s=s+i:i=i+1 Loop (i<=n) Sum3=s End If End Function Private Function Sum4(n As Integer) As Integer Dim s,i As Integer i=1 Do While (i<=n) s=s+i:i=i+1 Loop Sum4=s End Function
5.4 中途跳出语句 (1)exit for:用于中途跳出for循环,可以直接使用,也可以用条件判断语句加以限制。 (2)exit do:用于中途跳出do循环,同上类似。 (3)exit sub:用于中途跳出sub过程,既可以直接使用,也可以用条件判断语句限制使用。 (4)exit function:用于中途跳出function过程,可以直接使用,也可以用条件判断语句限制使用。 使用上述几种中途跳出语句,可以为某些循环体或过程设置明显的出口,能够增强程序的可读性。
例如: Private Function Sum5( n As Integer) As Integer Dim s , i As Integer i = 1 Do If ( i >= n) Then Exit Do s = s+ i; i = i +1 Loop Sum5 = s End Function
5.5图片框 图片框用于在窗体的特殊位置上放置图形信息,也可以在其上放置多个控件,因此它可以作为其他控件的容器。 1.常用属性 2.常用事件和方法 3.应用例子
常用属性 图片框的常用属性如下。 (1)Appearance属性 返回/设置一个对象在运行时是否以3D效果显示。 (2)AutoRedraw属性 返回/设置从图形方法到一个持久性位图的输出。 (3)AutoSize属性 决定控件是否能自动调整大小以显示所有的内容。 (4)Picture属性 返回/设置图片框控件中显示的图形。在设置时,设计阶段可直接利用属性窗口指定,运行阶段可使用LoadPicture函数加载
设计一个窗体,以命令按钮选择方式显示春、夏、秋、冬四个季节的图片。如图4.10所示是一幅春天的图片。 首先添加一个窗体,在其中放置一个图片框Picture1和4个命令按钮(使用Command1控件数组)。在该窗体上设计如下事件过程: Private Sub Command1_Click(Index As Integer) Select Case Index Case 0 Picture1.Picture = LoadPicture("e:\sf\spring.jpg") Case 1 Picture1.Picture = LoadPicture("e:\sf\summer.jpg") Case 2 Picture1.Picture = LoadPicture("e:\sf\fall.jpg") Case 3 Picture1.Picture = LoadPicture("e:\sf\winter.jpg") End Select End Sub
5.6图像框 图像框用来显形图形,可以显示位图、图标、图元文件、增强型图元文件、JPEG或GIF文件。 图像框与图片框的区别是:图像框控件使用的系统资源比图片框少而且重新绘图速度快,但它仅支持图片框的一部分属性、事件和方法。两种控件都支持相同的图片格式,但图像框控件中可以伸展图片的大小使之适合控件的大小,而图片框控件中不能这样做。 1.常用属性 2.常用的事件和方法 3.应用例子
常用属性 (1)Appearance属性 返回/设置一个图像框在运行时是否以3D效果显示。 (2)Picture属性 返回/设置图像框控件中显示的图形。在设置时,设计阶段可直接利用属性窗口指定,运行阶段可使用LoadPicture函数加载。 (3)Stretch属性 返回/设置一个值,决定是否调整图形的大小以适应图像框控件。该属性取值如下: · False:这是默认值,当图形载入时,图像框本身会自动调整大小,使得图形可以填满图像框。 · True:当图形载入时,图形自动调整大小,填满整个图像框。
设计一个窗体,说明图像框Stretch属性的作用。 首先添加一个窗体,在其中放置1个图像框Image1(其Picture属性设置为“e:\media\ happy.bmp”)和2个命令按钮(分别为Command1和Command2)。在该窗体上设计如下事件过程: Private Sub Command1_Click() '实现 "原大小"功能 Image1.Width = 1000 ' 设置图像框大小 Image1.Height = 1000 Image1.Stretch = False End Sub Private Sub Command2_Click() '实现"放大"功能 Image1.Stretch = True
5.7计时器 计时器控件在设计时可看见它,在运行时它就隐藏起来,但是在后台每隔一定时间间隔,系统就会自动执行一次计时器事件。所谓时间间隔,指的是各个计时器事件之间的时间,一般以毫秒(ms)为基本单位。因为计时器在1秒钟内最多产生18个事件,所以两个事件之间的时间间隔精确度不超过1/18s。 1.常用属性 2.常用事件和方法 3.应用例子
常用属性 (1) Enabled属性 决定计时器控件是否开始计时。其语法如下: Object.Enabled=True或False 若设置为True(默认值),表示启动计时器开始计时;否则,表示暂停计时器的使用,在需要启动计时器时再将Enabled属性设置为True即可。 (2)Interval属性 设置两个计时器事件之间的时间间隔。设置时以毫秒为单位,设置的范围是0~65 535ms。若将Interval属性值设置为1000ms,即将时间间隔设置为1s,则每隔1s就会执行一个计时器时间。由此可以看出,若想在1s内执行n个计时器事件,则必须将Interval属性的值设置为1000/n才可以实现。系统初始值设置为0。
设计一个窗体说明计时器的基本应用方法。 首先在本章工程中添加一个窗体,在其中放置两个标签(Label1和Label2)和一个计时器Timer1,该计时器的Interval属性设置为100。并在该窗体上设计如下事件过程: Private Sub Timer1_Timer() Label2.Caption = Time End Sub 执行本窗体,其界面如图4.18所示。
本章小结 1. For循环 For <循环变量>=<初值> To <终值> [Step <步长>] <语句组1> [Exit For] <语句组2> Next [<循环变量>] 2. While循环 While <条件> [<语句组>] Wend
Do [{While|Until}<条件>] Loop [{While|Until}<条件>] [<语句组1>] [Exit Do] [<语句组2>] Loop Do [<语句组1>] [Exit Do] [<语句组2>] Loop [{While|Until}<条件>]