Presentation is loading. Please wait.

Presentation is loading. Please wait.

第4章 基本的控制结构 4.1 顺序结构 4.2 选择结构程序设计 4.3 循环结构 4.4 综合实例 退出.

Similar presentations


Presentation on theme: "第4章 基本的控制结构 4.1 顺序结构 4.2 选择结构程序设计 4.3 循环结构 4.4 综合实例 退出."— Presentation transcript:

1 第4章 基本的控制结构 4.1 顺序结构 4.2 选择结构程序设计 4.3 循环结构 4.4 综合实例 退出

2 4.1 顺序结构 数据输出 数据输入 返回 退出

3 数据输出 1 Print方法 2 与Print方法有关的函数 3 使用位置属性 4 清除方法CLS 5 使用“标签”控件的输出

4 1 Print方法 Print方法的语法格式为:
object.Print {Spc(n) | Tab(n)} expression charpos 其中: object:窗体、图片框、打印机等对象。 Expression:要打印的数值表达式或字符串表达式。 Charpos:逗号或分号,指定下个字符的插入点。

5 2. 与Print方法有关的函数 与Print相配合的函数: (1)Tab函数
Tab[(n)] 当在一个 Print方法中有多个Tab函数时,每个Tab函数对应一个输出项,各输入项之间用分号隔开。

6 例题 Private Sub Form_Click() Print "12345678901234567890"
Print Tab(5); "5"; Tab(10 - 2); "8", " '注意这里10-2>当前位置5,故同行显示" Print Tab(5); "5"; Tab(10 - 6); "4"; Tab( ); "5"; " '注意这里10-6<当前位置5,故换行显示;20-15>当前位置4,故同行显示" End Sub 程序执行结果见图4-1。程序中已经对程序显示特点做出解释。 图4-1 Print方法与Tab()函数结合

7 (2)Spc函数 在显示或打印列表中的下一个表达式之前插入n个空白数,n为0~32767之间的整数。Spc函数与输出项之间用分号隔开。 格式: Spc(n) 如果 n 小于输出行的宽度,则下一个打印位置将紧接在数个已打印的空白之后。如果 n 大于输出行的宽度,则 Spc 利用下列公式计算下一个打印位置: 当前位置+ (n Mod 行宽) Spc函数与Tab函数的作用类似,可以互相代替。但应注意,Tab函数从对象的左端开始记数,而Spc函数只表示两个输出项之间的间隔。

8 3. 使用位置属性 位置属性CurrentX和CurrentY常用来把文本精确地输出到窗体、图片框或打印页上。这两个属性分别表示当前输出位置的横坐标与纵坐标。 格式: [对象名称].CurrentX [=x] [对象名称].CurrentY [=y]

9 例如:下面程序将图片框相对于窗体居中显示,图片框中的文字居中显示。
Private Sub Form_Click() Dim str1 As String str1 = "图片框相对窗体、文字相对图片框居中显示" Picture1.FontName = "宋体" '图片框中文字的字体 Picture1.FontSize = '图片框中文字的字号 Picture1.Left = (ScaleWidth - Picture1.Width) / '图片框水平位置 Picture1.Top = (ScaleHeight - Picture1.Height) / '图片框垂直位置 Picture1.CurrentX = Picture1.ScaleLeft + Picture1.Width / Picture1.TextWidth(str1) / 2 '输出水平位置 Picture1.CurrentY = Picture1.ScaleTop + Picture1.Height / 2 - Picture1.TextHeight(str1) / 2 '输出垂直位置 Picture1.Print str '在图片框中输出字符串str1 End Sub 各对象的其他参数保持默认值。程序设计时和运行结果见图4-2。无论怎样调整窗体,只要单击窗体,都会按题目要求调整图片框和文本的位置。TextWidth()为求文本宽度的函数。

10 (a)设计时 (b)运行时 图4-2 位置属性的应用

11 4. 清除方法CLS Cls 将清除图形和打印语句在运行时所产生的文本和图形,清除后的区域以背景色填充。但是设计时在 Form 中使用 Picture 属性设置的背景位图和放置的控件不受 Cls 影响。 语法: [〈对象名称〉.]Cls 例如,为了在运行时双击窗体时清除图片框中的文本,编写的程序为: Private Sub Form_DblClick() Picture1.Cls '清除图片框中的文本 End Sub 如果将代码由Picture1.Cls改为.Cls,将无法清除图片框中的文本。

12 5.使用“标签”控件的输出 标签(Label)是VB中最常用的输出文本信息的工具,目前几乎完全取代了Print方法。
例如:建立一个Label控件和Command控件,按表4-1设置设计时属性。加入如下代码,运行程序。 Private Sub Command1_Click() Label1.WordWrap = True Label1.AutoSize = True Label1.BorderStyle = 1 Label1.BackColor = &H End Sub 由运行结果可知,单击命令按钮后,标签控件可以自动适用内容,并自动换行,且加上边框,背景色为白色以突出显示文字。

