资源描述
本节课我们将通过实例来加强对For循环语句的使用。
例1:求Fibonacci数列的前30个数。这个数列有如下特点:前两个数为1,从第三个数开始,其值是前两个数的和,即:
F1=1 (n=1) F2=1 (n=2) Fn= Fn-1+ Fn-2 (n≥3)
程序如下:
Private Sub Command1_Click()
Dim i As Integer
Dim f1 As Long, f2 As Long, fn As Long
f1 = 1
f2 = 1
Print f1,
Print f2,
For i = 3 To 30 ' f1,f2已知,从第三个数开始计算
fn = f1 + f2
f1 = f2
f2 = fn ' 更改f1,f2的值
Print fn,
If i Mod 4 = 0 Then Print ' 打印4个数后换行打印
Next
End Sub
例2:利用随机数函数模拟投币,方法是:每次随机产生一个0或1的整数,相当于一次投币,1代表正面,0代表反面
1、设计界面
在窗体上添加三个标签、三个文本框和一个命令按钮。初始界面如图7-3所示。
图7-3-1 初始界面 图7-3-2 设置属性后的界面
2、设置属性
表7-3 属性设置
对象
属性
属性值
Label1
Caption
投币总次数
Label2
Caption
正面次数
Label3
Caption
反面次数
Text1
Text
Text2
Text
Text3
Text
Command1
Caption
开始
窗体中各个控件的属性设置按照表7-3进行设置,属性设置后的界面如图7-3-3所示。
3、程序代码
Private Sub Command1_Click()
Randomize
n=CInt(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
4、程序说明
在窗体上有三个文本框,名称分别是Text1、Text2、Text3,分别用于显示用户输入投币总次数、出现正面的次数和出现反面的次数。随机产生0或1的整数的表达式为:Int(Rnd*2)。
5、运行程序
运行程序,在文本框Text1中输入总次数,然后单击“开始”按钮,按照输入的次数模拟投币,分别统计出现正面、反面的次数,并显示结果。运行界面如上图所示。
例3:小猴吃桃:有一堆桃,小猴当天吃了一半多一个。第二天吃了剩下的桃子的一半多一个。以后每天都是吃剩下的桃子的一半多一个。到第10天小猴要吃时只剩下一个了。问原来那堆桃有多少个?
程序代码如下:
Private Sub Form_Click()
Dim n%,i%
n=1
For i=9 to 1 step -1
n=(n+1)*2
Next i
Print “peachs of the first day are:”;n
(二)复习
根据步长型循环语句FOR…NEXT的格式和功能填空
1、在 FOR- NEXT 循环语句中,对于循环变量要指定它的________、_________及步长,但步长在增量为1时,可以省略。
2、“NEXT I”意思是___________________.
3、在NEXT语句中,_____________可以省略, 但如果出现, 要与FOR语句中的____________一致。
4、终止 FOR- NEXT 循环语句的条件是 _______________。
5、计算循环次数的公式是__________________________
(三)新课讲授
本节课我们将通过实例来学习对For双重循环语句的使用。
一、引入:在屏幕上输出如下右图所示内容
该程序实现一行5个"*",一共4行。用循环语句实现
for i=1 to 4
print "*****"
next
其中对于print "*****"我们也可以循环进行输出
for i=1 to 5
print "*"
next
将两者相结合
For i = 1 To 4
For j = 1 To 5
Print "*";
Next j
Print
Next i
即可得到完整代码
二、循环嵌套也称为多重循环,即在一个循环结构中包含另外一个循环,这种结构可以实现很多复杂的算法。
语法:
for i=初值 to 终值
for j=初值 to 终值
循环体
next j
next i
其中i为外循环控件变量,j为内循环控制变量,这两个变量不可用同一个变量名
双重循环的次数是:内循环次数×外循环次数
三:图形专题
简单文本图形的程序设计 (用for和for双重循环嵌套语句)
输出一个文本图形需要考虑4点:
(1)图形有几行(一般由外循环控制)
(2)每行首字符位置(一般由tab( )函数控制)
tab(n)函数:输出时表达式定位于第n列
(3)每行由几个字符(一般由内循环控制)
(4)用什么字符组成图形
下面举例说明:
1、 打印如下图形
Private Sub Form_click() ‘图2
Dim i%, j%
For i = 5 To 1 Step -1
For j = 1 To i
Print "*";
Next j
Print
Next i
End Sub
Private Sub Form_click() ‘图1
Dim i%, j%
For i = 1 To 5
For j = 1 To i
Print "*";
Next j
Print
Next i
End Sub
*
**
***
****
*****
图1
*****
****
***
Private Sub Form_click() ‘图4
Dim i%, j%
For i = 5 To 1 Step -1
Print Tab(6 - i);
For j = 1 To i
Print "*";
Next j
Print
Next i
End Sub
Private Sub Form_click() ‘图3
Dim i%, j%
For i = 1 To 5
Print Tab(6 - i);
For j = 1 To i
Print "*";
Next j
Print
Next i
End Sub
**
*
图2
*
**
***
****
*****
图3
*****
****
***
**
*
图4
For i = 1 To 5 ‘图5
Print Tab(6 - i);
For j = 1 To 2 * i - 1
Print "*";
Next j
Print
Next i
2、 打印如下等腰三角形,如图5示
*
***
*****
*******
*********
For i = -2 To 2 ‘图6
Print Tab(Abs(i) + 1);
For j = Abs(i) - 2 To 2 - Abs(i)
Print "*";
Next j
Print
Next i
3、 打印如下菱形,如下图6示
*
***
*****
***
*
For i = 1 To 5 ‘图7
Print Tab(6 * 3 - i * 3);
For j = 1 To i
Print j;
Next j
Print
Next i
4、 若将“*”改为数字,如图7示:
1
12
123
1234
12345
提示:打印数值类型数据,数字前有
个符号位,数字后面有一个空格。
今天我们来介绍循环控制语句的第二种――当循环控制结构。
(三)新课讲授
循环分为两大类:一类是循环次数已知,一类是循环次数未知的情况。前者我们可以用for...next语句实现,但对于后者呢?我们可以使用while当型循环。事先不能确定需要执行多少次循环,只有当条件满足时才结束循环,称为“当型循环”。
While循环结构用While…Wend语句来实现,语句格式如下:
While <条件表达式>
[<语句块>]
Wend
语句说明:
(1)“条件表达式”可以是关系表达式、逻辑表达式或数值表达式。如果是数值表达式,值为0被作为False,非零值则为True。
(2)语句的执行过程是:先计算条件表达式的值,若为True,则执行循环中的语句块,遇到Wend语句时返回While语句继续判断条件表达式的值,若仍为真,则继续执行语句块,重复上述过程直到条件表达式的值为False,则退出循环结构,执行Wend语句的后续语句。
循环环执行过程如图7-4。
(3)如果条件一开始就不成立,则语句块一次也不会被执行。
表达式
语句块
F
T
图7-4
例如,求1到100的和。 (用FOR循环)
Private Sub Command1_Click()
Dim i As Integer, sum As Integer
sum = 0 ‘ 给变量sum赋初值0
For i = 1 To 100
sum = sum + i ‘ 累加
Next i
Print sum
End Sub
也可用While循环语句改写上例,程序代码如下:
Private Sub Command1_Click()
Dim i As Integer, sum As Integer
sum = 0 :i=1
While i<=100
sum = sum + i
i=i+1
Wend
Print sum
End Sub
下面举例说明:
例1:我国有13亿人口,以年平均增长率0.5%计算,多少年后我国人口就会增长到15亿。
程序代码如下:
Private Sub Form_Click()
Dim p!,n%
p=13
n=0
While p<15
p=p*1.005
n=n+1
Wend
Print n;”年后人口将达到:”;p;”亿”
End Sub
Do循环结构的形式较灵活,可分为以下几种:
(1)先判断条件的Do…Loop循环
格式一:
Do While <条件表达式>
[<语句块>]
Loop
语句执行过程:先计算条件表达式的值,若为True,则执行语句块中的语句;若为False则退出循环结构。循环环执行过程如图7-5-1。
格式二:
Do Until <条件表达式>
[<语句块>]
Loop
语句执行过程和格式一基本相同,唯一不同的是,它在条件表达式为False时重复执行语句块,直到条件为True时退出循环结构。循环环执行过程如图7-5-2。
表达式
语句块
T
F
表达式
语句块
T
F
图7-5-1 图7-5-2
例1:用Do…Loop循环结构实现求和sum=1+2+3+…+100。
编写程序代码。
解法一:采用当型循环Do While…Loop
Private Sub Command1_Click()
Dim i As Integer,sum As Integer
i=1 '计数器初值置为1
sum=0 '累加器初值置为0
Do While i<=100 '当型循环
sum=sum+i
i=i+1 '每次循环变量加1
Loop
Label2.Caption=Str(sum)
End Sub
解法二:采用直到型循环Do Until…Loop
Private Sub Command1_Click()
Dim i As Integer,sum As Integer
i=1 '计数器初值置为1
sum=0 '累加器初值置为0
Do Until i>100
sum=sum+i
i=i+1
Loop
Label2.Caption=Str(sum)
End Sub
例2:将10000元存入银行,按3.25%的利率,试问多长时间就会连本带利翻一番。
程序代码如下:
Private Sub Form_Click()
Dim year%,money!,original!,interest!
original=10000
money=original
Interest=3.25/100
Do While money<2*original
year=year+1
money=money+interest*money ’ 累计每过一年的连本带利的金额
Loop
Print “In”;year;”years,you’ll have”;money
End Sub
请同学们使用格式二改写上述程序。
(2)后判断条件的Do…Loop循环
格式三:
Do
[<语句块>]
Loop While <条件表达式>
语句执行过程:首先执行语句块中语句,然后计算条件表达式,如果条件表达式值为True,则继续执行语句块,否则退出循环结构。循环体至少执行一次。循环环执行过程如图7-5-3。
格式四:
Do
[<语句块>]
Loop Until <条件表达式>
格式四的执行过程和格式三基本一样,也是先执行后判断。唯一不同的是,它在条件表达式值为假时重复执行语句块,直到条件表达式值为真时退出循环结构。循环环执行过程如图7-5-4。
语句块
表达式
T
F
语句块
表达式
F
T
图7-5-3 图7-5-4
例3:用辗转相除法求两正整数m,n的最大公约数。
求最大公约数的算法如下:
(1)对于已知两数m,n,使得m>n;
(2)m除以n得余数r;
(3)令m ← n,n ← r;
(4)若r≠0,转到(2)继续执行,直到r=0求得最大公约数为m,循环结束。
程序代码如下:
Private Sub Form_Click()
Dim m%,n%
m = InputBox("输入m")
n = InputBox("输入n")
If m< n Then ’ 若m小于n,则交换两数,使得m>n
t=m : m=n : n=t
End If
m1=m :n1=n
Do
r = m Mod n :m = n :n = r
Loop while ( r <>0)
Print m1; ","; n1; "的最大公约数为"; m
End Sub
(3)无条件循环
格式:
Do
<语句块>
Loop
重复执行循环体,循环不会停止,除非在循环体中有Exit Do语句或在执行时按下Ctrl+Break键。例如:
Private Sub Form_Click()
s=0
i=0
Do
i=i+1
s=s+i
If s>=3000 Then Exit Do ’ 当s≥3000,执行Exit Do语句退出循环
Loop
Print i,s
End Sub
例4:输入一个整数,对其进行因数分解。如:126=2*3*3*7。
程序代码如下:
Private Sub Form_Click()
Dim x%,m%,flag as Boolean
x= val(InputBox(“输入一个整数”))
m=2
flag=True
Do While m<=x
Do While x mod m=0
If flag Then
Print x;”=”;m;
Flag=False
Else
Print “*”;m;
End If
X=x\m
Loop
M=m+1
Loop
End Sub
例1:编程输出九九乘法表。
程序代码如下:
Private Sub Form_Click()
For i=1 to 9
For j=1 to 9
Print tab((j-1)*14) ;i;”×”;j;”=”;i*j;
Next j
Print
Next i
End Sub
例2:输出3-100之间的素数。
素数,就是一个大于2且只能被1和本身整除的整数。判断某数m是否为素数的算法是:对于m从i=2,3,…,m-1判别m能否被i整除,只要有一个能整除,m就不是素数,否则m是素数。
程序代码如下:
Private Sub Form_Click()
Dim m%,i%,k%,Flag As Boolean
For m=3 To 100
Flag=True
For i=2 To m-1 ‘ 内循环判断m是否为素数
If (m mod i)=0 Then Flag=False
Next i
If Flag Then
k = k + 1
If (k Mod 10) = 0 Then Print m Else Print m; ’ 每行显示10个
End If
Next m
End Sub
实际上m不可能被大于√m的数整除,因此为减少循环次数,可将内循环语句改为:
For i=2 To int(sqr(m))
循环次数就会大大减少。
例3:百鸡问题:已知公鸡每只3元,母鸡每只5元,小鸡每三只1元,现有100元,要求买100只鸡,每种鸡至少买一只且必须买整只鸡,问有多少种方法。
方法一(用三重循环)
枚举范围:公鸡x 1~98 母鸡y 1~98 小鸡z 1~98
测试条件:3x+5y+z\3=100 And x+y+z=100
方法二(用两重循环)
枚举范围:公鸡x 1~31 母鸡y 1~18 小鸡z 100-x-y
测试条件:3x+5y+z\3=100
思考:如何用单层循环求解?
程序如下:
Private Sub Form_Click() ‘第二种方法
Dim x%, y%, z%
For x = 1 To 31
For y = 1 To 18
z = 100 - x - y
If 3 * x + 5 * y + z / 3 = 100 Then
Print x, y, z
End If
Next y
Next x
End Sub
例4:输入20个数,从中找出最大值和最小值。
提示:以第一个数作为最大(小)值,然后将剩余的数依次与最大(小)值比较,每当最大(小)值小于(大于)被比较的数时,就修改最大(小)值。
程序如下:
Dim max%,min%,a%,I%
a=InputBox(“输入a”)
max=a:min=a
For I=2 to 20
a=InputBox(“输入a”)
If max < a Then max = a
If min > a Then min = a
Next I
Print “max=“;max,”min=“;min
一、素数的概念
素数:只能被1和本身整除的正整数是素数。例如,2、3、5、7、11、13、17是素数。
二、判断一个数是否为素数
用这个数除以2到该数间的每个数(不包括该数)。一旦该数能被其中的一个数整除,则该数不是素数;若在2到该数之间(包括2,不包括该数)找不到任何一个数将该数除尽,则该数是素数。算法如下:
Private Sub Form_Click()
Dim n As Integer
n = InputBox("请输入一个正整数")
k = Int(Sqr(n))
For i = 2 To k
If n Mod i = 0 Then Exit For
Next i
If i = k + 1 Then
MsgBox Str(n) & "是素数", , "结果"
Else
MsgBox Str(n) & "不是素数", , "结果"
End If
End Sub
三、寻找某个范围内的素数
将上述判断素数的方法放在一个For循环中,由For循环来控制寻找范围。算法如下:
Private Sub Form_Click()
'――――输出200到300间所有的素数,―――――
'――――并统计共有多少个素数。――――――――
Dim n As Integer
For n = 200 To 300
k = Int(Sqr(n))
For i = 2 To k
If n Mod i = 0 Then Exit For
Next i
If i = k + 1 Then
Counter = Counter + 1
Print n; "是素数"
End If
Next n
Print "200到300间共有"; Counter; "个素数!"
End Sub
11
展开阅读全文