第4章 基本算法和流程控制

更新时间:2023-05-17 07:03:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第 4 章 基本算法和流程控制

本章主要介绍基本的算法、Visual Basic 语言的流程控制语句,包括 If 语句、Select Case 语句、 For Next 语句、While Wend 语句和 Do Loop 语句等。

4.1 基本算法

对计算机编程语言来说,算法是用于求解某个特定问题的一些指令的集合。具体地说,用计算机所能 实现的操作或指令,来描述问题的求解过程,就得到了这一特定问题的计算机算法。

4.1.1 算法和算法的描述方法 

1.什么是算法

一般来说,所谓算法是指解决一个特定问题采用的特定的、有限的方法和步骤。例如,计算 6!的步 骤是: 计算 1×2 的值为 2→计算 2×3 的值为 6→计算6×4 的值为24→计算 24×5 的值为 120, →计算 120 ×6 的值为 720,即 6!=720。

利用计算机来解决问题需要设计程序,在设计程序前要对问题进行充分的分析,设计解题的步骤与方 法,也就是设计算法,然后根据算法设计程序。例如,计算 6!的值,上面已给出了计算的步骤,要实现上 述计算,需用变量 SUM 存放初值 1,以后存放每次乘积的值和最后的计算结果,用变量N 存放初值 0,用 N=N+1 使 N 依次取整数 1、2、3、4、5 和 6,用 SUM=SUN*N 完成每次的乘法运算。根据上述算法,设 计计算 6!的程序代码如下。 

SUM=1:N=0 

N=N+1:SUM=SUM*N N=N+1:SUM=SUM*N N=N+1:SUM=SUM*N 

N=N+1:SUM=SUM*N N=N+1:SUM=SUM*N N=N+1:SUM=SUM*N Print "6!= " SUM 

如果使用上述算法计算 15!值,会使程序冗长而繁琐,这显然不是一个好算法。考虑到程序中多次使 用 N=N+1 和 SUM=SUM+N 语句,可使用循环的方法,循环一次执行一次 N=N+1 和 SUM=SUM+N 语句, 一共循环 15 次。如果是求 M!,则循环 M 次。产生循环的方法可以使用两个时钟控件对象。一个 Timer1 时钟对象的 Interval 属性值设置为 100ms, 每隔 100ms 触发一次, 执行一次N=N+1 和 SUM=SUM+N 语句。 再用一个Timer1时钟对象, 它的Interval属性值设置为M*100ms, 每隔M*100ms触发一次, 触发后使Timer1 时钟对象停止工作,即设置 Timer1 时钟对象的 Interval 属性值为 False。

由此可见,解决同一问题的算法可以有多种,应设计简单、明了,步骤尽量少的算法,这样编写出来 的程序才能短小、精练、易读。 

2.算法的描述方法

算法有许多描述方法,例如前面所用的方法是自然语言法,即使用人们日常使用的语言描述解决问题 的步骤与方法。这种描述方法通俗易懂,但比较繁琐,且对条件转向等描述欠直观。针对自然语言法描述 的缺点,又产生了流程图法、N­S 图法和 PAD 图等方法。计算机的算法有数值型运算算法和非数值型运算 算法。例如,前面提到的计算 M!的算法就属于数值型运算算法;而进行数据检索、分类、排序和计算机

91 

绘图、制表等都属于非数值型算法。

(1)流程图:它是一种用图形来表示算法的描述方法。它通过各种几何框图和流程线来描述各步骤 的操作和执行的过程。这种方法直观形象、逻辑清楚、容易理解,但它占用篇幅大,流程随意转向,较大 的流程图不易读懂。对于初学者和编写较小的程序时,可采用流程图的方法。流程图规定的几何图形如表 4­1­1所示。

表4-1-1 流程图规定的几何图形

(2)N­S 图:它是 1973年美国科学家 Nassi 和 Shneid erman B 首次提出的一种描述算法的图形方法。 N­S 图形方法完全去掉了流程线,全部算法写在一个矩形框内,总框内包含其它的功能框。

