• 沒有找到結果。

Visual Basic程序设计教程(第二版) - 万水书苑-出版资源网

N/A
N/A
Protected

Academic year: 2021

Share "Visual Basic程序设计教程(第二版) - 万水书苑-出版资源网"

Copied!
48
0
0

加載中.... (立即查看全文)

全文

(1)第 4 章 基本程序结构 【本章导读】 Visual Basic 是一种基于对象的可视化的程序设计语言,在 Visual Basic 中,界面设计非常 方便、直观。但要让计算机完成一个特定的作业,还必须编写相应的各种事件的程序代码,这 是程序设计的重点和难点。 程序设计有 3 种基本结构,它们是顺序结构、选择结构和循环结构,这是程序设计的基 础,这些内容将在本章中一一介绍。同时还在最后一节介绍一些程序设计中的常用算法,以期 达到事半功倍的效果。 【本章要点】   . 顺序结构 选择结构 循环结构. 4.1. 顺序结构的程序设计. 顺序结构是一种线性结构,是程序设计中最简单同时也是最基本的结构。它要求顺序地 执行每一个最基本的加工处理单位,是任何从简单到复杂的程序的主体基本结构。其流程图如 图 4-1 所示。. 语句组 1. 语句组 2. … 语句组 n. 图 4-1. 顺序结构流程图. 一般来讲,任何程序的主体结构通常应顺次包括:程序名称描述部分、程序开始操作标 识部分、给定问题的初始化处理操作部分(它至少要包括数据的输入操作) 、所论述问题的中 心处理操作部分、给定问题的善后处理操作部分(它至少要包括信息的输出操作)、程序结束.

(2) Visual Basic 程序设计教程(第二版). 54. 操作标识部分。 4.1.1 赋值语句 在计算机中让一个没被赋以具体值的变量参加运算是没有意义的。Visual Basic 会将一个 没被赋值的数值型变量当 0 处理、将一个没被赋值的字符型变量当空串处理、将一个没被赋值 的逻辑型变量当逻辑假处理。由此可以看出给变量提供数据是程序得以运行的不可缺少的步骤 之一。 赋值语句是任何程序设计中都必不可少的语句,它可以把指定表达式的值赋给某个变量 或对控件设定属性。而给变量赋值和设定控件的某个属性是 Visual Basic 编程中最常见的两项 基本操作。 1.格式 [Let] <变量名> = <表达式> 或:[Let] <对象名.属性>=<表达式> 2.功能 将<表达式>的值保存在一个变量或对象的属性中。 例如:intMax = 0 该语句将数值型数据 0 保存在变量 intMax 中 Text1.Text = "河南财经学院" 该语句将名称为 Text1 的 TextBox 控件的 Text 属性值修改为“河南财经学院”。 3.说明 (1)语句中的“=”称为赋值号,它不同于数学中的等号,例如,A=A+1 在数学中是不 成立的,但在程序设计中则经常用到(该语句被叫做累加器语句) ,它表示取变量 A 单元中的 值,将其加 1 后,仍然放回到 A 变量的存储单元中保存。 (2)赋值符号“=”右边的表达式可以是变量、常量、函数等。 (3)赋值符号“=”左边只能是变量名或对象的属性引用,不能是常量、符号常量、表 达式。 (4)赋值语句以关键字 Let 开头,因此也称 Let 语句。其中的关键字 Let 可以缺省。 (5)赋值符号“=”两边的数据类型一般要求一致。如果两边的类型不同,则以左边变 量或对象属性的数据类型为基准;如果右边表达式结果的数据类型能够转换成左边变量或对象 属性的数据类型,则先强制转换后,再赋值给左边的变量或对象的属性;如果不能转换,则系 统将提示出错信息。 【例 4.1】编写程序,求摄氏温度与华氏温度的转换。 分析:我们用 F 表示华氏温度 用 C 表示摄氏温度 则它们的关系为:C=5(F-32)/9 或:F=32+9C/5 有了这种关系式以后,只要给定其中一个值,我们就可以计算出另外一个值。 假设程序中我们用 F 表示华氏温度,用 C 表示摄氏温度。 我们利用文本框给变量 C(或者 F)提供数值,然后利用赋值语句计算 F(或者 C)的值。.

(3) 第 4 章 基本程序结构. 55. 由于在 cmdCToF_Click()和 cmdFToC_Click()两个程序过程中,都要用到变量 C 和 F, 因此,我们应该在“通用”中定义它们。根据题目的含义,变量 F 和 C 可选为单精度数值 型变量。 程序中 C(或者 F)的值是从文本框中得到的,它是文本型的,要将它作为数值型处理可 以使用转换函数(Val)将其转换成数值型数据。 该程序的控件属性和作用如表 4-1 所示。 表 4-1 例 4.1 的属性设置 对象 Form1 Label Label TextBox TextBox CommandButton CommandButton CommandButton. 属性. 属性值 例 4.1 温度的转换. Caption (名称). lblPrompt 1. Caption. 华氏温度:. (名称). lblPrompt 2. Caption. 摄氏温度:. (名称). txtF. 功能 显示程序的名称 提示信息 提示信息 输入或显示华氏温度. Text (名称). txtC. 输入或显示摄氏温度. Text (名称) Caption (名称) Caption (名称) Caption. cmdFToC 华氏温度向摄氏温度转换 cmdCToF 摄氏温度向华氏温度转换 cmdClose 关闭. 程序源代码如下: Option Explicit Dim sngF!, sngC! Private Sub cmdFToC_Click() Let F = Val(txtF.Text) Let C = 5 * (F - 32) / 9 Let txtC.Text = C End Sub Private Sub cmdCToF_Click() C = txtC.Text F = 9 * C / 5 + 32 txtF.Text = F End Sub Private Sub cmdClose_Click() End End Sub. 按要求计算温度转换, 并在指定位置显示 按要求计算温度转换, 并在指定位置显示 关闭窗口.

(4) Visual Basic 程序设计教程(第二版). 56. 程序的运行结果如图 4-2 所示。. 图 4-2. 例 4.1 的程序运行界面. 其中,程序中的第一行 Option Explicit 表示对程序中使用的变量要求声明,第二行是在“通 用”中将 F 和 C 分别定义为单精度数值型变量。另外,在 cmdCToF_Click()和 cmdFToC_Click() 两个程序过程中,都用到了赋值语句,但是过程 cmdCToF_Click()中的赋值语句省略了语句定 义符,这是 Visual Basic 允许的。 该例中我们还给出了“关闭”命令按钮的源程序代码,在以后的程序中我们会省去此项 内容,具体的源程序代码可以参考此例。 4.1.2 Print 方法 1.格式 [<窗体>.]Print [<输出项表>] 其中的“输出项表”由常量、变量、函数、表达式和格式字符(逗号,分号)组成。“输 出项表”是可选的。 2.功能 “Print 方法”的功能可以简单地用一句话来概括:在指定的窗体中显示“输出项表”的 值(默认窗体指当前窗体),即显示数值型表达式的具体值,“原样照印”字符型常量。 例如,命令行 Debug.Print "Visual Basic"会在“立即”窗口中显示 Visual Basic。 命令行 Print 3+5 会在当前窗口中显示计算后的结果 8。 3.说明 (1)数值型数据在输出时有统一的格式,即第一位是符号位,数值最后要带一个字符位 的尾空。 (2)“Print 方法”最后若没有格式字符,则执行完输出后,会自动换行。即输出结束后 自动将输出指针(光标)移到下一行的第一个字符位上。 (3)“Print 方法”最后若有格式字符,则执行完输出内容后,会按格式字符的规定移动 输出指针。此时由于没有换行,因此如果后续的显示内容过多,则多余的内容就会显示在窗口 的外面。.

(5) 第 4 章 基本程序结构. 57. 4.格式字符 (1)标准格式字符“,”。 格式字符“,”所规定的输出叫标准输出。标准输出是按每一部分有 14 个字符位计算。格 式字符“,”的功能是将输出指针移到下一个标准区域(从第一个字符位开始,每 14 个字符位 组成一个标准区域)的首位。 【例 4.2】格式字符“,”的显示效果。 程序运行结果如图 4-3 所示。. 图 4-3. 例 4.2 的程序运行界面. “开始”命令按钮(cmdStart)的源程序代码如下: Private Sub cmdStart_Click() Print "Visual Basic 程序设计", "A", "B", "C", "D", "E", "F" Print -1, 2, Print "Microsoft Visual Basic", 0 End Sub. 请读者从程序的运行界面中观察数值型数据的输出格式并思考为什么第一行的最后一个 字符 F 没有在窗口中显示出来? (2)紧凑格式字符“;”。 格式字符“; ”所规定的输出叫紧凑输出。紧凑输出就是紧挨着输出。 在“Print 方法中格式字符“;”的功能是保持输出指针不动。 【例 4.3】格式字符“;”的显示效果。 我们将例 4.2 中的“,”全部用“; ”替换,然后比较两个格式字符的区别。程序运行结果 如图 4.4 所示,“开始”命令按钮(cmdStart)的源程序代码如下:. 图 4-4. 例 4.3 的程序运行界面. Private Sub cmdStart_Click() Print "Visual Basic 程序设计"; "A"; "B"; "C"; "D"; "E"; "F" Print -1; 2; Print "Microsoft Visual Basic"; 0 End Sub. 5.与 Print 有关的函数 (1)Tab()。 Tab()的格式为:.

