51
大大大大大大大大大 TaiYuan University of Technology 第5第 第第第第第第第第 Visual Basic 第第第第第第

第 5 章 设计循环结构程序

Embed Size (px)

DESCRIPTION

第 5 章 设计循环结构程序. Visual Basic 程序设计教程. 循环结构又称重复结构。 本章主要介绍: 逻辑表达式 For/Next 语句 Do/Loop 语句 While/Wend 语句 循环的嵌套使用。. 循环结构是根据条件来决定某段代码是否重复执行。 循环结构中一种常用的流程可以表示如图: 条件满足就执行 a 块程序段 然后再进行条件判别 如果满足条件,则继续执行 a 块程序段 直到条件不满足,才执行 a 块后面的程序。. 5.1 概述. 其中的 a 程序块段称为循环体。 条件使用逻辑表达式。 - PowerPoint PPT Presentation

Citation preview

Page 1: 第 5 章  设计循环结构程序

大学计算机基础教程 TaiYuan University of Technology

第 5 章 设计循环结构程序

Visual Basic 程序设计教程

Page 2: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程2

循环结构又称重复结构。本章主要介绍:

逻辑表达式For/Next 语句Do/Loop 语句While/Wend 语句循环的嵌套使用。

Page 3: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程3

循环结构是根据条件来决定某段代码是否重复执行。循环结构中一种常用的流程可以表示如图:

条件满足就执行 a 块程序段然后再进行条件判别如果满足条件,则继续执行 a 块程序段直到条件不满足,才执行 a 块后面的程序。

Page 4: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程4

其中的 a 程序块段称为循环体。条件使用逻辑表达式。循环的另一种形式是把判断条件放在循环体之后。

Page 5: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程5

循环结构中有两个基本问题需要考虑:( 1 )条件必须明确,能使循环过程正常结束( 2 )循环体内,必要时可改变控制循环的条件

改变可能导致循环结束改变也可能导致循环进入无休止的状态

(死循环)。

Page 6: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程6

循环有两种类型:计数控制

控制累计执行循环体的次数次数已到则结束循环如 1+2+3+…+100 或 98+96+94+…+4+2

事态控制由某些条件决定循环结束。如计算一系列正整数之和,遇负数停止循环。

也可以在一个循环过程中同时使用这两种类型

Page 7: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程7

【例 5-1 】 设计一个判断素数的程序。若不是素数,要求分解为 a*b 的形式

控件: 1 个文本框和 1 个命令按钮事件:命令按钮的 Click 。首先要了解什么是素数。

素数是指除了 1 和自身外,不能被其它整数整除的正整数。判断 A 是否为素数的基本方法是:

将 A 分别除以 2 、 3 、……、 A-1 ,若都不能整除,则它为素数。

判断 A 被 i 整除可以采用表达式:A Mod i = 0 或: A / i = A \ i 或: A / i = Int(A /i)

Page 8: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程8

Option ExplicitPrivate Sub Command1_Click() Dim A As Long, i As Integer 'A 存放要判断的数。 i 取值为 2 ~ A-1 Dim Flag As Boolean ' Flag 作素数标志, False 时,表示不是素数 A = Val(Text1.Text) Flag = True ' 先设 A 是素数,当 A<2 或能被 i 整除时,再置为 False If A < 2 Then Flag = False 'A<2 ,不是素数 Else i = 2 Do While i <= A-1 If A Mod i = 0 Then Flag = False: Exit Do 'A 能被 i 整除 , 则不是素数 i = i + 1 Loop End If If Flag Then MsgBox A & " 是素数 ", , " 信息 " Else ' A 表示成两数之积 MsgBox A & " 不是素数 " & Chr(13) & A & "=" & i & "*" & A/i, , " 信息 " End IfEnd Sub

Page 9: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程9

说明:程序中,也可以不设标志变量,在最后判断 i 是否超过终值

A-1 ,若超过终值则表示直到循环完成,还没遇到一个能被整除的整数,即它是素数;否则它就不是素数。