(3)PAD 图:PAD 是英文 ProblemAnalysisDiagram 的缩写,其原意是问题分析图。它是近年来在软 件开发中被推广使用的一种描述算法的图形方法。它是一种二维图形,从上到下按各框图功能顺序执行, 从左到右表示层次关系。这种描述算法的方法,层次清楚,逻辑关系明了,在有多次嵌套时,不易出错。

4.1.2 三种程序控制结构

博姆(bohm)和雅可比尾(Jacopini)两位学者于 1966 年提出程序有三种基本结构:顺序结构、选择 结构和循环结构。这三种基本结构都具有只有一个入口和一个出口的特点,不会出现死循环。 

VB 虽然采用面向对象的编程方法,但它还采用了事件驱动调用相对划分得比较小的过程子过程。对 于具体的过程本身,仍然要用到结构化程序的方法,用控制结构来控制程序执行的流程。 

1.顺序结构

顺序结构是一种线性结构,也是程序设计中最简单、最常用的基本结构。顺序结构程序是把计算机要 执行的各种处理依次排列起来。程序运行后,便从左至右、自顶向下地顺序执行这些语句(一个语句行中, 从左至右顺序执行各条语句),直至执行完所有语句行的语句或执行至 End 语句止。一个程序通常分为 3 3 种描述方法绘制的顺序结构图如图 4­1­1 所示。

(a)流程图 (b)N-S图 图4­1­1 顺序结构

(c)PAD图

2.选择结构

选择结构是一种常用的主要基本结构,是计算机科学用来描述自然界和社会生活中分支现象的重要手 段。在实际工作中,常常需要根据某个条件是否成立,来决定下一步应做什么工作。设计程序让计算机工 作,同样存在这种情况。在这种情况下,程序不再按照行号的顺序来执行各语句行的语句,而是根据给定 的条件来决定选取哪条路径,执行哪些语句。选择结构的特点是:根据所给定选择条件为真(即条件成立) 与否,而决定从各实际可能的不同操作分支中,选择执行某一分支的相应操作,并且任何情况下均有“无 论分支多少,仅选其一”的特性。使用上面介绍的 3种描述方法绘制的选择结构图如图 4­1­2 

所示。

(a)流程图 (b)N­S图 图4­1­2 选择结构 

(c)PAD图

3.循环结构

在设计程序让计算机工作时,常需要在某个条件成立时反复执行某段程序或某条语句,直到条件不成 立后才停止这种重复工作。 这类的程序结构叫循环结构。 循环结构又分为当型循环结构与直到型循环结构, 前者是先进行条件判断,再执行程序段或语句;后者是执行一次要重复执行的程序段或语句,再进行条件 判断。使用上面介绍的 3 种描述方法绘制的循环结构图如图 4­1­3 

所示。

(a)流程图 (b)N­S

(c)PAD图 图4­1­3 循环结构

4.2 选择结构语句

在 Visual Basic 6.0语言中,实现选择结构的语句有:If Then Else(单选择双分支)、If Then Else lf(多选择多分支)、Select Case(多分支开关)语句。条件语句的功能都是根据表达式的值是否成立, 有条件地执行一组语句。

4.2.1 If Then Else 语句 

1.单行式 If Then Else 语句

【格式】If 条件 Then 语句组 1 [Else 语句组2]

【功能】格式中的“条件”可以是关系表达式表达或逻辑表达式。当条件成立(即其值为 True)时, 执行“语句组 1”的各条语句;当条件不成立(即其值为 False)时,执行“语句组 2”的各条语句,如果 没有“Else 语句组 2”选项则不执行。然后再执行其后的语句。

【说明】

(1)语句组中的语句可有多条,各条之间应用冒号分隔。

(2)格式中的“条件”可以是数值表达式和数值形式的字符串表达式,当它们的值为非零的数(例 如,123)或由非零的数组成的字符串(例如,"a string")时,执行“语句组 1”的各条语句;当它们的 值为 0 或由0 的数组成的字符串(例如,0、"0")时,执行“语句组 2”的各条语句。

