课件59张PPT。循环结构 Do Loop之“当”循环形式1: 形式2:
Do While <条件表达式> Do
语句块(循环体) 语句块(循环体)
Loop Loop While <条件表达式>当条件为真(true)时循环!Do Loop循环示例1Private sub Form_click()
num=1
Do while num<=10
Print num
Num=num+1
Loop
End subPrivate sub Form_click()
num=1
Do
Print num
Num=num+1
Loop while num<=10
End subS=1+2+3+……+100Private Sub Form_Click()
Dim i As Integer ‘i为累加数
Dim sum As Integer ‘sum为累加和
i =1
sum = 0
Do While i <= 100
sum = sum + i
i = i + 1
Loop
Print sum
End SubS=1+2+3+……+100Private Sub Form_Click()
Dim i As Integer
Dim sum As Integer
i = 1
sum = 0
Do
sum = sum + i
i = i + 1
Loop While i <= 100
Print sum
End SubDo Loop之“直到”循环形式1: 形式2:
Do Until <条件表达式> Do
语句块(循环体) 语句块(循环体)
Loop Loop Until <条件表达式>直到条件为真(true)时退出循环!S=1+2+3+……+nPrivate Sub Command1_Click()
Dim i As Integer, n As Integer
Dim sum As Integer
n = Val(Text1.Text)
sum = 0
i = 1
Do Until i > n
sum = sum + i
i = i + 1
Loop
Text2.Text = sum
End SubS=1+2+3+……+n
Private Sub Command1_Click()
Dim i As Integer, n As Integer
Dim sum As long
n = Val(Text1.Text)
sum = 0
i = 1
Do
sum = sum + i
i = i + 1
Loop Until i > n
Text2.Text = sum
End Sub
5.2 For 循环语句
For循环语句是计数型循环语句,用于控制循环次数已知的循环结构。语句形式如下:
For 循环变量 = 初值 To 终值 [Step 步长]
[循环体]
Next [循环变量] For 循环变量 = 初值 To 终值 [Step 步长]
[循环体]
Next [循环变量] (1)“循环变量”:必须为数值型,取值范围在初值和终值之间。
(2)“初值”、“终值”:都是数值型,可以是数值表达式。
(3)“步长”:是数值型,可以是数值表达式。 步长不能为0。如果步长是1,则Step 1可以省略不写。
(4)“循环体”:在For和Next之间一条或多条语句,他们将被执行指定的次数
。
(5)Next后面的循环变量与For语句中的循环变量必须相同。使用For循环计算1+3+5+……+99的值 Private Sub Command1_Click()
Dim i As Integer, n As Integer
Dim sum As Integer
sum = 0
For i = 1 to 99 step 2
sum = sum + i
Next i
Print sum
End SubFor 循环变量 = 初值 To 终值 [Step 步长]
[循环体]
Next [循环变量] 使用For循环计算1+3+5+……+99的值 Private Sub Command1_Click()
Dim i As Integer, n As Integer
Dim sum As Integer
sum = 0
For i = 99 to 1 step -2
sum = sum + i
Next i
Print sum
End SubFor 循环变量 = 初值 To 终值 [Step 步长]
[循环体]
Next [循环变量] For 和Do Loop的比较采用For语句比Do Loop更加简明。
一般情况下,能够预先确定循环次数时,应优先采用For语句,否则的话应该使用Do Loop语句【例 5.13】利用随机数函数模拟抛硬币采用的方法是:每次随机产生一个0或1的整数,相当于一次投币,1代表正面,0代表反面。在窗体上有三个文本框,名称分别是Text1、Text2、Text3,分别用于显示用户输入抛硬币次数、出现正面的次数和出现反面的次数,如图所示。Private Sub Command1_Click()
Dim n As Long
Dim n1 As Long, n2 As Long
Randomize
n = Val(Text1.Text)
n1 = 0
n2 = 0
For i = 1 To n
r = Int(Rnd * 2)
If r = 1 Then
n1 = n1 + 1
Else
n2 = n2 + 1
End If
Next
Text2.Text = n1
Text3.Text = n2
End Sub 循环的嵌套——多重循环结构
如果在一个循环内完整地包含另一个循环结构,则称为多重循环,或循环嵌套,嵌套的层数可以根据需要而定,嵌套一层称为二重循环,嵌套二层称为三重循环。
下面是几种常见的二重嵌套形式:(1)For I=….
…..
For J=….
….
Next J
…..
Next I(2)For I=….
…..
Do While/Until ….
….
Loop
…..
Next I(3)Do While….
…..
For J=….
….
Next J
…..
Loop(4)Do While/Until….
…..
Do While/Until ….
….
Loop
…..
Loop循环嵌套Private Sub Form_Click()
Dim i As Integer, j As Integer
For i = 1 To 3
Print "i=” ; i
For j = 1 To 3
Print Tab; "j="; j
Next j
Next I
End Sub图5.6 例5.4显示结果循环嵌套For i = 1 To 3 Step 1
Print "i=” ; i
For j = 1 To 3 Step 1
Print Tab; "j="; j
Next j
Next ii=1i<=3i=i+1Print "i=” ; i
For j = 1 To 3
Print Tab; "j="; j
Next jNY循环嵌套i=1i<=3i=i+1Print “i=“;ij=j+1j=1j<=3Print Tab; "j="; jYNYNFor i = 1 To 3 Step 1
Print "i=” ; i
For j = 1 To 3 Step 1
Print Tab; "j="; j
Next j
Next i循环嵌套For i = 1 To 3 Step 1
Print "i=” ; i
For j = 1 To 3 Step 1
Print Tab; "j="; j
Next j
Next ii=1i<=3i=i+1Print "i=” ; i
For j = 1 To 3
Print Tab; "j="; j
Next jNY循环嵌套i=1i<=3i=i+1Print “i=“;ij=j+1j=1j<=3Print Tab; "j="; jYNYNFor i = 1 To 3 Step 1
Print "i=” ; i
For j = 1 To 3 Step 1
Print Tab; "j="; j
Next j
Next i循环嵌套For i = 1 To 3
Print "i=” ; i
For j = 1 To 3
Print Tab; "j="; j
Next j
Next ii=1i<=3i=i+1j=j+1j=1j<=3Print Tab; "j="; jYNYN【例5.8】将一角钱换成零钱(可以包括含1分、2分、5分中的任意多个面值),共有多少种换法?
组成一角的零钱中,最多有10个1分、5个2分、2个5分。判断所有的组合中,总和正好是一角(10分)的情况有多少次即为所求。这类方法称为“穷举法”,也称“枚举法”。 Private Sub Command1_Click()
Dim i As Integer, j As Integer, k As Integer
Dim n As Integer
Print "1分个数", "2分个数", "5分个数"
For i = 0 To 10
For j = 0 To 5
For k = 0 To 2
If i + j * 2 + k * 5 = 10 Then
n = n + 1
Print i, j, k
End If
Next
Next
Next
Print "共有" & n & "种方法"
End Sub图5.8 例5.8显示结果打印图案*
* * *
* * * * *
* * * * * * **
* * *
* * * * *
* * * * * * ** * * * * *
* * * * * *
* * * * * *
* * * * * ** * * * * * *
* * * * *
* * *
*0
1 1 1
2 2 2 2 2
3 3 3 3 3 3 31
1 2 3
1 2 3 4 5
1 2 3 4 5 6 71
1 2 1
1 2 3 2 1
1 2 3 4 3 2 1 A
A B A
A B C B A
A B C D C B A打印图案和九九乘法表*
# # #
* * * * *
# # # # # # #* # * # * # *
* # * # *
* # *
*自顶向下、逐步求精
分而治之
For i=1 to 4
打印第i行
换行
Next i* * * * * *
* * * * * *
* * * * * *
* * * * * *打印第一行星号;换行
打印第二行星号;换行
打印第三行星号;换行
打印第四行星号;换行分析:……?For i=1 to 4
打印第i行
换行
Next i* * * * * *
* * * * * *
* * * * * *
* * * * * *For i=1 to 4
For j=1 to 6
同行打印第 j 颗 “*”
Next j
print
Next iFor i=1 to 4
打印第i行
换行
Next i* * * * * *
* * * * * *
* * * * * *
* * * * * *For i=1 to 4
For j=1 to 6
同行打印第 j 颗 “*”
Next j
print
Next iFor i=1 to 4
打印第i行
换行
Next i* * * * * *
* * * * * *
* * * * * *
* * * * * *For i=1 to 4
For j=1 to 6
同行打印第 j 颗 “*”
Next j
print
Next i* * * * * *
* * * * * *
* * * * * *
* * * * * *For i=1 to 4
For j=1 to 6
同行打印第 j 颗 “*”
Next j
print
Next iDim i%, j%
For i=1 to 4
for j=1 to 6
print "* " ;
next j
print
Next i*
* * *
* * * * *
* * * * * * *For i=1 to 4
打印第i行
换行
Next iFor i=1 to 4
For j=1 to 2*i-1
同行打印第 j 颗 “*”
Next j
print
Next i*
* * *
* * * * *
* * * * * * *For i=1 to 4
打印第i行
换行
Next iFor i=1 to 4
For j=1 to 2*i-1
同行打印第 j 颗 “*”
Next j
print
Next i*
* * *
* * * * *
* * * * * * *For i=1 to 4
打印第i行
换行
Next iFor i=1 to 4
定位第一颗星;
For j=1 to 2*i-1
同行打印第 j 颗 “*”
Next j
print
Next i*
* * *
* * * * *
* * * * * * *For i=1 to 4
定位第一颗星;
For j=1 to 2*i-1
同行打印第 j 颗 “*”
Next j
print
Next iFor i=1 to 4
print tab(5-i);
For j=1 to 2*i-1
print “*”;
Next j
print
Next iFor i=1 to 4
定位第一颗星?;
For j=1 to ?
同行打印第 j 颗 “*”
Next j
print
Next iFor i=1 to 4
print tab(i);
For j=1 to 9-2*i
print “*”;
Next j
print
Next i* * * * * * *
* * * * *
* * *
*打印图案*
# # #
* * * * *
# # # # # # #
If i Mod 2 = 0 Then
Print “#";
Else
Print “*";
End If
For i=1 to 4
print tab(5-i);
For j=1 to 2*i-1
????
Next j
print
Next i打印图案* # * # * # *
* # * # *
* # *
*
If j Mod 2 = 0 Then
Print "#";
Else
Print "*";
End IfFor i=1 to 4
print tab(i);
For j=1 to 9-2*i
????
Next j
print
Next i打印九九乘法表图5.7 例5.5显示结果Private Sub Form_Click( )
Dim se As String
Print Tab(35); "九九乘法表"
Print Tab(35); "-----------"
For i = 1 To 9
For j = 1 To 9
se = i & "×" & j & "=" & i * j
Print Tab((j - 1) * 9 + 1); se;
Next j
Print
Next i
End Sub
Private Sub Form_Click( )
Dim se As String
Print Tab(35); "九九乘法表"
Print Tab(35); "-----------"
For i = 1 To 9
For j = 1 To 9
se = i & "×" & j & "=" & i * j
Print se;
Next j
Print
Next i
End Sub
Private Sub Form_Click( )
Dim se As String
Print Tab(35); "九九乘法表"
Print Tab(35); "-----------"
For i = 1 To 9
For j = 1 To 9
se = i & "×" & j & "=" & i * j
Print Tab((j - 1) * 9 + 1); se;
Next j
Print
Next i
End Sub
Exit Do语句Exit Do语句可以用来结束Do..Loop循环。一般和选择结构语句一起配合使用。
它必须放置在Do..Loop语句的循环体中。当执行到Exit Do时,程序会立即结束循环,跳到loop后面执行下面的语句。
当有多个循环嵌套使用时,Exit Do语句只跳出所在的最内层的Do..Loop循环。S=1+2+3+……+100Private Sub Form_Click()
Dim i As Integer
Dim sum As Integer
i =1
sum = 0
Do
sum = sum + i
i = i + 1
If i > 100 Then Exit Do
Loop
Print sum
End SubExit For语句Exit For语句可以用来结束For..Next循环。一般也和选择结构语句一起配合使用。
它必须放置在For..Next语句的循环体中。当执行到Exit For时,程序会立即结束循环,跳到Next后执行下面的语句。
当有多个循环嵌套使用时,Exit For语句只跳出所在的最内层的For..Next循环。【例 5.7】给定一个数n,判断它是否是素数 分析:素数就是一个大于2且只能被1和本身整除的整数。
判断一个数是否为素数比较简单的方法是:用n逐个除以2~n-1之间的每个整数
只要有一个可以整除,则说明n不是素数;
如果全部不能整除,则说明n是素数。Private Sub Form_Click()
Dim i As Integer
Dim n As Integer
n = InputBox("请输入一个整数")
For i = 2 To n-1
If n Mod i = 0 Then
Exit For
End If
Next I
If i < n Then
Print n & "不是素数"
Else
Print n & "是素数"
End If
End Sub比较循环结束后循环变量i的值来判断是正常结束还是强行跳出,从而确定被验证的数n是否为素数。对于循环的嵌套,要注意以下事项:
(1) 内循环变量与外循环变量不能同名;
(2) 外循环必须完全包含内循环,不能交叉;
(3) 不能从循环体外转向循环体内,也不能从外循环转向内循环.
正 确 错 误 For ii =1 To 10
For jj=1 To 20
…
Next ii
Next jj For ii =1 To 10 For ii=1 To 20
…
Next ii
Next ii For ii =1 To 10
For jj=1 To 20
…
Next jj
Next ii For ii =1 To 10
…
Next ii
For ii =1 To 10
…
Next ii 常见题型数值计算
1!+2!+...+n!
1 - 1/3 + 1/5 - 1/7 + 1/9 +…
x - x3/3! + x5/5! - x7/7! + x9/9! - …
数值计算伪代码描述:
累加项(term)赋初值,累加和(sum)赋初值
while (……)
{
sum=sum+term;
求出下一轮的term;
}
关键问题:找出前项Xi和Xi+1后项之间的关系1!+2!+3!+……n!单循环实现
累加项(term)赋初值,累加和(sum)赋初值
while (……)
{
sum=sum+term;
求出下一轮的term;
}
双循环实现求自然对数e的近似值,要求其误差小于0.00001 Private Sub Form_Click()
Dim i%, n&, t!, e!
e = 0 ' 存放累加和结果
i = 0 ' 计数器
n = 1 ' 存放阶乘的值
t = 1 ‘ 级数第i项值
Do While t > 0.00001
e = e + t
i = i + 1
n = n * i ' 连乘,求阶乘
t = 1 / n ' 累加项
Loop
Print "计算了 "; i; " 项的和是 "; e
End SubFibonacci数列
1,1,2,3,5,8,13,21,34,55… 兔子繁殖问题求斐波那契数列前十五项Private Sub Form_Click()
Dim f1%, f2%, f3%, i%
f1=1
f2=1
print f1; f2
For i = 3 To 15
f3=f1+f2
print f3
f1=f2
f2=f3
Next
End Sub求最大公约数
【例 5.12】用辗转相除法求两自然数x、y的最大公约数。
算法描述如下:
x除以y得余数r;
若r=0,则y为求得的最大公约数,算法结束,否则执行步骤(3);
令x等于y,y等于r,重复执行步骤(1)。思考:请用Do While…Loop和Do…Loop Until改写辗转相除法求最大公约数 Private Sub Form_Click()
x = InputBox("输入x")
y = InputBox("输入y")
Do
r = x Mod y
If r = 0 Then Exit Do
x = y
y = r
Loop
Print "最大公约数为: "; y
End Sub作业 2求100以内的所有素数。
求斐波那契数列第多少项大于500,并打印出该项的值。
Do While…Loop和Do…Loop Until改写辗转相除法求最大公约数(选做)
作业 1鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,翁、母、雏各几何?
-《算经》张丘建
求100以内的所有素数。
打印讲到的各种星号组合。