当 A 能被其中一个 i 整除时, A 肯定不是素数,所以没有必要再测试下一个 i ,因此使用 Exit Do 退出循环。

在使用 Exit Do 退出循环的时候,没有改变 i 的值,故 A 能被该 i 整除,即 A 可以表示成 A=i*(A/i) 。

事实上只要判断 A 能否被 2 、 3 、……、 Sqr(A) 整除即可。

Page 10: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程10

逻辑运算使用逻辑运算符VB 提供了多个逻辑运算符,有:

非 (Not) 、与 (And) 、或 (Or)异或 (Xor) 、等价 (Eqv) 、蕴含 (Imp) 。

1 .基本格式Not 为一元运算符,其它均为二元运算符。格式:

Not 表达式 表达式 1 逻辑运算符 表达式 2 (除 Not 外)

一个逻辑表达式可用一个或多个逻辑运算符。如: A>0 And B>0 And C>0

2 .数据类型逻辑运算的数据及结果均为布尔类型。

Page 11: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程11

3 .运算方式

4 .优先级逻辑运算符关系运算符

字符串运算符算术运算符

ImpEqvXorOrAndNot

Page 12: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程12

5 .逻辑表达式举例( 1 )设变量 Name1 的值为“王小华”、变量 Add

r 的值为“上海”,则表达式: Name1 = “ 王小华” Or Addr = " 杭州 " 值: True

表达式: Name1 = “ 王小华” And Addr = " 沪 " 值: False

( 2 )写出数学表达式 0<x<10 对应的 VB 表达式。

VB 表达式应为: x > 0 And x < 10

Page 13: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程13

( 3 )描述 Name1 的值不等于“王小华”的表达式。该表达式可写为:Name1 <> " 王小华 " 或: Not Name1 = " 王小华 "

( 4 ) X=3 、 Y=4 、 Z=5 ,求表达式 X>2 Xor Y<0 Or Z>X+1 的值。执行次序如图所示,最终值为 False 。

Page 14: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程14

闰年的条件是:能被 4 整除,但不能被 10

0 整除;或能被 400 整除。设变量 Y 存放年份,则该逻辑表达式应为: Y Mod 4=0 And Y Mod 100<>0 Or Y Mod 400=0

【例 5-2 】 设计程序,要求对文本框的年份判断是否为闰年,并在标签中显示相应的信息。

Page 15: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程15

程序代码如下:Option ExplicitPrivate Sub Command1_Click() Dim Y As Integer If Command1.Caption = "闰年判断 " Then '闰年判断 Y = Val(Text1.Text) If Y Mod 4 = 0 And Y Mod 100 <> 0 Or Y Mod 400 = 0 Then Label1.Caption = " 是闰年 " Else Label1.Caption = " 不是闰年 " End If Command1.Caption = "清除 " Else '清除 Text1.Text="" : Label1.Caption="" : Command1.Caption="闰年判断 " Text1.SetFocus End IfEnd Sub

Page 16: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程16

5.4.1 For/Next语句

使用 For/Next 语句可以方便地实现计数循环For/Next 由 For 语句、循环体、 Next 语句组成。格式: For 循环控制变量 = 初值 To 终 值 [Step 步长 ] [ 循环体 ] Next [ 循环控制变量 ]

Page 17: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程17

1 .执行过程( 1 )将初值送至循环控制变量( 2 )判断循环控制变量的值是否超过终值:若未超过终值,执行步骤( 3 );超过终值执行步骤( 5 )。( 3 )执行循环体。( 4 )遇到 Next ,使循环控制变量加上步长再送入循环控制变量中,转步骤( 2 )。( 5 )循环终止,执行 Next 语句后面的语句。注意:其中“超过终值”不一定是大于终值。

Page 18: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程18

2 .关于格式省略“ Step 步长”则默认为“ Step

1” 。初值、终值、步长分别控制循环变量的起始值、终止值和增量。

For 和 Next 必须成对出现。Next 后若有循环控制变量,则必须与 F

or 中的相同。建议 Next 后不要省略循环控制变量,

以有利于阅读程序

Page 19: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程19

