Visual Basic 程序设计教程

Post on 03-Jan-2016

79 Views

Category:

Documents

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

Transcript

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

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

2003 年 6月

第 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 算法举例算法举例习题五习题五

5.2.1 前测型 Do…Loop 循环

其语法为

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

[ 〈语句列 1 〉 ]

[Exit Do]

[ 〈语句列 2 〉 ]

Loop

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

设计步骤如下:

窗体界面的设计参见前面章节,这里仅给出命令按钮的 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

还可以改为直到型:

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

【例 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

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

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

Private Sub Text1_GotFocus()

Text1.SelStart = 0

Text1.SelLength = Len(Text1.Text)

End Sub

5.2.2 后测型 Do…Loop 循环

其语法为

Do

[ 〈语句列 1 〉 ]

[Exit Do]

[ 〈语句列 2 〉 ]

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

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

222

2

22

2

2

22

设计步骤如下:

(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

文本框 Text1 的 GotFocus 事件代码:

Private Sub Text1_GotFocus()

Text1.SelStart = 0

Text1.SelLength = Len(Text1.Text)

End Sub

【例 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

Do

r = m Mod n

m = n

n = r

Loop While r <> 0

Text3.Text = m

End Sub

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

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

[ 〈语句列 1 〉 ]

[Exit For]

[ 〈语句列 2 〉 ]

Next [ 〈循环变量〉 ]

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

设计步骤如下:

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

(2) 编写代码。

编写命令按钮的 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

【例 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

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

【例 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, "@@@@@

@@@@@")

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

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

设计步骤如下:

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

(2) 设置对象属性

(3) 编写代码。

出题部分由窗体的激活( 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 中

End Select

Form1.Tag = Form1.Tag + 1

Text1.SelStart = 0

Text1.Text = ""

End Sub

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

Private Sub Command1_Click()

Unload Me

End Sub

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

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

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

设计步骤如下:

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

(2) 编写事件代码。

编写命令按钮的 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

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

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 )事件代码:

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

编写命令按钮 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 。

2. 简单组合框

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

设计步骤如下:

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

(2) 编写事件代码。

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

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

3. 下拉组合框

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

设计步骤如下:

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

(2) 编写事件代码。

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

编写命令按钮 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

窗体界面的设计参见前面例子,这里给出命令按钮的 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

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

窗体界面的设计参见前面例子,这里给出命令按钮的 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

习题五

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称自然数对。

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

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

,,,,,…

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

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

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

top related