第 8章 循环结构本章的学习要点
掌握 DO循环结构
掌握 For循环控制结构
循环的嵌套
常用算法概 述
单击窗体,要求在窗体上显示 6行星号
分析:
要求显示的信息是每行是由 16个星号所构成的字符串,所以可以通过连续 6次调用窗体的 Print方法实现图形的显示
Private Sub Form_Click()
Print "****************"
Print "****************"
Print "****************"
Print "****************"
Print "****************"
Print "****************"
End Sub
若要求显示 10行或更多行这样的信息
若打印信息的行数要求是由用户决定?
专门用于进行重复操作的语句结构概 述
所谓循环结构,表示在执行语句时,需要对其中的某个或某部分语句重复执行多次。对于此类情况可以利用各种循环结构来实现。
循环结构可以分为 For循环,Do 循环和 While循环语句结构。
循环
For循环
Do 循环
While循环
For…Next
For Each…Next
前测型循环后测型循环当型循环直到型循环当型循环直到型循环
8.1 Do 循环
Do 循环可以分为前测型循环和后测型循环两种结构。
前测型循环 结构
语法格式:
True
循环条件循环体
False
格式 1 (当型 )
Do While 循环条件循环体
Loop
False
循环条件循环体
True
格式 2(直到型 )
Do Until 循环条件循环体
Loop
当型循环是当循环条件为 TRUE时进入循环;直到型则是为 FALSE进入循环。
8.1 Do 循环
Do 循环可以分为前测型循环和后测型循环两种结构。
后测型循环 结构
语法格式:? 格式 1 (当型 )
Do
循环体
Loop While 循环条件
格式 2 (直到型 )
Do
循环体
Loop Until 循环条件循环条件循环体
True
False 循环条件循环体
False
True
前测型循环是 先判断循环条件,循环体执行次数 ≥0; 后测型循环是 先执行循环体,循环体执行次数 ≥1。
8.1 Do 循环
单击窗体,要求在窗体上显示 6行星号
前测型 当型循环:
将上面的代码改为 前测型 直到型循环、后 测型 当型循环和后 测型 直到型循环。
Dim i As Integer '定义计数器变量 i来记录目前已输出的行数
i = 0
Do While i < 6 '当输出行数未达到 6行,反复执行下面语句
Print "****************"
i = i + 1 '每输出一行信息,计数器 i累加 1
Loop '返回到 Do While行
End Sub
Do Until i >5
Print "****************"
i = i + 1
Loop
Do
while i <6Until > 5Val(InputBox("请输入行数,"))
注意:
在 循环体中,至少要有一条语句使得循环趋结束,使循环语句在有限的时间内执行完毕,否则将会出现
,死循环,。
例,求 S=1+(1+2)+?+(1+2+3+?+100) 的值。
编写代码:
Private Sub Command1_Click()
Dim s As Long,n As Integer,k As Integer
Label1.Caption = "s=1+(1+2)+(1+2+3)+...(1+2+3+...100)=?"
s = 0,n = 0,k = 1
Do
n = n + k ’ 求“小和”,即求 s中的每一项的和。
s = s + n ’ 求“大和”,即求 s的累加和。
k = k + 1 ’,大和”的项数 (亦即“小和”中的末项值 )。
Loop While k <= 100
Label2.Caption = "s=1+(1+2)+(1+2+3)...+(1+2+3+...+100)=" & s
End Sub
8.1 Do循环
Untilk >100
8.1 Do 循环
设计采用欧几里德算法求解两个自然数的最大公约数的程序
算法分析:
,欧几里德算法,
① 输入两个自然数 m,n
② 求 m除以 n的余数 r
③ m←n
④ n←r
⑤ 若 r≠ 0,则重复执行 ②③
④ (循环 ),否则转 ⑥
⑥ 输出 m和 n的最大公约数 m
输入两个自然数 m,n
r=m Mod n
m=n
n=r
r<>0
输出最大公约数 m
开始结束
False
True
8.1 Do 循环
设计采用欧几里德算法求解两个自然数的最大公约数的程序
界面设计:
利用 文本框 来接收数据和显示结果,利用 命令按钮的单击事件 完成最大公约数的计算。
False
输入两个自然数 m,n
r=m Mod n
m=n
n=r
r<>0
输出最大公约数 m
开始结束
True
Private Sub Command1_Click()
Dim m As Integer,n As Integer,r As Integer
m = Val(Text1.Text)
n = Val(Text2.Text)
End Sub
Private Sub Command2_Click()
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
End Sub
Private Sub Command3_Click()
End
End Sub
Do
r = m Mod n
m = n
n = r
Loop While r <> 0
Text3.Text = m
8.1 Do 循环
设计一个小程序,能够实现接收若干的专家的考评打分,
输入 -1表示打分结束,最后计算出平均考评分
界面设计,
由于要接收的数据无法预知其个数,所以不适合利用文本框来接收数据,所以采用输入函数 InputBox,
结合循环实现
利用 窗体的单击事件完成最大公约数的计算,并在窗体上而显示结果输入一个专家打分 Mark
总分累加 Total = Total + Mark
输出平均考评分 Average
开始结束
False
True
总考评分清零 Total=0
Mark<>-1
输入下一个专家打分 Mark
Average= Total / Num
考评分个数清零 Num=0
考评分个数累加 Num = Num + 1
Private Sub Form_Click ()
Dim Total As Single,mark As Single,average As Single
Dim Num As Integer
Total = 0,Num = 0
mark = Val(InputBox("请输入第 " & Num + 1 & "个专家评分 (-1表示结束输入 ):"))
Do While mark <> -1
Total = Total + mark
Num = Num + 1
mark = Val(InputBox("请输入第 " & Num+1 & "个专家评分 (-1表示结束输入 ):"))
Loop
average = Total / Num
MsgBox Num & "个专家的平均分为," & average
End Sub
习 题
1,依次在输入 5,4,3,2,1,-1,输出结果是?
Private Sub Command_Click()
X=0
Do Until x = -1
a=Val(InputBox(,请输入 A的值,) )
b=Val(InputBox(,请输入 B的值,) )
x=Val(InputBox(,请输入 X的值,) )
a=a+b+x
print a
Loop
End Sub 输出两个结果,分别是 12和 2
习 题
2,依次在输入 5,4,3,2,1,-1,输出结果为 _______
Private Sub Command_Click()
X=0
Do Until x=-1
a=Val(InputBox(,请输入 A的值,) )
b=Val(InputBox(,请输入 B的值,) )
x=Val(InputBox(,请输入 X的值,) )
a=a+b+x
Loop
print a
End Sub 输出结果 只有一个,2
3,运行下列程序,单击窗体,则执行结果是()
Private Sub Form_Click()
s=0
Do
s=(s+1)*(s+2)
Number= Number+1
Loop Until s >= 30
Print Number ; s
End Sub
A) 0 1 B) 30 30 C) 4 30 D) 3 182
习 题
4,运行下列程序,单击窗体,则执行结果是()
Private Sub Form_Click()
b=1
a=2
Do While b < 10
b=2*a+b
Loop
Print b
End Sub
A) 13 B) 17 C) 21 D) 33
习 题习 题
5,运行下列程序,单击窗体,则执行结果是
Private Sub Form_Click()
a = 100
Do
s = s + a
a = a + 1
Loop While a > 111
Print a
End Sub
结果,a=101
6.运行下列程序,单击窗体,则执行结果是 _____
Private Sub Form_Click()
s = 0
i = 1
Do While i <=100
If (i \ 5) * 5 = i Then
s = s + 1
i = i + 1
End If
Loop
Print s
End Sub 结果,死循环习 题
7,运行下列程序,单击窗体,则执行结果是 ____
Private Sub Form_Click()
s = 0
i = 1
Do While i <=100
If (i \ 5) * 5 = i Then
s = s + 1
End If
i = i + 1
Loop
Print s
End Sub 结果,s=20
习 题
8.2 While循环
语法格式:
While 循环条件循环体
Wend
这种结构使用完全类似于 Do-Loop的当型循环 (格式 1),表示当循环条件为 True时,反复执行循环体,直到循环条件为 False为止。例如:求 S=1+( 1+2) +? ( 1+2+?+100 )的值。程序代码:
Private Sub Command_Click( )
Dim s as long,n as Integer,k as Integer
s=0:n=0:k=1
While k<=100
n=n+k:s=s+n:k=k+1
Wend
Label2.Caption=“1+ ( 1+2) +? ( 1+2+?+100 ) =” & s
语法格式如下,
For 循环变量 = 初值 to 终值 [step 步长 ]
执行语句
Next 循环变量
8.3 For…Next 循环
True
i<=终值循环体
False
i=i+步长控制变量 i=初值注意:
步长可以为正、负,也可以是整数或小数。若省略,默认值为 1。当步长为 正数 时,终值 >初值 ;为 负数 时,终值
<初值 。
Next表示循环控制变量取下一个值,
即,i=i+步长
For循环的循环次数由循环变量的初值、终值和步长决定:
Int((终值 -初值 )/步长 )+1
循环次数的一般计算公式:
Int((终值 -初值 )/步长 )+1
例如,
For I=2 to 18 step 3
c=c+1
Next I
上述 For的循环次数
=Int((18-2)/3)+1=6
第几次循环 I
没有进行循环时 2
1 5
2 8
3 11
4 14
5 17
6 20
8.3 For…Next 语句循环次数的两种特殊情况:
1,初值、终值和步长表达式中所包含的变量在循环体内被改变,也不会影响循环次数。
8.3 For…Next 语句例如:
c=18
For I=2 to c step 3
c=c+1
Next I
第几次循环 c I
未循环时 2
1 5
2 8
3 11
4 14
5 17
6 20
18
19
20
21
22
23
24
说明:
代码段中虽然变量 c在循环体内改变,
但循环控制变量 I的终值依旧为 18,并未改变,因此循环次数 =6
2,当循环变量在循环体内被重新赋值,则会影响和改变循环次数。
8.3 For…Next 语句例如:
c=18
For I=2 to 18 step 3
c=c+1
I=I+2
Next I
说明:
循环体中循环控制变量 I被改变,
循环次数由原来的 6次 变为 4次 。
第几次循环 c I
未循环时 2
1 4
2 9
3 14
4 19
18
19
20
21
22
7
12
17
22
8.3 For…Next 循环
For循环实现,单击窗体,要求在窗体上显示 6行星号
分析:
循环体,Print "****************",循环变量 I表示输出行,从 1变化到 6,即循环变量 I的初值为 1,终值为 6,步长为 1,循环次数为 6
Private Sub Form_Click()
Dim I As Integer '定义一个循环变量 I来控制输出的行数
'当输出行数没有超过 6行,就反复执行下面的语句
For I = 1 To 6 '步长为 1,可省略 Step 1
Print "****************"
Next I '完成 I根据步长完成递增,即 I = I + 1,并返回到 For行
End Sub
习 题
1,Private Sub Form_Click()
For I=7 to 90 step 5
print I
Next I
End Sub
上述程序共执行执行循环体的次数是()
A) 14 B) 15 C) 16 D) 17
2,在窗体上放置一个命令按钮,然后编写如下事件过程:
Private Sub Command1_Click()
x=5
For i = 1 to 20 Step 2
x = x + i \ 5
Next i
Print x
End Sub
程序运行后,单击命令按钮,输出结果为()
A) 21 B) 22 C) 23 D) 24
习 题
3,运行下列程序,单击窗体,则执行结果是()
Private Sub Form_Click( )
E = 1,F = 1
For j = 1 To 3
E=E + F,F = F+ E
Next j
Print E;F
End Sub
A) 6 6 B) 5 8 C) 13 21 D) 34 55
习 题
4,运行下列程序,单击窗体,则执行结果是()
Private Sub Form_Click( )
For j = 1 To 15
a = a + j Mod 3
Next j
Print a
End Sub
A) 1 B) 15 C) 90 D) 120
习 题
5,运行下列程序,单击窗体,则执行结果是()
Private Sub Form_Click( )
For j = 1 To 3
Print Tab(3 * j);(2 * j - 1) * (2 * j - 1)
Next j
Print
End Sub
A) B)
C) D);?
若 print语句后有分号,将如何输出有分号的输出结果习 题
6,运行下列程序,单击窗体,则执行结果是()
Private Sub Form_Click( )
For j = 1 To 10
a = a + j \ 3 + j Mod 3
Next j
Print a
End Sub
A) 20 B) 25 C) 30 D) 35
习 题
8.4 循环嵌套
无论是 Do循环,还是 For-Next循环,都可以在大循环中套小循环以嵌套方式使用,而且允许不同类型的循环相互嵌套使用。
嵌套的层数没有具体限制,但必须注意,每一个循环必须有一个唯一的循环控制变量 (不能同名 );内层的小循环一定要完整地被包含在外层的大循环之内,
不得相互交叉 。 For i = 1 To 9
For j = 1 To 9
循环体
Next j
Next i
8.4 循环嵌套
用循环实现打印九九乘法表。
Private Sub form_Click()
For i = 1 To 9
For j = 1 To i
Print i & "*" & j & "=" & i * j & " "
Next j
Next i
End Sub
8.4 循环嵌套
用循环实现打印九九乘法表 。
Private Sub form_Click()
For i = 1 To 9
For j = 1 To i
Print i & "*" & j & "=" & i * j & " ";
Next j
Next I
End Sub
8.4 循环嵌套
用循环实现打印九九乘法表。
Private Sub form_Click()
For i = 1 To 9
For j = 1 To i
Print i & "*" & j & "=" & i * j & " ";
Next j
Print
Next I
End Sub
8.4 循环嵌套
用循环实现打印九九乘法表。
Private Sub form_Click()
For i = 1 To 9
For j = 1 To i
Print Tab((j - 1) * 7 + 2);i & "*" & j & "="
& i * j & " ";
Next j
Print
Next I
End Sub
常用算法介绍累加累乘迭代法素数问题穷举法求最大值或最小值问题
例题:求 1+2+3… +n
分析:求多项数据之和,首先得设置一个累加器 sum,
存放累加结果。根据一般人们求和的步骤,多个数据累加的过程如下:
sum=0
sum=sum+1
sum=sum+2
sum=sum+3
……
sum=sum +n
累 加求多项数据之和,整个累加过程一直在重复执行 sum = sum + i,一共重复 n次。
例题:求 1+2+3… +n
程序代码设计:
累 加
Private Sub Form_Click()
Dim sum As Integer,i As Integer
n = Val(InputBox("请输入累加的终值 n,"))
sum = 0 '累加器清零
For i = 1 To n
sum = sum + i '累加
Next i
Print "1+...+"; n; "="; sum
End Sub
求 1~n之间所有的 偶数 之和
例题:求 10!
程序代码设计,
累 乘
Private Sub Form_Click ()
Dim x As Long
x = 1
For i = 1 To 10
x = x * i
Next i
MsgBox "10!的值为," & x
End Sub
求最大值或最小值问题
求班级学生某一门课成绩的最高分?
这就是一个求最大值的问题。先假设第一个成绩就是班级最高分,然后从第二个成绩开始依次与假设的最高分比较,若有高于它的,则更新最高分,否则继续下一个成绩的比较,直至最后一个成绩
Private Sub form_Click()
Dim grade As Single
Max = 0
For i = 1 To 2 '假设班级人数为 20人
grade = Val(InputBox("请输入第 " & i & "个学生的成绩,"))
If grade > Max Then Max = grade
Next i
Print
Print "最高分为 "; Max
End Sub
迭代法
求多项式的值,直到最后一项的绝对值小于 10-6
分析:
方案 2,迭代法 —— 通过找出 前后累加项之间的关联,在前一次累加项的基础上递推出后一个累加项,从而实现 t
的构造
......!!!! 87654321
!2
1
1?t 41431
3
2
1
4
3 1
2 ****!!
tt
nn
t
nnn
n
n
n
n
nt n
n 232212112
12
12
112
2
12 1
*)(*)(*))((
)(*
))!((
))((
!
)(




nn
tt
232 *)(?

63653
5
4
3
6
5 2
3 ****!!
tt
迭代法
求多项式的值,直到最后一项的绝对值小于 10-6
Private Sub Form_Click()
n = 1,t = 1 / 2,Sum = t '累加器等变量设置初始值
Do Until Abs(t) < 10 ^ (-6) '累加到最后一项的绝对值小于 10-6
n = n + 1 '第 n个累加项
t = -t / (2 * n - 3) / (2 * n) '根据前一累加项构造 t
Sum = Sum + t '累加
Loop
End Sub
......!!!! 87654321
nn
tt
232 *)(?
迭代法:
素数问题
素数 就是大家在数学中熟知的质数,即 一个大于 1且只能被 1和它本身整除的整数
输入一个正整数,判断该正整数是否为素数
分析:
从素数的定义出发:既然素数除了 1和它本身之外,
不能被任何数整除,那么就把待判断的数 X依次与除了 1和它本身之外的其他所有的数进行除,看是否有整除的情况;若有,表示 X不是素数,否则就是素数。
除数的范围 i从 2开始到 X-1(因为一个数不可能能整除比它自身大的数 ),由于要对这个范围内的每一个数都进行相同的重复除操作,所以使用循环素数问题
输入一个正整数,判断该正整数是否为素数
Private Sub Form_Click()
Dim x As Integer
x = Val(InputBox("请输入一个正整数,"))
For i = 2 To Sqr(x)
'如果能被某个数据整除,x就不是素数,直接提前结束循环
If x Mod i = 0 Then Exit For
Next i
If i <= Sqr(x) Then '若 i<=Sqr(x)循环非正常结束,说明 x不是素数
MsgBox CStr(x) & "不是素数 "
Else '如果 x不能被 [2,Sqr(x)]整除,则循环正常结束,i>Sqr(x),即说明 x是素数
MsgBox CStr(x) & "是素数 "
End If
End Sub
穷举法
编写“百元买百鸡”的程序:鸡翁一值钱五;鸡母一值钱三;鸡雏三值钱一。百钱买百鸡。请问鸡翁、鸡母、鸡雏各多少只?Private Sub Form_Click()
Print "鸡翁 ","鸡母 ","鸡雏 "
For i = 1 To 100
For j = 1 To 100
k = 100 - i - j
If 5 * i + 3 * j + k / 3 = 100 Then
Print i,j,k
End If
Next j
Next I
End Sub