13 表4-1 属性设置 (a)设计时 (b)运行结果 图4-3 利用标签控件输出 对象 属性 设计时属性值 说明 Command1
表4-1 属性设置 对象 属性 设计时属性值 说明 Command1 Caption 单击此按钮,令WordWrap=True,AutoSize=True 命令按钮标题 Label1 将WordWrap属性设置为True,则Caption属性的内容自动换行并垂直扩充;将AutoSize属性设置为True,控件自动适应内容 标签控件的内容 WordWrap False 不自动换行 AutoSize 控件不能自动调整 Font 宋体、三号 (a)设计时 (b)运行结果 图4-3 利用标签控件输出

14 数据输入 1 使用“文本框”控件进行输入 2 SetFocus 方法 3 与用户交互的函数和过程

15 1 使用“文本框”控件进行输入 例4-1:如图4-4所示,在设计时建立四个标签控件和三个文本框控件,各控件的设置见表4-2。要求在运行时,双击填写意见的文本框,可以将该文本框放大至窗口的1/2。 设计步骤如下: (1)建立应用程序用户界面 单击“文件|新建工程”,进入窗体设计器。按如图4-4(a)所示布局增加四个标签Label1~ Label4和三个文本框Text1~Text3。 (2)属性设置 按表4-3所示设置各对象的属性值,其他属性值不变。 (3)编写代码 双击Text3文本框,打开Text3的代码窗口,在过程下拉列表框中选择“DblClick”,编写Text3的DblClick事件的代码: Private Sub Text3_DblClick() Text3.Left = 0 Text3.Width = Width ' Text3的宽度为窗口宽度 Text3.Height = Height / ' Text3的高度为窗口高度的1/2 Label4.Top = Text3.Top + Text3.Height ' Label4始终在Text3之下 End Sub

16

17 2 SetFocus 方法 使某个控件获得焦点,可以有多种方法: (1)直接单击这一控件。
(2)按Tab键(或Tab+Shfit组合键)按规定的次序在各控件之间移动焦点。 (3)在代码中使用SetFocus 方法使得某一控件获得焦点。 使用SetFocus 方法的格式为: <对象名称>.SetFocus 其中: <对象名称>:为对象表达式,其值为可以获得焦点的控件对象名称。

18 例4-2:在上述工程中,增添一个命令按钮,单击该按钮时将清空所有文本框中的内容(完善的工程将要编写保存用户信息的代码)。
(1)增加Command命令按钮。 在窗体的合适位置增加一个Command命令按钮,调整其大小。 (2)设置属性 可以将Caption属性值设置为“发送”。设置Font属性符合整体风格。 (3)编写Command1的Click事件的代码 Private Sub Command1_Click() Text1.Text = "" Text2.Text = "" Text3.Text = "" Text1.SetFocus End Sub 并在上例代码的后面增加一行如下代码: Command1.Top = Text3.Top + Text3.Height ' Command1始终在Text3之下 该代码使得Command1控件始终保持在Text3控件之下。

19 3 与用户交互的函数和过程 1.InputBox函数 作用:在一对话框中显示提示,等待用户输入正文或按下按钮,并返回包含文本框中内容,函数值的类型为 String类型。 语法格式: [变量[%]]=InputBox(<提示>[,<标题>] [,<默认>] [, <x坐标位置>] [, <y坐标位置>] [, <helpfile>, <context>]) 2.MsgBox函数和MsgBox过程 作用:在对话框中显示信息,等待用户单击按钮,并返回一个整数以标明用户单击了哪个按钮。 语法格式 [变量[%]]=MsgBox(<提示>[, <按钮>] [, <标题>] [, <helpfile>, <context>])

20 例4-3:在上述实例中,要求单击“发送”命令按钮后,显示如下对话框,提示您输入身份证号,并将输入内容保存在变量strIDcard中。
增添的代码为: Private Sub Command1_Click() Dim strIDcard As String, strText As String strText = "请输入您的身份证号并单击“确定”" + Chr(13) + Chr(10) + "重新填写请单击“取消”" strIDcard = InputBox$(strText, "身份证号", , 100, 100) Text1.SetFocus End Sub 如果单击“确定”按钮,则strIDcard的值为输入值“ ”,否则为空字符串。 图4-5 使用InputBox 函数

21 (2)MsgBox函数和MsgBox过程 MsgBox函数在对话框中显示信息,等待用户单击按钮,并返回一个整数以标明用户单击了哪个按钮。其语法格式为: [变量[%]]=MsgBox(<提示>[, <按钮>] [, <标题>] [, <helpfile>, <context>]) MsgBox语句的用法为: MsgBox <提示>[, <按钮>] [, <标题>] [, <helpfile>, <context>] 其中: <提示>、<标题>、<Helpfile>和< context>的意义同InputBox函数。 <按钮>可选项。整型表达式,指定显示按钮的数目及形式,使用的图标类型,缺省按钮的种类以及消息框的强制回应等。如果省略,则 <按钮> 的缺省值为 0。

