《vb程序设计的3种基本结构.ppt》由会员分享,可在线阅读,更多相关《vb程序设计的3种基本结构.ppt(100页珍藏版)》请在三一办公上搜索。
1、第4章 程序设计的3种基本结构,重点:选择结构及循环结构的实现及其应用,难点:选择的嵌套及多重循环结构,本章内容及要求:1.了解算法概念及表示,掌握用NS流程图表示算法;2.熟练掌握赋值语句、输入/输出消息框函数的使用;3.熟练掌握行if语句、块if结构、Select Case情况选择结构有使用,掌握选择的嵌套结构;4.熟练掌握实现循环结构的For/Next循环结构及Exit For语句、Do/Loop循环结构的使用,掌握多重循环。,4.1.1 算法概述 什么是算法:广义地讲:算法是为完成一项任务所应当遵循的一步一步的规则的、精确的、无歧义的描述,它的总步数是有限的。狭义地讲:算法是解决一个问
2、题采取的方法和步骤的描述。下面通过两个简单的例子加以说明:,4.1 算法及算法的表示,1)输入A、B、C。2)A与B中大的一个放入MAX中。3)把C与MAX中大的一个放入MAX中。4)输出MAX,MAX即为最大数。,例4.1 输入三个数,然后输出其中最大的数。将三个数依次输入到变量、B、C中,设变量MAX存放最大数。其算法如下:,例4.1算法的描述,例4.2 输入10个数,打印输出其中最大的数。算法设计如下:(1)输入1个数,存入变量A中,将记录数据个数的变量N赋值为1,即N=1(2)将A存入表示最大值的变量Max中,即Max=A(3)再输入一个值给A,如果AMax 则 Max=A,否则Max
3、不变(4)让记录数据个数的变量增加1,即N=N+1(5)判断N是否小于10,若成立则转到第(3)步执行,否则转到第(6)步(6)打印输出max,例4.2 算法的描述2,有穷性确定性有0个或多个输入有一个或多个输出有效性,4.1.2 算法的特性,一、自然语言与伪代码表示算法自然语言:就是指人们日常使用的语言,可以是汉语、英语或其它语言。伪代码:是用介于自然语言和计算机语言之间的文字和符号(包括数学符号)来描述算法。,4.1.3 算法的表示,例如:例4.1可用如下的伪代码表示Begin(算法开始)输入 A,B,C IF AB 则 AMax 否则 BMax IF CMax 则 CMaxPrint M
4、axEnd(算法结束),伪代码示例,处理框,起止框,I/O框,判断框,流程线,连接点,1、传统流程图中的基本符号,二 用传统流程图表示算法,(1)顺序结构,(2)选择结构,2、三种基本结构的表示,a)当型循环,b)直到循环,(3)循环结构,(1)只有一个入口(2)只有一个出口(3)不存在死语句(4)不存在死循环,例:例4.2输入10个数,打印输出其中的最大的数的流程图,三种基本结构的特点,从10个数中选出最大的数的算法流程图,算法流程图示例,将全部算法写在一个矩形框内,在矩形内还可包含其它从属于它的框,4.1.4 用NS流程图表示算法,(3)循环结构,NS 流程图示例,例:从10个数中选出最大
5、的数,A=Val(InputBox(A=?)B=Val(InputBox(B=?)C=Val(InputBox(C=?)If AB then Max=AElse Max=BEnd IfIf CMax then Max=CPrint Max=;Max,下面是例4.1的计算机 程序,即为用计算机语言表示算法:,用计算机语言表示算法,(一)、用计算机解决问题的过程,提出、分析问题,确定算法模型,设计算法,编写程序,调试程序,分析输出结果,正确合理,结束,不正确,4.1.6 结构化程序设计方法(补充),自顶向下、逐步细化、模块化,自顶向下:先从全局、整体设计逐步细化:将一个问题分解成几个较小的问题解决
6、模块化:将一个大任务分解成若干个较小的部分,每 个部分承担一定功能,称为“功能模块”,例:给100个整数,打印输出其中的素数,(二)、结构化程序设计思想,S1,NS流程图,S3,S2,(三)、结构化程序设计过程示例,S1,NS流程图,S3,S2,S21,示例2,细化后的流程图,示例3,4.2 顺序结构,4.2.1 赋值语句,形式:变量名表达式 对象.属性表达式 功能:将表达式的值赋值给变量名或指定对象的属性。一般用于给变量赋值或对控件设定属性值.例:sRate!=0.1 Text1.Text 欢迎使用Visual Basic 6.0”说明:1 执行过程:先求表达式的值,然后将值赋值给左边的变量
7、。2 右边的表达式可以是变量、常量、函数调用等特殊的表达式。3 不要将“”理解为数学上的等号:A=A+1 是表示将A单元的值加后以放回到A单元。,4赋值符号“=”左边一定只能是变量名或对象的属性引用,不能是常量、符号常量、表达式。下面的赋值语句都是错的:5=X 左边是常量。Abs(X)=20 左边是函数调用,即是表达式。5.赋值符号“=”两边的数据类型一般要求应一致。说明:当表达式的类型与变量的类型不一致时,VB系统会自动地将表达式的值强制地转换成变量的类型。例:iA%=10/3 iA中的结果为3 iA%=11/3 iA中的结果为4(四舍五入)iA%=-11/3 iA中的结果为-4(四舍五入)
8、iA%=38000 出错,数据溢出。,赋值语句2,说明:当表达式是数字字符串,变量是数值类型时,系统自动地将数字字符串转换成数值再赋值;当表达式中含有非数字字符时,则出错。例:iA%=123 iA中的结果为123 iA%=123abc 错误,类型不匹配!说明:逻辑型值赋值给数值型变量;系统自动转换。例:iA%=True iA中的结果为-1 iA%=Flase iA中的结果为0说明:非字符类型值赋值给字符型变量时,系统自动转换。例:cA$=True cA中的结果为True cA$=123 cA中的结果为123 cA$=#2003/3/12#cA中的结果为03-3-12 注意:VB不能在一句语句中
9、给多个变量赋值。,Dim x%,y%:x=y=100,n=n+1,iA%=Val(“123abc”),赋值语句3,Vb数据的输出Print方法,Print方法的一般格式:对象名.Print,|;,说明:对象名.可以是窗体名、图片框名,也可是立即窗口“Debug”。若省略对象,则表示在当前窗体上输出。用Print方法在图片框和立即窗口对象中输出与在窗体对象中输出完全相同。,4.2.2 Print方法,4.2.3 用户交互函数和过程,1.InputBox函数变量名=InputBox$(,)其中:提示 提示信息,标题 标题区显示,缺省输入区缺省值。例如,要在屏幕上显示如下的对话框:,例如:有下列语句
10、如下:Dim x%x=Val(InputBox(请输入一个数,输入框,100)语句执行后打开如下对话框。,InputBox示例,2.MsgBox函数和MsgBox过程,函数形式:变量%=MsgBox(,按钮图标+缺省按钮+模式,标题)过程形式:MsgBox,按钮图标+缺省按钮+模式,标题,说明:“标题”和“提示”与InputBox函数中对应的参数相同;“按钮图标+缺省按钮+模式”是整型表达式,决定信息框按钮数目、出现在信息框上的图标类型及操作模式(见表4.1)若程序中需要返回值,则使用函数,否则可调用过程。,MsgBox参数说明,按钮及图标值如下:,MsgBox参数说明2,根据用户所选按钮,函
11、数返回17的整数值,其含义如下表:(表4.2),MsgBox函数示例,用户可根据MsgBox函数的不同返回值,实现程序的控制流程,就必需通过编写程序代码才能实现。例如下面一段程序中的MsgBox函数,显示的对话框在“是”、“否”两个按钮,默认按钮为第一个按钮“是”。i=MsgBox(发生错误,是否继续?,vbYesNo+vbQuestion,提示信息)If i=7 Then End 或写成 If i=vbNo Then End 当用户单击“否”,程序就结束,单击“是”或直接按回车键,程序则继续向下执行。,其语法格式为:Rem 或 说明:1.指要包括的任何注释文本。在Rem关键字和注释内容之间要
12、加一个空格。可以用一个英文单引号“”来代替Rem关键字。2.如果在其他语句行后面使用Rem关键字,必需用冒号(:)与语句隔开。若用英文单引号“”,则在其他语句行后面不必加冒号(:)。例如:Const PI=3.1415925 符号常量PIS=PI*r*r:Rem计算圆的面积,4.2.4 注释语句,例4.3 输入时间(小时,分和秒),然后使用输出消息框输出总计多少秒。使用文本框输入数据,使用消息框输出计算结果,程序运行界面如图3-14所示。,4.2.5 应用举例,图4-14 程序运行界面,例4.4 编一程序,求一内半径R1=10cm,外半径R2=20cm的球环的体积。要求按四舍五入保留到小数点后
13、4位。,4.2.5 顺序结构应用举例,本题所求的球环面的体积公式:,Private Sub Form_Click()Dim R1#,R2#R1,R2 表示球的内外半径 Dim Vol As Double Vol表示体积 Const PI#=3.1415926 符号常量PI代表 R1=10:R2=20 Vol=4/3*PI*(R2 3-R1 3)Vol=Fix(Vol*10000+0.5)/10000 保留小数点后4位 Print 球环的体积:V=;Vol;立方厘米End Sub,4.3 选择结构,选择结构是根据条件选择执行不同的分支语句,以完成问题的要求。在Visual Basic程序设计中,
14、使用IF语句和Select Case语句来处理选择结构。其特点是:根据所给定的条件成立(True)或不成立(False),从各实际可能的不同分支中执行某一分支的相应操作(程序块),并且任何情况下总有“无论条件多寡,必择其一;虽然条件众多,仅选其一”的特性。,4.3.1 If条件语句,1.IfThen语句(单分支结构)If Then 语句块 End If 或 If Then,说明:表达式一般为关系表达式或逻辑表达式,也可以是算术表达式。若为算术表达式,则表达式的值非零时为TRUE,零为FALSE。语句块可以是一个语句,也可以是多个语句。若在程序中采用行IF语句,则多个语句之间一定要用冒号分隔。,
15、选择结构示例,例 已知两个数x和y,比较它们的大小,并把大者赋值给x,小者赋值给y.If xy Then t=x x=y y=t End If 或 If xy Then t=x:x=y:y=t,重要的是学会两个数的交换,若上述语句次序变一下,结果如何?,?一瓶酱油、一瓶醋,例 从键盘输入两个整数x和y,输出两者中的大者。Private Sub Form_Click()Dim x%,y%,max%,mmm$x=Val(InputBox(请输入一个整数给x)y=Val(InputBox(请输入一个整数给y)max=x If max y Then max=y mmm=(x&,&y&两者中的大数是:&
16、max)MsgBox(mmm)End Sub,双分支选择结构执行过程,2.IfThenElse语句(双分支结构),If Then Else End If If Then Else,例如:输出x,y两个中值较大的一个值。IF XY Then Print X Else Print Y End If也可以写成如下的单行形式:IF XY Then Print X Else Print Y,选择结构示例2,单分支结构实现:y=cos(x)x3+3*x If x0 Then y=sin(x)+sqr(x*x+1),双分支结构实现:If x0 Then y=sin(x)+sqr(x*x+1)Else y=c
17、os(x)x3+3*x End If,选择结构示例3,例:计算分段函数,IIF函数可用来执行简单的条件判断操作,它相当于IFThen.Else结构。IIF函数的使用格式:IIF(,)说明:(1)与IF语句中的表达式相同,通常是关系表达式、逻辑表达式,也可为算术表达式。如果是算术表达式,其值按非0为True,0为False进行判断。(2)当为真时,函数返回的值,当为假时,函数返回的值。(3)、可以是任何表达式。例如:Max=IIF(XY,X,Y)它与下面语句等价:IF XY Then Max=x Else Max=Y,3.条件函数,执行过程,4.IfThenElseIf语句(多分支结构),形式:
18、If Then ElseIf Then Else 语句块 n+1 End If,使用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.6:输入一学生成绩,评定其等级。方法是:90100分为“优秀”,8089分为“良好”,7079分为“中等”,6069分为“及格”,60分以为“不合格”,选择结构例4.6,数值型或字符串表达式,4.3.2 Select Case语句,1.Sele
19、ct Case语句形式:Select Case 变量或表达式Case 表达式列表1语句块1Case 表达式列表2语句块2Case Else语句块n+1End Select,注意:Case子句后的表达式中不能出现变量.,Select Case语句说明,说明:与同类型的下面四种形式之一:(1)表达式 A+5(2)一组枚举表达式(用逗号分隔)2,4,6,8(3)表达式1 To 表达式2 60 to 100(4)Is 关系运算符表达式 Is 60,A只能是符号常量!,例如:将例4.6 使用select case.语句来实现的程序段如下:Select Case x Case 90 to 100 Prin
20、t 优秀 Case 80 to 89 Print 良好 Case 70 to 79 Print 中等 Case 60 to 69 Print 及格 Case Else Print 不及格End Select,Select Case语句示例,Choose函数使用格式:Choose(,.)说明:Choose函数根据的值来决定返回其后中的那个表达式的值。如果的值为1,则返回的值,如果的值为2,则返回的值,以此类推。若的值小于1或大于n,则函数返回Null(空)。例如:根据Nop的值,得到+、-、*,/的运算符,可由下面语句来实现。Nop=Int(Rnd*4)+1 OP=Choose(Nop,+,-,
21、*,/),2.Choose函数,Switch函数形式是:Switch(条件表达式1,条件表达式1为True时的值,条件表达式2,条件表达式2为True时的值),3.Switch函数,自左至右,只能返回一个值。,例如:根据Nop的值,得到+、-、*,/的运算符,也可由下面的语句来实现。Nop=Int(Rnd*4)+1OP=Switch(Nop=1,+,Nop=2,-,Nop=3,*,Nop=4,/),下面是两种嵌套形式:(1)IF Then.IF Then Else.End If.Else.IF Then.Else.End If.End IF,(2)IF Then.Select Case Cas
22、e IF Then Else.End If Case.End Select.End IF,4.3.3 选择结构的嵌套,注意:只要在一个分支内嵌套,不出现交叉,满足结构规则,其嵌套的形式可以任意多。一个Else必须与IF配结,配对的原则是:在写含有多层嵌套的程序时,建议使用缩进对齐方式,这样容易阅读和维护。,例4.7 设计一个用户身份验证程序,运行界面如下图所示。,设密码分别为 1234567(普通用户)、1989643(授权用户)和1687799(特许用户),按回车键表示密码输入结束。如果输入密码正确,则用MsgBox对话框显示“你的口令正确,已通过身份验证”并显示用户类型;否则显示“密码不符
23、,要重试一遍吗!”(有“是”和“否”两个按钮),当用户单击“是”则将焦点定位到文本框中、清除文本框中的内容并允许再输入一遍,如果单击“否”则退出程序。,选择结构例4.7,补充例题:闰年问题,判断某年是否为闰年的两个条件:1该年年号能被4整除,但不能被100整除;2该年年号能被4整除,同时又能被400整除。,所有年号,能被4整除,能被100整除,能被400整除,Private Sub Form_Click()Dim y%,flag As Boolean y=Val(InputBox(请输入年号)If y Mod 4=0 Then If y Mod 100=0 Then If y Mod 400=
24、0 Then flag=True Else flag=flase End If Else flag=True End If Else flag=flase End If If flag Then Print y;年是闰年!Else Print y;年不是闰年!End IfEnd Sub,Private Sub Form_Click()Dim y%,flag As Boolean y=Val(InputBox(请输入年号)flag=(y Mod 4=0)And(y Mod 100 0)flag=flag Or(y Mod 400=0)If flag Then Print y;年是闰年!Else
25、Print y;年不是闰年!End IfEnd Sub,1.For循环语句(一般用于循环次数已知)形式:For 循环变量初值 to 终值 Step 步长 语句块Exit For 语句块 Next 循环变量,4.4 循环结构,循环次数,例:For I=2 To 13 Step 3 Print I,Next I Print I=,I,循环执行次数:输出I的值分别为:2 5 8 11 出了循环输出为:I=14,Int(13-2)/3+1)=4,For循环语句示例,例4.8 编程计算:S=1+2+3+100,Dim S%,I%S=0 累加前变量S为0For I=1 to 100 S=S+INext I
26、Print S=,S,例4.8的算法流程图,For循环示例4.8,注意:在循环体内对循环控制变量可多次引用;但最好不要对其赋值,否则影响原来的循环控制规律。,Private Sub Command1_Click()j=0 For i=1 To 20 Step 2 i=i+3 j=j+1 Print 第;j;次循环i=;i Next i Print 退出循环后i=;i End Sub正常情况:i=1,3,5,7,9,11,13,15,17,19现在:i=4,9,14,19,补充例题:改变循环控制变量对循环的影响。,补充例题:通过改变循环控制变量,控制循环提前结束。,题目:打印出最小的水仙花数(一
27、个三位数,其值等于它的三个数位的值的立方之和,例如:371=33+73+13)。,Private Sub Form_Click()Dim m%,a%,b%,c%For m=100 To 999 a=m 100 c=m Mod 10 b=(m-a*100)10 If m=a3+b3+c3 Then Print m;End If Next m PrintEnd Sub,Private Sub Form_Click()Dim m%,a%,b%,c%For m=100 To 999 a=m 100 c=m Mod 10 b=(m-a*100)10 If m=a3+b3+c3 Then Print m;
28、m=1000 Exit For End If Next m PrintEnd Sub,形式1:(当型循环)Do While|Until 语句块 Exit Do 语句块 Loop,4.4.2 DoLoop循环语句,条件也可以是数值、字符串或逻辑表达式。,Do 语句块 Exit Do 语句块Loop While|Until,形式2:(直到循环),Do UntilLoop执行过程 DoLoop Until执行过程,DoLoop执行过程,(1)当使用While构成循环时,当条件为“真”,则反复执行循环体,当条件为“假”,则退出循环。(2)当使用Until 构成循环时,当条件为“假”,则反复执行循环体,
29、直到条件成立,即为“真”时,则退出循环。(3)在循环体内一般应有一个专门用来改变条件表达式中变量的语句,以使随着循环的执行,条件趋于不成立(或成立),最后达到退出循环。(4)语句Exit Do的作用是退出它所在的循环结构,它只能用在DO/Loop结构中,并且常常是同选择结构一起出现在循环结构中,用来实现当满足某一条件时提前退出循环。,DoLoop有关说明:,使用格式如下:While Wend 说明:该语句的功能与Do While.Loop实现的循环完全相同。,例:用doLoop语句改写前面的例题4.5,4.4.3 WhileWend语句,例4.10 求两个整数的最大公约数、最小公倍数,Dim
30、n%,m%,nm%,r%m=Val(InputBox(m=)n=Val(InputBox(n=)nm=n*mIf m 0)m=n n=r r=m mod nLoopPrint 最大公约数=,n Print 最小公倍数=,nm/n,算法流程图,循环结构示例4.10,辗转相减法求最大公约数当 mn时:m=m-n当 nm时:n=n-m 重复操作直到m=n时为止 m=n即为最大公约数Do While m n m n If m n Then 14 6 m=m n 8 6 Else 2 6 n=n m 2 4 End If 2 2Loop,多重循环结构 如果在一个循环内完整地包含另一个循环结构,则称为多重
31、循环,或循环嵌套,嵌套的层数可以根据需要而定,嵌套一层称为二重循环,嵌套二层称为三重循环。上面介绍的几种循环控制结构可以相互嵌套,下面是几种常见的二重嵌套形式:,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 Next j Picture1.Print Next
32、 i,例题:打印九九乘法表.,(1)内循环变量与外循环变量不能同名;(2)外循环必须完全包含内循环,不能交叉;(3)不能从循环体外转向循环体内,也不能从外循环转向内循环.下面是正确的嵌套,例4.11:将一张面值为100元的人民币等值换成100张5元、1元和0.5元的零钞,要求每种零钞不少于1张,问有哪几种组合?,循环嵌套注意事项:,For i=1 To 10 For j=1 To 20 Next i Next j,For i=1 To 10 For i=1 To 20 Next i Next i,不正确的嵌套,4.4.5 几种循环语句比较,在循环结构中可以完整嵌套选择结构即整个选择结构都属于循
33、环体。在选择结构中嵌套循环结构时,则要求整个循环结构必须完整地嵌套在一个分支内,一个循环结构不允许出现在两个或两个以上的分支内。,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 N
34、ext I,嵌套示例,(5)Select Case Case Case For I=Next I Case End Select,4.5.1 Goto 语句 形式:Go To 标号|行号 作用是无条件地转移到标号或行号指定的那行语句.标号是一个字符序列,行号是一个数字序列。例如:Lp:goto lp,4.5 其它控制语句,Exit 语句用于退出 Do.Loop、For.Next、Function或Sub代码块。对应的使用格式为:Exit Do、Exit For、Exit Function、Exit Sub。分别表示退出DO循环、For循环、函数过程、子过程。,例如:下面的例子是使用 Exit
35、语句退出 For.Next 循环、Do.Loop 循环及子过程。,4.5.2 Exit 语句,Private Sub Form_Click()Dim Num%Do While True 建立无穷循环。Num=Int(Rnd*100)生成一个099的随机数。Select Case Num Case 0 to 35:msgbox 退出 For.Next 循环 Exit For Case 36 to 70:msgbox 退出 Do.Loop循环 Exit Do Case else:Exit Sub 退出过程。End Select LoopEnd Sub,例:用Exit 语句退出 循环,形式:End
36、功能:结束一个程序的运行。在Visual Basic中还有多种形式的End语句,用于结束一个程序块或过程。其形式有:End If End Select End Type End With End Sub End Function等,它们与对应的语句配对使用。,4.5.3 End 语句,Stop语句用来暂停程序的执行,相当于在事件代码中设置断点。语法格式为:Stop说明:1.Stop语句的主要作用是把解释程序置为中断(Break)模式,以便对程序进行检查和调试。可以在程序的任何地方放置Stop语句,当执行Stop语句时,系统将自动打开立即窗口。2.与End语句不同。,4.5.4 暂停语句,形式:
37、With 对象名 语句块 End With 说明:With 语句可以对某个对象执行一系列的语句,而不用重复指出对象的名称。例如,要改变一个对象的多个属性,可以在 With 控制结构中加上属性的赋值语句,这时候只是引用对象一次而不是在每个属性赋值时都要引用它。下面的例子显示了如何使用 With 语句来给同一个对象的几个属性赋值。,4.5.5 With.End With 语句,例如,需要对同一对象设置几个属性。途径之一是使用多条语句。Private Sub Form_Load()Command1.Caption=退出(E&xit)Command1.Top=500 Command1.Left=450
38、0 Command1.Enabled=TrueEnd Sub,使用 With 语句来给多个属性赋值,使用With 语句,上面程序的代码如下。Private Sub Form_Load()With Command1.Caption=退出(E&xit).Top=500.Left=4500.Enabled=True End WithEnd Sub,此类问题都要使用循环,根据问题的要求,确定循环变量的初值、终值或结束条件及用来表示计数、和、阶乘的变量的初值。,4.6 应用程序举例 1.求累加和、连积的问题,1100的5或7的倍数的和 Sum=0 For i=1 To 100 If i Mod 5=0
39、Or i Mod 7=0 Then Sum=Sum+i End If Next i Print Sum,310的乘积 t=1 For i=3 To 10 t=t*i Next i Print t,思考:若把循环体前面置各变量初值的语句放在循环体内,程序运行时会产生什么情况?,补充例题:求N的阶乘,求N的阶乘是一个标准的递推公式:N!=N*(N-1)!(注:已知:1!=1),Private Sub Form_Click()Dim i%,f#f=1 For i=1 To 10 f=f*i Print(i f Next iEnd Sub,在若干个数中求最大值,一般先假设一个较小的数为最大值的初值,若
40、无法估计较小的值,则取第一个数为最大值的初值;然后将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值;依次逐一比较。例 随机产生10个100200之间的数,求最大值。,Private Sub Command1_Click()Max=100 For i=1 To 10 x=Int(Rnd*101+100)Print x;If x Max Then Max=x Next i Print Print 最大值=;MaxEnd Sub,2.补充算法:极值问题,有一根长度为321米的钢材料,要将它截取成两种规格a、b的长度分别为17米和27米的短料,问分隔成a,b各多少段后,剩余的残料 r 最少
41、?分析,该题利用“穷举法”通过循环求残料r的最小值。程序如右:,Private Sub Form_Click()Dim a%,b%,r%For b=1 To 321 27 a=(321-b*27)17 r=321-b*27-a*17 Print a,b,r Next bEnd Sub,例4.18 实际应用,求最短残料。,Private Sub Form_Click()Dim a%,b%,r%,ma%,mb%,mr%mr=321 For b=1 To 321 27 a=(321-b*27)17 r=321-b*27-a*17 If r mr Then mr=r mb=b ma=a End If
42、Next b Print ma,mb,mrEnd Sub,例4.14 判断一个给定的整数是否为素数。,算法思路:素数指除了能被1和自身外,不能被其他整数整除的自然数。判断整数N是不是素数的基本方法是:将N分别除以2,3,N-1,若都不能整除,则N为素数。因为N=Sqr(N)*Sqr(N),所以,当N能被大于等于Sqr(N)的整数整除时,一定存在一个小于等于Sqr(N)的整数,使N能被它整除,因此只要判断N能否被2,3,Sqr(N)整除即可。,3.素数与哥德巴赫猜想,Dim N%,I%,K%N=Val(InputBox(N=?)K=Int(Sqr(N)For I=2 To K If N Mod
43、I=0 Then Exit ForNext IIf IK Then Print N;是素数Else Print N;不是素数End If,算法流程图,素数算法流程图及程序,例4.15 编一程序验证哥德巴赫猜想:一个大于等于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所示。将程序代码写到窗体的单击事件中。,实现上面算法的程序代码
44、如下:,例4.15 编一程序验证哥德巴赫猜想,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 Ne
45、xt I If I K2 Then 如果N2也为素数,则打印输出 Print N&=&N1&+&N2 End If End If Next N1End Sub,哥德巴赫猜想程序,4.补充算法:递推法,“递推法”的基本思想是把一个复杂的计算过程转化为简单过程的多次重复。每次重复都从旧值的基础上递推出新值,并由新值代替旧值。补充例题 猴子吃桃。小猴在某天摘桃若干个,当天吃掉一半,觉得还不过瘾,又多吃了一个;第二天吃了剩下的桃子的一半多一个;以后每天都这样吃下去,直到第7天要吃时只剩下一个,问小猴子第一天共摘下了多少个桃子?分析:这是一个“递推”问题,先从最后一天推出倒数第二天的桃子,再从倒数第二天
46、的桃子推出倒数第三天的桃子。设第n天的桃子为xn,那么它是前一天的桃子数的xn-1 的一半减1,即 xn=xn-1/2-1 xn-1=(xn+1)2,Private Sub Form_Click()Dim n%,i%x=1 第7天的桃子 Print 第 7 天的桃子数为:1只 For i=6 To 1 Step-1 x=(x+1)*2 Print 第;i;天的桃子数为:;x;只 Next iEnd Sub,补充例题:Fibonacci数列,著名意大利数学家Fibonacci 曾提出这样一个有趣的问题:设有一对新生的兔子,从第三个月开始它们每个月都生一对兔子。按此规律,并假设没有兔子死亡,一年后
47、共有多少对兔子?,一月:1对小兔子二月:1对大兔子三月:1大兔子+1对小兔子四月:2大兔子+1对小兔子五月:3大兔子+2对小兔子六月:5大兔子+3对小兔子七月:8大兔子+5对小兔子,Private Sub Form_Click()Dim i%,f1%,f2%,f3%f1=1:f2=1 Print f1;f2;For i=3 To 12 f3=f1+f2 Print f3;f1=f2 f2=f3 Next iEnd Sub,当最后一项的绝对值小于0.000001时停止计算,输出其计算的结果及其计算了多少项。编程分析:这是用来求多项式和的一类题目,这类题目一般要写成s=s+t(t为通项)这种形式。
48、本题中t第1项的值为1。递推公式为:t=-t/(2*i)*(2*i+1),例4.12 编程序计算多项式的和.,Private Sub Form_Click()Dim s#,t#,i%s=1:i=0:t=1 第1项的值 do i=i+1 t=-t/(2*i)*(2*i+1)s=s+t loop while abs(t)=0.000001 Print s=;s,i=;iEnd Sub,该例题涉及两个问题:(1)用循环结构求级数和的问题。本例根据某项值的精度 来控制循环是否结束。(2)累加:e=e+t 循环体外对累加和的变量清零 e=0 连乘:n=n*i 循环体外对连乘积变量置1 n=1 Priva
49、te Sub Form_Click()Dim i%,n eEnd Sub,补充例题:求自然对数e的近似值,要求其误差小于0.00001:,补充例题:国际象棋棋盘与古印度国的粮食,相传古代印度国王舍罕要褒赏他的宰相达依尔(国际象棋的发明者),问他需要什么,达依尔回答说:“国王只要在国际象棋棋盘的第一格里放上1粒麦子,在第二格里放上2粒麦子,在第三格里放上4粒麦子,以后按此比例每一格加一倍,一直放到第64格,我就感恩不尽,其它我什么也不想要了。”结果全印度国的粮食都不够!(注:1M3麦子1.42108颗),Private Sub Form_Click()Dim i%,s!,t!t=1:s=0 Fo
50、r i=1 To 64 s=s+t t=t*2 Next i s=s/142000000#Print 需要麦子;s;立方米End Sub,迭代法算法思想:迭代法在数学上也称“递推法”,凡是由一给定的初值,通过某一算法(公式)可求得新值,再由新值按照同样的算法又可求得另一个新值,这样经过有限次即可求得其解。,5.迭代法,牛顿迭代公式:x=x0-f(x0)/f(x0),补充例题:二分法高次方程求根。,其递推方法如下:(1)输入两个点的x坐标值a,b,使f(a)*f(b)0,即确保在区间a,b内有一根。(2)求区间a,b的中点c=(a+b)/2。(3)计算f(c)的值,若该值小于给定的精度要求,则