(6) Visual Basic 程序设计教程(第二版). 58 Print Tab(n). Tab()的功能是将输出指针移到第 n 个位置。如果第 n 个位置已经有数据存在,则输出指 针会移到下一行的第 n 个位置输出。 (2)Spc()。 Spc ()的格式为: Print Spc (n). Spc(n)的功能是输出 n 个空格。 注意:多数情况下,在函数 Tab()和 Spc()的后面必须使用“;”,才能真正实现函数的功能。 4.1.3 人机交互 人机交互是指通过计算机输入、输出设备,以有效的方式实现人与计算机的对话。Visual Basic 中的人机交互主要是通过 InputBox()函数、MsgBox()函数和 MsgBox 过程实现的。 1.InputBox 函数 该函数的作用是在一个对话框中显示提示,等待用户输入正文或按 Enter 键,并返回文本 框中内容。函数返回值的类型为字符型。 InputBox 函数的语法格式为: [<变量>=]InputBox(<提示>[,<标题>][,<默认>][,<X 坐标位置>][,<Y 坐标位置>][,<帮助文件>, <主题编号>]). 各参数的含义如下: 提示:对话框消息出现的字符串表达式,最大长度大约为 1024 个字符,由所用字符的宽 度决定;如果提示包含多个行,则可在各行之间用回车符(Chr(13))、换行符(Chr(10))或 回车换行符的组合(Chr(13) & Chr(10))来分隔。 标题:显示对话框标题栏中的字符串表达式,如果省略标题,则程序名将显示在标题栏中。 默认:显示文本框中的字符串表达式,在没有其他输入时作为默认值。如果省略默认, 则文本框为空。 X 坐标位置:数值表达式,指定对话框的左边与屏幕左边的水平距离。如果省略 X 坐标 位置,则对话框会在水平方向居中。 Y 坐标位置:数值表达式,指定对话框的上边与屏幕上边的距离。如果省略 Y 坐标位置, 则对话框被放置在屏幕垂直方向距下边大约二分之一的位置。 帮助文件:字符串表达式,是识别帮助文件,用该文件为对话框提供上下文相关的帮助。 如果己提供帮助文件,则也必须提供主题编号。 主题编号:可选项。数值表达式,由帮助文件的作者指定给某个帮助主题的帮助上下文 编号。如果己提供主题编号,则也必须提供帮助文件。 说明:如果同时提供了帮助文件与主题编号,用户可以按 F1 键来查看与主题编号相应的 帮助主题;如果用户单击“确定”或按下 Enter 键,则 InputBox 函数返回文本框中的内容,如 果用户单击“取消”,则此函数返回一个长度为零的字符串("")。 注意:如果省略某些位置的参数,则必须加入相应的逗号分界符。 下面的语句是要求在弹出的对话框中输入身份证号。 strIDCard = InputBox("输入完成后单击“确定”按钮","输入卡号").

(7) 第 4 章 基本程序结构. 59. 该语句会弹出一个对话框让用户输入具体的身份证号,如图 4-5 所示。返回值保存在变量 strIDCard 中。. 图 4-5. “输入卡号”对话框. 如果在输入框为空的时候单击了“确定”按钮,则 strIDCard 的值为空字符串。 无论你使用对话框输入是数值还是文本,对话框返回的值都是字符串型的数据。但是, 有时你确实希望得到数值型数据,这时,就需要对数据进行转换。在数据转换中,使用最多的 是将字符串转换为数值,可以使用函数 Val()来实现。 2.MsgBox 函数和 MsgBox 过程 MsgBox 函数在对话框中显示信息,等待用户单击按钮或按 Enter 键,并返回一个整数以 标明用户单击了哪个按钮。其语法格式为: [<变量>[%]]=MsgBox(<提示>[,<按钮值>][,<标题>] [,<帮助文件>,<主题编号>]). MsgBox 过程的语法格式为: MsgBox <提示>[,<按钮值>][,<标题>] [,<帮助文件>,<主题编号>]. 其中:提示、标题、帮助文件和主题编号的意义与 InputBox 函数相同。 按钮值为整型表达式,用来指定显示按钮的数目及形式、使用的图标类型、默认按钮的 种类等。如果省略则按钮的默认值为 0。按钮的设置值如表 4-2 所示。 说明:“按钮值”是由表 4-2 每个“分组”中取一个数字作和得到的。 表 4-2 <按钮值>的设置及其意义 分组. 按钮数目. 图标类型. 默认按钮. 系统常数. 按钮值. 描述. vbOKOnly. 0. 只显示“确定”按钮. vbOKCancel. 1. 显示“确定”、“取消”按钮. vbAbortRetryIgnore. 2. 显示“终止”、“重试”、“忽略”按钮. vbYesNoCancel. 3. 显示“是”、“否”、“取消”按钮. vbYesNo. 4. 显示“是”、“否”按钮. vbRetryCancel. 5. 显示“重试”、“取消”按钮. vbCritical. 16. 图 4-6 中的图标(a). vbQuestion. 32. 图 4-6 中的图标(b). vbExclamation. 48. 图 4-6 中的图标(c). vbInformation. 64. 图 4-6 中的图标(d). vbDefaultButton1. 0. 第一个按钮是默认值. vbDefaultButton2. 256. 第二个按钮是默认值. vbDefaultButton3. 512. 第三个按钮是默认值.

(8) Visual Basic 程序设计教程(第二版). 60. (a). (b). (c). (d). 图 4-6 MsgBox 中可以显示的图标. 下面语句的显示效果如图 4-7 所示。. 图 4-7. MsgBox 的效果. YN = MsgBox ("你的输入有误!", 1 + 64 + 0, "确认"). 或使用等价的另一种形式: YN = MsgBox ("你的输入有误!", vbOKCancel +vbInformation + vbDefaultButton1, " 确认"). MsgBox 函数的返回值如表 4-3 所示。 表 4-3 MsgBox 函数的返回值 系统常数. 返回值. 描述. vbOK. 1. 确定. vbCancel. 2. 取消. vbAbort. 3. 终止. vbRetry. 4. 重试. vbIgnore. 5. 忽略. vbYes. 6. 是. vbNo. 7. 否. 说明:如果对话框显示“取消”按钮,则按下 Esc 键与单击“取消”按钮的效果相同。 【例 4.4】Visual Basic 期终总评成绩由三部分组成:考试成绩、作业成绩和平时测试成绩, 它们分别占 70%、10%、20%。现有一个学生的成绩依次为 89、90、78,编写程序,求其总 评成绩。 分析:依据题目的叙述,其总评成绩为: 89×70%+90×10%+78×20% 假设程序中我们分别用 KS、ZY、CS 表示考试成绩、作业成绩和平时测试成绩(这些数 据通过 InputBox 得到,显示在窗口的文本框中),则总评成绩 ZP 为: ZP = KS×70%+ZY×10%+CS×20% 该程序的控件属性和作用如表 4-4 所示。.

(9) 第 4 章 基本程序结构. 61. 表 4-4 例 4.4 的属性设置 对象 Form1. 属性 Caption (名称). TextBox. TextBox. TextBox. 属性值 例 4.4 计算总评成绩. 显示考试成绩. Enabled. False. (名称). txtZY 显示作业成绩. Text Enabled. False. (名称). txtCS 显示测试成绩. Text (名称). False lblTS1. Label. Caption. 考试成绩:. Font. 宋体,小四号字. Label. (名称). Label. 作业成绩:. Font. 宋体,小四号字. Label. 测试成绩:. Font. 宋体,小四号字. Font CommandButton CommandButton. Caption (名称) Caption. 输出总评成绩 黑体,小四号字,粗体 cmdJS 计算 cmdGB 关闭. “计算”命令按钮(cmdJS)的程序源代码如下: Private Sub cmdStart_Click() Dim Temp$, KS%, ZY%, CS%, ZP! Temp = InputBox("", "输入“考试成绩”") KS = Val(Temp): txtKS.Text = KS Temp = InputBox("", "输入“作业成绩”") ZY = Val(Temp): txtZY.Text = ZY Temp = InputBox("", "输入“测试成绩”") CS = Val(Temp): txtCS.Text = CS ZP = KS * 0.7 + ZY * 0.1 + CS * 0.2 lblZP.Caption = "总评成绩:" & Str(ZP) End Sub. 程序运行界面如图 4-8 所示。. 提示信息. lblZP. Caption (名称). 提示信息. lblTS3. Caption (名称). 提示信息. lblTS2. Caption (名称). 显示程序的名称. txtKS. Text. Enabled. 功能. 开始计算 关闭窗口.

(10) Visual Basic 程序设计教程(第二版). 62. 图 4-8. 例 4.4 的程序运行界面. 本例中我们将 TextBox 控件的 Enabled 属性值设置为 False,意思是用 TextBox 控件显示 信息,而该信息在此时不能被编辑。 程序中改变 lblZP 的 Caption 属性的语句中用到了字符的连接运算。其中变量 ZP 表示一 个数值型数据,我们使用转换函数 Str 将变量 ZP 转换成字符型数据,这样会使&两边的数据 类型完全一致。实际上字符的连接运算符&会首先将参与运算的数据类型转换成字符型以后再 进行字符的连接,因此下面的写法在程序中也不会出错: lblZP.Caption = "总评成绩:" & ZP. 请读者考虑:如果将程序中给 ZP 赋值的语句做如下修改后再运行程序,会有什么结果输 出,为什么? ZP = KS * 70% + ZY * 10% + CS * 20%. 【例 4.5】鸡兔同笼问题。鸡和兔子被放在同一个笼子中,现在已知鸡和兔子的总头数、 总脚数。编写程序,计算笼子中鸡和兔子各有多少只? 分析:我们用 H 表示总头数,F 表示总脚数; 用 C 表示鸡,R 表示兔子。 则有: C+R=H ① 2C + 4R =F ② 计算机不会直接处理这样的二元一次方程组,必须经过变形。 ② - ①×2 得 R=(F-2×H)/2 ③ ①可以等价的变形为 C=H-R ④ 这时我们就可以利用已知的 F 和 H 通过③、④两个式子分别求得 R 和 C 了。 假设程序中我们还是用 H 表示总头数,F 表示总脚数,用 C 表示鸡,R 表示兔子。 我们利用 InputBox 函数给 F 和 H 赋值,通过标签显示在窗体中,计算后的结果 R 和 C 通过文本框输出。 该程序的控件属性和作用如表 4-5 所示。 表 4-5 例 4.5 的属性设置 对象 Form1. 属性 Caption. 属性值 例 4.5 鸡兔同笼问题. 功能 显示程序的名称.

