Top Banner
Visual Basic Visual Basic 程程程程程程 程程程程程程 机机机机机机机机机机机 机机机机机机 2003 程 6
40

Visual Basic 程序设计教程

Jan 03, 2016

Download

Documents

zelenia-lewis

Visual Basic 程序设计教程. 机械工业出版社同名教材 配套电子教案. 2003 年 6 月. 第 5 章 循环结构程序设计. 5.1 循环结构程序设计的概念 5.2 Do…Loop 语句 5.2.1 前测型 Do…Loop 循环 5.2.2 后测型 Do…Loop 循环 5.3 For...Next 语句 5.4 列表框与组合框 5.4.1 列表框 5.4.2 组合框 5.4 算法举例 习题五. 5.2.1 前测型 Do…Loop 循环. 其语法为 Do [{ While | Until }〈 条件 〉] - PowerPoint PPT Presentation
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Visual Basic  程序设计教程

Visual Basic Visual Basic 程序设计教程程序设计教程

机械工业出版社同名教材配套电子教案

2003 年 6月

Page 2: Visual Basic  程序设计教程

第 5 章 循环结构程序设计

5.15.1 循环结构程序设计的概念循环结构程序设计的概念

5.25.2 DoDo……LoopLoop 语句语句 5.2.1 5.2.1 前测型前测型 DoDo……LoopLoop 循环循环 5.2.2 5.2.2 后测型后测型 Do…LoopDo…Loop 循环 循环 5.3 5.3 For...NextFor...Next 语句语句5.45.4 列表框与组合框列表框与组合框 5.4.1 5.4.1 列表框列表框 5.4.2 5.4.2 组合框组合框 5.45.4 算法举例算法举例习题五习题五

Page 3: Visual Basic  程序设计教程

5.2.1 前测型 Do…Loop 循环

其语法为

Do [{ While | Until } 〈条件〉 ]

[ 〈语句列 1 〉 ]

[Exit Do]

[ 〈语句列 2 〉 ]

Loop

【例 5-1 】求累加和 1 + 2 + 3 +…+ 100 (如图 5-2 )。

Page 4: Visual Basic  程序设计教程

设计步骤如下:

窗体界面的设计参见前面章节,这里仅给出命令按钮的 Click 事件代码:

Private Sub Command1_Click()

Dim s As Integer, n As Integer

s = 0: n = 1

Do While n <= 100

s = s + n

n = n + 1

Loop

Label2.Caption = "1+2+3+…+100 = " & s

End Sub

Page 5: Visual Basic  程序设计教程

还可以改为直到型:

Private Sub Command1_Click()

Dim s As Integer, n As Integer

s = 0: n = 1

Do Until n > 100

s = s + n

n = n + 1

Loop

Label2.Caption = "1+2+3+…+100 = " & s

End Sub

Page 6: Visual Basic  程序设计教程

【例 5-2 】输入一个正整数,利用“当型”循环判断是否素数。

设计步骤如下:

窗体界面的设计参见前面章节,这里给出命令按钮的 Click 事件代码:

Private Sub Command1_Click()

Dim n As Long

Select Case Val(Text1.Text)

Case Is < 3

MsgBox " 请输入一个大于 2 的整数 !", vbInformation + vbOKOnly, " 注意 "

Case Is > 2147483647

MsgBox " 此数太大 !", vbInformation + vbOKOnly, " 注意 "

Case Else

n = Val(Text1.Text)

s = 0: i = 2

Page 7: Visual Basic  程序设计教程

Do While i <= Sqr(n) And s = 0

If n Mod i = 0 Then

s = 1

Else

i = i + 1

End If

Loop

If s = 0 Then

a = " 是一个素数 "

Else

a = " 不是素数 "

End If

Label1.Caption = Str(n) & a

End Select

Text1.SetFocus

End Sub

Page 8: Visual Basic  程序设计教程

另外,为了使用文本框得到焦点后,文本立即被选中,编写 Text1 的 GotFocus 事件代码如下:

Private Sub Text1_GotFocus()

Text1.SelStart = 0

Text1.SelLength = Len(Text1.Text)

End Sub

Page 9: Visual Basic  程序设计教程

