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