(11) 第 4 章 基本程序结构. 63 续表. 对象. 属性. 属性值. (名称) TextBox. TextBox. txtC 输出鸡的数量. Text Enabled. False. (名称). txtR 输出兔子的数量. Text Enabled. Label Label Label. False. (名称). lblResult. CommandButton. 显示输入的总头数、总脚数. Caption (名称). lblC. Caption. 鸡:. (名称). lblR. 提示信息. 兔子:. Caption CommandButton. 功能. (名称). cmdStart 计算. Caption (名称). cmdClose 关闭. Caption. 提示信息 开始计算 关闭窗口. “计算”命令按钮(cmdStart)的程序源代码如下: Private Sub cmdStart_Click() Dim H%, F%, R%, C% H = Val(InputBox("", "输入总头数")) F = Val(InputBox("", "输入总脚数")) lblResult.Caption = "总头数:" & H & " 总脚数:" & F R = (F - 2 * H) / 2 C = H - R txtC.Text = C txtR.Text = R End Sub. 程序运行结果如图 4-9 所示。. 图 4-9. 例 4.5 的程序运行界面. 说明:在对本例题的处理中,我们没有考虑输入的原始数据是否合理的问题。例如,输 入的“总脚数”不能是奇数、“总脚数”应该不小于“总只数”的两倍。如果“总脚数”是奇 数或者“总脚数”大于“总只数”的两倍,那么这个问题的解就没有意义。 请读者注意:在处理实际问题中,我们都应该对原始数据进行“过滤” ,具体的过滤的方.

(12) Visual Basic 程序设计教程(第二版). 64. 法我们会在后续内容中加以介绍。 【例 4.6】编写程序,在实数范围内求解一元二次方程:aX2+bX+c=0。 分析:因为要求在实数范围内求解一元二次方程,所以我们应该假设该方程的根的判 别式 d2-4ac≥0,因此我们可以利用一元二次方程的求根公式 x1,2 . b  b2  4ac 2a. 来求解方程。 为了直观起见,假设程序中我们用 A、B、C 表示方程的系数,并利用 InputBox 函数输入 并通过标签显示在窗体中,我们用 X1 和 X2 表示方程的根,X1 和 X2 通过文本框输出。 该程序的控件属性和作用如表 4-6 所示。 表 4-6 例 4.6 的属性设置 对象 Form1 Label Label Label CommandButton CommandButton. 属性 Caption (名称). 属性值 例 4.6 求解一元二次方程 lblX1. 功能 显示程序的名称 输出方程的第一个根. Caption (名称). lblX2. 输出方程的第二个根. Caption (名称). lblShow. 显示输入的方程的系数. Caption (名称) Caption (名称) Caption. cmdStart 计算 cmdClose 关闭. 开始计算 关闭窗口. “计算”命令按钮(cmdStart)的程序源代码如下: Private Sub cmdStart_Click() Dim A%, B%, C%, X1!, X2! A = Val(InputBox("", "输入方程的系数 A")) B = Val(InputBox("", "输入方程的系数 B")) C = Val(InputBox("", "输入方程的系数 C")) lblShow.Caption = "一元二次方程的系数是:" & A & "," & B & "," & C X1 = (-B + Sqr(B * B - 4 * A * C)) / (2 * A) X2 = (-B - Sqr(B * B - 4 * A * C)) / (2 * A) lblX1.Caption = "X1=" & X1 lblX2.Caption = "X2=" & X2 End Sub. 程序运行结果如图 4-10 所示。 说明:在本例中一定要考虑到方程在实数范围内有解, 否则运行程序时会由于 b2-4ac<0 而使 Sqr(B * B - 4 * A * C) 出现错误。另外,要注意程序中给 X1、X2 赋值的表达式的 书写格式。. 图 4-10. 例 4.6 的程序运行界面.

(13) 第 4 章 基本程序结构. 65. 【例 4.7】A、B、C 三人上街买糖果,买好后,A 对 B、C 说:“我可以按你们现有的数 量再送你们每人一份。 ”之后,B 对 A、C;C 对 A、B 也说了同样的话。互相赠送后,每人各 有 64 块糖果。编写程序,计算 A、B、C 原来各买了多少块糖果。 分析:我们用 A、B、C 表示三人原来各买的糖果数。 从后往前推算: C 送给 A、B 前三个人的糖果数为: A←A/2 B←B/2 C←A+B+C B 送给 A、C 前三个人的糖果数为: A←A/2 C←C/2 B←A+B+C A 送给 B、C 前三个人的糖果数为: B←B/2 C←C/2 A←A+B+C 至此,我们就得出了三人原来各买的糖果数。 该程序的控件属性和作用如表 4-7 所示。 表 4-7 例 4.7 的属性设置 对象 Form1 Label CommandButton CommandButton. 属性 Caption (名称). 属性值 例 4.7 买糖果 lblResult. 功能 显示程序的名称 显示计算的最后结果. Caption (名称) Caption (名称) Caption. cmdStart 计算 cmdClose 关闭. 开始计算 关闭窗口. 为直观起见,假设程序中我们用 A、B、C 表示三人原来各买的糖果数。“计算”命令按 钮(cmdStart)的程序源代码如下: Private Sub cmdStart_Click() Dim A%, B%, C% A = 64: B = 64: C = 64 A = A / 2: B = B / 2: C = A + B + C A = A / 2: C = C / 2: B = A + B + C B = B / 2: C = C / 2: A = A + B + C lblResult.Caption = "A、B、C 三人的糖果数为:" & " " & A & " " & B & " " & C End Sub. 程序运行结果如图 4-11 所示。.

(14) Visual Basic 程序设计教程(第二版). 66. 图 4-11. 例 4.7 的程序运行界面. 4.1.4 With 语句 With 语句的格式为: With <对象> .<属性>=<表达式> End With. With 语句可以对某个对象执行一系列的操作,而不用重复指出对象的名称。例如,对于 标签控件 lblResult 的几个属性的设置可以使用如下代码: With lblResult .Height=2000 .Width=2000 .FontSize=22 .Caption="这是处理后的结果" End With. 与其等价的代码为: lblResult.Height=2000 lblResult.Width=2000 lblResult.FontSize=22 lblResult.Caption="这是处理后的结果". 使用 With 语句时需要注意:①当程序进入 With 块以后,对象就不能改变,也就是说一个 With 块只能对一个对象进行设置;②对象属性前面的“.”不能省略。. 4.2. 选择结构的程序设计. 我们已经知道,顺序现象是客观世界最平凡、最常见、最简单、最基础的普遍现象。但 是,在自然界中还有许许多多的分支现象,例如,树有干、干有枝、枝有叶的分叉现象;路有 三叉路、十字路的分路现象等。 同样,在日常生活中,同一产品因质量不同有一等品、二等品、三等品、等外品;同一 班级的学生学习成绩有优秀、良好、中等、及格、不及格等分类情况。 我们每天都要作数以万计的判断,只是有些判断稍加思考就可以得出判断的结果,而有 些判断则需要我们经过周密的考虑才能得出结果。对于自然界和日常生活中诸如此类一分为 二、一分为三甚至更多的客观现象,可以说几乎随时随地都能见到,我们将这类现象称为分支 现象。计算机用选择结构来描述分支现象。 选择结构,是一种常用的主要基本结构,是计算机科学用来描述自然界和社会生活中分 支现象的重要手段。其特点是:根据所给定选择条件的真(分支条件成立)与假(分支条件不 成立),来决定从各实际可能的不同操作分支中执行某一分支的相应操作,并且任何情况下都.

(15) 第 4 章 基本程序结构. 67. 有“无论分支多寡,必择其一;纵然分支众多,仅选其一”的特性。 4.2.1 简单条件选择结构的程序实现 简单条件选择结构是最常见的典型分支结构,它的功能就是对所给条件进行判断,从而 决定在两个分支中选择哪一个来执行。 为了养成良好的程序设计风格和习惯,在使用条件选择结构时,应该采用“按结构缩格 格式”书写。 1.简单条件语句格式 块方式: If. <条件> Then <语句组 1> [ Else <语句组 2> ] End If. 行方式: If. <条件>. Then. <语句组 1>. [ Else <语句组 2> ]. 其中语句格式中的<条件>是一个具有逻辑型结果的表达式。简单条件结构的流程图如图 4-12 所示。. False. 条件. 语句组 2. True. 语句组 1. (a). True. 条件 False. 语句组 1. (b) 图 4-12. 选择结构流程图. 2.功能 当<条件>为真时,执行<语句组 1>;当<条件>为假时,执行<语句组 2>。 通常在流程图中用 True 或 Y 表示真,用 False 或 N 表示假。 【例 4.8】编写程序,对任意的 3 个数,按从小到大的顺序输出。 分析:我们分别用 A、B、C 表示输入的 3 个数。如果输出也按 A、B、C 表示,则处理 过程为如下。 先比较 A 与 B,看 A 是否大于 B,若 A>B,则 A、B 的排列顺序不符合从小到大的要求, 因此,应使 A 与 B 的值相互调换,使之符合从小到大的要求。在进行 A、B 交换时可以利用 “三角形交换法”,如图 4-13 所示。即先将 A 的值赋给中间变量 X,再将 B 的值赋给 A,最 后将 X 的值赋给 B。 然后按同样的方法比较 A 与 C,B 与 C。最后得到的 A、B、C 即为从小到大的顺序。.