5.2.2 后测型 Do…Loop 循环

其语法为

Do

[ 〈语句列 1 〉 ]

[Exit Do]

[ 〈语句列 2 〉 ]

Loop [{While | Until} 〈条件〉 ]

【例 5-3 】输入有效数字的位数,利用下述公式计算圆周率 π的近似值:

222

2

22

2

2

22

Page 10: Visual Basic  程序设计教程

设计步骤如下:

(1) 建立应用程序用户界面与设置对象属性。

(2) 编写程序代码。

根据流程图,可以写出命令按钮 Command1 的 Click 事件代码为

Private Sub Command1_Click()

Dim m As Integer

m = Val(Text1.Text)

p = 0#: s = 2#: e = 0.1 ^ m

Do

t = s : p = Sqr(2 + p) : s = s * 2 / p

Loop Until Abs(t – s) < 0.1 ^ m

f = String(m – 1, "#")

Text2.Text = Format(s, "0." & f)

Text1.SetFocus

End Sub

Page 11: Visual Basic  程序设计教程

文本框 Text1 的 GotFocus 事件代码:

Private Sub Text1_GotFocus()

Text1.SelStart = 0

Text1.SelLength = Len(Text1.Text)

End Sub

Page 12: Visual Basic  程序设计教程

【例 5-4 】输入两个正整数,求它们的最大公约数。

设计步骤如下。

窗体界面的设计如图 5-10 所示,这里给出命令按钮的 Click 事件代码:

Private Sub Command1_Click()

m = Val(Text1.Text)

n = Val(Text2.Text)

If n * m = 0 Then

MsgBox " 两数都不能为 0!"

Exit Sub

End If

If m < n Then

t = m: m = n: n = t

End If

Page 13: Visual Basic  程序设计教程

Do

r = m Mod n

m = n

n = r

Loop While r <> 0

Text3.Text = m

End Sub

Page 14: Visual Basic  程序设计教程

5.3 For...Next 语句 其语法为

For 〈循环变量〉 = 〈初值〉 To 〈终值〉 [Step〈步长〉 ]

[ 〈语句列 1 〉 ]

[Exit For]

[ 〈语句列 2 〉 ]

Next [ 〈循环变量〉 ]

【例 5-5 】利用 For 循环结构显示 1000 以内的所有能被 37 整除的自然数(如图 5-13 所示)。

设计步骤如下:

(1) 窗体界面的设计与属性设置。

(2) 编写代码。

Page 15: Visual Basic  程序设计教程

编写命令按钮的 Click 事件代码:

Private Sub Command1_Click()

a = ""

For n = 1 To 1000

If n Mod 37 = 0 Then

a = a & Str(n) & vbCrLf

End If

Next

Text1.Text = a

End Sub

Page 16: Visual Basic  程序设计教程

【例 5-6 】求从 1000 到 1100 之间的所有素数。窗体界面的设计参见图 5-15 ,这里给出命令按钮的 Click 事件代码:Private Sub Command1_Click()

a = ""

For n = 1001 To 1100 Step 2

s = 0

For i = 2 To Int(Sqr(n))

If n Mod i = 0 Then

s = 1

Exit For

End If

Next

If s = 0 Then a = a & Str(n) & vbCrLf

Next

Text1.Text = a

End Sub

Page 17: Visual Basic  程序设计教程

5.4 列表框与组合框【例 5-7 】将例 5-6 中的文本框改为列表框(如图 5-16 所示)。将窗体中的文本框换为列表框,无需修改列表框的属性,只需修改命令按钮的 Click 事件代码: Private Sub Command1_Click()

List1.Clear

For n = 1001 To 1100 Step 2

s = 0

For i = 2 To Int(Sqr(n))

If n Mod i = 0 Then

s = 1 : Exit For

End If

Next

If s = 0 Then List1.AddItem n ' 使用列表框的 Add 方法增加列表项 Next

End Sub

Page 18: Visual Basic  程序设计教程

【例 5-8 】“同构数”是指这样的整数:它恰好出现在其平方数的右端,例如 1 和 5 就是这样的数。试找出 1 ~ 9999 之间的全部“同构数”(如图 5-17 所示)。

