实验3 基本控制结 构 3.1 基本控制结构程序设计 实验目的 (1)掌握3 种基本结构的程序流程图。 (2)熟练掌握分支结构的程序设计方法。 (3)熟练掌握循环结构的程序设计方法。 实验内容 Visual Basic 是结构化的程序设计语言,有3 种基本控制结构:顺序结构、分支结构和 循环结构。循环结构又分“当型”循环和“直到型”循环,其程序流程图如图3-1 所示。 (a) 顺序结构 (b) 分支结构 (c) “当型”循环 (d) “直到型”循环 图3-1 程序流程图 分支结构主要有:If…Then…Else 结构、Select Case 结构和If 函数。循环结构主要有 Do…Loop 和For…Next 结构。有的问题可以使用多种结构形式解决,有的问题只能使用某 种结构实现,根据不同的情况灵活使用不同的结构形式。 【实验3-1】单分支结构。输入变量X 和Y 的值,当X 小于Y 时,X 与Y 的值互换。 Private Sub Form_Click( ) Dim x As Integer, y As Integer x = InputBox("X=" ) y = InputBox("Y=" ) If x < yThen t = x: x =y:y = t End If Print "X="; x; "Y="; y End Sub 练习: 实验3-1 中, 20 Visual Basic 实训(第4 版) If x < yThen t = x: x = y:y = t End If 是否可以用If x < y Then t= x:x= y:y= t 替换? 【实验3-2 】运行下列程序,深入体会循环变量的初值、终值和步长取值的变化情况。 Private Sub Form_Click( ) Dim x As Integer, y As Integer, z As Integer x = 3: y = 4: z = 15 For i = xToz Stepy i= i + 3 x = x + 3 y =y + 3 z = z+ 3 Next i Print "i="; i; "x="; x; "y="; y; "z="; z End Sub 【实验3-3】将输入的字符串反向显示。 1. 界面设计 放置2 个标签(Label1 和Label2)、2 个文本框(Text1 和Text2)和1 个按钮(Command1)。 Text1 用于输入,Text2 用于显示反向后的字符串。根据图3-2(a)设置标签和按钮的Caption 属性,并将Text 属性设置为空。 2. 程序代码设计 功能要求:单击Command1 ,进行字符串反向运算,并在Text2 中显示反向后的字符 串。运行结果如图3-2(a)所示。 流程图如图3-2(b)所示。 图3-2 字符串取反 程序代码: Option Explicit 实验 3 基本控制结构 21 Private Sub Command1_Click( ) Dim String1 As String, String2 As String Dim i As Integer, n As Integer String1 = Text1.Text n = Len(String1) '取字符串长 度 For i=1Ton String2 = Mid(String1, i, 1) & String2 Next i Text2.Text = String2 End Sub 程序分析: . For 循环的次数是由字符串的长度n 决定的。 . 用Mid() 函数每次从字符串中第i 个位置取一个字符。 练习: 使用Do…Loop 结构实现循环。 【实验3-4】求两个数m、n 的最大公约数和最小公倍数。 Private Sub Form_Click( ) Dim m As Integer: Dim n As Integer Dim t As Integer, r As lnterger, mn As lnterger m = InputBox(" 请输入M值", , , 100, 120) n = InputBox(" 请输入N值", , , 100, 200) If n <= 0 Orm<=0Then Print " " End End If mn = m * n If m < n Thent = m: m = n: n = t DoWhile n <> 0 r=mMod n m= n n= r Loop Print " 最大公约数为:",m, " 最小公倍数为:",mn / m End Sub 【实验3-5 】摇奖产生中奖号码,并查询是否中奖。 1. 界面设计 在窗体界面中放置1 个标签Label1、1 个文本框Text1 和1 个按钮Command1 。 2. 属性设置 界面控件的属性设置见表3-1。 22 Visual Basic 实训(第4 版) 表3-1 界面控件的属性设置 对象控件名属性名属性值 Form Form1 Caption 摇奖 Label Label1 Caption 中奖号码 Text Text1 Text 空 3. 程序代码设计 功能要求:单击Command1 产生中奖号码,并显示在文本框Text1 中,通过循环产生 3 位随机数,组成中奖号码。运行界面如图3-3 所示。 流程图如图3-4 所示。 图3-3 运行界 面 图3-4 流程图 程序代码: Option Explicit Private Sub Command1_Click() '单击按钮开始摇奖 Dim i As Integer, s As Integer Dim Prize As String For i=1To 3 Randomize s = Str(Int(10 * Rnd)) '产生0~9 的随机数 Prize = Prize & s Text1.Text = Prize Next i End Sub 程序分析: . Rnd 为产生随机数的函数,使用Randomize 语句初始化随机数生成器,使每次产生 的随机数都不同。 . 用&符号连接字符串。 4. 修改程序 1)增加延时程序 为了产生摇奖的效果,使每次号码中间产生时间间隔,可以使用空的For 循环实现。 实验 3 基本控制结构 23 程序修改如下: Private Sub Command1_Click( ) '单击按钮开始摇 奖 Dim i As Integer, s As Integer Dim j As Single Dim Prize As String For i=1To 3 For j = 0 To 1000 Step 0.0001 '产生时间间 隔 Next j Randomize s = Str(Int(10 * Rnd)) '产生0~9 的随机 数 Prize = Prize & s Text1.Text = Prize Text1.Refresh '刷新文本 框 Next i End Sub 程序分析: . 使用空循环,循环步长为0.0001 。 . Text1.Refresh 是刷新文本框,即刷新文本框中的文本内容。 2)设计查询是否中奖,并查询所中奖的等级 界面设计:在窗体界面增加1 个标签Label2、2 个文本框(Text2 和Text3 )及1 个按 钮Command2 。 功能要求:从Text2 中输入奖券号码,单击Command2,查询是否中奖及中奖的等级。 若与中奖号码相同,则为一等奖;若与中奖号码的前2 位相同,则为二等奖;若与中奖号 码的前1 位相同,则为三等奖。中奖信息在Text3 中显示。程序运行界面如图3-5(a)所 示。流程图如图3-5(b)所示。 (a)运行界面(b)流程图 图3-5 摇奖程序 24 Visual Basic 实训(第4 版) 程序代码: Private Sub Command2_Click() '单击按钮查询中奖 Dim Code As String, Prize As String Prize = Text1.Text Code = Text2.Text If Code = Prize Then Text3.Text = " 恭喜你,中了一等奖!" ElseIf Left(Code, 2) = Left(Prize, 2) Then Text3.Text = " 恭喜你,中了二等奖!" ElseIf Left(Code, 1) = Left(Prize, 1) Then Text3.Text = " 恭喜你,中了三等奖!" Else Text3.Text = " 谢谢你的参与!" End If End Sub 练习: '前2位相同 '前1位相同 使用Select Case 结构实现查询中奖的程序。 3)修改中奖的条件 若与中奖号码相同,则为一等奖;若有2 位与中奖号码相同,则为二等奖;若有1 位 与中奖号码相同,则为三等奖。此时中奖的情况分为多种:二等奖有2 位相同,有3 种情 况;三等奖有1 位相同,也有3 种情况。 程序代码修改如下: Private Sub Command2_Click( ) '单击按钮查询中 奖 Dim Code As String, Prize As String Prize = Text1.Text Code = Text2.Text If Code = Prize Then Text3.Text = " 恭喜你,中了一等奖! " ElseIf Code Like Left(Prize, 2) & "?" Then Text3.Text = " 恭喜你,中了二等奖! " ElseIf Code Like Left(Prize, 1) & "?" & Right(Prize, 1) Then Text3.Text = " 恭喜你,中了二等奖! " ElseIf Code Like "?" & Right(Prize, 2) Then Text3.Text = " 恭喜你,中了二等奖! " ElseIf Code Like Left(Prize, 1) & "??" Then Text3.Text = " 恭喜你,中了三等奖! " ElseIf Code Like "?" & Mid(Prize, 2, 1) & "?" Then Text3.Text = " 恭喜你,中了三等奖! " ElseIf Code Like "??" & Right(Prize, 1) Then Text3.Text = " 恭喜你,中了三等奖! " 实验 3 基本控制结构 25 Else Text3.Text = " 谢谢你的参与! " End If End Sub 程序分析:Like 运算符用来进行字符匹配的运算,“?”表示匹配单个字符。 练习: 若使用If 结构嵌套实现上面的查询中奖,应如何修改程序? 3.2 综合练习 【实验3-6】对3 个数进行排序。输入任意3 个数,按从大到小的顺序输出。 功能要求:设计程序界面,画流程图,再依据图编制程序上机调试,验证程序的正 确性。 【实验3-7】计算税款。假如收税标准如下: 收入s/元超出部分税率/ % s<1 000 0 1 000≤s<1 500 5 1 500≤s<2 000 10 2 000≤s<2 500 15 2 500≤s<5 000 20 s>5 000 25 本题是一个典型的多分支情况,如果使用嵌套的If 结构,因层次复杂,容易产生 If 和End If 不匹配的语法错误,因此建议使用If…Then…Else If 结构或Select Case 结构。 【实验3-8】编写程序,用一近似公式求e=1+1/1!+1/2!+…+1/n!,要求误差小于1e-5。 【实验3-9 】编程计算PI/2=2/1×2/3×4/3×4/5×6/5×6/7×…×2n/(2n-1)×2n/(2n+1) (循环次数为10 000 次或值与1 之差小于0.000 1)。