(16) Visual Basic 程序设计教程(第二版). 68. X 3. 1 2. A 图 4-13. B “三角形交换法”示意图. 该程序的控件属性和作用如表 4-8 所示。 表 4-8 例 4.8 的属性设置 对象 Form1 Label Label CommandButton CommandButton. 属性 Caption (名称). 属性值 例 4.8 三个数据排序 lblInput. 功能 显示程序的名称 显示输入的原始数据. Caption (名称). lblOutput. 显示排好序的数据. Caption (名称) Caption (名称) Caption. cmdStart 计算 cmdClose 关闭. 开始计算 关闭窗口. 为直观起见,假设程序中我们用 A、B、C 表示输入的 3 个数, “计算”命令按钮(cmdStart) 的程序源代码如下: Private Sub cmdStart_Click() Dim A!, B!, C!, X! A = Val(InputBox("", "输入第一个数据")) B = Val(InputBox("", "输入第二个数据")) C = Val(InputBox("", "输入第三个数据")) lblInput.Caption = "输入的数据是:" & A & "," & B & "," & C If A > B Then X = A: A = B: B = X If A > C Then X = A: A = C: C = X If B > C Then X = B: B = C: C = X lblOutput.Caption = "排序的结果是:" & A & "," & B & "," & C End Sub. 程序运行结果如图 4-14 所示。. 图 4-14. 例 4.8 的程序运行界面.

(17) 第 4 章 基本程序结构. 69. 说明:从简单条件语句的格式中可以看出来,<语句组 2>是可以缺省的。这就是说,其中 一个分支可以是空的。为了养成一个良好的程序设计风格和习惯,当分支中有一个空操作时, 这个空操作,应该放在“语句组 2”的分支上。即当条件为假时,执行空操作,如图 4-2(b) 所示。 【例 4.9】从甲地到乙地托运行李。行李重量在 50 千克以内时,每千克 0.80 元;超过 50 千克时,其超过部分每千克 1.10 元。编写程序,计算托运行李W千克时所付的运费。 分析:我们用 W 表示行李的重量,F 表示运费,依题意,我们可以得到以下计算公式: 0.8×W (W≤50) ① F= 50×0.8+(W-50)×1.1 (W>50) ② 假设程序中我们用 W 表示行李的重量,用 F 表示运费。W 利用 InputBox 函数输入并通过 标签显示在窗体中。根据分析得到的公式,当 W 的值小于等于 50 时,我们利用公式①计算 F; 当 W 的值大于 50 时,我们利用公式②计算 F。最后将 F 的值通过标签输出。 该程序的控件属性和作用如表 4-9 所示。 表 4-9 例 4.9 的属性设置 对象 Form1 Label Label CommandButton CommandButton. 属性 Caption (名称). 属性值. 功能. 例 4.9 计算运费. 显示程序的名称. lblW. 显示输入行李的重量. lblF. 输出运费的值. cmdStart. 开始计算. Caption (名称) Caption (名称) Caption (名称) Caption. 计算 cmdClose 关闭. “计算”命令按钮(cmdStart)的程序源代码如下: Private Sub cmdStart_Click() Dim W!, F! W = Val(InputBox("", "输入行李的重量")) lblW.Caption = "行李重: " & W & " 千克" If W <= 50 Then F = 0.8 * W Else F = 50 * 0.8 + (W - 50) * 1.1 End If lblF.Caption = "运费:" & F & "元" End Sub. 程序运行结果如图 4-15 所示。. 关闭窗口.

(18) Visual Basic 程序设计教程(第二版). 70. 图 4-15. 例 4.9 的程序运行界面. 4.2.2 选择结构的嵌套 从条件语句的格式中我们可以知道 Then 或 Else 后要求的语句体都可以是语句。既然是 语句,当然就可以是条件语句。即条件语句可以出现在条件语句的 Then 或 Else 中。这就是 选择结构的嵌套,也叫条件语句的嵌套。 【例 4.10】编写程序,输入一个 X 的值,按照以下表达式计算 Y 的值。 1+X2 (X>0) ① Y= 0 (X=0) ② 1-X2 (X<0) ③ 分析:我们要根据输入的 X 的值的范围确定选用哪个表达式计算 Y:如果 X>0 成立,则 利用表达式①计算 Y 的值;否则,如果 X=0 成立,则利用表达式②计算 Y 的值;否则,X<0 一定成立,利用表达式③计算 Y 的值。 这就形成了选择结构的嵌套。 假设程序中我们分别用 X 表示输入的 X,用 Y_Str 表示计算 Y 的表达式,用 Y 表示计算 的结果。其中 X 的值用文本框输入,显示计算 Y 的表达式和计算结果用属性 Enabled 的值为 False 的文本框。 该程序的控件属性和作用如表 4-10 所示。 表 4-10 例 4.10 的属性设置 对象 Form1. 属性 Caption (名称). Label. Label. Label. 例 4.10 选择的嵌套 计算 Y 的值. Font. 宋体,四号字. (名称). lblX. Caption. X=. Font. 宋体,小四号字. (名称). lblY. Caption. Y=. Font. 宋体,小四号字. 显示程序的名称 显示程序的功能. 提示信息. 提示信息. txtX 输入 X 的值. Text Enabled. 功能. lblTitle. Caption. (名称) TextBox. 属性值. True.

(19) 第 4 章 基本程序结构. 71 续表. 对象. 属性 (名称). TextBox. CommandButton. 功能. txtY 输出 Y 的表达式和运算结果. Text Enabled. CommandButton. 属性值. (名称) Caption (名称) Caption. False cmdStart 计算 cmdClose 关闭. 开始计算 关闭窗口. “计算”命令按钮(cmdStart)的程序源代码如下: Private Sub comStart_Click() Dim X!, Y!, Y_Str$ X = Val(txtX.Text) If X > 0 Then Y = 1 + X * X Y_Str = "1+X*X" Else If X < 0 Then Y = 1 - X * X Y_Str = "1-X*X" Else Y = 0 Y_Str = "0" End If End If txtY.Text = Y_Str & " = " & Y End Sub. 程序运行结果如图 4-16 所示。. 图 4.16. 例 4.10 的程序运行界面. 4.2.3 多分支选择结构的程序实现 用 If 语句实现的选择结构是从两个分支中选择其中之一。在有些问题的处理中往往不止 两个分支,而是有多个分支,要求从多条路径中选择其中一条。为了方便处理,Visual Basic 提供了多分支选择结构语句,可直接实现从多分支中选择其中之一来执行。.

(20) Visual Basic 程序设计教程(第二版). 72. 1.Select Case 语句 (1)语句格式。 Select. Case Case Case …… [Case. <测试表达式> <表达式 1> <语句组 1> <表达式 2> <语句组 2> Else] <语句组 n+1>. End Select. (2)功能。 在给出的多个备选分支中,用测试表达式顺序与<表达式 1>、<表达式 2>比较,当某个条 件成立时,则执行下面相应的<语句组>,<语句组>执行完成以后,转到 End Select 语句后执 行;如果与前 N 个表达式比较,其结果都不成立,则执行<语句组 n+1>。 (3)说明。 1)Case 语句中的表达式有 3 种不同的形式:  表达式 1 [,表达式 2 ] … 例如 Case 2,4,6,9,表示当测试表达式的值为 2 或者 4 或者 6 或者 9 时条件成立。  表达式 1 To 表达式 2 例如: Case "A" To. "E". 表示当测试表达式的值为字符 A 或者字符 B 或者字符 C 或者字符 D 或者字符 E 时条件成 立。 Is 关系表达式 例如:. . Case. Is<=12. 表示当测试表达式的值小于等于 12 时条件成立。 2)Case 语句中的条件可以是以上形式的组合(这多个条件是“或”的关系)。 例如: Case 2,4,9 To 12. 表示当测试表达式的值为 2 或者 4 或者 9 或者 10 或者 11 或者 12 时条件成立。 3)“测试表达式”的类型应同 Case 表达式的类型一致。 2.If 语句格式 (1)语句格式。 If <条件 1> Then <语句组 1> ElseIf <条件 2> Then <语句组 2> ElseIf <条件 3> Then <语句组 3> ….

(21) 第 4 章 基本程序结构. 73. Else <语句组 n> End If. (2)功能。 If…Then…ElseIf 实际上可以理解成选择结构的嵌套。 【例 4.11】编写程序,将学生的百分制成绩按要求转换成相应的等次输出。 等次分为 5 种,具体划分如下: 90~100 优秀 80~89 良好 70~79 中等 60~69 及格 0~59 不及格 分析:我们将以上的多个等次用多条件选择结构来控制。 假设程序中我们分别用 R 表示输入的百分制成绩,用 G 表示相应的等次。其中 R 的值用 InputBox 输入,计算的结果 G 用标签显示。 G 的计算分别用 Select Case 语句和 If…Then…ElseIf 语句实现。 控件的属性和作用如表 4-11 所示。 表 4-11 例 4.11 的属性设置 对象 Form1 Label Label CommandButton CommandButton. 属性 Caption (名称). 属性值 例 4.11 成绩的转换 lblR. 功能 显示程序的名称 显示百分制成绩. Caption (名称). lblG. 显示等级. Caption (名称) Caption (名称) Caption. cmdStart 计算 cmdClose 关闭. “计算”命令按钮(cmdStart)的程序源代码如下: (用 Select Case 语句实现) Private Sub cmdStart_Click() Dim R!, G$ R = Val(InputBox("", "输入百分制成绩")) Select Case R Case Is >= 90 G = "优秀" Case Is >= 80 G = "良好" Case Is >= 70 G = "中等" Case Is >= 60. 开始计算 关闭窗口.

(22) 74. Visual Basic 程序设计教程(第二版) G = "及格" Case Else G = "不及格" End Select lblR.Caption = "百分制成绩: " & R lblG.Caption = "等 次: " & G End Sub. (用“If…Then…ElseIf 语句”实现) Private Sub cmdStart_Click() Dim R!, G$ R = Val(InputBox("", "输入百分制成绩")) If R >= 90 Then G = "优秀" ElseIf R >= 80 Then G = "良好" ElseIf R >= 70 Then G = "中等" ElseIf R >= 60 Then G = "及格" Else G = "不及格" End If lblR.Caption = "百分制成绩: " & R lblG.Caption = "等 次: " & G End Sub. 程序运行结果如图 4-17 所示。. 图 4-17. 请读者考虑:如果将上例中的 If R >= 90 Then G = "优秀" ElseIf R >= 80 Then G = "良好" ElseIf R >= 70 Then G = "中等" ElseIf R >= 60 Then G = "及格" Else G = "不及格" End If. 例 4.11 的程序运行界面.