22 表4-3 <按钮>设置值及其意义 分组 系统常数 值 描述 按钮数目 vbOKOnly 只显示 OK 按钮。
表4-3 <按钮>设置值及其意义 分组 系统常数 描述 按钮数目 vbOKOnly 只显示 OK 按钮。 VbOKCancel 1 显示 OK 及 Cancel 按钮。 VbAbortRetryIgnore 2 显示 Abort、Retry 及 Ignore 按钮。 VbYesNoCancel 3 显示 Yes、No 及 Cancel 按钮。 VbYesNo 4 显示 Yes 及 No 按钮。 VbRetryCancel 5 显示 Retry 及 Cancel 按钮。 图标类型 VbCritical 16 显示 Critical Message 图标。 VbQuestion 32 显示 Warning Query 图标。 VbExclamation 48 显示 Warning Message 图标。 VbInformation 64 显示 Information Message 图标。 默认按钮 vbDefaultButton1 第一个按钮是缺省值。 vbDefaultButton2 256 第二个按钮是缺省值。 vbDefaultButton3 512 第三个按钮是缺省值。 模式 vbApplicationModal 应用程序强制返回;应用程序一直被挂起,直到用户对消息框作出响应才继续工作。 vbSystemModal 4096 系统强制返回;全部应用程序都被挂起,直到用户对消息框作出响应才继续工作。

23 表4-4 MsgBox函数的返回值 系统常数 返回值 描述 VbOK 1 确定 vbCancel 2 取消 vbAbort 3 终止
vbRetry 4 重试 vbIgnore 5 忽略 VbYes 6 VbNo 7

24 例4-4:在上例中,如果要求在单击InputBox对话框中的“确定”按钮后,弹出一个如图4-6所示的对话框,以便用户进行审查并作出如下选择:
图4-6 MsgBox 对话框的应用(a) 单击“是”:完成提交操作,显示如图4-7对话框,单击“确定”结束程序。 单击“否”:返回Command1_click事件,重新显示如图4-5所示输入对话框。 单击“取消”:没有提交操作,显示如图4-8对话框,单击“确定”结束程序。

25 图4-7 MsgBox 对话框的应用 图4-8 MsgBox 对话框的应用

26 修改的Command1_click事件代码为:
Private Sub Command1_Click() Dim intMsgin As Integer Dim strmsg As String strText = "请输入您的身份证号并单击“确定”" + Chr(13) + Chr(10) + "重新填写请单击“取消”" strIDcard = InputBox$(strText, "身份证号", , 100, 100) strmsg = "请确认您的身份证号码:" + Chr(13) + Chr(10) + strIDcard ' 图4-9对话框显示的内容 If strIDcard <> "" Then intMsgin = MsgBox(strmsg, vbYesNoCancel + vbQuestion + vbDefaultButton2, "确认身份证") End If Select Case intMsgin Case 6 ' ……..提交意见单的代码略 MsgBox "您的意见已经提交,谢谢!", vbOKOnly + vbInformation, "已经提交" Case 7 Command1_Click ' 重新执行Command1_Click 事件 Case 2 MsgBox "您已经放弃提交意见,欢迎下次参加!", vbOKOnly + vbCritical, "放弃提交" End Select End End Sub

27 选择结构程序设计 If条件语句 Select Case 条件函数 返回 退出

28 4.2.1 If条件语句 1.单分支条件结构(If...Then语句) 2.双分支结构(If...Then...Else语句)
3.多分支结构(If…Then…ElseIf语句) 4.If语句的嵌套

29 1.单分支条件结构(If...Then语句) 用 If...Then 结构有条件地执行一个或多个语句。单行语法和多行块语法都可以使用:
<语句块> End If 下面两个例子等价: (1)If todayDate < Now Then todayDate = Now (2)If todayDate < Now Then todayDate = Now 注意:If...Then 的单行格式不用 End If 语句。如果 <表达式>为 True 时要执行多行代码,则必须使用多行块 If...Then...End If 语法。例如: If todayDate < Now Then Timer1.Enabled = False ' 定时器控制失效。

30 图4-12 单分支条件语句 图4-13 单分支条件语句实例
<表达式> True False <语句> 空 todayDate < Now True False todayDate = Now 空 Timer1.Enabled = False 图4-12 单分支条件语句 图4-13 单分支条件语句实例

31 可以用 If...Then...Else 块定义几个语句块,执行其中一个语句。其语法格式也有两种形式:
<语句块1> Else <语句块2> End If (2)If <表达式> Then<语句1>Else<语句2> 当<表达式>的值为真时,执行Then后面的语句块1(或语句1),否则执行Else后面的语句块2(或语句2)。其流程见图4-11。 <表达式> True False <语句块1> <语句块2> y= 图4-14 双分支结构流程