窗体界面的设计参见图 5-17 ,这里给出命令按钮的 Click 事件代码:

Private Sub Command1_Click()

List1.Clear

For n = 1 To 9999

Select Case n

Case n ^ 2 Mod 10

List1.AddItem Format(n, "@@@@@") &Format(n ^ 2, "@@@@@

@@@@@")

Case n ^ 2 Mod 100

List1.AddItem Format(n, "@@@@@") & Format(n ^ 2, "@@@@@

@@@@@")

Page 19: Visual Basic  程序设计教程

Case n ^ 2 Mod 1000

List1.AddItem Format(n, "@@@@@") & Format(n ^ 2, "@@@

@@@@@@@")

Case n ^ 2 Mod 10000

List1.AddItem Format(n, "@@@@@") & Format(n ^ 2, "@@@

@@@@@@@")

End Select

Next

End Sub

Page 20: Visual Basic  程序设计教程

【例 5-9 】小学生做加减法的算术练习程序。计算机连续地随机给出两位数的加减法算术题,要求学生回答,答对的打“√”,答错的打“ ×” 。将做过的题目存放在列表框中备查,并随时给出答题的正确率(如图 5-19 所示)。

设计步骤如下:

(1) 建立应用程序用户界面。

(2) 设置对象属性

(3) 编写代码。

Page 21: Visual Basic  程序设计教程

出题部分由窗体的激活( Activate )事件代码完成:

Private Sub Form_Activate()

Randomize (Time)

a = Int(10 + 90 * Rnd)

b = Int(10 + 90 * Rnd)

p = Int(2 * Rnd)

Select Case p

Case 0

Label1.Caption = a & " + " & b & " = "

Text1.Tag = a + b ' 将本题答案放入 Text1.Tag 中

Case 1

If a < b Then t = a: a = b: b = t

Label1.Caption = a & " – " & b & " = "

Text1.Tag = a – b ' 将本题答案放入 Text1.Tag 中

Page 22: Visual Basic  程序设计教程

End Select

Form1.Tag = Form1.Tag + 1

Text1.SelStart = 0

Text1.Text = ""

End Sub

“ 关闭”按钮的 Click 事件代码:

Private Sub Command1_Click()

Unload Me

End Sub

答题部分由文本框的按健( KeyPress )事件代码完成:

Page 23: Visual Basic  程序设计教程

Private Sub Text1_KeyPress(KeyAscii As Integer)

If KeyAscii = 13 Then

fm = "!@@@@@@@@@@@@@@"

If Val(Text1.Text) = Text1.Tag Then

Item = Format(Label1.Caption & Text1.Text, fm) & " √"

List1.Tag = List1.Tag + 1

Else

Item = Format(Label1.Caption & Text1.Text, fm) & " ×"

End If

List1.AddItem Item, 0 ' 将题目和回答插入到列表框中的第 1 项

Label2.Caption = " 共 " & Form1.Tag & " 题, " & Chr(13) & " 正确率为 :"

Label3.Caption = Format(List1.Tag / Form1.Tag, "#0.0#%")

Form_Activate ' 调用出题代码

End If

End Sub

Page 24: Visual Basic  程序设计教程

【例 5-10 】利用循环结构和列表框控件,设计的“选项移动”窗体。

设计步骤如下:

(1) 建立应用程序用户界面与设置对象属性。

(2) 编写事件代码。

Page 25: Visual Basic  程序设计教程

编写命令按钮的 Click 事件代码:

Private Sub Command1_Click()

i = 0

Do While i < List1.ListCount

If List1.Selected(i) = True Then

List2.AddItem List1.List(i)

List1.RemoveItem i

Else

i = i + 1

End If

Loop

End Sub

Page 26: Visual Basic  程序设计教程

Private Sub Command2_Click()

For i = 0 To List1.ListCount - 1

List2.AddItem List1.List(i)

Next

List1.Clear

End Sub

Private Sub Command3_Click()

i = 0

Do While i < List2.ListCount

If List2.Selected(i) = True Then

List1.AddItem List2.List(i)

List2.RemoveItem i

Else

i = i + 1

End If

Loop

End Sub

Page 27: Visual Basic  程序设计教程

Private Sub Command4_Click()

For i = 0 To List2.ListCount - 1

List1.AddItem List2.List(i)

Next

List2.Clear

End Sub

5.4.2 组合框

【例 5-11 】将例 5-9 算术练习中的列表框改为组合框(下拉列表框),如图 5-22 所示。

设计步骤如下:

(1) 建立应用程序用户界面与设置对象属性。

(2) 编写程序代码

修改文本框 Text1 的按健( KeyPress )事件代码:

Page 28: Visual Basic  程序设计教程

Private Sub Text1_KeyPress(KeyAscii As Integer)

If KeyAscii = 13 Then

Fm = "!@@@@@@@@@@@@@@"

If Text1.Text = Text1.Tag Then

Item = Format(Label1.Caption & Text1.Text, Fm) & " √"

Combo1.Tag = Combo1.Tag + 1

Else

Item = Format(Label1.Caption & Text1.Text, Fm) & " ×"

End If

Combo1.AddItem Item, 0

Combo1.ListIndex = 0

Label3.Caption = " 共 " & Form1.Tag & " 题,正确率为 :"

Label2.Caption = Format(Combo1.Tag / Form1.Tag, "#0.0#%")

Form_Activate

End If

End Sub

Page 29: Visual Basic  程序设计教程

编写命令按钮 Command2 的 Click 事件代码:

Private Sub Command2_Click()

Form1.Tag = 0#

Combo1.Tag = 0#

Combo1.Clear

Label3.Caption = " 欢迎重新开始 !"

Label2.Caption = ""

Form_Activate

Text1.SetFocus

End Sub

其他代码同例 5-9 。

Page 30: Visual Basic  程序设计教程

2. 简单组合框

【例 5-12 】“简易抽奖机”。在组合框中输入号码,按“开始”按钮可以得到中奖的号码(如图 5-23 所示)。

设计步骤如下:

(1) 建立应用程序用户界面与设置对象属性。

(2) 编写事件代码。

编写组合框 Combo1 的按健( KeyPress )事件代码:

Page 31: Visual Basic  程序设计教程

Private Sub Combo1_KeyPress(KeyAscii As Integer)

If KeyAscii = 13 Then ' 按回车键后,接收输入的选项 Combo1.AddItem Combo1.Text, 0

Combo1.SelStart = 0

Combo1.SelLength = Len(Combo1.Text)

End If

If KeyAscii = 27 Then ' 按〈 Esc 〉键后,移去选项 If Combo1.ListIndex <> -1 Then

Combo1.RemoveItem Combo1.ListIndex

End If

End If

End Sub

编写命令按钮 Command1 的 Click 事件代码,使之可以随机地抽取奖号:Private Sub Command1_Click() Randomize n = Combo1.ListCount a = Int(Rnd * n) Combo1.ListIndex = a MsgBox " 中奖的号码是 :" & Chr(13) & Combo1.Text, 0, " 恭喜! "End Sub

Page 32: Visual Basic  程序设计教程

3. 下拉组合框

【例 5-13 】在例 5-12 中使用下拉组合框,可以更加节省空间(如图 5-25 所示)。

设计步骤如下:

(1) 建立应用程序用户界面与设置对象属性。

(2) 编写事件代码。

Page 33: Visual Basic  程序设计教程

Private Sub Combo1_KeyPress(KeyAscii As Integer)

If KeyAscii = 13 Then ' 按回车键后,接收输入的选项

Combo1.AddItem Combo1.Text, 0

Combo1.SelStart = 0

Combo1.SelLength = Len(Combo1.Text)

Text1.Text = Combo1.ListCount

End If

If KeyAscii = 27 Then ' 按 〈 Esc 〉键后,移去选项

If Combo1.ListIndex <> -1 Then

Combo1.RemoveItem Combo1.ListIndex

Text1.Text = Combo1.ListCount

End If

End If

End Sub

Page 34: Visual Basic  程序设计教程

编写命令按钮 Command1 的 Click 事件代码,使之可以随机地抽取奖号:

Private Sub Command1_Click()

Randomize

n = Combo1.ListCount

a = Int(Rnd * n)

Combo1.ListIndex = a

Label1.Caption = " 中奖的号码是 :" & Combo1.Text

End Sub

5.5 算法举例

【例 5-14 】“水仙花数”是指一个 3 位数,其各位数的立方和等于该数,如: 153 = 13 + 53 + 33

Page 35: Visual Basic  程序设计教程

窗体界面的设计参见前面例子,这里给出命令按钮的 Click 事件代码:

Private Sub Command1_Click()

Dim p As Integer

List1.Clear

For n = 100 To 999

a = Int(n / 100)

b = Int((n – a * 100) / 10)

c = n - (a * 100 + b * 10)

p = a ^ 3 + b ^ 3 + c ^ 3

If p = n Then List1.AddItem p

Next

End Sub

Page 36: Visual Basic  程序设计教程

【例 5-15 】马克思曾经做过这样一道趣味数学题:有 30 个人在一家小饭馆里用餐,其中有男人、女人和小孩。每个男人花了 3先令,每个女人花了 2先令,每个小孩花了 1先令,一共花去 50先令。问男人、女人以及小孩各有几人?如图 5-28 所示。

Page 37: Visual Basic  程序设计教程

窗体界面的设计参见前面例子,这里给出命令按钮的 Click 事件代码:

Private Sub Command1_Click()

List1.Clear

For x = 1 To 16

For y = 1 To 24

z = 30 – x – y

If 3 * x + 2 * y + z = 50 Then

p = Format(x, "@@@") & Format(y, "@@@@@") & Format(z, "@@@@@")

List1.AddItem p

End If

Next

Next

End Sub

Page 38: Visual Basic  程序设计教程

习题五

5.1 输出 101 ~ 500 之间的所有奇数,奇数之和。

5.2 输出 100 ~ 200 之间不能被 3 整除的数。

5.3 输入初始值,输出 100 个不能被 3 整除的数。

5.4 设计程序,求 s = 1 + (1 + 2) + (1 + 2 + 3) + … + (1 + 2 + 3 + … + n) 的值。

5.5 设 s = 1×2×3×…×n,求 s不大于 400000 时最大的 n。

5.6 设 s = 11×22×33×…×nn ,求 s不大于 400000 时最大的 n。

5.7 找出 1 ~ 1000 之间的全部“同构数”。

5.8 “ 完备数”是指一个数恰好等于它的因子之和,如 6 的因子为 1、2、 3 ,而 6 = 1 + 2 + 3 ,因而 6 就是完数。编制程序,找出 1 ~ 1000之间的全部“完备数”。

5.9 编制程序,求出所有小于或等于 100 的自然数对。自然数对是指两个自然数的和与差都是平方数,如 8 与 17 的和 8 + 17 = 25 与其差 17 – 8 = 9 都是平方数,则 8 和 17称自然数对。

Page 39: Visual Basic  程序设计教程

5.10 我国古代数学家张丘建在“算经”里提出一个世界数学史上有名的百鸡问题:鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问鸡翁、母、雏各几何?

5.11 利用 ex 的下述近似公式计算 e (直到最后一项小于 10-6 为止)。

!n!3!2!11e

n32 xxxxx

5.12 编程序在窗体上输出的图形如图 5-30 所示。

5.13 编程序在窗体上输出的图形如图 5-31 所示。

图 5-30 题 5.12 图 5-31 题 5.13

Page 40: Visual Basic  程序设计教程

5.14 求下述数列的前 n 项之和:

,,,,,…

5.15 验证“哥德巴赫猜想”。 1742 年 6 月,德国数学家哥德巴赫( C.

Goldbah 1690-1764 )在给彼得堡的大数学家欧拉的信中提出一个问题:任何大于 6 的偶数均可以表示为两个素数之和吗?欧拉复信道:“任何大于 6 的偶数均可以表示为两个素数之和,这一猜想我还不能证明,但我确信无疑地认为这是完全正确的定理。”这就是至今尚未被证明的哥德巴赫猜想。

5.16 输出 1 ~ 100 之间的平方、平方根、自然对数、 e 指数的数学用表。