(23) 第 4 章 基本程序结构. 75. 换为 If R >= 60 Then G = "及格" ElseIf R >= 70 Then G = "中等" ElseIf R >= 80 Then G = "良好" ElseIf R >= 90 Then G = "优秀" Else G = "不及格" End If. 程序运行结果会有什么变化?为什么? 4.2.4 条件函数 Visual Basic 中提供的条件函数:IIf()函数和 Choose()函数,前者代替 If 语句,后者可代 替 Select Case 语句,均适用于简单的判断场合。 1.IIf()函数 (1)格式。 IIf(<条件表达式>,<真值时的表达式>,<假值的表达式>). (2)功能。 IIf 函数首先要计算“条件表达式”、“真值时的表达式”、“假值的表达式”的值,当“条 件表达式”的值为“真”时,则 IIf 函数返回“真值时的表达式”的值;当“条件表达式”为 “假”时,则 IIf 函数返回“假值时的表达式”的值。 例如,求 x、y 中大的数,将其存入 MaxNum 变量中,我们可以使用如下语句: MaxNum = IIf(x > y, x, y). 2.Choose()函数 (1)格式。 Choose(<整数表达式>, <选项列表>). (2)功能。 Choose()函数会根据“整数表达式”的值来决定返回的值(Choose 函数会自动将“整数表 达式”的值进行取整操作)。如果“整数表达式”的值是 1,则返回“选项列表”中的第 1 个 选项;如果“整数表达式”的值是 2,则会返回“选项列表”中的第 2 个选项,依此类推。若 “整数表达式”的值小于 1 或大于列出的选项数目,则 Choose()函数返回 Null。 例如,Nop 的取值范围为 1~4,使其对应转换成“+”、“-”、 “×”、“÷”运算符,我 们可以使用如下语句: Op = Choose(Nop, "+", "-", "×", "÷"). 当 Nop 的值为 1 时,返回字符串“+”,将其存入 Op 变量中;当 Nop 的值为 2 时,返回 字符串“-” ,将其存入 Op 变量中,依此类推。.

(24) Visual Basic 程序设计教程(第二版). 76. 4.2.5 Go To 语句的程序实现 1.Go To 语句 (1)格式。 Go To{标号 | 行号}. (2)功能。 该语句的功能是无条件地转移到标号或行号指定的语句行。 (3)注意。 1)Go To 语句只能转移到同一过程的标号或行号处。标号是一个字符序列,首字符必须 为字母,与大小写无关,任何转移到的标号后应有冒号;行号是一个数字序列。 2)在以前使用 Basic 语言进行程序设计时,没有过分强调限制 Go To 语句的使用,从而使得 Go To 语句的使用频率很高,这样编制出来的程序结构不清晰,可读性差,我们将这种程序称为 BS 程序(Bowl of Spaghetti Program,乱麻似的程序) 。现在我们要强调指出,在结构化程序设计 中尽可能少用或不用 Go To 语句,在涉及转移执行时要尽量使用选择结构或循环结构来代替。 2.On Error Go To 语句 (1)格式。 On Error Go To{<标号> | <行号>}. (2)功能。 该语句的功能是当程序执行的过程中出现错误时,系统会将程序转移到标号或行号指定 的语句行。 由于该语句是在程序执行过程中出现了错误以后的转移,因此,该语句也被叫做“错误 陷阱”语句。 如果不使用 On Error 语句,则任何运行时的错误都是致命的,也就是说,结果会导致显 示错误信息并中止运行。一个“允许的”错误处理程序是由 On Error 语句打开的处理程序, 一个“活动的”错误处理程序是在处理错误的过程中允许出现的错误处理程序。 错误处理程序依靠 Err 对象的 Number 属性中的值来确定错误发生的原因。 【例 4.12】计算数据的算术平方根。 假设程序中我们用 X 表示输入的数据,用 Sqr()函数计算 X 的算术平方根。 控件的属性和作用如表 4-12 所示。 表 4-12 例 4.12 的属性设置 对象 Form1. 属性 Caption (名称). Label. CommandButton. 例 4.12 计算算术平方根. (名称) Caption (名称) Caption. 功能 显示程序的名称. lblResult 显示计算的结果. Caption Alignment. CommandButton. 属性值. 2-Center cmdStart 计算 cmdClose 关闭. 开始计算 关闭窗口.

(25) 第 4 章 基本程序结构. 77. “计算”命令按钮(cmdStart)的程序源代码如下: Private Sub cmdStart_Click() Dim X!, XSqrt! X = Val(InputBox("", "输入数据")) XSqrt = Sqr(X) lblResult.Caption = X & " 的算术平方根为:" & XSqrt End Sub. 程序运行结果如图 4-18 所示。. 图 4-18. 例 4.12 的程序运行界面. 在上例中,如果输入了符合规定的数据,程序不会出现问题。但是如果我们输入的是负 数,那么程序就会弹出错误提示并结束程序的运行,如图 4-19 所示。为了避免由于输入的数 据不在有效范围内(本例中要求输入的数据应该大于等于 0)而导致程序出错的问题,我们可 以在输入数据后利用 GoTo 语句对输入的数据加以过滤。 用 If - Then Go To 语句实现: Private Sub cmdStart_Click() Dim X!, XSqrt! ReInput: X = Val(InputBox("", "输入数据")) If X < 0 Then GoTo ReInput XSqrt = Sqr(sngX) lblResult.Caption = X & " 的算术平方根为:" & XSqrt End Sub. 图 4-19. 程序运行出错时的提示界面. 用 If - Then Go To 语句对上例改造后,如果再输入有效范围以外的数据,程序不会弹出 错误提示,而再次弹出输入数据对话框要求重新输入数据。 用 On Error Go To 实现: Private Sub cmdStart_Click() Dim sngX!, sngXSqrt! On Error GoTo ErrorExit.

(26) Visual Basic 程序设计教程(第二版). 78. ReInput: sngX = Val(InputBox("输入完成后单击“确定”按钮", "输入数据")) sngXSqrt = Sqr(sngX) lblResult.Caption = sngX & " 的算术平方根为:" & sngXSqrt GoTo ProgEnd ErrorExit: If Err.Number = 5 Then MsgBox "输入的数据有误!", 1 + 64 + 0, "确认" GoTo ReInput Else MsgBox "程序运行错误!", 1 + 64 + 0, "确认" End If ProgEnd: End Sub. 说明:在用 On Error Go To 语句实现的程序中一定要注意,“错误陷阱”应该放在程 序的有效语句以后,并且在进入“错误陷阱”之前,应该有一个转向语句,使程序在没有出错 的时候能够正常结束。 在实际的应用程序处理工作中,只要涉及有原始数据输入的过程,一般我们都要对它们 进行过滤!. 4.3. 循环结构的程序设计. 循环是客观世界普遍存在的一种现象。在茫茫宇宙之中,地球不停地围绕太阳循环运转; 滔滔江河也存在着回旋倒转的大大小小的旋涡;春夏秋冬来复去,白天黑夜去复来,就更是人 们司空见惯的了。 在人类社会,不但一般微观社会经济活动有时可抽象为某种循环往复的模式(例如,一 个工厂的整个经济活动,可以概括为供、产、销三环节周而复始的循环运动),而且整个宏观 经济活动,也可以概括为生产、分配、交换、消费四大环节的螺旋式循环运动。 同样,在我们所处理的问题中,常常遇到这样一些情况,它们的计算和处理方法完全一 样,只是要求重复计算多次,而每次使用的数据都按照一定的规则在改变。例如,需要对一个 班的 50 名学生的成绩进行处理,将不及格的学生名单打印出来等。 这些客观现象都有一个共同的特征,可以概括为“循环”。所谓循环,是指一个客观事物 在其发展过程中,从某一环节开始有规律地反复经历相似的若干环节的现象。循环的诸子环节 具有“同处同构”的性质,即它们“出现位置同处,构造本质同一”。 程序设计中的循环,是指在程序设计中,从某处开始有规律地反复执行某一操作块(或 程序块)的现象,并称重复执行的该操作块(或程序块)为它的循环体。 Visual Basic 提供了两种循环结构:当型循环和直到型循环。提供了 3 种循环语句:条件 循环 While…Wend;固定次数循环 For…Next;不固定次数循环 Do…Loop。 4.3.1 条件循环的程序实现 1.格式 While <条件>.

(27) 第 4 章 基本程序结构. 79. <循环体> Wend 其中的“条件”类似于选择结构中的条件,是一个逻辑量。While 和 Wend 之间的语句 构成循环体,是要重复执行的内容。 2.功能 当“条件”成立时,顺序执行循环体。当“条件”不成立时,脱离循环,程序转到 Wend 以后继续执行。其流程图如图 4-20 所示。. 条件. False. True 循环体. Wend 后. 图 4-20. 循环结构流程图. 3.说明 (1)While 和 Wend 必须配对使用。 (2)为使程序正确执行,循环中必须有改变条件的语句。 (3)要想执行循环体,必须先执行 While。 【例 4.13】有一张面积足够大的纸,如果可能,你将它不断的对折。编写程序,计算对 折多少次以后可以超过珠穆朗玛峰的高度(珠穆朗玛峰的高度为 8844430mm)? 分析:假设程序中我们用 H 表示纸张的厚度,对折一次(用 N 记录对折的次数)其厚度 就扩大一倍,即 H=H*2,用条件控制循环,判断对折多少次以后可以超过 8844430。 控件的属性和作用如表 4-13 所示。 表 4-13 例 4.13 的属性设置 对象 Form1. 属性 Caption (名称). Label. 例 4.13 折纸计算. Alignment. 显示程序的名称 显示纸的厚度. 2-Center lblH 显示对折后纸的厚度. Caption Alignment. 功能. lblPaper. Caption (名称). Label. 属性值. 2-Center.