32 本题在选择条件时,可以选择x<0作为条件,也可以选择x≥0作为条件。这里选择x≥0作为条件。画出如图4-12所示流程图。
例如:计算分段函数 y = 本题在选择条件时,可以选择x<0作为条件,也可以选择x≥0作为条件。这里选择x≥0作为条件。画出如图4-12所示流程图。 x≥0 True False y=3*x*x+4*x-5 y= 图4-12 双分支结构流程实例

33 If x<0 Then y=3*x*x+4*x-5 If x≥0 Then y=
1)用单分支结构实现 y=3*x*x+4*x-5 If x≥0 Then y= If x<0 Then y=3*x*x+4*x-5 If x≥0 Then y= 但是,不能这样表示: If x≥0 Then y= y=3*x*x+4*x-5 (2)用双分支结构实现 If x≥0 Then y= Else y=3*x*x+4*x-5 End If

34 多分支结构可以处理两个或两个以上分支。其语句形式为: If <表达式1> Then <语句块1>
3. 多分支结构(If…Then…ElseIf语句) 多分支结构可以处理两个或两个以上分支。其语句形式为: If <表达式1> Then <语句块1> ElseIf<表达式2> Then <语句块2> [Else <语句块n+1>] End If Visual Basic 首先测试<表达式1>。如果它为 False,Visual Basic就测试<表达式2>,依次类推,直到找到一个为 True 的条件。当它找到一个为 True 的条件时,Visual Basic就会执行相应的语句块,然后执行 End If 后面的代码。作为一个选择,可以包含 Else 语句块,如果条件都不是 True,则 Visual Basic 执行 Else 语句块。

35 图4-13 多分支结构流程 <表达式1> 语句块1 <表达式2> 语句块2 …… 语句块n 语句块n+1
False True False True True False 语句块n 语句块n+1 图4-13 多分支结构流程

