400 likes | 548 Views
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 }〈 条件 〉]
E N D
Visual Basic 程序设计教程 机械工业出版社同名教材配套电子教案 2003 年 6月
第5章 循环结构程序设计 5.1循环结构程序设计的概念 5.2Do…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 }〈条件〉] [〈语句列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】输入一个正整数,利用“当型”循环判断是否素数。【例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事件代码如下:另外,为了使用文本框得到焦点后,文本立即被选中,编写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】输入有效数字的位数,利用下述公式计算圆周率π的近似值:
设计步骤如下: (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-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-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所示)。【例5-9】小学生做加减法的算术练习程序。计算机连续地随机给出两位数的加减法算术题,要求学生回答,答对的打“√”,答错的打“×”。将做过的题目存放在列表框中备查,并随时给出答题的正确率(如图5-19所示)。 设计步骤如下: (1) 建立应用程序用户界面。 (2) 设置对象属性 (3) 编写代码。
出题部分由窗体的激活(Activate)事件代码完成:出题部分由窗体的激活(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】利用循环结构和列表框控件,设计的“选项移动”窗体。【例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事件代码,使之可以随机地抽取奖号:编写命令按钮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事件代码:窗体界面的设计参见前面例子,这里给出命令按钮的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所示。【例5-15】马克思曾经做过这样一道趣味数学题:有30个人在一家小饭馆里用餐,其中有男人、女人和小孩。每个男人花了3先令,每个女人花了2先令,每个小孩花了1先令,一共花去50先令。问男人、女人以及小孩各有几人?如图5-28所示。
窗体界面的设计参见前面例子,这里给出命令按钮的Click事件代码:窗体界面的设计参见前面例子,这里给出命令按钮的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为止)。 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指数的数学用表。