(28) Visual Basic 程序设计教程(第二版). 80. 续表 对象. 属性. CommandButton CommandButton. (名称) Caption (名称) Caption. 属性值 cmdStart 计算 cmdClose 关闭. 功能 开始计算 关闭窗口. “计算”命令按钮(cmdStart)的程序源代码如下: Private Sub cmdStart_Click() Dim H#, N% N = 0 H = Val(InputBox("", "输入纸的厚度(mm)")) lblPaper.Caption = "纸的厚度:" & H & "mm" While H <= 8844430 H = H * 2 N = N + 1 Wend lblH.Caption = "对折" & N & "次后的厚度为:" & H & "mm" End Sub. 程序运行结果如图 4-21 所示。 【例 4.14】编写程序,求自然数前 N 项和小于 1000 的最大的 N 值。 分析:假设程序中我们用 N 表示自然数,S 表示前 N 个自然数的和,当 S 小于 1000 时,S 应该继续与下一个 自然数求累加和。当 S 不再小于 1000 时,重复过程就不 图 4-21 例 4.13 的程序运行界面 再继续,但是这时的 N 是自然数前 N 项和中第一个大于 1000 的数值,而题目要求的是小于 1000 的最大的 N,因此所求的结果应该是 N-1。 控件的属性和作用如表 4-14 所示。 表 4-14 例 4.14 的属性设置 对象 Form1. 属性 Caption (名称). Label. (名称). CommandButton. (名称) Caption (名称) Caption. 功能 显示程序的名称. lblResult1 显示最大的 N 值 2-Center lblResult2 显示前 N 个数的和. Caption Alignment. CommandButton. 例 4.14 求满足条件的最大值. Caption Alignment. Label. 属性值. 2-Center cmdStart 计算 cmdClose 关闭. 开始计算 关闭窗口.

(29) 第 4 章 基本程序结构. 81. “计算”命令按钮(cmdStart)的程序源代码如下: Private Sub cmdStart_Click() Dim S%, N% N = 0 S = 0 While S < 1000 N = N + 1 S = S + N Wend lblResult1.Caption = "自然数前 N 项和小于 1000 的最大的 N 值:" & N - 1 lblResult2.Caption = "自然数前 " & N - 1 & " 项的和:" & S – N End Sub. 程序运行结果如图 4-22 所示。. 图 4-22. 例 4.14 的程序运行界面. 【例 4.15】任给一自然数,编写程序,求其反序数。 分析:假设程序中我们用 N 表示输入的自然数;用 N 与 10 求模,得出个位,该位计入 M;用 N 除以 10 取整,去掉个位,然后再与 10 求模,得出新数据的个位,该位与 M 乘以 10 以后作和;重复前一步直到将整个数据处理完毕(N=0)。 控件的属性和作用如表 4-15 所示。 表 4-15 例 4.15 的属性设置 对象 Form1. 属性 Caption (名称). TextBox. TextBox. Label CommandButton CommandButton. 输入自然数的值. Enabled. True. (名称). txtM 输出自然数的反序数. Text False. (名称). lblNum. Caption. 自然数. (名称) Caption (名称) Caption (名称) Caption. 功能 显示程序的名称. txtN. Text. Enabled Label. 属性值 例 4.15 求反序数. lblBackNum 反序数 cmdStart 计算 cmdClose 关闭. 提示信息 提示信息 开始计算 关闭窗口.

(30) Visual Basic 程序设计教程(第二版). 82. “计算”命令按钮(cmdStart)的程序源代码如下: Private Sub cmdStart_Click() Dim N&, M&, T& N = Val(txtN.Text) M = 0 While N <> 0 T = N Mod 10 M = M * 10 + T N = Int(N / 10) Wend txtM.Text = M End Sub 图 4-23 例 4.15 的程序运行界面 程序运行结果如图 4-23 所示。 说明:当 N≠0 时说明还没有将 N 的所有位全部取完,因此循环应该继续;当 N=0 时, 说明已将 N 的所有位全部取完,因此循环就应该结束了。 因为 Visual Basic 用数值“0”表示逻辑假、“非 0”表示逻辑真,所以程序中我们可以直 接用 N 表示循环的条件,即:. While N 【例 4.16】编写程序,利用近似公式按指定精度(1/n! < Term)求工程常量 e。 1 1 1 e 1    1! 2! n! 分析:假设程序中我们用 E 表示待求的工程常量;用 N 表示累加的数据项数(为便于计 算让其从 0 开始);用 M 表示第 N 个数据项的分母;用 Term 表示计算精度。 控件的属性和作用如表 4-16 所示。 表 4-16 例 4.16 的属性设置 对象 Form1 Label Label. 属性 Caption (名称) (名称) Caption. CommandButton. lblPrecision lblPrompt. 显示程序的名称 显示输入的精度. (名称) Caption (名称) Caption. txtE 输出求出的工程常量 e False cmdStart 计算 cmdClose 关闭. “计算”命令按钮(cmdStart)的程序源代码如下: Private Sub cmdStart_Click(). 提示信息. e=. Text Enabled. CommandButton. 例 4.16 计算工程常量 e. 功能. Caption. (名称) TextBox. 属性值. 开始计算 关闭窗口.

(31) 第 4 章 基本程序结构. 83. Dim E#, N%, M&, Term! E = 1: N = 1: M = 1 Term = Val(InputBox("", "输入精确度")) lblResult.Caption = "输入的精确度为:" & Term While 1 / M > Term E = E + 1 / M N = N + 1 M = M * N Wend txtE.Text = E End Sub. 程序运行结果如图 4-24 所示。. 图 4-24. 例 4.16 的程序运行界面. 4.3.2 固定循环次数的程序实现 1.格式 For <循环变量>=<初值> To <终值> Step <步长值> <循环体> [Exit For] Next <循体变量>. 其中<初值>、<终值>、<步长值>可以是数值型常量、变量和表达式。 2.功能 当循环变量不“超过”终值时,将一次增加一个步长值地重复执行循环体。其具体执行 过程是:执行到 For 语句时,循环变量先得到“初值”,然后与“终值”比较;如果循环变量 未“超过”终值,那就执行循环体。执行到 Next 语句时,循环变量累加一个步长值,之后再 与终值进行比较。若没有“超过”终值,则重复上述过程,直到循环变量“超过”终值才退出 循环而转到 Next 语句后继续执行。 Exit For 语句的功能是无条件退出循环转到 Next 语句后继续执行。 3.说明 (1)For 和 Next 必须配对使用。 (2)当步长值为 1 时,“Step 1”可省略。 (3)当步长值>0 时,“超过”就是“>”;.

(32) Visual Basic 程序设计教程(第二版). 84. 当步长值<0 时,“超过”就是“<”。 (4)循环变量应尽量使用整型变量,以免出现误差。 (5)循环结束后,循环变量的值不变。即保持当前值。 n. 【例 4.17】编写程序,计算: S . k k 1. 分析:这是一个典型的固定循环次数的问题。 为了简单直观起见,假设程序中我们用 S 表示待求的和;用 K 表示累加的数据;用 N 表示累加的终值。 控件的属性和作用如表 4-17 所示。 表 4-17 例 4.17 的属性设置 对象 Form1. 属性 Caption (名称). Label. CommandButton. 例 4.17 计算自然数的和. (名称) Caption (名称) Caption. 功能 显示程序的名称. lblResult 显示计算的结果. Caption Alignment. CommandButton. 属性值. 2-Center cmdStart 计算 cmdClose 关闭. 开始计算 关闭窗口. “计算”命令按钮(cmdStart)的程序源代码如下: Private Sub cmdStart_Click() Dim N%, S&, K% N = Val(InputBox("输入完成后单击“确定”按钮", "输入 N 的值")) S = 0 For K = 1 To N S = S + K Next K lblResult.Caption = "前 " & N & " 个数的和为:" & S End Sub. 程序运行结果如图 4-25 所示。. 图 4-25. 例 4.17 的程序运行界面. 【例 4.18】相传古代印度国王舍罕要褒奖他聪明能干的宰相(国际象棋发明者)达依尔。 国王问达依尔需要什么,达依尔说:国王只要在国际象棋棋盘上的第一格放一粒麦子,第二格.

(33) 第 4 章 基本程序结构. 85. 放两粒麦子,第三格放四粒麦子,以后都按此比例每一格都是前一格的两倍,一直放到第 64 格为止,我将感激不尽!国王一听马上便答应下来。结果,他让扛过来的麦子,不一会儿就用 完了。国王很纳闷,这到底是怎么回事呢?我们下面编写程序,让计算机来算一算这笔账,假 定 1.42×108 粒小麦/m3,计算一下这么多小麦有多大的体积。 分析:这也是一个固定循环次数的问题。 63. 我们可以用下面的式子计算麦子的总颗粒数: S . 2. i. i 0. 为了简单直观起见,假设程序中我们用 S 表示待求的和;用 I 表示累加的数据。 控件的属性和作用如表 4-18 所示。 表 4-18 例 4.18 的属性设置 对象 Form1 Label Label CommandButton CommandButton. 属性 Caption (名称) Caption. 属性值 例 4.18 聪明的宰相 lblTotal 麦子颗粒总数. (名称). lblVolume. Caption. 所占体积. (名称). cmdStart. Caption (名称) Caption. 计算 cmdClose 关闭. 功能 显示程序的名称 显示计算的麦子的颗粒数 显示计算的体积 开始计算 关闭窗口. “计算”命令按钮(cmdStart)的程序源代码如下: Private Sub cmdStart_Click() Dim I%, S# Const T = 142000000# S = 0 For I = 0 To 63 S = S + 2 ^ I Next I lblTotal.Caption = lblTotal.Caption & " " & S lblVolume.Caption = lblVolume.Caption & " " & S / T & " 立方米" End Sub. 程序运行结果如图 4-26 所示。. 图 4-26. 例 4.18 的程序运行界面.