【举例 1】设计一个程序如下。程序运行后,调出“输入数”对话框,要求输入一个数,如图 4-2-1 所示。输入数后单击“确定”按钮。当该数为偶数时(此处输入 10),显示“是偶数” ,如图4-2-2 所示; 当该数为奇数时(此处输入 11),显示“是奇数” ,如图 4-2-3 所示。程序代码如下。 

Private Sub Form_Activate() 

X = V

al(InputBox("

请输入数:

", "输入数", 0, 600, 120)) If X Mod 2 = 0 Then Print "是偶数" Else Print "是奇数" End Sub 

图4­2­1 程序运行结果 图4­2­2 输入偶数的结果 图4­2­3 输入奇数的结果 

2.区块式 If Then Else 语句 【格式】 If 条件 Then 语句序列 1 [Else 语句序列 2] End If

【功能】当条件成立时,执行“语句序列 1”的各条语句;当条件不成立时,执行“语句序列 2”的 各条语句,如果没有“Else 语句序列 2”选项则不执行,然后执行 End If后面的语句。

【说明】 “语句序列1”和“语句序列 2”可以由一个语句行或多个语句行组成。在书写代码的习惯上, 常把夹在关键字 If、Then 和 Else 之间的语句序列以缩排的方式排列,这样会使程序更容易阅读理解。

【举例 2】采用 If Then Else If 语句设计上面的例子如下。 Private Sub Form_Activate() 

X = Val(InputBox("请输入数:", "输入数", 0, 600, 120)) If X Mod 2 = 0 Then Print "是偶数" Else 

Print "是奇数" End If End Sub 

4.2.2 If Then Elself 语句

无论是单行式还是区块式的 If..Then..Else 语句,都只有一个条件表达式,只能根据一个条件表 达式进行判断,因此最多只能产生两个分支。如程序需要根据多个条件表达式进行判断,产生多个分支时, 就需要使用 If..Then..Elself 语句。

【格式】 If 条件 1 Then 语句序列 1 [Elself 条件 2 Then 语句序列 2] ...... [Else 语句序列 n] End If

【功能】当条件 1 的值为 True时,则执行语句序列1;当条件 1 的值为 False 时,则再判断条件 2 的 值,依次类推,直到找到一个值为 True 的条件为止,并执行其后面的语句序列。如果所有条件的值都不 是 True,则执行关键字Else 后面的语句序列

n。

无论哪一个语句序列,

执行完后都接着执行关键字 End If 后面的语句。

【说明】语句中的“条件”和序列的要求及功能与 If Then Else语句相同。

【举例 3】制作一个“符号函数”程序。该程序运行后的 3 个画面如图 4-2-4 所示。在左边的文本框 内输入一个数值,单击“求符号函数的值”按钮,即可在右边的文本框内显示出相应的数值,其对应关系 符合符号函数的特点:输入大于零的数时输出 1,输入等于零的数时输出0,输入小于零的数时输出-1。

“符号函数”程序的窗体设计和对象属性设置比较简单,由读者自行完成。

图4­2­4 “符号函数”程序运行后的3个画面

Private Sub Command1_Click() Dim N As Integer '声明变量N 是数值型 N = Val(Text1.Text) '将 Text1 文本框中的数据转换为数值,并赋给变量 N If N > 0Then '如果N>0 则使 Text2 文本框中显示 1 Text2.Text = "1" ElseIf N = 0 Then '如果 N=0则使 Text2 文本框中显示 0 Text2.Text = "0" Else '否则(即 N<0)使 Text2 文本框中显示­1 Text2.Text = "­1" End If End Sub 

Private Sub Command2_Click() 

    '在单击“退出”按钮后,退出程序运行 End End Sub 

4.2.3 Select Case 语句

If Then ElseIf 语句可以包含多个 Elself 子语句, 这些 Elself 子语句中的条件一般情况下是不同的。 但当每个 ElseIf 子语句后面的条件都相同,而条件表达式的值并不相同时,使用 If Then ElseI 语句设 计程序就会很烦琐,此时可使用 Select Case 语句。

【格式】

Select Case 表达式 [Case 取值列表 1 语句序列 1] [Case 取值列表 2 语句序列 2] ...... [Case Else 语句序列 n] End Select

【功能】计算表达式的值,再将其值依次与每个 Case 关键字后面的“取值列表”中的数据和数据范 围进行比较,如果相等,就执行该 Case 后面的语句序列;如果都不相等,则执行 Case Else 子语句后面 的语句序列 n。无论执行的是哪一个语句序列,执行完后都接着执行关键字 End Select 后面的语句。程序 中的选择结构程序的流程图如图 4­2­5 所示。

图4­2­5 Select Case语句流程图

【说明】

(1)表达式可以是数值表达式或字符串表达式。

(2)每一个 Case 后面的“取值列表”中的数据是表达式可能取得的结果,其“取值列表”的格式有 以下三种。

◎ 数值型或字符型常量或表达式。 例如, “10” 、 “1,5,7” 、 “Val("n")-5” 、 “S” 、 ““A”,F,E” 、 “Chr(65) & 12”等。其中,认为数字可以是数值或字符,认为字母是变量,只有用引号括起来的字母才会被认为是 字母。

◎ 使用“To”来表示数值或字符常量区间, “To”两边可以是数值型或字符型常量。例如: “1 To 10” 、 [A To D]、 ““A” To ”D””等。注意“To”左边的数值或字符应小于“To”右边的数值或字符。

◎ 使用“Is 表达式”来表示数值或字符串区间。这种方法适用于取值为含有关系运算符的式子,在 实际输入时,加或不加 Is 都可以,光标一旦离开该行,Visual Basic会自动将它加上。例如: “Is>10” 、 “Is>=S” 、 “Is<=”X””等。可以混合使用这三种格式。例如:Case A T0 F,16,30,Is>10。其中,A T0 F 为变量 A 和 F 所表示的数据区间的数据,16 和 30 可以是数值或字符数据,Is>10 为 Is 表达式,表示所 有大于 10 的数据。

(3)如果不止一个 Case 后面的取值与表达式相匹配,则只执行第一个与表达式匹配的 Case 后面的 语句序列。

【举例 4】在窗体内创建一个名成为“Command1”的按钮和一个名成为“Label1”的标签,标签用来 显示输入的数据。单击“Command1”按钮后即可执行下面的程序。在输入不同的数据后,会在窗体中显示 不同的内容。读者可以上机操作,并输入不同的数据,以了解 Select Case 语句的功能,理解“取值列表” 格式的特点。读者还可以修改程序,来进一步掌握 Select Case 语句的功能。程序如下。 

Private Sub Command1_Click() 

Dim N As String, B, C As Integer  '声明变量 FS1 是字符型,B 和 C 变量是数值型 N = InputBox$("请输入字符数据:")   '输入一个数据,赋给变量 N Cls:Label1.Caption = N:B = 100: C = 200 Select Case N 

Case "A" To "G"    '输入打头字母为 A到 G(包括字母 A和 G)的字符串时,输出 1 Print "1" 

Case 11, 18, 36, "20"      '输入 11、36、20 时,输出 2 Print "2" 

Case Val("50")­ 10        '输入 40 时,输出 3 Print "3" 

Case B, C                  '输入 100 或 200时,输出 4 Print "4" 

Case "H", B + C            '输入H 或 300 时,输出 5 Print "5" 

Case "W" + Chr(65) & 22    '输入 WA22 时,输出6 Print "6" 

Case Is > "R"              '输入大于 R 字母时,输出 7 Print "7" 

Case "X" To "Z",30,50,Is<0  '输入 X 到 Z的字母或30 或 50 或负数时,输出 8 Print "8" 

Case Else                '输入不符合上述要求的数据时,输出"无符合的数据!" Print "无符合的数据!" End Select End Sub

4.2.4 选择结构的嵌套

选择结构的语句中的“语句序列”可以是一个选择结构语句,这就叫选择结构的嵌套。 【举例 5】“符号函数”程序可以采用选择结构的嵌套方式修改如下。  

4.3 循环结构语句

循环结构语句是在某个条件成立时反复执行一段程序,直到条件不成立后才停止执行这段程序, 退出 循环语句。

4.3.1 For Next 语句 

1.For Next 语句的格式与功能 【格式】 

For 循环变量=初值 To 终值 [Step 步长值] [循环体语句序列] Next [循环变量] 

【功能】(1)执行 For 语句时,首先计算初值、终值和步长值各数值型表达式的值,再将初值赋给循 环变量。然后将循环变量的值与终值进行比较,如果循环变量的值没超出了终值,则执行循环体语句序列 的语句,否则执行Next 下面的语句。

(2)执行 Next 语句时,将循环变量的值与步长值相加,再赋给循环变量,然后将循环变量的值与终 值进行比较,如果循环变量的值没超出终值,则执行循环体语句序列的语句,否则执行 Next 下面的语句。

(3)若步长值为正数,则循环变量的值大于终值时为超出;若步长值为负数,则循环变量的值小于 终值时为超出。

【说明】

(1)如果没有关键字 Step和其后的步长值,则默认步长值为 1。

(2)循环变量是数值型变量,初值、终值和步长值都是数值型的常量、变量或表达式,但不能是数 组的数组元素。

(3)在循环体语句序列中可以加入 Exit For 语句,执行该语句后会强制程序脱离循环,执行 Next 下 面的语句。Exit For 语句通常放在选择结构语句之中使用。

(4)如果出现循环变量的值总没有超出终值的情况,则会产生死循环。此时,可按 Ctrl+Break 键,

强制终止程序的运行。 

2.分析程序的运行结果

分析循环语句程序的运行过程和运行结果,有利于帮助了解循环语句的功能。 【举例 1】程序如下,分析程序的运行结果。 Private Sub Form_Activate() 

For N = 1 To 5 Step2 Print N, Next N 

Print :Print "N=" N End Sub 

该程序运行后,执行 For 语句,循环变量 N 取值 1<5(终值),因步长值为正数,没有超出终值,则 执行循环体语句“Print N,” ,在窗体中第 1行第 1 列显示变量N 的值 1。执行Next 语句时,N 加步长值 2 后再赋值给变量 N等于 3,与终值5 比较(3<5),没有超出终值,再执行“Print N,”语句,在窗体中第 1 行第 15 列(第 2 显示区的第 1列)显示 N 的值 3。

再执行 Next 语句时,N 加步长值后的取值为 5,与终值 5 比较没有超出终值,再执行“Print N,”语句, 在窗体中第 1行第 29列(第 3显示区的第 1 列)显示 N 的值 5。然后,再执行Next 语句,N加步长值后 的取值为 7,超出终值,退出循环语句,执行“Next N”语句下面的语句“Print :Print “N=” N” ,在第2 行第 1 列显示 N 的值 7。窗体显示如图 4­3­1 所示。 【举例 2】程序如下,分析程序的运行结果。 Private Sub Form_Activate() 

For N = 5To1 Step­2 Print N, Next N 

Print :Print "N=" N End Sub 

该程序运行后,执行 For 语句,循环变量 N 取值 5>1(终值),因步长值为负数,没有超出终值,则 执行执行语句“Print N,” ,在窗体中第 1行第 1 列显示变量 N的值 5。执行Next 语句时,N 加步长值­2后 再赋值给N 等于 3,与终值 5 比较(3>1),没有超出终值,再执行“Print N,”语句,在窗体中显示 3。再 执行 Next 语句时,N加步长值后的取值为 1,与终值1 比较没有超出终值,再执行“Print N,”语句,在窗 体中显示 1。

然后,再执行Next 语句,N 加步长值后的取值为­1,超出终值,退出循环语句,执行“Next N

”语句

下面的语句“Print :Print “N=” N” ,在第 2 行第 1 列显示“N=”和N 的值­1。窗体显示如图 4­3­2 所示。

图4­3­1 例1程序运行结果 图4­3­2 例2程序运行结果

【举例 3】求 1+2+……+100的值。 设计的程序如下。 

Private Sub Form_Activate() 

Dim N As Integer, SUM As Long 

SUM = 0          '给变量 sum赋初值 0 

Rem 可循环 100 次,每一次循环使变量 N 自动加 1,N 依次取值 1、2……100

For N = 1 To 100 SUM = SUM + N Next N 

Print "1+2+……+100="  SUM End Sub 

程序运行结果如图 4­3­3所示。 【举例 4】求 10!的值。

‘累加语句,进行变量 N的累加 ‘显示计算结果 

程序如下。程序运行结果如图4­3­4 所示。 

Private Sub Form_Activate() 

Dim N As Integer, SUM As Long 

SUM = 1  

        '给变量 sum赋初值 1 Rem 

For N = 1 To 10 ‘ 可循环 10 次,每一次循环使N 自动加 1,N 依次取值 1……10 SUM = SUM * N    '累加语句,进行变量 N的累加 Next N 

Print "10!="  SUM   '显示计算结果 End Sub 

图4­3­3 例3程序运行结果 图4­3­4 例4程序运行结果

【举例 5】求 1+(1+2)+……+(1+2+……+100)的值。 程序内容如下。 

Private Sub Form_Activate() 

Dim N As Integer, SUM, SUN1 As Long 

SUM = 0: SUM1 = 0       '给变量 SUM 和 SUM1 赋初值 0 

Rem 可循环 100 次,每一次循环使变量 N 自动加 1,N 依次取值 1、2……100 For N = 1 To 100 

SUM = SUM + N   '累加语句,进行变量N 的累加运算 

SUM1 = SUM1 + SUM    '累加语句,进行变量SUM 的累加运算 Next N 

Print "1+(1+2)+……+(1+2+……+100)="  SUM1   '显示计算结果 End Sub 

在求 1+2+……+100 值的程序中,第 1 次循环中,SUM 的值为 1;第 2 次循环中,SUM 的值为 1+2=3;……;第 100 次循环中,SUM 的值为 1+2+3+……+100=5050。可见,每次循环中 SUM 的值正好 是求 1+(1+2)+……+(1+2+……+100)值式子中的各项值,因此只要在每循环时将 SUM 进行累加即可。

程序的运行结果为:1+(1+2)+……+(1+2+……+100)=171700 

4.3.2 循环结构的嵌套 

1.什么是循环结构嵌套和循环嵌套的注意事项

可以把一个循环结构放入另一个循环结构之中,这称为循环结构的嵌套。例如,可以在一个 For Next 语句中嵌套另一个 For Next 语句, 组成嵌套循环, 不过在每个循环中的循环控制变量应使用不同的变量名, 以避免互相影响。

使用循环嵌套应注意以下几点。

(1)内循环与外循环的循环变量名称不能够相同。 (2)外循环必须完全包含内循环,不可以出现交叉现象。 (3)不可以没有执行 For 语句,就执行Next 语句。 下面的情况是错误的: 出现交叉现象

内外循环变量名称相同 

For A=1 TO 100                  For A=1 TO 100 

For B=3 TO 1 Step–1            For A=3 TO 1 Step–1 …… …… Next A                          Next A Next B Next A 2.循环结构嵌套举例 【举例 6】求三个有趣的整数

有三个正整数,其和为 30,第 1 个数与第 2 个数的 2 倍及第 3 个数的 3 倍之和为 53,第 1 个与第 2 个数和的 2倍减去第3 个数的3 倍为 20,设计程序求这三个数。

设第 1、2、3 个数分别为 A、B、C,由题意可知 A+B+C=30,A+2*B+3*C=53,2*(A+B)­3*C=20。解 决这类问题可以采用穷举法,即产生 0 到 30 的数分别赋给 A、B、C,然后按照条件进行筛选,符合条件 的便显示出来。下面介绍两种方法。

(1)方法一:程序如下。 

Private Sub Form_Activate() Dim A, B As Integer For A = 0 To 30 For B = 0 To 30 For C = 0 To 30 

If A + B + C = 30 And A + 2 * B + 3 * C = 53 And 2 * (A + B) ­ 3 * C = 20 Then Print "A="  A, "B="  B, "C="  C End If Next C Next B Next A End Sub 

程序运行结果是: A=15     B=7     C=8 (2)方法二:程序如下。 

Private Sub Form_Activate() Dim A, B As Integer For A = 0 To 30 

For B = 0 To 30 

C = 30­A­ B        '保证 A+B+C=30 

If A + 2 * B + 3 * C = 53 And 2 * (A + B) ­ 3 * C = 20 Then Print "A="  A, "B="  B, "C="  C End If Next B

Next A End Sub 

可以看出,该程序比第一个程序运行的时间要短,程序更优化。 (3)方法三:程序如下。 

Private Sub Form_Activate() Dim A, B As Integer For A = 0 To30 For B = 0 To30 

C = 30­A­ B 

If A + 2 * B + 3 * C <> 53 Or 2 * (A + B) ­ 3 * C <> 20Then GoTo BT Print "A="  A, "B="  B, "C="  C BT: 

Next B Next A End Sub 

在该程序中,使用了“Goto 标号”语句,其功能是无条件转到标号(例如:BT)所指示的语句行, 标号的右边一定要加冒号“:” 。在程序中应尽量少用Goto语句。

【举例 7】猜父子年龄。

父子二人,已知儿子年龄不大于 40 岁,父亲年龄不大于 100 岁,10 年前父亲年龄是儿子年龄的 4 倍, 10 年后父亲年龄是儿子年龄的整数倍。求父子现在的年龄。

设父、子年龄各为 A、B 岁,10 年前儿子的最小岁数是 1 岁,现在至少为 11 岁,因此现在父亲年龄 至少 14 岁。由此可设 A的初值为 11,B 的初值为 14。解决这个问题也可以采用穷举法。所用的判断式子 如下。

A­10=(B­10)*4 和 Int((A+10)/(B+10))=(A+10)/(B+10) 设计的程序如下。 

Private Sub Form_Activate() 

Dim A, B As Integer For A = l4 To 100 For B = 11 To40 

If (A­10)=(B­10) * 4 And (A+10) / (B+10) = Int((A+10) / (B+10)) Then Print "父亲现在岁数:"  A, "儿子现在岁数:"  B End If Next B Next A End Sub 

程序运行结果如下。

父亲现在岁数:50;儿子现在岁数:20 【举例 8】人民币取法。

有面值为壹元、贰元和伍元的人民币若干,从中取出20 张使其总值为陆拾元,问有多少种取法?每种 取法中的壹元、贰元和伍元人民币各有多少张? 

设取壹元人民币有 A张,贰元人民币有 B 张,伍元人民币有 C 张,共有 N 种取法。用三重循环产生 各种取法,在循环体内用条件判断语句进行是否符合条件的判断,从而找出符合其总值为 60 元的取法。 根据题意可知,变量 A、B 的循环变量的终值不能大于 20,而变量 C 的循环变量的终值不能大于 12(因5

×12=60)。程序如下。 

Private Sub Form_Activate() 

For A = 0 To 20 For B = 0 To 20 

For C = 0 To 12 

If A + B + C = 20 And A + B * 2 + C * 5 = 60 Then N = N + 1 

Print Tab(1)  "壹元张数:"  A  Print Tab(15)  "贰元张数:"  B  Print Tab(30)  "伍元张数:"  C End If 

Next C, B, A            '三个连续的Next 可采用这种写法 Print: Print "人民币取法的总数为:"  N End Sub 

程序运行结果如图 4-3-5 所示。

图4­3­5 实例8程序运行结果

4.3.3 While Wend 语句 

1.While Wend语句的格式和功能 【格式】 While 条件 [循环体语句序列] Wend 

【功能】当条件成立时,重复执行语句序列,否则,转去执行关键字 Wend 后面的语句。执行 Wend 语句的作用就是返回到 While语句去执行。

【说明】条件实际上是一个表达式,对它的要求与对If Then Else语句的要求一样。经常使用的是关 系和逻辑表达式。 

2.分析程序的运行结果 【举例 9】程序内容如下。 Private Sub Form_Activate() Dim N, SUM As Integer N = 1: SUM = 0 While N <= 3 

SUM = SUM + N N = N + 1 Wend 

Print "SUM="  SUM End Sub

该程序运行后,执行到 While N <= 3语句时,判断 N <= 3 关系表达式成立(其值为 True),则执行循 环体语句,使 SUM=1,N=2。执行 Wend语句返回 While语句。再判断N <= 3 关系表达式成立,则执行循 环体语句,使 SUM=3,N=3。然后,第 3 次执行 While语句,判断 N <= 3关系表达式成立,则执行循环体 语句,使 SUM=6,N=4。接着第 4 次执行While语句,判断 N <= 3 关系表达式不成立,则执行 Wend语句 下边的语句 Print "SUM="  SUM。程序运行结果为:SUM=6 。

如果将 N <= 3 关系表达式改为 N <= 100,即可求 1+2+……+100 的值。 【举例 10】程序内容如下。 Private Sub Form_Activate() Dim N As Integer N = 10:A=1:B=2:C=3 While N >4 

C=A:A=B:B=C Print A,B,C N = N ­ 3 Wend 

Print "N=" N End Sub 

第 1 次执行While N>4 语句时,判断N>4关系表达式成立,执行循环体语句。语句 C=A:A=B:B=C 的 作用是将 A、B 的值互换,输出 A、B、C 的值分别为 2、1、1;N = N – 3语句使变量 N变为 7。第 2次 执行 While N >4 语句时,判断N>4关系表达式成立,执行循环体语句,输出 A、B、C 的值分别为 1、2、 2;N = N – 3 语句使变量N 变为4

。第 3次执行While N >4 语句时,判断 N>4关系表达式不成立,执行 Wend语句下边的语句 Print“N=” N,输出 N=4。程序运行后的结果如图 4­3­6所示。

图4­3­6 实例10程序运行结果

【举例 11】求 2!+4!+……+10!的值 设计的程序如下。 

Private Sub Form_Activate() 

Dim I, J As Integer, N, SUM As Long 

MUM = 0: I = 2                   '给变量赋初值 

FontSize = 10                    '设置窗体中文字的大小 ForeColor = RGB(0, 0, 255) '设置窗体中文字的颜色为蓝色 While I <= 10                    '产生 2到 10 的偶数 J = 1: N = 1 '给变量赋初值 While J <= I '求偶数的阶乘 N = N * J                    '进行累积运算 J = J + 1                    '变量 I自动加 1 Wend 

SUM = SUM + N '进行阶乘的累加 I = I + 2                      '变量J 自动加 2 Wend 

Print "2!+4!+……+10!="  SUM    '显示计算结果

程序运行结果如图 4­3­7

所示。

图4­3­7 实例11程序运行结果

4.3.4 Do Loop 语句 

1.当型 Do Loop语句 【格式】 

Do [While|Unitl 条件] [循环体语句序列] Loop 

【功能】选关键字 While,当条件成立(其值为 True、非零的数或非零的数字符串)时,重复执行循 环体语句序列的语句;当条件表达式不成立(其值为False、0 或”0”)时,转去执行关键字 Loop后面的语 句。

选关键字 Unitl,当条件表达式不成立(其值为 False、0 或"0")时,重复执行循环体语句序列的语句; 当条件成立(其值为 True、非零的数或非零的数字符串)时,转去执行关键字 Loop后面的语句。

当型 Do Loop语句是先判断条件,再执行循环体语句序列中的语句。

【说明】条件实际上是一个表达式,对它的要求与对If Then Else语句的要求一样。经常使用的是关 系和逻辑表达式。

在循环体语句序列中可以使用[Exit Do]语句,它的作用是退出该循环体,它一般用于循环体语句序列 中的判断语句。 

2.直到型 Do Loop语句 【格式】 Do 

[循环体语句序列] Loop [While|Unitl 条件] 

【功能】与当型 Do Loop语句的功能基本一样,只是直到型 Do Loop语句是先执行循环体语句序列中 的语句,再判断条件。

本文来源:https://www.bwwdw.com/article/x5z4.html

Top