36 例4-5:利用If...Then...Else 语句编写求函数
y = 的值的程序,要求只要在文本框Text1中输入自变量x的值,就在标签栏label1上显示函数值。 根据题意,在窗体上添加一个文本控件Text1和标签控件label1,代码应包含在Text1_change事件中。代码为: Private Sub Text1_Change() Dim x As Double, y As Double Label1.Caption = "" ' 清空Label1的内容 x = CDbl(Text1.Text) ' 将字符串类型转化为双精度类型 If (x < 1#) Then y = 1# - x ElseIf (x >= 1# And x <= 2#) Then y = (1# - x) * (2# - x) Else y = -(2# - x) End If Label1.Caption = y ' 在Label1上显示结果 End Sub

37 图4-14 多分支结构流程实例 x < 1# x >= 1# And x <= 2# True False
y = (1# - x) * (2# - x) y = -(2# - x) True False y = 1# - x 图4-14 多分支结构流程实例

38 例4-6:大学录取新生时,根据学生总分情况给与奖励,条件如下:
(1)四门总分不低于700分,特等奖。 (2)四门总分680分(含680分)~700分(不含700分),优秀奖。 (3)前三门单科不低于145分,第四门不低于280分),特别奖。 (4)奖励按特等奖、优秀奖、特别奖由高到低,不重复计奖(包括单科)。 要求:四科成绩(intmark1、intmark2、intmark3、intmark4)依次在四个文本框中输入,总分(intmark0)在标签控件上显示。单击命令按钮Command1后,在对话框中显示获奖情况。 分析:获奖条件表达式分别为: (1)intmark0>=700 (2)intmark0>=680 AND intmark0<700 (3)intmark1>=145 OR intmark2>=145 OR intmark3>=145 OR intmark4>=280 流程图见图4-18。 设计步骤如下: (1)建立应用程序用户界面 按如图4-19建立四个文本框(Text1~Text4)接受成绩输入,两个标签控件(Label1~Label2),一个命令按钮Command1,设置各控件的属性,其中Command1的Caption属性值为“查询”。

39 图 4-15多分支结构流程实例 图4-16应用程序运行情况 intmark0>=700 True Flase 特等奖 优秀奖
intmark1>148 OR intmark2>148 ORintmark3>148 OR intmark4>148 intmark0>=680 AND intmark0<700 特别奖 您没有获奖 True Flase Flase True 图 4-15多分支结构流程实例 图4-16应用程序运行情况

40 (2)编写程序代码 根据流程图,编写出Command_click事件的代码为: Private Sub Command1_Click() Dim intmark0 As Integer, intmark1 As Integer Dim intmark2 As Integer, intmark3 As Integer, intmark4 As Integer intmark1 = CInt(Text1.Text) intmark2 = CInt(Text2.Text) intmark3 = CInt(Text3.Text) intmark4 = CInt(Text4.Text) intmark0 = intmark1 + intmark2 + intmark3 + intmark4 Label3.Caption = intmark0 If intmark0 >= 700 Then MsgBox "您获得了特等奖", vbOKOnly + vbInformation, "获奖通知" ElseIf intmark0 >= 680 Then MsgBox "您获得了优秀奖", vbOKOnly + vbInformation, "获奖通知" ElseIf intmark1 >= 145 Or intmark2 >= 145 Or intmark3 >= 145 Or intmark4 >= 280 Then MsgBox "您获得了特别奖", vbOKOnly + vbInformation, "获奖通知" Else MsgBox "很遗憾,您没有获奖", vbOKOnly + vbInformation, "获奖通知" End If End Sub

41 4. If语句的嵌套 上面学习了If语句的基本形式,可以通过这些基本形式加以复合,获得更为复杂的If结构,称为If语句的嵌套。一般形式如图4-17所示。图4-18为在Else块中嵌套If结构的形式。可根据实际情况选择采用何种结构。 图4-17 If语句复合结构的一般形式 图4-18在Else块中嵌套If结构的形式

42 图4-19 正确与错误的转向

43 例4-7:求a、b、c中三个实数的最大值、最小值,程序中不得使用循环结构和转向语句。a、b、c三值从三个文本框中输入,当单击命令按钮时将结果显示在窗体上。画出流程图。
(1)设计流程图 根据题意,画出如图4-20所示流程图。 a<b True False b<c True a<c Mininabc=a Mininabc=c Maxinabc=b Maxinabc=a False True False Maxinabc=c Mininabc=a Mininabc=c True False True False Mininabc=b Mininabc=b Maxinabc=c Maxinabc=a Maxinabc=c 图4-20 求三个数极值的流程 (2)设置界面与控件属性 在窗体上添加三个文本框,一个命令按钮,设置各自的属性(主要是Caption属性和Font属性)。

44

45 Select Case Select Case的结构形式为: Select Case <测试表达式> [Case <表达式列表1> [<语句块1>]] [Case <表达式列表3> [<语句块2>]] [Case <表达式列表n> [<语句块n>]] [Case Else [<语句块n+1>]] End Select

46 Select Case选择结构执行的过程为: (1)计算<测试表达式>的值
(2)将<测试表达式>的值与Case语句中的<表达式列表>中的每一个值逐一进行比较。如果与其中的一个值相匹配,则执行该语句中的<语句块>。如果不止一个 Case与<测试表达式>相匹配,则只对第一个匹配的 Case 执行与之相关联的<语句块>。如果在表达式列表中没有一个值与测试表达式相匹配,则 Visual Basic 执行 Case Else 子句(此项是可选的)中的语句。最后执行End Select语句。 <测试表达式> V <表达式列表n > <表达式列表n+1> <表达式列表1> …… …… <语句块n> <语句块1> <语句块n+1> 图4-22 Select Case选择结构流程

47 例4-8:表4-5为华中航空总公司机票打折表。试根据此表编写程序。日期、机票数从文本框中输入,打折情况在窗体上输出。如图4-23。
表4-5 机票优惠率 订票数(张) 优惠率(%) 1、2、3、6、11、12 全部 >=30 25 <30 10 4、9 28~30 35 15 其它 5、10 1~8 7、8 30 20

48 添加3个文本框控件Text1~Text3,按顺序见图4-23所示。 添加一个命令按钮Command1。
(2)设计应用程序用户界面 添加6个标签控件Label1~ Label6,按顺序见图4-23所示。Label1~ Label5的Caption属性依次为:“请输入日期”、“月”、“日”、“请输入订票数”、“张”,Label6的Caption属性设计时为空白,运行时用来显示优惠率。 添加3个文本框控件Text1~Text3,按顺序见图4-23所示。 添加一个命令按钮Command1。 图4-23 机票优惠率查询系统

49 (3)编写代码 根据流程图,编写出Command1_ Click事件的代码如下: Private Sub Command1_Click() Dim intnn As Long Dim intss As Integer,strdate As Integer intnn = Clng(Text3.Text) strdate = Cint(Trim(Text1.Text) & Trim(Text2.Text)) Select Case strdate Case 428 To 431, 51 To 57, 928 To 931, 101 To 107 If intnn >= 30 Then intss = 35 Else intss = 15 Case 71 To 79, 710 To 731, 81 To 89, 810 To 831 If intnn >= 30 Then intss = 30 Else intss = 20 Case Else If intnn >= 30 Then intss = 25 Else intss = 10 End Select Label6.Caption = "您所订机票优惠率为:" & str(intss) & "%" End Sub

50 另外,可以取系统的日期作为输入日期,该事件可以指定为Text1_DbClick事件,即双击Text1发生的事件,代码为:
Private Sub Text1_DblClick() Text1.Text = Month(Now) Text2.Text = Day(Now) End Sub 当要重新输入数据时,可以自动清空各文本框的内容。其中单击Text1清空所有文本框的内容,单击其他文本框,只清空被单击的文本框的内容。 Private Sub Text1_Click() Text1.Text = "" Text2.Text = "" Text3.Text = "" Private Sub Text2_Click() Private Sub Text3_Click()

51 此外,还应为每一个文本框的键盘按下事件编写如下代码,表明当按回车键时,自动跳到下一个必要的控件:
Private Sub Text1_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then Text2.SetFocus End Sub Private Sub Text2_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then Text3.SetFocus Private Sub Text3_KeyPress(KeyAscii As Integer) If KeyAscii = 13 Then Command1.SetFocus

52 图4-24机票优惠率计算流程图 7月~8月 <30 10 日期
>= < >= < >=30 4/28~5/7,9/28~10/7 >=30 满足条件 其他 <30 >=30 <30 >=30 <30 35 15 30 20 25 10 图4-24机票优惠率计算流程图

53 4.2.3 条件函数 1.IIf 函数 IIf 函数的功能是根据表达式的值,来返回两部分中的其中一个。其语法格式为:
条件函数 1.IIf 函数 IIf 函数的功能是根据表达式的值,来返回两部分中的其中一个。其语法格式为: IIf(<测试表达式>, <真值部分>, <假值部分>) 例如,求分段函数: y= 函数值的语句可以简单地表示为: y=Iif(x<0,2*x+3,4-3*x) 2.Choose函数 Choose函数的功能是:从参数列表中选择并返回一个值。其语法格式为: Choose(<整数表达式>, <选项1>[, <选项2>, ... [,<选项n>]])

54 下面的示例使用 Choose 函数来显示某天的执勤人员情况, strDay 参数传递到过程之中的索引。
Function GetChoice(strDay As string) strName= Choose(strDay, "王大虎", "谢伟烽", "马家栋", "何右嘉", "吴仁杰",) End Function 当strDay的值为1时,返回字符串“王大虎”,当strDay的值为2时,返回字符串“谢伟烽”,以此类推。当strDay的值不在1~5之间时,返回NULL。

55 4.3 循环结构 4.3.1 Do...Loop语句 4.3.2 For...Next语句 4.3.3 循环嵌套
4.3 循环结构 Do...Loop语句 For...Next语句 循环嵌套 For Each...Next 退出控制结构 返回 退出

56 4.3.1 Do...Loop语句 1.前测型Do...Loop循环
在前测型Do...Loop循环中,只要 <循环条件>为 True 就执行 <循环体>。其语法格式为: Do [{While | Until} <循环条件>] <循环体> Loop

57 根据题目要求,设计出如图4-25所示的流程图。
例4-9:编写程序,根据多项式: π= 求π的近似值。精度要求 <10-12。根据题意和要求可先求出 的和 (1)设计流程图 根据题目要求,设计出如图4-25所示的流程图。 输出循环次数i sum = 0#;temp = 1#;i = 1 当 temp >= 1.0E-12 sum = sum + temp i = i + 1 temp = 1# / i / i 输出π的近似值 图4-25 求π的近似值流程图

58 Picture1和Picture2分别用来显示运算次数i的值和π的近似值。
(2)设计应用程序界面 应用程序所需的控件及其属性值见表4-6。 Picture1和Picture2分别用来显示运算次数i的值和π的近似值。 表4-6 求π的近似值应用程序控件属性值 控件 Caption属性值 Label1 运算次数 Label2 近似值 Picture1 空白(设计时) Picture2 Command1 求π的近似值

59 根据流程图编写Command1_click事件的代码如下: Private Sub Command1_Click()
(3)编写代码 根据流程图编写Command1_click事件的代码如下: Private Sub Command1_Click() Dim sum As Double, temp As Double, pi As Double Dim i As Double sum = 0# temp = 1# i = 1 图4-26 求π的近似值的程序运行结果 Do While (temp >= ) sum = sum + temp i = i + 1 temp = 1# / i / i Loop pi = Sqr(6# * sum) Picture1.Print i ;"次" Picture2.Print pi End Sub 由于程序代码是直接从设计界面拷贝过来,所有代码书写格式已经经过VB格式化。 程序运行情况参见图4-26。

60 例4-10:编写程序::判断一个数是否为素数。 (1)设计流程图 根据题目要求,设计出如图4-27所示的流程图。
输入数据n Val(Text1.Text) > True False n 当k<= m= k=k+1 n Mod k =0 True False s=0 True False And m=0 当k<= n是素数 n不是素数 图4-27求素数流程图

61 (2)设计应用程序界面 应用程序所需的控件及其属性值见表4-7。 表4-7 判断素数应用程序控件属性值 控件 Caption属性值
表4-7 判断素数应用程序控件属性值 控件 Caption属性值 Label1 自然数 Label2 空白(设计时) Text11 Command1 输入自然数后单击此按钮

62 (3)编写代码 图4-28判断素数程序运行实例 根据流程图,编写Command1_click事件代码如下:
Private Sub Command1_Click() Dim m as integer ,k as integer Dim n As Long If Val(Text1.Text) > Then MsgBox "数据溢出,请重新输入", vbOKOnly + vbOKCancel + vbInformation, "数据错误" Text1.Text = "" Else n = CLng(Text1.Text) m = 0: k = 2 Do While k <= Sqr(n) And m = 0 If n Mod k = 0 Then m = 1 Else k=k + 1 End If Loop If m = 0 Then Label2.Caption = "是一个素数" Label2.Caption = "不是一个素数" Text1.SetFocus End Sub 图4-28判断素数程序运行实例

63 2.后测型Do...Loop循环 Do...Loop 语句的另一种演变形式是先执行<循环体>,然后在每次执行后测试 <循环条件>。称为后测型Do...Loop循环。这种形式保证<循环体>至少执行1次,其语法格式为: Do <循环体> Loop [{While | Until} <循环条件>]

64 求最大公约数最常用的方法是辗转相除法。其设计思路是: (1)假设m大于n; (2)用n作除数除m,得余数r。
(3)若r≠0,则令m←n,n←r,继续相除得到新的r值,直到r=0为止。 (4)最后的n即为最大公约数。 解题步骤如下: (1)设计流程图 根据题意,设计出如图4-29所示流程图。 输入m,n m存放大数,n存放小数 输出n 求m/n的余数 m←n数 n←r的余数 直到r=0 图4-29 求最大公约数的流程图

65 (2)设计应用程序界面 所需添加的控件的属性值参见表4-8。 表4-8 判断素数应用程序控件属性值 控件 Caption(或Text)属性值
表4-8 判断素数应用程序控件属性值 控件 Caption(或Text)属性值 Label1 请输入两个正整数 Label2 m n Label3 m 和 n 的最大公约数是 Label4 空白(设计时) Text11 Text12 Command1 求 解

66 图4-30 求最大公约数程序运行实例 (3)编写代码 Private Sub Command1_Click()
Dim m As Long, n As Long, temp As Long If (Val(Text1.Text) = 0 Or Val(Text2.Text) = 0) Or Val(Text1.Text) > Or Val(Text2.Text) > Then MsgBox "输入的数0或溢出,请重新输入!" MsgBox "输入的数0或溢出,请重新输入!", vbInformation + vbOKOnly, "数据错误" Text1.Text = "" Text2.Text = "" Text1.SetFocus Else m = Val(Text1.Text) n = Val(Text2.Text) If m < n Then temp = m: m = n: n = temp End If Do r = m Mod n m = n n = r Loop While r <> 0 Label3.Caption = m End Sub 图4-30 求最大公约数程序运行实例

67 For...Next语句 Do 循环使用于在不知道执行多少次<循环体>时。有时,循环的次数是已知的,这时最好使用 For...Next 循环。与 Do 循环不同, For 循环使用一个叫做计数器的变量,每重复一次循环之后,计数器变量的值就会增加或者减少。For 循环的语法如下: For <循环变量> = <初值> To <终值> [Step <步长>] <循环体> Next [<循环变量>]

68 例4-12:求1~1000之间所有能够被13整除的数。按每行各行10个数排满足条件的数。 (1)设计流程图
根据题意,设计如图4-34所示流程图。 图4-31求被13整除的数的流程图

69 (2)设计应用程序界面 应用程序所需控件属性值参见表4-9。 表4-9 求被13整除的数应用程序控件属性值 控件 Caption属性值
表4-9 求被13整除的数应用程序控件属性值 控件 Caption属性值 Command1 单击此按钮求1~1000值见能被13整除的数 Picture1 无此属性值

70 (3)编写代码 Private Sub Command1_Click() Dim i As Integer, j As Integer j = 0 For i = 1 To 1000 If i Mod 13 = 0 Then j = j + 1 Picture1.Print i; If j Mod 10 = 0 Then Picture1.Print End If Next i Picture1.Print Picture1.Print "一共有" & j & "个数可以被13整除" End Sub 其中,语句If j Mod 10 = 0 Then Picture1.Print控制每行打印满足条件的数的个数(10个),注意语句 Picture1.Print i;后的分号不能省略。 程序运行情况参见图4-32。 图4-32 程序运行情况

71 在一个循环体内又出现另外的循环语句称为循环嵌套。
循环嵌套 在一个循环体内又出现另外的循环语句称为循环嵌套。 例4-13:指出下面程序的运行结果: Private Sub Form_Click() Dim a As Integer, i As Integer, j As Integer a = 0 For i = 1 To 5 For j = -2 To 2 a = a + i + j Next j Print a; Next i Print Print i, j, a End Sub 图4-33 程序运行结果

72 例4-14:编程求图4-38所示乘法九九表。 图4-34 乘法九九表(1)
执行分析图4-38可知:如果将每一个等式作为一个方阵的节点,则每一个等式出现的位置上行列的数字是相同的。因此,可以用如下嵌套的循环作为对一个节点的描述: For i=1 to 9 For j=1 to i <循环体> Next j Next i 这里,<循环体>为乘法等式:expss = i & "×" & j & "=" & i * j。 现在,主要的问题是控制每个表达是出现的位置,可以用Tab函数来实现,假设给每个等式的宽度为10,第一个等式出现在第4行,则Tab函数可以这样表示:Tab((j - 1) * ); 图4-34 乘法九九表(1)

73 在窗体上添加一个命令按钮和一个Pictrue控件,编写command1_click事件的代码如下:
Private Sub Command1_Click() Dim i As Integer, j As Integer Dim expss As String For i = 1 To 9 For j = 1 To i expss = i & "×" & j & "=" & i * j Picture1.Print Tab((j - 1) * ); expss; Next j Picture1.Print Next i End Sub 图4-35 乘法九九表(2)

74 For Each...Next For Each...Next 循环与 For...Next 循环类似,但它对数组或对象集合中的每一个元素重复一组语句,而不是重复语句一定的次数。For Each...Next 循环非常适合于不知道一个集合有多少元素的情况。 For Each...Next 循环的语法格式如下: For Each<成员> In <数组|集合> [<语句块>] Next elementt

75 4.3.5 退出控制结构 1.Exit For 语句和 Exit Do语句 2.Go To语句 Go To语句的语法格式为:
退出控制结构 1.Exit For 语句和 Exit Do语句 2.Go To语句 Go To语句的语法格式为: Go To {标号|行号} 3.End语句 4.With语句 With语句的功能是在一个单一对象或一个用户定义类型上执行一系列的语句。其语法结构为: With <对象> [<语句块>] End With

76 4.4 综合实例 例4-15:求Sn=a+aa+aaa+…+aaa…a(n个a)之值,其中a是一个数字。例如: … (此时n=6)。a和n在程序运行时由键盘输入。 Private Sub Command1_Click() Dim i As Integer, Dim a As Double, b As Double, tn As Double, sn As Double Picture1.Cls i = 1: tn = 0: sn = 0 a = Val(Text1.Text) b = a If Val(Text1.Text) > 0 And Val(Text1.Text) < 10 And Val(Text2.Text) > 2 Then Do While (i <= CInt(Text2.Text)) tn = tn + a sn = sn + tn a = a * 10 i = i + 1 Loop Else MsgBox "请输入10以内的自然数!", vbOKOnly + vbInformation, "数据错误" End If Picture1.Print b & "+" & b & b & "+..." & "+"; tn & " = "; sn End Sub 图4-36 程序运行实例

77 例4-16:求1~1000之间的“水仙花数”。(注:“水仙花数”是一个三位数,其个位数的立方和等于该数本身。)
分析:三位数n中的每一位上的数可以这样来表述: 百位i :i=int(n/100) 十位j :j=n/10-i×10 个位k :k=n Mod 10 编写Command1_click的代码如下: Private Sub Form_Click() Dim i As Integer, j As Integer, k As Integer, n As Integer For n = 100 To 999 i = Int(n / 100) j = Int(n / 10) - i * 10 k = n Mod 10 If n= i * i * i + j * j * j + k * k * k Then Print n; Next End Sub 图4-37 求水仙花数程序运行情况

78 ② =6x2-8x+3 例4-18:用牛顿迭代法求解方程2x3-4x2+3x-6=0的一个根。所求得根的误差小于10-6。
分析:牛顿迭代法的求解方程的步骤是: (1)给出一个尽可能的根x0. (2)根据公式: x1= x0-d ……① d= ……. 求出d和新的x的值x1。 (3)如果d的值小于10-6,则执行步骤(4),否则转到步骤(2)。 (4)输出x,即为所求的根。 这里, =6x2-8x+3 程序如下: Private Sub Form_Click() Dim x As Double, d As Double x = Val(Text1.Text) Do d = (x * (x * (2# * x - 4#) + 3#) - 6#) / (6# * x * x - 8# * x + 3#) x = x - d Loop While Abs(d) >= Print "初值="; Val(Text1.Text), "x="; x, "精度:"; d End Sub

79 图4-39 程序运行实例

80 例4-19:现有长度10000毫米的钢管,要求截成长度分别为100毫米、150毫米和200毫米的三种规则短料,第一种短料不少于15根,第二种短料不少于17根,第三种短料不少于13根。求三种短料各多少根,使得所剩材料最少? Private Sub Command1_Click() Dim a As Integer, b As Integer, c As Integer, sum As Integer Dim n1 As Integer, n2 As Integer, n3 As Integer, temp As Integer Sum = 10000 For c = 13 To / 177 For b = 17 To / c For a = 15 To / b - c temp = c * b * a * 112 If temp >= 0 And temp < Sum Then Sum = temp: n1 = a: n2 = b: n3 = c End If Next Print "n1="; n1, "n2="; n2, "n3="; n3 Print "a="; a, "b="; b, "c="; c End Sub 如果将循环改成: For c = 13 To / 177 For b = 17 To / 133 For a = 15 To / 112 结果是一样的,只不过每一循环的次数增多。 图4-40 程序运行结果


Download ppt "第4章 基本的控制结构 4.1 顺序结构 4.2 选择结构程序设计 4.3 循环结构 4.4 综合实例 退出."

Similar presentations


Ads by Google