第四章 三种基本结构程序设计本章内容及要求:
1.了解算法概念及算法的表示,掌握用 N—S流程序表示算法
2,熟练掌握赋值语句,End语句和注释语句等语句及输入 /输出消息框函数的使用;
3,熟练掌握行 if语句、块 if结构,Select Case情况选择结构有使用,掌握选择的嵌套结构;
4,熟练掌握实现循环结构的 For/Next循环结构及 Exit
For语句,Do/Loop循环结构的使用,掌握多重循环。
重点,选择结构及循环结构的实现及其应用难点,选择的嵌套及多重循环结构
4.1 算法及算法的表示
4,1.1 算法概述什么是算法:
广义地讲:算法是为完成一项任务所应当遵循的一步一步的规则的、精确的、无歧义的描述,它的总步数是有限的。
狭义地讲:算法是解决一个问题采取的方法和步骤的描述 。
下面通过两个简单的例子加以说明:
例 4.1 输入三个数,然后输出其中最大的数。
将三个数依次输入到变量A,B,C中,设变量 MAX存放最大数。其算法如下:
例 4.2 输入 10个数,打印输出其中最大的数。
算法设计如下:
( 1) 输入 1个数,存入变量 A中,将记录数据个数的变量 N赋值为 1,即 N=1
( 2) 将 A存入表示最大值的变量 Max中,即 Max=A
( 3) 再输入一个值给 A,如果 A>Max 则 Max=A,否则 Max
不变
( 4) 让记录数据个数的变量增加 1,即 N=N+1
( 5) 判断 N是否小于 10,若成立则转到第 ( 3) 步执行,否则转到第 ( 6) 步 。
( 6) 打印输出 max
1) 输入 A,B,C。
2) A与 B中大的一个放入 MAX中。
3) 把 C与 MAX中大的一个放入 MAX中。
4) 输出 MAX,MAX即为最大数。
4.1.2 算法的特性
1 有穷性
2 确定性
3 有 0个或多个输入
4 有一个或多个输出
5 有效性
4.1.3 算法的表示一、自然语言与伪代码表示算法自然语言:就是指人们日常使用的语言,可以是汉语、
英语或其它语言。
伪代码:是用介于自然语言和计算机语言之间的文字和符号(包括数学符号)来描述算法。
例如:例 4.1可用如下的伪代码表示
Begin( 算法开始 )
输入 A,B,C
IF A>B 则
A→Max
否则 B→Max
IF C>Max 则 C→Max
Print Max
End (算法结束 )
二 用 传统 流程图表示算法处理框起止框 I/O框 判断框流程线 连接点
1、传统流程图中的基本符号
2、三种基本结构的表示
( 1)顺序结构条件语句 1 语句 2
Y N语句 1
语句 2
( 2)选择结构条件
( a )
条件语句组
( 3)循环结构
a) 当型循环 b) 直到循环
Y
N
Y
N
( b )
语句组三种基本结构的特点:
( 1)只有一个入口
( 2)只有一个出口
( 3)不存在死语句
( 4)不存在死循环例,例 4.2输入 10个数,打印输出其中的最大的数的流程图从 10个数中选出最大的数的流程图
N<10
Max =AN=1
A>Max
Max =A
输入 A
开始再输入给 A
N=N+1 打印 Max
结束
YN
N
Y
4.1.4 用 N—S流程图表示算法将全部算法写在一个矩形框内,在矩形内还可包含其它从属于它的框三种基本结构的 N—S图表示:
语句 A
语句 B
语句 A 语句 B
条件Y N
1、顺序结构 2、选择结构语句组
( 3)循环结构
a) 当型循环 b) 直到循环当条件成立语句组直到当条件成立例,画出从 10个数中选出最大的数的 N—S 流程图
( a ) ( b )
传统流程图
N<10
Max =AN=1
A>Max
Max =A
输入 A
开始再输入给 A
N=N+1 打印 Max
结束
YN
N
Y
输入 A
当 N<=10
Max =A
N=N+1
打印 Max
输入 A
N—S流程图
A>=Max YN
Private Sub Form_Click()
Dim a%,max%,i%
max = a
For i = 1 To 10
a = Val(InputBox("A=?"))
If a > max Then max = a
Next i
Print "Max="; max
End Sub
最后需要说明的是:上面介绍的算法表示是给人看的,
即是为帮助程序开发人员阅读、编写程序而设计的一种辅助工具,程序则必须符一计算机语言的语法规则。
下面是例 4.2的计算机 程序,即为 用计算机语言表示算法:
4.1.6 结构化程序设计方法(补充)
(一)、用计算机解决问题的过程提出、分析问题确定算法模型设计算法编写程序调试程序分析输出结果正确合理结束
(二)、结构化程序设计思想自顶向下、逐步细化、模块化自顶向下,先从全局、整体设计逐步细化,将一个问题分解成几个较小的问题解决模块化,将一个大任务分解成若干个较小的部分,
每 个部分承担一定功能,称为“功能模块”
例:给 100个整数,打印输出其中的素数
S1
N—S流程图输入 100个数存入
X1,x2,……x 100
打印 x1…..x 100中不等于 0的数让 x1,
x2,……x 100中的非素变为 0
S3
S2
输入 xi
当 i<=100
i=i+1
i=1
xi≠0
当 i<=100
i=i+1
i=1
YN
打印 xi
S1
N—S流程图输入 100个数存入
X1,x2,……x 100
打印 x1…..x 100中不等于 0的数让 x1,……x 100中的非素变为 0
S3
S2
判断 xi是否是素数,
若不是则将 xi=0
当 i<=100
i=i+1
i=1
S21
r=0
r<=将 x1除 j的余
j=j+1
j=2
YN
xi=0
直到 j>xi/2
输入 100个数存入
X1,x2,……x 100
打印 x1…..x 100中不等于 0的数让 x1,……x 100中的非素变为 0
细化后的流程图输入 xi
当 i<=100
i=i+1
i=1
当 i<=100
i=1
r=0
r =xi%j
j=j+1
j=2
YN x
i=0
直到 j>xi/2
i=i+1
xi≠0
当 i<=100
i=1
YN
打印 xi
i=i+1
4.2 顺序结构
4.2.1 赋值语句形式,变量名=表达式对象,属性=表达式功能,将表达式的值赋值给变量名或指定对象的属性。
一般用于给变量赋值或对控件设定属性值,
例,sRate!=0.1
Text1.Text = "欢迎使用 Visual Basic 6.0”
说明:
1 执行过程:先求表达式的值,然后将值赋值给左边的变量。
2 右边的表达式可以是变量、常量、函数调用等特殊的表达式。
3 不要将“=”理解为数学上的等号:
A=A+1 是表示将 A单元的值加1后以放回到 A单元。
执行过程如右图
4.赋值符号,=”左边一定只能是变量名或对象的属性引用,不能是常量、符号常量、表达式。
下面的赋值语句都是错的:
5=X ' 左边是常量 。
Abs(X)=20 ' 左边是函数调用,即是表达式。
5,赋值符号,=”两边的数据类型一般要求应一致。
4.2.2 数据的输出 ——Print方法
Print方法的一般格式:
[对象名,]Print[ <表达式表 >] [{,|; }]
说明:
[对象名,] 可以是窗体名、图片框名,也可是立即窗口,Debug”。若省略对象,则表示在当前窗体上输出。在
2.3节窗体对象的方法中对 Print方法做了详细的介绍。用
Print方法在图片框和立即窗口对象中输出与在窗体对象中输出完全相同。
缺省值标题题提示
4.2.3 用户交互函数和过程
1,InputBox函数变量名 =InputBox[$](<提示信息 >[,<标题 >][,<缺省 >]
[,<x坐标 >][,<y坐标 >] )
其中,提示 提示信息,标题 标题区显示,缺省 输入区缺省值有 $ 返回字符类型,否则为数值类型,
例如,要在屏幕上显示如下的对话框,
例如,有下列语句如下,
Dim strName As String * 40,strS1 As String * 40
strS1 =,请输入你的姓名” + Chr(13) + Chr(10) +,然后单击确定”
strName= InputBox$(strS1,“输入框”,,100,100)
当键盘输入“王晓明” 后,变量 strName获得键盘输入的值,
缺省值标题题提示
2,MsgBox函数和 MsgBox过程函数形式,变量 [%] = MsgBox(提示 [,按钮 [+图标 ]+
[缺省按钮 ]+[模式 ]][,标题 ])
过程形式,MsgBox 提示 [,按钮 [+图标 ] +[缺省按钮 ]+
[模式 ]][,标题 ]
图标标题提示信息命令按钮说明:
1,标题”和“提示”与 InputBox函数中对应的参数相同;
2,按钮+图标 +缺省按钮 +模式”是整型表达式,决定信息框按钮数目、出现在信息框上的图标类型及操作模式 (见表 4.1)
3 若程序中需要返回值,则使用函数,否则可调用过程。
按钮及图标值如下,根据用户所选按钮,函数返回 1—7的整数值,其含义如下表,(表 4.2)
4.2.4 注释语句其语法格式为:
Rem <注释内容 >
或 ' <注释内容 >
说明:
1,<注释内容 > 指要包括的任何注释文本 。 在 Rem关键字和注释内容之间要加一个空格 。 可以用一个英文单引号,'”
来代替 Rem关键字 。
2,如果在其他语句行后面使用 Rem关键字,必需用冒号 (,)
与语句隔开 。 若用英文单引号,'”,则在其他语句行后面不必加冒号 (,)。
例如:
Const PI=3.1415925 ' 符号常量 PI
S=PI*r*r,Rem计算圆的面积
4.3 选择结构
1,If…Then 语句 (单分支结构 )
If <表达式 > Then
语句块
End If
或 If <表达式 > Then <语句 >
t
yx
图 1 - 3 - 8 两 个 数 交 换过 程例,已知两个数 x和 y,比较它们的大小,
使得 x大于 y.
If x<y Then
t=x,x=y,y=t
End If
或 If x<y Then t=x,x=y,y=t
2,If…Then…Else 语句 (双分支结构 )
If <表达式 > Then
<语句块 1>
Else
<语句块 2>
End If
If <表达式 > Then <语句 1> Else <语句 2>
例如:输出 x,y两个中值较大的一个值 。
IF X>Y Then
Print X
Else
Print Y
End If
也可以写成如下的单行形式:
IF X>Y Then Print X Else Print Y
双分支选择结构执行过程例 4.1 设计一个求解一元二次方程的程序
3,If…Then…ElseIf 语句 (多分支结构 )
形式,
If <表达式 1> Then
<语句块 1>
Else If <表达式 2>Then
<语句块 2>
…
[Else
语句块 n+1 ]
End If
例:输入一学生成绩,评定其等级。方法是,90~100分为
“优秀”,80~89分为“良好”,70~79分为“中等”,
60~69分为“及格”,60分以为“不合格”
执行过程使用 IF语句实现的程序段如下:
If x>=90 then
Print "优秀 "
ElseIf x>=80 Then
Print "良好 "
ElseIf x>=70 Then
Print "中等 "
ElseIf x>=60 Then
Print "及格 "
Else
Print "不及格 "
End If
4.3.2 Select Case语句(情况语句)
形式:
Select Case 变量或表达式
Case 表达式列表 1
语句块 1
Case 表达式列表 2
语句块 2
…
[Case Else
语句块 n+1]
End Select
<表达式列表 >:与 <变量或表达式 >同类型的下面四种形式之一:
表达式 例,A +5
一组枚举表达式 (用逗号分隔 ) 2,4,6,8
表达式 1 To 表达式 2 60 to 100
Is 关系运算符表达式 Is < 60
数值型或字符串表达式例如:将例 4.3 使用 select case….,语句来实现的程序段如下:
Select Case x
Case 90 to 100
Print "优秀 "
Case 80 to 89
Print "良好 "
Case 70 to 79
Print "中等 "
Case 60 to 69
Print "及格 "
Case Else
Print "不及格 "
End Select
补 充例题,设计一个由计算机来当小学低年级学生算术老师的
VB应用程序,要求给出一系列的两个 1~10数的四则运算的算术题,学生输入该题的答案,计算机根据学生的答案判断正确与否,并给出成绩,单击结束命令按钮,退出应用程序。
分析,产生 1~ 10操作数,可通过 Int(10* Rnd + 1) 实现
4.3.3 选择结构的嵌套在 IF语句的 Then分支和 Else分支中可以完整地嵌套另一 IF语句或 Select Case语句,同样 Select Case语句每一个 Case分支中都可嵌套另一 IF语句或另一 Select Case语句。下面是两种正确的嵌套形式:
( 1) IF <条件 1> Then…,.
Then <条件 2> Then……
Else
…,.End If
…,Else
…,
IF <条件 3> Then…,.
Else…,.
End If
…,.End IF
( 2) IF <条件 1> Then
…,.
Select Case …
Case ……
IF <条件 1> Then
……
Else
…,.
End If
……
Case…,
…,.
End Select
…,
End IF
注意:只要在一个分支内嵌套,不出现交叉,满足结构规则,其嵌套的形式将有很多种,嵌套层次也可以任意多 。
对于多层 IF嵌套结构中,要特别注意 IF与 Else的配对关系,
一个 Else必须与 IF配结,配对的原则是:在写含有多层嵌套的程序时,建议使用缩进对齐方式,这样容易阅读和维护 。
例 4.4 设计一个用户身份验证程序,运行界面如下图所示。
4.4 循环结构
1,For循环语句 (一般用于循环次数已知 )
形式
For 循环变量=初值 to 终值 [Step 步长 ]
语句块
[Exit For]
语句块
Next 循环变量循环变量在终值内图 1 - 3 - 1 3 F o r 循环语句语句块
E x it F o r
语句块循环变量加步长
T
F
循环变量得初值循环体
>0 初值 <终值 =1 时,可省略
<0 初值 >终值
=0 死循环步长循环次数
)1(步长 初值终值I n t
例,For I=2 To 13 Step 3
Print I,
Next I
Print,I=“,I
4)1( 3 213I n t
循环执行次数输出 I的值分别为,
2 5 8 11
出了循环输出为,I=14
例 4.5 编程计算,S=1+2+3+… +100
Dim S%,I%
S=0 ' 累加前变量 S为 0
For I=1 to 100
S=S+I
Next I
Print " S=",S
当 N<=100
N=N+1
打印 S
S=0,N=1
S=S+N
例 4-5的算法流程图形式 1:(当型循环)
Do { While|Until }<条件 >
语句块
[Exit Do]
语句块
Loop
条件
F
T
F
T
E x it D o
语句块语句块
E x it D o
语句块语句块表达式列表 1
图 1 - 3 - 1 6 D o? L o o p W h ile
D o W h ile? L o o p 执行过程
4.4.2 Do…Loop 循环语句形式 2,(直到循环)
Do
语句块
[Exit Do]
语句块
Loop { While|Until} <条件 >
表达式列表 1
F
T
F
T
E x it D o
语句块语句块
E x it D o
语句块语句块条件
D o? L o o p W h ile 的执行过程图 1 - 3 - 1 5 D o W h ile? L o o p
条 件语句块语句块
T
F
Exit Do
条 件语句块语句块
T
F
Exit Do
Do Until…Loop 执行过程 Do…Loop Until 执行过程说明:
( 1) 当使用 While<条件 >构成循环时,当条件为,真,,
则反复执行循环体,当条件为,假,,则退出循环 。
( 2) 当使用 Until <条件 >构成循环时,当条件为,假,,
则反复执行循环体,直到条件成立,即为,真,时,则退出循环 。
( 3) 在循环体内一般应有一个专门用来改变条件表达式中变量的语句,以使随着循环的执行,条件趋于不成立 ( 或成立 ),最后达到退出循环 。
( 4)语句 Exit Do的作用是退出它所在的循环结构,它只能用在 DO/Loop结构中,并且常常是同选择结构一起出现在循环结构中,用来实现当满足某一条件时提前退出循环。
4.4.3 While… Wend语句使用格式如下:
While <条件 >
<循环块 >
Wend
说明,该语句的功能与 Do While <条件 >…,Loop实现的循环完全相同 。
例:用 do…Loop 语句改写前面的例题 4.5
例 4.7 求两个整数的最大公约数、最小公倍数
Dim n%,m%,nm%,r%
m=Val(InputBox("m="))
n=Val(InputBox("n="))
nm=n*m
If m<n Then t=m,m=n,n=t
r=m mod n
Do While (r <> 0)
m=n
n=r
r= m mod n
Loop
Print "最大公约数 =",n
Print "最小公倍数 =",nm/n
算法使用转碾除法,流程图如右,
实现的程序代码如下:
4.4.4 循环的嵌套 ——多重循环结构如果在一个循环内完整地包含另一个循环结构,则称为多重循环,或循环嵌套,嵌套的层数可以根据需要而定,
嵌套一层称为二重循环,嵌套二层称为三重循环。
上面介绍的几种循环控制结构可以相互嵌套,下面是几种常见的二重嵌套形式:
( 1) For I=…,
…,.
For J=…,
…,
Next J
…,.
Next I
( 2) For I=…,
…,.
Do While/Until …,
…,
Loop
…,.
Next I
( 3) Do While…,
…,.
For J=…,
…,
Next J
…,.
Loop
( 4) Do While/Until…,
…,.
Do While/Until …,
…,
Loop
…,.
Loop
例如,打印九九乘法表,
For i = 1 To 9
For j = 1 To 9
se = i & "× " & j & "=" & i * j
Picture1.Print Tab((j - 1) * 9 + 1); se;
Next j
Picture1.Print
Next i
对于循环的嵌套,要注意以下事项:
(1) 内循环变量与外循环变量不能同名;
(2) 外循环必须完全包含内循环,不能交叉;
(3) 不能从循环体外转向循环体内,也不能从外循环转向内循环,
正 确 错 误
For ii =1 To 10
For jj=1 To 20
…
Next ii
Next jj
For ii =1 To 10
For ii=1 To 20
…
Next ii
Next ii
For ii =1 To 10
For jj=1 To 20
…
Next jj
Next ii
For ii =1 To 10
…
Next ii
For ii =1 To 10
…
Next ii
4.4.5 几种循环语句比较
F o r,,,,t o
N e x t
D o w h i l e / u n t i l,...
L o o p
do
....
L o o p Wh i l e / u n t i l,..
循环类型 当型循环 当型循环 直到循环循环控制条件循环变量大于或小于终值条件成立 / 不成立执行循环条件成立 / 不成立执行循环循环变量初值在 F O R 语句行中在 DO 之前 在 DO 之前使循环结束
F or 语句中无需专门语句必须用专门语句 必须使用专门语句使用场合循环次数容易确定循环 / 结束 控制条件易给出循环 / 结束 控制条件易给出
4.4.6 循环结构与选择结构的嵌套在循环结构中可以完整嵌套选择结构即整个选择结构都属于循环体。在选择结构中嵌套循环结构时,则要求整个循环结构必须完整地嵌套在一个分支内,一个循环结构不允许出现在两个或两个以上的分支内。
( 1) For I=……
……
IF … Then
……
End IF
……
Next I
( 6) IF … Then
……
For I=……
……
End IF
……
Next I
( 5) Select Case ……
For I=……
……
Case ……
……
Case ……
……
Next I
………
End Select
( 3) For I=……
……
IF … Then
……
Next I
……
End IF
( 2) IF … Then
……
For I=……
……
Next I
……
End IF
( 4) For I=……
……
Select Case …
Case ……
……
Case ……
……
End Select
……
Next I
×
×
×
4.5 其它控制语句
4.5.1 Goto 语句形式,Go To {标号 |行号 }
作用是无条件地转移到标号或行号指定的那行语句,
标号是一个字符序列,行号是一个数字序列。
例 3.8 求 100以内的素数判别某数 m是否为素数最简单的方法是,
对于 m从 i=2,3,…,m-1判别 m能否被 i整除,只要有一个能整除,m不是素数,否则 m是素数。
For m = 2 To 100
For i = 2 To m - 1
If (m Mod i) = 0 Then GoTo NotNextM
Next i
Print m
NotNextM:
Next m
4.5.2 Exit 语句
Exit 语句用于退出 Do...Loop,For...Next,Function或
Sub代码块。 对应的使用格式为,Exit Do,Exit For,Exit
Function,Exit Sub。分别表示退出 DO循环,For循环、函数过程、子过程。
例如:
下面的例子是使用 Exit 语句退出 For...Next 循环、
Do...Loop 循环及子过程。
Private Sub Form_Click()
Dim I%,Num%
Do ' 建立无穷循环 。
For I = 1 To 100 ' 循环 100 次 。
Num = Int(Rnd * 100) ' 生成一个 0~99的随机数 。
Select Case Num
Case 10,Exit For '退出 For...Next 循环 。
Case 50,Exit Do '退出 Do...Loop 循环 。
Case 64,Exit Sub ' 退出子过程 。
End Select
Next I
Loop
End Sub
4.5.3 End 语句形式,End
功能:结束一个程序的运行。
在 Visual Basic中还有多种形式的 End语句,用于结束一个程序块或过程 。
其形式有:
End If
End Select
End Type
End With
End Sub
End Function等它们与对应的语句配对使用 。
4.5.4 暂停语句
Stop语句用来暂停程序的执行,相当于在事件代码中设置断点。
语法格式为,Stop
说明:
1,Stop语句的主要作用是把解释程序置为中断 (Break)模式,
以便对程序进行检查和调试 。 可以在程序的任何地方放置
Stop语句,当执行 Stop语句时,系统将自动打开立即窗口 。
2,与 End语句不同 。
4.5.5 With...End With 语句形式:
With 对象名语句块
End With
说明,With 语句可以对某个对象执行一系列的语句,而不用重复指出对象的名称。
例如,要改变一个对象的多个 属性,可以在 With 控制结构中加上属性的赋值语句,这时候只是引用对象一次而不是在每个属性赋值时都要引用它。下面的例子显示了如何使用 With 语句来给同一个对象的几个属性赋值。
例如,需要对同一对象设置几个属性 。 途径之一是使用多条语句 。
Private Sub Form_Load()
Command1.Caption = "退出 (E&xit)"
Command1.Top = 500
Command1.Left = 4500
Command1.Enabled = True
End Sub
使用 With...End With 语句,上面程序的代码如下 。
Private Sub Form_Load()
With Command1
.Caption = "OK"
.Top = 500
.Left = 4500
.Enabled = True
End With
End Sub
4.6 应用程序举例
4.6.1 素数与哥德巴赫猜想例 4.9 判断一个给定的整数是否为素数。
算法思路:素数指除了能被 1和自身外,不能被其他整数整除的自然数 。 判断整数 N是不是素数的基本方法是:将 N分别除以 2,3,…,N-1,若都不能整除,
则 N为素数 。 因为 N=Sqr(N)*Sqr(N),所以,当 N能被大于等于 Sqr(N)的整数整除时,一定存在一个小于等于
Sqr(N)的整数,使 N能被它整除,因此只要判断 N能否被 2,3,…,Sqr(N)整除即可 。
算法流程图如下:
Dim N %,I%,K%
N = Val(InputBox("N=? "))
K= Int(Sqr(N))
For I = 2 To K
If N Mod I = 0 Then Exit For
Next I
If I>K Then
Print N; " 是素数 "
Else
Print N; " 不是素数 "
End If
例 4.10 编一程序验证哥德巴赫猜想:一个大于等于 6的偶数可以表示为两个素数之和。例如,6=3+3 8=3+5 10= 3+7
算法设计,设 N为大于等于 6的任一偶数,将其分解为 N1和 N2两个数,使用 N1+N2=N,分别判断
N1和 N2是否为素数,若都是,则为一组解 。 若 N1不是素数,就不必再检查 N2是否素数 。 先从 N1=3开始,直到 N1=N/2为止 。 算法流程图如图 4-29所示 。 将程序代码写到窗体的单击事件中 。
实现上面算法的程序代码如下:
Private Sub Form_Click()
Dim N%,N1%,N2%,I%,K1%,K2%
N=Val(InputBox("输入大于 6的偶数 "))
For N1 = 3 To N \ 2 Step 2
K1 = Int(Sqr(N1))
For I = 2 To K1 '判断 N1是否是素数
If N1 Mod I = 0 Then Exit For
Next I
If I > K1 Then '如果 N1为素数,将 N分解为 N1+N2
N2 = N - N1
K2 = Int(Sqr(N2))
For I = 2 To K2 '判断 N2是否是素数
If N2 Mod I = 0 Then Exit For
Next I
If I > K2 Then ' 如果 N2也为素数,则打印输出
Print N & "=" & N1 & "+" & N2
End If
End If
Next N1
End Sub
4.6.2 字符串处理例 4.11 统计文本框中英文单词的个数 。
算法设计
( 1) 从文本 ( 字符串 ) 的左边开始,取出一个字符;设逻辑量 WT表示所取字符是否是单词内的字符,初值设为
False。
( 2) 若所取字符不是,空格,,,逗号,,,分号,或
,感叹号,等单词的分隔符,再判断 WT是否为 True,若
WT不为 True,则表示新单词的开始,让单词数 Nw=Nw+1;
让 WT=True。
( 3) 若所取字符是,空格,,,逗号,,,分号,或,感叹号,等单词的分隔符,则表示字符不是单词内字符,让
WT=False。
( 4)再依次取下一个字符,重复( 2)( 3)步直到文本结束。
例 4.12 字符的加密和解密加密算法是:
将每个字母 C加 ( 或减 ) 一序数 K,即用它后的第 K个字母代替,变换式公式,c=chr(Asc(c)+k)
例如:设序数 k为 5,这时 "A"→ "F","a"? "f","B"?
"G"…
当加序数后的字母超过 "Z"或 "z"则 c=Chr(Asc(c)+k -26)
例如,You are good? Dtz fwj ltti
解密算法,解密为加密的逆过程将每个字母 C减 ( 或加 ) 一序数 K,即 c=chr(Asc(c)-k),
例如:序数 k为 5,这时 "Z"?"U","z"?"u","Y"?"T"…
当加序数后的字母小于 "A"或 "a"则 c=Chr(Asc(c)-k +26)
迭代法在数学上也称“递推法”,凡是由一给定的初值,通过某一算法(公式)可求得新值,再由新值按照同样的算法又可求得另一个新值,这样经过有限次即可求得其解。
4.6.3 迭代法例 4.13 用迭代法求某个数的平方根。
已知求平方根的迭代公式为:
)(
2
1
0
01 x
axx
算法思想如下:
设平方根的解为 x,可假定一个初值 x0=a/2(估计值 ),
根据迭代公式得到一个新的值 x1,这个新值 x1比初值 x0更接近要求的值 x;再以新值作为初值,即,x1→ x0,重新按原来的方法求 x1,重复这一过程直到 |x1-x0|<ε(某一给定的精度 )。此时可将 x1作为问题的解。
程序代码见教材 Pg.103
1.了解算法概念及算法的表示,掌握用 N—S流程序表示算法
2,熟练掌握赋值语句,End语句和注释语句等语句及输入 /输出消息框函数的使用;
3,熟练掌握行 if语句、块 if结构,Select Case情况选择结构有使用,掌握选择的嵌套结构;
4,熟练掌握实现循环结构的 For/Next循环结构及 Exit
For语句,Do/Loop循环结构的使用,掌握多重循环。
重点,选择结构及循环结构的实现及其应用难点,选择的嵌套及多重循环结构
4.1 算法及算法的表示
4,1.1 算法概述什么是算法:
广义地讲:算法是为完成一项任务所应当遵循的一步一步的规则的、精确的、无歧义的描述,它的总步数是有限的。
狭义地讲:算法是解决一个问题采取的方法和步骤的描述 。
下面通过两个简单的例子加以说明:
例 4.1 输入三个数,然后输出其中最大的数。
将三个数依次输入到变量A,B,C中,设变量 MAX存放最大数。其算法如下:
例 4.2 输入 10个数,打印输出其中最大的数。
算法设计如下:
( 1) 输入 1个数,存入变量 A中,将记录数据个数的变量 N赋值为 1,即 N=1
( 2) 将 A存入表示最大值的变量 Max中,即 Max=A
( 3) 再输入一个值给 A,如果 A>Max 则 Max=A,否则 Max
不变
( 4) 让记录数据个数的变量增加 1,即 N=N+1
( 5) 判断 N是否小于 10,若成立则转到第 ( 3) 步执行,否则转到第 ( 6) 步 。
( 6) 打印输出 max
1) 输入 A,B,C。
2) A与 B中大的一个放入 MAX中。
3) 把 C与 MAX中大的一个放入 MAX中。
4) 输出 MAX,MAX即为最大数。
4.1.2 算法的特性
1 有穷性
2 确定性
3 有 0个或多个输入
4 有一个或多个输出
5 有效性
4.1.3 算法的表示一、自然语言与伪代码表示算法自然语言:就是指人们日常使用的语言,可以是汉语、
英语或其它语言。
伪代码:是用介于自然语言和计算机语言之间的文字和符号(包括数学符号)来描述算法。
例如:例 4.1可用如下的伪代码表示
Begin( 算法开始 )
输入 A,B,C
IF A>B 则
A→Max
否则 B→Max
IF C>Max 则 C→Max
Print Max
End (算法结束 )
二 用 传统 流程图表示算法处理框起止框 I/O框 判断框流程线 连接点
1、传统流程图中的基本符号
2、三种基本结构的表示
( 1)顺序结构条件语句 1 语句 2
Y N语句 1
语句 2
( 2)选择结构条件
( a )
条件语句组
( 3)循环结构
a) 当型循环 b) 直到循环
Y
N
Y
N
( b )
语句组三种基本结构的特点:
( 1)只有一个入口
( 2)只有一个出口
( 3)不存在死语句
( 4)不存在死循环例,例 4.2输入 10个数,打印输出其中的最大的数的流程图从 10个数中选出最大的数的流程图
N<10
Max =AN=1
A>Max
Max =A
输入 A
开始再输入给 A
N=N+1 打印 Max
结束
YN
N
Y
4.1.4 用 N—S流程图表示算法将全部算法写在一个矩形框内,在矩形内还可包含其它从属于它的框三种基本结构的 N—S图表示:
语句 A
语句 B
语句 A 语句 B
条件Y N
1、顺序结构 2、选择结构语句组
( 3)循环结构
a) 当型循环 b) 直到循环当条件成立语句组直到当条件成立例,画出从 10个数中选出最大的数的 N—S 流程图
( a ) ( b )
传统流程图
N<10
Max =AN=1
A>Max
Max =A
输入 A
开始再输入给 A
N=N+1 打印 Max
结束
YN
N
Y
输入 A
当 N<=10
Max =A
N=N+1
打印 Max
输入 A
N—S流程图
A>=Max YN
Private Sub Form_Click()
Dim a%,max%,i%
max = a
For i = 1 To 10
a = Val(InputBox("A=?"))
If a > max Then max = a
Next i
Print "Max="; max
End Sub
最后需要说明的是:上面介绍的算法表示是给人看的,
即是为帮助程序开发人员阅读、编写程序而设计的一种辅助工具,程序则必须符一计算机语言的语法规则。
下面是例 4.2的计算机 程序,即为 用计算机语言表示算法:
4.1.6 结构化程序设计方法(补充)
(一)、用计算机解决问题的过程提出、分析问题确定算法模型设计算法编写程序调试程序分析输出结果正确合理结束
(二)、结构化程序设计思想自顶向下、逐步细化、模块化自顶向下,先从全局、整体设计逐步细化,将一个问题分解成几个较小的问题解决模块化,将一个大任务分解成若干个较小的部分,
每 个部分承担一定功能,称为“功能模块”
例:给 100个整数,打印输出其中的素数
S1
N—S流程图输入 100个数存入
X1,x2,……x 100
打印 x1…..x 100中不等于 0的数让 x1,
x2,……x 100中的非素变为 0
S3
S2
输入 xi
当 i<=100
i=i+1
i=1
xi≠0
当 i<=100
i=i+1
i=1
YN
打印 xi
S1
N—S流程图输入 100个数存入
X1,x2,……x 100
打印 x1…..x 100中不等于 0的数让 x1,……x 100中的非素变为 0
S3
S2
判断 xi是否是素数,
若不是则将 xi=0
当 i<=100
i=i+1
i=1
S21
r=0
r<=将 x1除 j的余
j=j+1
j=2
YN
xi=0
直到 j>xi/2
输入 100个数存入
X1,x2,……x 100
打印 x1…..x 100中不等于 0的数让 x1,……x 100中的非素变为 0
细化后的流程图输入 xi
当 i<=100
i=i+1
i=1
当 i<=100
i=1
r=0
r =xi%j
j=j+1
j=2
YN x
i=0
直到 j>xi/2
i=i+1
xi≠0
当 i<=100
i=1
YN
打印 xi
i=i+1
4.2 顺序结构
4.2.1 赋值语句形式,变量名=表达式对象,属性=表达式功能,将表达式的值赋值给变量名或指定对象的属性。
一般用于给变量赋值或对控件设定属性值,
例,sRate!=0.1
Text1.Text = "欢迎使用 Visual Basic 6.0”
说明:
1 执行过程:先求表达式的值,然后将值赋值给左边的变量。
2 右边的表达式可以是变量、常量、函数调用等特殊的表达式。
3 不要将“=”理解为数学上的等号:
A=A+1 是表示将 A单元的值加1后以放回到 A单元。
执行过程如右图
4.赋值符号,=”左边一定只能是变量名或对象的属性引用,不能是常量、符号常量、表达式。
下面的赋值语句都是错的:
5=X ' 左边是常量 。
Abs(X)=20 ' 左边是函数调用,即是表达式。
5,赋值符号,=”两边的数据类型一般要求应一致。
4.2.2 数据的输出 ——Print方法
Print方法的一般格式:
[对象名,]Print[ <表达式表 >] [{,|; }]
说明:
[对象名,] 可以是窗体名、图片框名,也可是立即窗口,Debug”。若省略对象,则表示在当前窗体上输出。在
2.3节窗体对象的方法中对 Print方法做了详细的介绍。用
Print方法在图片框和立即窗口对象中输出与在窗体对象中输出完全相同。
缺省值标题题提示
4.2.3 用户交互函数和过程
1,InputBox函数变量名 =InputBox[$](<提示信息 >[,<标题 >][,<缺省 >]
[,<x坐标 >][,<y坐标 >] )
其中,提示 提示信息,标题 标题区显示,缺省 输入区缺省值有 $ 返回字符类型,否则为数值类型,
例如,要在屏幕上显示如下的对话框,
例如,有下列语句如下,
Dim strName As String * 40,strS1 As String * 40
strS1 =,请输入你的姓名” + Chr(13) + Chr(10) +,然后单击确定”
strName= InputBox$(strS1,“输入框”,,100,100)
当键盘输入“王晓明” 后,变量 strName获得键盘输入的值,
缺省值标题题提示
2,MsgBox函数和 MsgBox过程函数形式,变量 [%] = MsgBox(提示 [,按钮 [+图标 ]+
[缺省按钮 ]+[模式 ]][,标题 ])
过程形式,MsgBox 提示 [,按钮 [+图标 ] +[缺省按钮 ]+
[模式 ]][,标题 ]
图标标题提示信息命令按钮说明:
1,标题”和“提示”与 InputBox函数中对应的参数相同;
2,按钮+图标 +缺省按钮 +模式”是整型表达式,决定信息框按钮数目、出现在信息框上的图标类型及操作模式 (见表 4.1)
3 若程序中需要返回值,则使用函数,否则可调用过程。
按钮及图标值如下,根据用户所选按钮,函数返回 1—7的整数值,其含义如下表,(表 4.2)
4.2.4 注释语句其语法格式为:
Rem <注释内容 >
或 ' <注释内容 >
说明:
1,<注释内容 > 指要包括的任何注释文本 。 在 Rem关键字和注释内容之间要加一个空格 。 可以用一个英文单引号,'”
来代替 Rem关键字 。
2,如果在其他语句行后面使用 Rem关键字,必需用冒号 (,)
与语句隔开 。 若用英文单引号,'”,则在其他语句行后面不必加冒号 (,)。
例如:
Const PI=3.1415925 ' 符号常量 PI
S=PI*r*r,Rem计算圆的面积
4.3 选择结构
1,If…Then 语句 (单分支结构 )
If <表达式 > Then
语句块
End If
或 If <表达式 > Then <语句 >
t
yx
图 1 - 3 - 8 两 个 数 交 换过 程例,已知两个数 x和 y,比较它们的大小,
使得 x大于 y.
If x<y Then
t=x,x=y,y=t
End If
或 If x<y Then t=x,x=y,y=t
2,If…Then…Else 语句 (双分支结构 )
If <表达式 > Then
<语句块 1>
Else
<语句块 2>
End If
If <表达式 > Then <语句 1> Else <语句 2>
例如:输出 x,y两个中值较大的一个值 。
IF X>Y Then
Print X
Else
Print Y
End If
也可以写成如下的单行形式:
IF X>Y Then Print X Else Print Y
双分支选择结构执行过程例 4.1 设计一个求解一元二次方程的程序
3,If…Then…ElseIf 语句 (多分支结构 )
形式,
If <表达式 1> Then
<语句块 1>
Else If <表达式 2>Then
<语句块 2>
…
[Else
语句块 n+1 ]
End If
例:输入一学生成绩,评定其等级。方法是,90~100分为
“优秀”,80~89分为“良好”,70~79分为“中等”,
60~69分为“及格”,60分以为“不合格”
执行过程使用 IF语句实现的程序段如下:
If x>=90 then
Print "优秀 "
ElseIf x>=80 Then
Print "良好 "
ElseIf x>=70 Then
Print "中等 "
ElseIf x>=60 Then
Print "及格 "
Else
Print "不及格 "
End If
4.3.2 Select Case语句(情况语句)
形式:
Select Case 变量或表达式
Case 表达式列表 1
语句块 1
Case 表达式列表 2
语句块 2
…
[Case Else
语句块 n+1]
End Select
<表达式列表 >:与 <变量或表达式 >同类型的下面四种形式之一:
表达式 例,A +5
一组枚举表达式 (用逗号分隔 ) 2,4,6,8
表达式 1 To 表达式 2 60 to 100
Is 关系运算符表达式 Is < 60
数值型或字符串表达式例如:将例 4.3 使用 select case….,语句来实现的程序段如下:
Select Case x
Case 90 to 100
Print "优秀 "
Case 80 to 89
Print "良好 "
Case 70 to 79
Print "中等 "
Case 60 to 69
Print "及格 "
Case Else
Print "不及格 "
End Select
补 充例题,设计一个由计算机来当小学低年级学生算术老师的
VB应用程序,要求给出一系列的两个 1~10数的四则运算的算术题,学生输入该题的答案,计算机根据学生的答案判断正确与否,并给出成绩,单击结束命令按钮,退出应用程序。
分析,产生 1~ 10操作数,可通过 Int(10* Rnd + 1) 实现
4.3.3 选择结构的嵌套在 IF语句的 Then分支和 Else分支中可以完整地嵌套另一 IF语句或 Select Case语句,同样 Select Case语句每一个 Case分支中都可嵌套另一 IF语句或另一 Select Case语句。下面是两种正确的嵌套形式:
( 1) IF <条件 1> Then…,.
Then <条件 2> Then……
Else
…,.End If
…,Else
…,
IF <条件 3> Then…,.
Else…,.
End If
…,.End IF
( 2) IF <条件 1> Then
…,.
Select Case …
Case ……
IF <条件 1> Then
……
Else
…,.
End If
……
Case…,
…,.
End Select
…,
End IF
注意:只要在一个分支内嵌套,不出现交叉,满足结构规则,其嵌套的形式将有很多种,嵌套层次也可以任意多 。
对于多层 IF嵌套结构中,要特别注意 IF与 Else的配对关系,
一个 Else必须与 IF配结,配对的原则是:在写含有多层嵌套的程序时,建议使用缩进对齐方式,这样容易阅读和维护 。
例 4.4 设计一个用户身份验证程序,运行界面如下图所示。
4.4 循环结构
1,For循环语句 (一般用于循环次数已知 )
形式
For 循环变量=初值 to 终值 [Step 步长 ]
语句块
[Exit For]
语句块
Next 循环变量循环变量在终值内图 1 - 3 - 1 3 F o r 循环语句语句块
E x it F o r
语句块循环变量加步长
T
F
循环变量得初值循环体
>0 初值 <终值 =1 时,可省略
<0 初值 >终值
=0 死循环步长循环次数
)1(步长 初值终值I n t
例,For I=2 To 13 Step 3
Print I,
Next I
Print,I=“,I
4)1( 3 213I n t
循环执行次数输出 I的值分别为,
2 5 8 11
出了循环输出为,I=14
例 4.5 编程计算,S=1+2+3+… +100
Dim S%,I%
S=0 ' 累加前变量 S为 0
For I=1 to 100
S=S+I
Next I
Print " S=",S
当 N<=100
N=N+1
打印 S
S=0,N=1
S=S+N
例 4-5的算法流程图形式 1:(当型循环)
Do { While|Until }<条件 >
语句块
[Exit Do]
语句块
Loop
条件
F
T
F
T
E x it D o
语句块语句块
E x it D o
语句块语句块表达式列表 1
图 1 - 3 - 1 6 D o? L o o p W h ile
D o W h ile? L o o p 执行过程
4.4.2 Do…Loop 循环语句形式 2,(直到循环)
Do
语句块
[Exit Do]
语句块
Loop { While|Until} <条件 >
表达式列表 1
F
T
F
T
E x it D o
语句块语句块
E x it D o
语句块语句块条件
D o? L o o p W h ile 的执行过程图 1 - 3 - 1 5 D o W h ile? L o o p
条 件语句块语句块
T
F
Exit Do
条 件语句块语句块
T
F
Exit Do
Do Until…Loop 执行过程 Do…Loop Until 执行过程说明:
( 1) 当使用 While<条件 >构成循环时,当条件为,真,,
则反复执行循环体,当条件为,假,,则退出循环 。
( 2) 当使用 Until <条件 >构成循环时,当条件为,假,,
则反复执行循环体,直到条件成立,即为,真,时,则退出循环 。
( 3) 在循环体内一般应有一个专门用来改变条件表达式中变量的语句,以使随着循环的执行,条件趋于不成立 ( 或成立 ),最后达到退出循环 。
( 4)语句 Exit Do的作用是退出它所在的循环结构,它只能用在 DO/Loop结构中,并且常常是同选择结构一起出现在循环结构中,用来实现当满足某一条件时提前退出循环。
4.4.3 While… Wend语句使用格式如下:
While <条件 >
<循环块 >
Wend
说明,该语句的功能与 Do While <条件 >…,Loop实现的循环完全相同 。
例:用 do…Loop 语句改写前面的例题 4.5
例 4.7 求两个整数的最大公约数、最小公倍数
Dim n%,m%,nm%,r%
m=Val(InputBox("m="))
n=Val(InputBox("n="))
nm=n*m
If m<n Then t=m,m=n,n=t
r=m mod n
Do While (r <> 0)
m=n
n=r
r= m mod n
Loop
Print "最大公约数 =",n
Print "最小公倍数 =",nm/n
算法使用转碾除法,流程图如右,
实现的程序代码如下:
4.4.4 循环的嵌套 ——多重循环结构如果在一个循环内完整地包含另一个循环结构,则称为多重循环,或循环嵌套,嵌套的层数可以根据需要而定,
嵌套一层称为二重循环,嵌套二层称为三重循环。
上面介绍的几种循环控制结构可以相互嵌套,下面是几种常见的二重嵌套形式:
( 1) For I=…,
…,.
For J=…,
…,
Next J
…,.
Next I
( 2) For I=…,
…,.
Do While/Until …,
…,
Loop
…,.
Next I
( 3) Do While…,
…,.
For J=…,
…,
Next J
…,.
Loop
( 4) Do While/Until…,
…,.
Do While/Until …,
…,
Loop
…,.
Loop
例如,打印九九乘法表,
For i = 1 To 9
For j = 1 To 9
se = i & "× " & j & "=" & i * j
Picture1.Print Tab((j - 1) * 9 + 1); se;
Next j
Picture1.Print
Next i
对于循环的嵌套,要注意以下事项:
(1) 内循环变量与外循环变量不能同名;
(2) 外循环必须完全包含内循环,不能交叉;
(3) 不能从循环体外转向循环体内,也不能从外循环转向内循环,
正 确 错 误
For ii =1 To 10
For jj=1 To 20
…
Next ii
Next jj
For ii =1 To 10
For ii=1 To 20
…
Next ii
Next ii
For ii =1 To 10
For jj=1 To 20
…
Next jj
Next ii
For ii =1 To 10
…
Next ii
For ii =1 To 10
…
Next ii
4.4.5 几种循环语句比较
F o r,,,,t o
N e x t
D o w h i l e / u n t i l,...
L o o p
do
....
L o o p Wh i l e / u n t i l,..
循环类型 当型循环 当型循环 直到循环循环控制条件循环变量大于或小于终值条件成立 / 不成立执行循环条件成立 / 不成立执行循环循环变量初值在 F O R 语句行中在 DO 之前 在 DO 之前使循环结束
F or 语句中无需专门语句必须用专门语句 必须使用专门语句使用场合循环次数容易确定循环 / 结束 控制条件易给出循环 / 结束 控制条件易给出
4.4.6 循环结构与选择结构的嵌套在循环结构中可以完整嵌套选择结构即整个选择结构都属于循环体。在选择结构中嵌套循环结构时,则要求整个循环结构必须完整地嵌套在一个分支内,一个循环结构不允许出现在两个或两个以上的分支内。
( 1) For I=……
……
IF … Then
……
End IF
……
Next I
( 6) IF … Then
……
For I=……
……
End IF
……
Next I
( 5) Select Case ……
For I=……
……
Case ……
……
Case ……
……
Next I
………
End Select
( 3) For I=……
……
IF … Then
……
Next I
……
End IF
( 2) IF … Then
……
For I=……
……
Next I
……
End IF
( 4) For I=……
……
Select Case …
Case ……
……
Case ……
……
End Select
……
Next I
×
×
×
4.5 其它控制语句
4.5.1 Goto 语句形式,Go To {标号 |行号 }
作用是无条件地转移到标号或行号指定的那行语句,
标号是一个字符序列,行号是一个数字序列。
例 3.8 求 100以内的素数判别某数 m是否为素数最简单的方法是,
对于 m从 i=2,3,…,m-1判别 m能否被 i整除,只要有一个能整除,m不是素数,否则 m是素数。
For m = 2 To 100
For i = 2 To m - 1
If (m Mod i) = 0 Then GoTo NotNextM
Next i
Print m
NotNextM:
Next m
4.5.2 Exit 语句
Exit 语句用于退出 Do...Loop,For...Next,Function或
Sub代码块。 对应的使用格式为,Exit Do,Exit For,Exit
Function,Exit Sub。分别表示退出 DO循环,For循环、函数过程、子过程。
例如:
下面的例子是使用 Exit 语句退出 For...Next 循环、
Do...Loop 循环及子过程。
Private Sub Form_Click()
Dim I%,Num%
Do ' 建立无穷循环 。
For I = 1 To 100 ' 循环 100 次 。
Num = Int(Rnd * 100) ' 生成一个 0~99的随机数 。
Select Case Num
Case 10,Exit For '退出 For...Next 循环 。
Case 50,Exit Do '退出 Do...Loop 循环 。
Case 64,Exit Sub ' 退出子过程 。
End Select
Next I
Loop
End Sub
4.5.3 End 语句形式,End
功能:结束一个程序的运行。
在 Visual Basic中还有多种形式的 End语句,用于结束一个程序块或过程 。
其形式有:
End If
End Select
End Type
End With
End Sub
End Function等它们与对应的语句配对使用 。
4.5.4 暂停语句
Stop语句用来暂停程序的执行,相当于在事件代码中设置断点。
语法格式为,Stop
说明:
1,Stop语句的主要作用是把解释程序置为中断 (Break)模式,
以便对程序进行检查和调试 。 可以在程序的任何地方放置
Stop语句,当执行 Stop语句时,系统将自动打开立即窗口 。
2,与 End语句不同 。
4.5.5 With...End With 语句形式:
With 对象名语句块
End With
说明,With 语句可以对某个对象执行一系列的语句,而不用重复指出对象的名称。
例如,要改变一个对象的多个 属性,可以在 With 控制结构中加上属性的赋值语句,这时候只是引用对象一次而不是在每个属性赋值时都要引用它。下面的例子显示了如何使用 With 语句来给同一个对象的几个属性赋值。
例如,需要对同一对象设置几个属性 。 途径之一是使用多条语句 。
Private Sub Form_Load()
Command1.Caption = "退出 (E&xit)"
Command1.Top = 500
Command1.Left = 4500
Command1.Enabled = True
End Sub
使用 With...End With 语句,上面程序的代码如下 。
Private Sub Form_Load()
With Command1
.Caption = "OK"
.Top = 500
.Left = 4500
.Enabled = True
End With
End Sub
4.6 应用程序举例
4.6.1 素数与哥德巴赫猜想例 4.9 判断一个给定的整数是否为素数。
算法思路:素数指除了能被 1和自身外,不能被其他整数整除的自然数 。 判断整数 N是不是素数的基本方法是:将 N分别除以 2,3,…,N-1,若都不能整除,
则 N为素数 。 因为 N=Sqr(N)*Sqr(N),所以,当 N能被大于等于 Sqr(N)的整数整除时,一定存在一个小于等于
Sqr(N)的整数,使 N能被它整除,因此只要判断 N能否被 2,3,…,Sqr(N)整除即可 。
算法流程图如下:
Dim N %,I%,K%
N = Val(InputBox("N=? "))
K= Int(Sqr(N))
For I = 2 To K
If N Mod I = 0 Then Exit For
Next I
If I>K Then
Print N; " 是素数 "
Else
Print N; " 不是素数 "
End If
例 4.10 编一程序验证哥德巴赫猜想:一个大于等于 6的偶数可以表示为两个素数之和。例如,6=3+3 8=3+5 10= 3+7
算法设计,设 N为大于等于 6的任一偶数,将其分解为 N1和 N2两个数,使用 N1+N2=N,分别判断
N1和 N2是否为素数,若都是,则为一组解 。 若 N1不是素数,就不必再检查 N2是否素数 。 先从 N1=3开始,直到 N1=N/2为止 。 算法流程图如图 4-29所示 。 将程序代码写到窗体的单击事件中 。
实现上面算法的程序代码如下:
Private Sub Form_Click()
Dim N%,N1%,N2%,I%,K1%,K2%
N=Val(InputBox("输入大于 6的偶数 "))
For N1 = 3 To N \ 2 Step 2
K1 = Int(Sqr(N1))
For I = 2 To K1 '判断 N1是否是素数
If N1 Mod I = 0 Then Exit For
Next I
If I > K1 Then '如果 N1为素数,将 N分解为 N1+N2
N2 = N - N1
K2 = Int(Sqr(N2))
For I = 2 To K2 '判断 N2是否是素数
If N2 Mod I = 0 Then Exit For
Next I
If I > K2 Then ' 如果 N2也为素数,则打印输出
Print N & "=" & N1 & "+" & N2
End If
End If
Next N1
End Sub
4.6.2 字符串处理例 4.11 统计文本框中英文单词的个数 。
算法设计
( 1) 从文本 ( 字符串 ) 的左边开始,取出一个字符;设逻辑量 WT表示所取字符是否是单词内的字符,初值设为
False。
( 2) 若所取字符不是,空格,,,逗号,,,分号,或
,感叹号,等单词的分隔符,再判断 WT是否为 True,若
WT不为 True,则表示新单词的开始,让单词数 Nw=Nw+1;
让 WT=True。
( 3) 若所取字符是,空格,,,逗号,,,分号,或,感叹号,等单词的分隔符,则表示字符不是单词内字符,让
WT=False。
( 4)再依次取下一个字符,重复( 2)( 3)步直到文本结束。
例 4.12 字符的加密和解密加密算法是:
将每个字母 C加 ( 或减 ) 一序数 K,即用它后的第 K个字母代替,变换式公式,c=chr(Asc(c)+k)
例如:设序数 k为 5,这时 "A"→ "F","a"? "f","B"?
"G"…
当加序数后的字母超过 "Z"或 "z"则 c=Chr(Asc(c)+k -26)
例如,You are good? Dtz fwj ltti
解密算法,解密为加密的逆过程将每个字母 C减 ( 或加 ) 一序数 K,即 c=chr(Asc(c)-k),
例如:序数 k为 5,这时 "Z"?"U","z"?"u","Y"?"T"…
当加序数后的字母小于 "A"或 "a"则 c=Chr(Asc(c)-k +26)
迭代法在数学上也称“递推法”,凡是由一给定的初值,通过某一算法(公式)可求得新值,再由新值按照同样的算法又可求得另一个新值,这样经过有限次即可求得其解。
4.6.3 迭代法例 4.13 用迭代法求某个数的平方根。
已知求平方根的迭代公式为:
)(
2
1
0
01 x
axx
算法思想如下:
设平方根的解为 x,可假定一个初值 x0=a/2(估计值 ),
根据迭代公式得到一个新的值 x1,这个新值 x1比初值 x0更接近要求的值 x;再以新值作为初值,即,x1→ x0,重新按原来的方法求 x1,重复这一过程直到 |x1-x0|<ε(某一给定的精度 )。此时可将 x1作为问题的解。
程序代码见教材 Pg.103