(34) Visual Basic 程序设计教程(第二版). 86. 上面程序中是用 S = S + 2 ^ I 来计算麦子的颗粒数的。实际上我们往往用连乘的方法来 实现高次幂的乘方: Private Sub cmdStart_Click() Dim I%, S#, K# Const T = 142000000# I = 1: S = 1: K = 1 For I = 1 To 63 K = 2 * K S = S + K Next I lblTotal.Caption = lblTotal.Caption & " " & S lblVolume.Caption = lblVolume.Caption & " " & S / T & " 立方米" End Sub. 说明:程序中,由于求和的第一项(I=0)已经在循环开始前进行了处理(I = 1: S = 1: K = 1),因此循环就应该从 1 开始到 63 结束。 【例 4.19】编写程序,判断输入的整数是否是素数。 分析:素数是除了能被 1 和它本身整除以外,不能被其他数整除的数。例如 11,就是一 个素数。而 12 就不是素数。因为 12 不仅可被 1 和它本身整除,而且 2、3、4、6 都可以整 除 12。 假设程序中我们用 Num 表示待判断的整数。依据素数的定义,我们不难得出判断 Num 是 不是素数的方法:将 Num 看做被除数,用 2~Num-1 作为除数,一一判断,只有当从 2~Num-1 之间的所有整数除 X 后都不为整数时,Num 才为素数。 实际上,由定理保证,只要当从 2~ Num 之间的所有整数除 Num 后都不为整数,那么 Num 即为素数。 控件的属性和作用如表 4-19 所示。 表 4-19 例 4.19 的属性设置 对象 Form1. 属性 Caption (名称). Label. (名称) Caption (名称). TextBox. CommandButton. (名称) Caption (名称) Caption. 功能 显示程序的名称. lblResult 显示判断的结果 四号,黑体 lblPrompt 数值. 提示信息. txtNum 显示输入的数据. Text Enabled. CommandButton. 例 4.19 判断素数. Caption Font. Label. 属性值. False cmdStart 判断 cmdClose 关闭. 开始处理 关闭窗口.

(35) 第 4 章 基本程序结构. 87. “判断”命令按钮(cmdStart)的程序源代码如下: Private Sub cmdStart_Click() Dim I&, Num& Dim Sign As Boolean Sign = False Num = Val(txtNum.Text) For I = 2 To Sqr(Num) If Num / I = Int(Num / I) Then Sign = True Exit For End If Next I If Sign Then lblResult.Caption = "不是素数" Else lblResult.Caption = "是素数" End If End Sub. 程序运行结果如图 4-27 所示。. 图 4-27. 例 4.19 的程序运行界面. 说明:程序中设置了一个逻辑型变量 Sign,其初始值为 False。循环体中的选择语句用来 判断 Num 能否整除循环变量 I。如果能整除,则 Num 不为素数。此时,令 Sign 取值 True。 当确认了 Num 不为素数以后,循环就不需要再继续下去了。因此,程序中可以使用 Exit For 语句退出循环。 循环结束后,对 Sign 进行判断,如果 Sign 的值为 True,则在标签控件 lblResult 的 Caption 中显示“不是素数”;否则就显示“是素数”。 【例 4.20】一个皮球从 10 米的高度自由落下,假定每次落地后反弹到原高度的一半,再 落下。如此下去,编写程序,计算它第五次反弹时的高度。 分析:假设程序中我们用 H 表示高度,则每次的反弹高度都是其一半,则有 H=H/2。如 此循环 5 次即可得到所求的反弹高度。 控件的属性和作用如表 4-20 所示。.

(36) Visual Basic 程序设计教程(第二版). 88. 表 4-20 例 4.20 的属性设置 对象 Form1 Label CommandButton CommandButton. 属性 Caption (名称). 属性值 例 4.20 球的反弹 lblResult. 功能 显示程序的名称 显示计算的结果. Caption (名称) Caption (名称) Caption. cmdStart 计算 cmdClose 关闭. 开始计算 关闭窗口. “计算”命令按钮(cmdStart)的程序源代码如下: Private Sub cmdStart_Click() Dim H!, I% H = 10 For I = 1 To 5 H = H / 2 Next I lblResult.Caption = "第五次反弹时的高度为: " & H End Sub. 程序运行结果如图 4-28 所示。. 图 4-28. 例 4.20 的程序运行界面. 请读者考虑: (1)如果题目中要求不仅计算出落地五次后的反弹高度,而且还要计算皮球从放手到第 五次落地共经过了多少米?应如何修改程序? (2)如果题目中的下落高度、反弹次数都不固定,又应该如何修改程序? 4.3.3 不固定循环次数的程序实现 1.格式 格式 1: Do [While|Until <条件>] <循环体> [Exit Do] Loop. 格式 2: Do <循环体>.

(37) 第 4 章 基本程序结构. 89. [Exit Do] Loop [While|Until <条件>]. 2.功能 格式中如果选择了“While <条件>”,则表示“当”条件成立时执行循环(当型循环),类 似 While-Wend 循环;格式中如果选择了“Until <条件>”,则表示“直到”条件成立才不执行 循环(直到型循环),条件为假时执行循环。 其中格式 1 是先测试条件(如果有[While|Until <条件>]选项的话),再根据测试的结果决 定是否执行循环;格式 2 是先执行循环然后再测试条件(如果有[While|Until 条件]选项的话), 根据测试的结果决定是否继续执行循环。 3.说明 该循环的常用格式为: Do <循环体> If <条件> Then Exit Do Loop. 注意:这种格式中必须要有一个条件语句决定是否退出 Do 循环,否则它就是一个“死循环”。 【例 4.21】编写程序, 求两个正整数的最大公约数。 分析:我们用辗转相除的方法求出两个数 A、B 的最大公约数。辗转相除的方法就是求 A 除以 B 的余数,当这个余数为 0 时,除数即为最大公约数。 我们可以通过利用求模运算 Mod 得到 A/B 的余数的方法求出 A/B 的余数 R,即: R = A Mod B 如果 R≠0,我们将 B 的值赋给 A,将 R 的值赋给 B,然后再求新得到的 A、B 的余数; 如此下去,直到 R=0 为止,此时除数 B 的值就是 A、B 的最大公约数。 我们用具体的数据来说明一下处理过程。 例如:A 为 72,B 为 28 A 72. Mod. B 28. =. R 16. ≠0. 28. Mod. 16. =. 12. ≠0. 16. Mod. 12. =. 4. ≠0. 12. Mod. 4 = 即为所求. 0. =0. 因此,4 即为 72 与 28 的最大公约数。 为了简单直观起见,假设程序中我们用 A、B 表示两个正整数,R 表示余数。 控件的属性和作用如表 4-21 所示。.

(38) Visual Basic 程序设计教程(第二版). 90. 表 4-21 例 4.21 的属性设置 对象 Form1 TextBox TextBox Label Label Label CommandButton CommandButton. 属性 Caption (名称). 属性值 例 4.21 计算最大公约数 txtA. Text (名称). txtB. Text (名称). lblResult. 功能 显示程序的名称 输入数据 A 的值 输入数据 B 的值 显示计算的结果. Caption (名称) Caption (名称) Caption (名称) Caption (名称) Caption. lblPromptA 数据 A lblPromptB 数据 B cmdStart 计算 cmdClose 关闭. 提示信息 提示信息 开始计算 关闭窗口. “计算”命令按钮(cmdStart)的程序源代码如下: Private Sub cmdStart_Click() Dim A%, B%, R% A = Val(txtA.Text) B = Val(txtB.Text) Do R = A Mod B If R = 0 Then Exit Do A = B B = R Loop lblResult.Caption = "A、B 两数的最大公约数是:" & B End Sub. 程序运行结果如图 4-29 所示。. 图 4-29. 例 4.21 的程序运行界面. 请读者考虑:如果题目要求在窗体中显示出具体数值:“72,28 的最大公约数是 4”。应 如何修改程序?.

(39) 第 4 章 基本程序结构. 91. 4.3.4 循环结构的嵌套 循环结构作为循环体的一部分出现时,就被叫做循环的嵌套,它实际上是在循环结构中 又包含了循环结构。这种嵌套可以是步长型循环的自身嵌套,可以是当型循环的自身嵌套,还 可以是当型循环嵌套步长型循环或者步长型循环嵌套当型循环等。 包含循环结构的循环叫外循环,被包含的循环叫内循环。使用循环嵌套时一定要注意, 内外循环不能交叉。 【例 4.22】编写程序,输出如下图形:. * ** *** **** ***** 分析:我们用外层 I 循环控制行数;内层 J 循环控制每行的符号“*”的个数;由图形 可以看出: 第 1 行 1 个“*”, 第 2 行 2 个“*”, …… 第 5 行 5 个“*”, 因此,第 I 行 I 个“*”,也就是说,内层循环的终值与外层循环的当前值一致。同时每一 行上的第一个“*”都从第一个位置开始显示。 程序运行结果如图 4-30 所示。. 图 4-30. 例 4.22 的程序运行界面. “开始”命令按钮(cmdStart)的程序源代码如下: Private Sub cmdStart_Click() Dim I%, J% For I = 1 To 5 For J = 1 To I Print "*"; Next J Print Next I End Sub.