3 .关于循环体循环体是一条或多条语句可以包括分支结构和循环结构可以写成一行或多行。循环体中可以引用循环控制变量,也可

以不引用。但不要随便修改循环控制变量的值,以防引起循环混乱。

4 .强行终止死循环使用 Ctrl+Break 可以暂停程序运行再使用 VB工具栏上的“结束”按钮终止程序执

行。

Page 20: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程20

【例 5-3 】 输入 10 个非负整数,求所有偶数之和。 假定存放和的变量为 Sum ,先让 Sum=0 。然后可采用以下方法: 将第 1 个数送入 A ,如果 A 是偶数,则让 Sum加上A ,否则 Sum 不变。…… 将第 10 个数送入 A ,如果 A 是偶数,则让 Sum增加 A ,否则 Sum 不变。最终得到的 Sum 就是和。由此可见,每步都做着同样的工作,即: 将第 i 个数送入 A ,如果 A 是偶数,则让 Sum增加A ,否则 Sum 不变。

Page 21: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程21

Option ExplicitPrivate Sub Command1_Click() '输入 10 个非负整数,求偶数和。

Dim Sum As Long, i As Integer Dim A As Integer Sum = 0 '赋初值 ,注意位置 For i = 1 To 10 A = Val(InputBox("请输入第 " & i & " 个数 :", "输入非负整数 ")) If A Mod 2 = 0 Then Sum = Sum + A Next i MsgBox "Sum=" & SumEnd Sub

一个好的程序,应该为自己用于累加、累乘等的变量赋初值。

Page 22: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程22

【例 5-4 】 求表达式值。 x 、 n 由键盘输入。

这是一个求和的例子。它由 n项构成,能表示成 Sum=Sum+Item 的形式第 i项等于第 i-1项乘以 X/(i+1) ,即 Item=Item*X/(i+1)