(40) Visual Basic 程序设计教程(第二版). 92. 请读者考虑: (1)为什么程序第六行“Print "*";”语句中的格式符号”;”不能省略? (2)如何利用字符串重复函数 String()来简化程序? (3)如果要分别输出如下 8 种形式的图形,应该如何编写程序?. ***** * **** *** *** ***** ** ******* * ********* ** ******* *** ***** **** *** ***** *. ********* ******* ***** *** * *** ***** ******* *********. 1 222 33333 4444444 555555555 4444444 33333 222 1. ***** * **** *** *** ***** ** ******* * *********. ********* ******* ***** *** *. A BBB CCCCC DDDDDDD E E E E E E E EE. 【例 4.23】编写程序,输出九九乘法表。 分析:我们用二重循环控制乘数和被乘数。外循环 I:1~9 变化;如果要输出的九九乘 法表为阶梯形状,那么内循环 J:1~I 变化;如果要输出的九九乘法表为矩形,那么内循环 J: 1~9 变化。 程序运行结果如图 4-31 所示(阶梯形状) , “开始”命令按钮(cmdStart)的程序源代码如下: Private Sub cmdStart_Click() Dim I%, J% For I = 1 To 9 For J = 1 To I Print Tab((J - 1) * 13 + 1); I; "*"; J; "="; I * J; Next J Print Next I End Sub. 请读者注意程序第六行“Print Tab((J - 1) * 13 + 1); I; "*"; J; "="; I * J;”语句中 Tab 函数值 的设定。. 图 4-31. 例 4.23 的程序运行界面.

(41) 第 4 章 基本程序结构. 4.4. 93. 程序举例. 4.4.1 穷举法 穷举就是对所有可能的值进行逐一判断,找出其中符合条件要求的解。 【例 4.24】编写程序,计算我国古代数学家提出的“百钱百鸡问题”:“鸡翁一,值钱 五;鸡母一,值钱三;鸡雏三,值钱一。百钱买百鸡,问鸡翁、母、雏几何?” 分析:这个问题的意思是:一只公鸡值 5 个钱;一只母鸡值 3 个钱;3 只小鸡值 1 个钱。 用 100 个钱买 100 只鸡,公鸡、母鸡、小鸡各有多少只? 我们分别用 X,Y,Z 表示公鸡、母鸡、小鸡的个数 则有: X + Y + Z =100 ① 5X+3Y+Z/3=100 ② 由方程②可知:X 的取值范围为[0,20]中的整数。 Y 的取值范围为[0,33]中的整数。 因此我们可以用二重循环来解决这个问题。 外循环用 X 控制:0~20;内循环用 Y 控制:0~33;内循环体中根据方程①先求得 Z, 然后再根据方程②判定 X,Y,Z 是不是该问题的解。 控件的属性和作用如表 4-22 所示。 表 4-22 例 4.24 的属性设置 对象 Form1 Label Label Label CommandButton CommandButton. 属性 Caption (名称) Caption (名称) Caption (名称) Caption (名称) Caption (名称) Caption. 属性值 例 4.24 百钱百鸡问题 lblX 公鸡: lblY 母鸡: lblZ 小鸡: cmdStart 计算 cmdClose 关闭. “计算”命令按钮(cmdStart)的程序源代码如下: Private Sub cmdStart_Click() Dim X%, Y%, Z% For X = 0 To 20 For Y = 0 To 33 Z = 100 - X - Y. 功能 显示程序的名称 显示计算出的公鸡数量 显示计算出的母鸡数量 显示计算出的小鸡数量 开始计算 关闭窗口.

(42) Visual Basic 程序设计教程(第二版). 94. If 5 * X + 3 * Y + Z / 3 = 100 Then lblX.Caption = lblX.Caption & " " & X lblY.Caption = lblY.Caption & " " & Y lblZ.Caption = lblZ.Caption & " " & Z End If Next Y Next X End Sub. 程序运行结果如图 4-32 所示。. 图 4-32. 例 4.24 的程序运行界面. 请读者考虑:如果程序中的 3 个改变标签控件标题属性的语句变为: lblX.Caption = X lblY.Caption = Y lblZ.Caption = Z. 程序运行会如何变化? 【例 4.25】一个长长的阶梯,如果一次上两阶,最后剩一阶;如果一次上三阶,最后剩 两阶;如果一次上五阶,最后剩四阶;如果一次上六阶,最后剩五阶;如果一次上七阶,刚好 上完。编写程序,计算这个阶梯至少有多少阶? 解法 1 分析:假设阶梯有 X 阶,则: X Mod 2 =1 ① X Mod 3 =2 ② X Mod 5 =4 ③ X Mod 6 =5 ④ X Mod 7 =0 ⑤ 由①知 X 为奇数; 由⑤知 X 为 7 的倍数; 因此,我们设定循环由 7 开始,每次增加 14(如果增加的值为 7,那么初值 7 是奇数, 增加的值是 7 也是奇数,而“奇数+奇数=偶数” 。由条件①可知,偶数肯定不是该问题的解, 所以增加的值应至少为 14),循环体中比较 X 是否满足条件②、③、④,如果满足,则找到了 满足条件的 X。 控件的属性和作用如表 4-23 所示,程序运行结果如图 4-33 所示。.

(43) 第 4 章 基本程序结构. 95. 表 4-23 例 4.25 的属性设置 对象 Form1 Label CommandButton. 属性 Caption (名称) Caption (名称) Caption. CommandButton (名称). 图 4-33. 属性值 例 4.25 计算阶梯数 lblResult 最少阶梯数为: cmdStart 计算 cmdClose. 功能 显示程序的名称 显示计算结果 开始计算 关闭窗口. 例 4.25 的程序运行界面. “计算”命令按钮(cmdStart)的程序源代码如下: Private Sub cmdStart_Click() Dim X% X = 7 Do If X Mod 3 = 2 And X Mod 5 = 4 And X Mod 6 = 5 Then lblResult.Caption = lblResult.Caption & X Exit Do Else X = X + 14 End If Loop End Sub. 解法 2 分析:假设阶梯有 X 阶,则: X Mod 2 =1 ① X Mod 3 =2 ② X Mod 5 =4 ③ X Mod 6 =5 ④ X Mod 7 =0 ⑤ 由①、②、③、④知 X+1 是 2、3、5、6 的倍数, 也就是 X+1 能同时整除 2、3、5、6,换句话说就是(X+1)可整除 2、3、5、6 的最小公 倍数 30,可用表达式表示为: (X+1) Mod 30 = 0 ⑥ 现在条件减少到⑤和⑥两个,由条件⑥控制循环:X 由 29 开始,每次增加 30,循环 体中比较 X 是否满足条件⑤,如果满足,则找到了满足条件的 X。.

(44) Visual Basic 程序设计教程(第二版). 96. 假设程序中我们仍然用 intLadder 表示阶梯数,程序代码可以修改为: Private Sub cmdStart_Click() Dim X% X = 29 Do If X Mod 7 = 0 Then lblResult.Caption = lblResult.Caption & X Exit Do Else X = X + 30 End If Loop End Sub. 4.4.2 递推法 递推法就是在已知某个结果的前提下,根据已经给出的(或者是分析总结出的)递推公 式,推出下一个结果的方法。 【例 4.26】有斐波那契数列(Fabonacci),已知前两个数分别是 1、1,从第三个数据开始 每个数据都是其前两个数据的和,编写程序,输出该数列的前 12 个数。 分析:我们用 A、B 分别表示前两个数。由于从第三个数开始每个数都是其前两个数的和, 所以如果仍然用 A、B 表示第三、四个数,则有: A = A + B B = B + A ↑ ↑ ↑ ↑ ↑ ↑ 第 3 个数 第 1 个数 第 2 个数 第 4 个数 第 2 个数 第 3 个数 因此,我们得到的递推公式为: A=A+B B=B+A 为了简单直观起见,假设程序中我们用 A,B 表示数列的递推数据, “计算”命令按钮的 程序源代码如下: Private Sub cmdStart_Click() Dim A%, B%, I% A = 1: B = 1 Print A, B For I = 2 To 6 A = A + B B = B + A Print A, B Next I End Sub. 程序运行结果如图 4-34 所示。.

(45) 第 4 章 基本程序结构. 图 4-34. 97. 例 4.26 的程序运行界面. 【例 4.27】一个猴子摘了一堆桃子,第一天吃了一半,又多吃一个;第二天还是吃了一 半,又多吃一个。它每天如此,到第 5 天时只剩一个桃子了。编写程序,计算猴子第一天共摘 了多少个桃子? 分析:这个问题与上例正好相反,现在知道第 5 天有一个桃子问第一天有多少桃子? 因此,若用 Ti 表示第 i 天的桃子数,则有: T Ti 1  i  1 (i=1,2,…) 2 即: Ti=2×(Ti+1+1) (i=1,2,…) 由此例可知: T5=1 T4=2×(T5+1) =2×(1+1) ...... 依此类推即可求得 T1。 假设程序中我们用 T 表示每天的桃子数。 用循环控制执行 4 次 T=2*(T+1)即可。 控件的属性和作用如表 4-24 所示,程序运行结果如图 4-35 所示。 表 4-24 例 4.27 的属性设置 对象 Form1 Label CommandButton. 属性 Caption (名称). 属性值 例 4.27 猴子摘桃子 lblResult. 功能 显示程序的名称 显示计算结果. Caption (名称) Caption. CommandButton (名称). 图 4-35. cmdStart 计算 cmdClose. 例 4.27 的程序运行界面. 开始计算 关闭窗口.

參考文獻

相關文件

某项货物的单位价格是指该项货物的贸易货值与其货量之比。季度单位价格指数是计算当季各

某项货物的单位价格是指该项货物的贸易货值与其货量之比。季度单位价格指数是计算当季各

某项货物的单位价格是指该项货物的贸易货值与其货量之比。季度单位价格指数是计算当季

VARIABLE LABELS PrimaryFirst '將所有第一個相符觀察值標為主要的 指標' MatchSequence '相符觀察值的循序個數'.. VALUE LABELS PrimaryFirst 0 '重複觀察值'

数值 按年变动 数值

对于二元函数的自变量,我

求出 Select Case 運算式之值,並逐一與 Case 運算式值串列比對,若符合則執行該 Case 之後的敘述區段。1. 如果所有的

Excel VBA 乃是以 Visual Basic 程式語言為基礎,提供在 Excel 環境中進 行應用程式開發的能力。在 Excel 環境中「Visual Basic 編輯器」提供了一個