故循环体可由 Item=Item*X/(i+1) 和 Sum=Sum+Item 构成。初值问题: Sum初值为 0 , Item初值应为 1 。

)!1(!3!2

2

n

xxx n

为防止溢出, Item 和 Sum声明为双精度型。程序运行结果:当 X=6 , N 分别为 1 、 2 、3 时,其和分别为 3 、 9 、18 。

Page 23: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程23

Private Sub Command1_Click() Dim Sum As Double, Item As Double, i As Integer Dim N As Integer, X As Double N = Val(InputBox("请输入项数 : ")) X = Val(InputBox(" X= ")) Sum = 0: Item = 1 For i = 1 To N Item = Item * X / (i + 1) Sum = Sum + Item Next i MsgBox " x/2!+x^2/3!+...= " & Sum, , " 信息 " End Sub

Page 24: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程24

5.4.2 Exit For语句循环中,中途退出循环,称为跳出循环。跳出 For/Next 循环的语句就是 Exit For 。跳出循环后,将执行 Next 语句后面的语句。Exit For 语句一般往往与 If 语句合用。如: If A >= 2 Then ' 素数判断

For i = 2 To Int(Sqr(A)) If A Mod i = 0 Then Exit For 'A 能被 i 整除 , 不是素数 , 退出 For 循环 Next i If i > Int(Sqr(A)) Then ' 表示 A 不能被 2~ Int(Sqr(A)) 中的数整除 Print A; " 是素数 " Else ' 此时表示程序运行是通过 Exit For转出来的 Print A; " 不是素数 " End IfElse Print A; " 不是素数 "End If

Page 25: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程25

5.5.1 Do/Loop语句对只知道循环终止条件,可采用 Do/Loop 循环For/Next 语句可改写成 Do/Loop 循环,反之则不然。Do/Loop 语句有五种表示形式,它们的格式为:

Page 26: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程26

1 .执行过程( 1 )对格式一和二, VB 将先判断条件,再执行循环体。( 2 )对格式三和四,先执行循环体,再判断条件。循环体至少执行一次。( 3 )对用 While 的语句,当条件满足( True )时,执行循环体。( 4 )对用 Until 的语句,当条件不满足( False )时,执行循环体。( 5 )格式五的循环体内必须存在 Exit Do 语句,否则会出现死循环。若程序运行出现死循环,同样可用 Ctrl Break暂停程序执行。

Page 27: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程27

2 .关于格式( 1 )条件一般应为关系或逻辑表达式,一般应有变量。

( 2 ) Do 和 Loop 必须成对出现3 .关于循环体

循环体是一条或多条语句可以包括分支结构和循环结构。可以写成一行或多行。循环体中应有改变循环条件的语句,以避免出现死循环。

Page 28: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程28

Private Sub Command1_Click() Dim N As Integer, Result As DoubleDim i As Integer N = Val(InputBox("n=")) Result = 1 For i = 1 To N Result = Result * i Next i MsgBox N & "!=" & ResultEnd Sub0

Private Sub Command2_Click() Dim N As Integer, Result As Double Dim i As Integer N = Val(InputBox("n=")) Result = 1: i = 1 Do While i <= N Result = Result * i i = i + 1 Loop MsgBox N & "!=" & ResultEnd Sub

Private Sub Command3_Click() Dim N As Integer, Result As Double Dim i As Integer N = Val(InputBox("n=")) Result = 1: i = 1 Do Until i > N Result = Result * i i = i + 1 Loop MsgBox N & "!=" & ResultEnd Sub

Private Sub Command4_Click() Dim N As Integer, Result As Double Dim i As Integer N = Val(InputBox("n=")) Result = 1: i = 1 Do Result = Result * i i = i + 1 Loop While i <= N MsgBox N & “!=” & ResultEnd Sub

5.5.1 Do/Loop语句 - 编程序:求 n!

Page 29: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程29

【例 5-6 】 在文本框中输入两个整数,求它们的最大公约数和最小公倍数。

求最大公约数可用辗转相除法。该方法的基本思想是使用带余除法:

( 1 ) A 除以 B ,得余数为 R1 ;( 2 )若 R1= 0 ,则 B 为最大公约数。 若 R1≠0 ,则 B赋值给 A , R1赋值给 B ,求余数 R2 ; 若 R2≠0 ,则继续以上步骤。

Page 30: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程30

( 3 )经过有限( n+1 )步后, Rn+1=0 。这时 A 和 B 的最大公约数是 Rn 。最小公倍数为 A*

B/Rn 。该算法循环次数未知,但循环条件已知:余数不为

0 。因此适用于 Do/Loop 语句编程。其循环体为:

把上一个 B 作为新的 A ,把上一个余数作为新的 B ,求出新余数。

Page 31: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程31

5.5.1 Do/Loop语句—求最大公约数和最小公倍数Private Sub Command1_Click() Dim A As Long, B As Long, R As Long A = Val(Text1.Text) B = Val(Text2.Text) R = A Mod B Do While R <> 0 A = B: B = R R = A Mod B Loop MsgBox " 最大公约数 =" & B MsgBox " 最小公倍数 =" & Val(Text1.Text)*Val(Text2.Text)/BEnd Sub

如果 s 在两个文本框中分别输入 351 和 675 ,单击命令按钮后,得出最大公约数为 27 ,最小公倍数为 8775 。

Page 32: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程32

【例 5-7 】 编程:输入一批非负数,当输入负数时,表示输入结束。求这批非负数据的最大值、最小值和平均值。

由于输入的个数不确定,故应采用 Do/Loop 语句。本题关键在于如何设置最大值、最小值的初值。

Page 33: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程33

Private Sub Command1_Click() Dim X As Integer, Min As Integer, Max As Integer Dim N As Integer, Average As Single 'N 作为计数,存放项数 X = Val(InputBox("X=")): Max = X: Min = X ' 最大最小值初值 N = 0: Average = 0 Do While X >= 0 If X > Max Then Max = X If X < Min Then Min = X N = N + 1 Average = Average + X 'Average暂存数据和,最后再除 N X = Val(InputBox("X=")) '从第 2 个开始输入 Loop If N <> 0 Then Average = Average / N Print "Max="; Max, "Min="; Min, "Average="; Round(Average, 3)

End Sub

当输入 23 、 41 、 35 、 61 、 12 、 1 、 7 、 -1 后,运行结果: Max=61 Min=1 Average=25.714

Page 34: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程34

5.5.2 Exit Do 语句Exit Do 是跳出 Do/Loop 循环的语句跳出循环后,将执行 Loop 语句后面的语句。Exit Do 语句同样也往往与 If 语句合用如求阶乘的程序片断为:

N = Val(InputBox("n= ")) Result = 1: i = 1 Do Result = Result * i i = i + 1 : If i > N Then Exit Do Loop MsgBox N & "!= " & Result

Page 35: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程35

While/Wend 语句的作用与 Do While 条件 / 循环体 /Loop相同。

格式: While 条件 [ 循环体 ] Wend

执行过程:先计算条件的值,若条件的值为 True ,执行循环体,否则

执行 Wend 语句后面的语句。While 和 Wend 必须成对出现循环体中必须要有设法改变循环条件的语句While/Wend 语句没有对应的跳出语句。

Page 36: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程36

【例 5-8 】 编程:求 π 的值。有关 π 的级数公式为:

要求逐项累加,直到最后一项 <0.0000001 时,求 π 。因没有确定项数,故可用 Do/Loop 或 While/Wend

可设一个变量 Sign 作为各项的符号,在循环中让 Sign=-Sign ,可以达到一次正、一次负的目的。

为达到较为精确的值,变量大多声明为双精度型

...12

1)1(

7

1

5

1

3

11

41

nn

Page 37: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程37

本例中变量 Pi 、 Sum 、 Item 、 N 、 Precision分别存放 π 、累计和、项值、项中分母值和精度。Private Sub Command1_Click() Dim Pi As Double, Sum As Double, Item As Double Dim N As Long, Precision As Double, Sign As Integer N = 1: Item = 1 / N: Sum = 0: Sign = 1 Precision = Val(InputBox(“请输入精度: ” , “输入数据” , “0.0000001”)) While Item >= Precision Sum = Sum + Sign * Item N = N + 2 Item = 1 / N Sign = -Sign Wend Pi = 4 * Sum Print “π= ”; PiEnd Sub

在单击命令按钮后,若精度用缺省值 0.0000001 ,则显示= 3.1415924535898 。

...12

1)1(

7

1

5

1

3

11

41

nn

Page 38: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程38

循环结构中可以嵌套循环当循环体中包含了循环时,称为循环嵌套,或称

为多重循环。循环体中包含的循环语句可以与外循环相同,也

可以不同。嵌套一层称为二重循环。多重循环中遇到 Exit For(Do) ,只能跳出当前一层循环。

Page 39: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程39

【例 5-9 】 窗体上显示 3 ~ 100 之间的所有素数。每行显示 5 个。前面的例子中判断 A 是否为素数是一重循环。现让 A 分别等于 3 、 5 、 7 、……、 97 、 99 就可以了。为了每行显示 5 个,设置一个计数变量 Count 。 Private Sub Command1_Click()

Dim A As Integer, i As Integer, Count As Integer Count = 0 ' 素数个数计数变量 Print " 以下数据为素数: " For A = 3 To 99 Step 2 For i = 2 To Int(Sqr(A)) If A Mod i = 0 Then Exit For ' 被整除 Next i If i > Int(Sqr(A)) Then Count = Count + 1 : Print A, If Count Mod 5 = 0 Then Print '换行 End If Next AEnd Sub

Page 40: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程40

【例 5-10 】 在窗体上如图图案,它由“ *”组成。分析:

上三角形中,第 I 行有 I 个,可使用循环:For J = 1 To I : Print "* "; : Next J

因每行起点不同,而且一行结束后要换行,所以在 J 循环的前后各有一 Print 。

这样的行有 7 行,故外循环使 I从 1至 7 。下三角形,操作过程与上三角相似

Page 41: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程41

Private Sub Command1_Click() Dim I As Integer, J As Integer Cls For I = 1 To 7 Print Spc(20 - I); '打印时空 20-i 格 For J = 1 To I Print "* "; Next J Print ' 用于换行 Next I For I = 6 To 1 Step -1 Print Spc(20 - I); For J = 1 To I Print "* "; Next J Print Next IEnd Sub

Page 42: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程42

5.8.1 递推法【例 5-11 】 有一个数列,前两项是 1 、 1 ,第三项是前二项之和,以后每一项都是前二项之和。即为: 1 、 1 、 2 、 3 、 5 、8 、 13 、 21 , 34…… 。 要求输出该数列的前 30项。

该数列又称斐波那契数列。由“兔子问题”引发这是一个递推问题

所谓递推关系是指一串函数之间的关系,它把每一个函数表示为前 k 个函数的线性组合。本题中 k=2 。

解决递推问题必须具备两个条件:( 1 ) 有初始值,如 F1=1 、 F2=1 ( 2 ) 存在递推关系。如 Fn=Fn-1+Fn-2 ( n>2 )

在程序中一般设置二或三个变量就可以了。程序中用 F1 、 F2 、 F3 表示三个数,在循环中,它们不断用新值代替旧值。这种操作称为迭代,

Page 43: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程43

程序代码如下:Private Sub Command1_Click() Dim F1 As Long, F2 As Long, F3 As Long Dim i As Integer Cls F1 = 1: F2 = 1 Print F1, F2, For i = 3 To 30 F3 = F1 + F2 Print F3, If i Mod 4 = 0 Then Print '每行显示 4 个数 F1 = F2 : F2 = F3 ' 用新值代替旧值 NextEnd Sub

F1 和 F2始终作为前两个数, F3 作为新产生的数因第 24 个月兔子数已超过 32767 对,故变量声明为 Long

Page 44: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程44

5.8.2 穷举法【例 5-12 】 我国古代数学家在《算经》中出了一道题:“鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏各几何?”

即:当时用 100 元钱买 100 只鸡,其中公鸡每只 5 元,母鸡每只 3 元,小鸡3 只 1 元,问可买公鸡、母鸡、小鸡各多少只?

设公鸡 X 只,母鸡 Y 只,小鸡 Z 只,列出方程式: X+Y+Z=100 5X+3Y+Z/3=100

2 个方程求 3 个未知数,无法用代数方法求解可将 X 、 Y 、 Z 分别为 0~100 的每一种可能性都去试一下,如符合,则就

是其中的一种购买方案。列举所有可能的方案,找出符合要求的,这样的算法称为穷举法。

Page 45: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程45

可测试方案分别为:0 、 0 、 0 ; 0 、 0 、 1 ;……; 0 、 0 、 100 ;1 、 0 、 0 ; 1 、 0 、 1 ;……; 1 、 0 、 100 ;…… ;100 、 100 、 0 ; 100 、 100 、 1 ;……; 100 、 1

00 、 100事实上当 X 和 Y 确定时, Z 可以用 100-X-Y 求得,因此

可以把三重循环改为二重循环。 Private Sub Command1_Click()

Dim X As Integer, Y As Integer, Z As IntegerPrint "公鸡 ", "母鸡 ", " 小鸡 "For X = 0 To 100 For Y = 0 To 100 Z = 100 - X - Y If 5 * X + 3 * Y + Z / 3 = 100 Then Print X, Y, Z Next YNext XEnd Sub

事实上 X 和 Y 的循环可分别为 0 到 20 和 0到 33

Page 46: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程46

5.8.3 求水仙花数【例 5-13 】 求数 100 ~ 999 所有满足:数 X =

数 X 个位、十位、百位的立方和。如: 153 = 1*1*1 + 5*5*5 + 3*3*3

说明:该程序主要是能分出个位、十位、百位 Private Sub Command1_Click()

Dim i As Integer Dim N1 As Integer, N2 As Integer, N3 As Integer For i = 100 To 999 N1 = i \ 100 ' 求百位 N2 = (i - N1 * 100) \ 10 ' 求十位 N3 = i Mod 10 ' 求个位 If i = N1 ^ 3 + N2 ^ 3 + N3 ^ 3 Then ' 计算水仙花数 Print i; "="; N1; "^3 +"; N2; "^3 +"; N3; "^3" End If NextEnd Sub

Page 47: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程47

5.8.4 验证哥德巴赫猜想【例 5-14 】 输入一个大于等于 6 的偶数,将它分解

为两个素数之和。对每一个大于等于 6 的偶数 N 都可表示成:

N=3+(N-3) 、 N=4+(N-4) 、 N=5+(N-5) 、……、 N=(N-3)+3 ,即 A 、 B 的范围为 3 ~ N-3由于大于 2 的偶数不是素数,处理前可以去掉这些数,由于 3+(N-3) 和 (N-3)+3 是一致的,故 A 的范围为 3 ~ N/2 , B=N-A 。程序设计思路:

当输入一个大于等于 6 的偶数 N 后,让 A 在 3 ~ N/2 的奇数范围内循环,

若 A 是素数,则求出 B=N-A ,再判断 B 是否为素数,若 B 也是素数,则输出 A 和 B 。

Page 48: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程48

Private Sub Command1_Click() Dim A As Long, B As Long, N As Long, i As Integer, j As Integer Do ' 该循环是为了必须获得一个大于等于 6 的偶数 N = Val(InputBox("请输入一个大于 6 的偶数 ")) Print "输入的数为 " & N Loop While N / 2 <> N \ 2 Or N < 6 For A = 3 To N / 2 Step 2 '步长为 2 是只判断偶数 For i = 2 To Sqr(A) ' 判断 A 是否为素数 If A Mod i = 0 Then Exit For Next i If i > Sqr(A) Then ' 若 A 是素数 B = N - A ' 求出 B For j = 2 To Sqr(B) ' 判断 B 是否也为素数 If B Mod j = 0 Then Exit For Next j If j > Sqr(B) Then ' 若 B 也是素数 Print N & "=" & A & "+" & B '输出 Exit For ' 已验证,跳出 A 循环 End If End If Next AEnd Sub

当输入 2322 时,显示 2322=11+2311

Page 49: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程49

5.8.5 数制转换【例 5-15 】 请编写程序:将十进制正整数转换为二进制数或十六进制数;

控件:两个标签两个文本框两个单选按钮两个命令按钮

十进制整数转换成二进制数,采用除 2 取余法。十进制整数转换成十六进制数,采用除 16 取余法最后把这些余数以字符方式拼接起来。

Page 50: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程50

5.8.5 数制转换 -程序 Private Sub Command1_Click() ' 转换Dim A As Long, B As String, R As Integer 'B 存放转换后结果, R 放余数A = Val(Text1.Text): B = ""If Option1.Value Then '转换成二进制 Do While A <> 0 B = (A Mod 2) & B : A = A \ 2 '拼接除 2 后的余数 ,获得除 2 后的商 Loop Text2.Text = B ' 将结果(二进制)放入文本框Else '转换成十六进制 Do While A <> 0 R = A Mod 16 ' 除 16 取余 Select Case R '获得余数对应的十六进制数,即 0~9 , A~F 之一并拼接 Case 0 To 9 : B = R & B Case 10 : B = "A" & B Case 11 : B = "B" & B Case 12 : B = "C" & B Case 13 : B = "D" & B Case 14 : B = "E" & B Case 15 : B = "F" & B End Select A = A \ 16 '获得除 16 后的商 Loop Text2.Text = B ' 将结果(十六进制)放入文本框End IfEnd Sub

Page 51: 第 5 章  设计循环结构程序

Visual Basic 程序设计教程51

Private Sub Command2_Click() '清除 Text1.Text = "": Text2.Text = "" Text1.SetFocusEnd SubPrivate Sub Option1_Click() '修改文本框提示,即标签的 Caption Label2.Caption = " 二进制数 "End SubPrivate Sub Option2_Click() '修改文本框提示,即标签的 Caption Label2.Caption = "十六进制数 "End Sub

在学了第 9 章字符函数 Asc 、 Chr 或 Mid 后,有关转换成十六进制的 A至 F 这段程序可以大大简化,可以用一条语句代码完成。