已阅读5页,还剩73页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章 结构化的程序设计方法,重点:选择结构及循环结构的实现及其应用,难点:选择的嵌套及多重循环结构,本章内容及要求: 1.了解算法的概念,掌握用流程图表示算法; 2. 熟练掌握赋值语句及输入/输出数据的方法; 3. 熟练掌握if语句、Select Case语句的使用, 掌握选择的嵌套结构; 4. 熟练掌握实现循环结构的三种常用的语句: ForNext语句及 Exit For语句; DoLoop语句及 Exit Do语句; WhileWend语句 5. 掌握循环结构的嵌套(多重循环)。,4.1.1 结构化程序设计方法的基本原则 结构化程序设计方法的基本思路:把一个复杂的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。每个阶段的处理都用一个相对独立的过程来完成;整个程序由若干个过程组合而成。 结构化程序设计方法的主要原则: (1)自顶向下 (2)逐步求精 (3)模块化 (4)限制使用GOTO语句 结构化程序设计方法要求: 只能使用三种基本结构来组成程序。,4.1 结构化程序设计方法简介,顺序结构、 选择结构、 循环结构。,1. 算法 在计算机中,把解题过程的准确而完整地描述称为解题算法,它是为了求解某个特定的问题而设计的有限多个操作步骤的集合。,4.1.2 算法及算法的特性,2. 算法的特性 (1)有穷性 (2)确定性 (3)有效性 (4)有零个或多个输入 (5)有一个或多个输出,1.自然语言表示法 自然语言:就是指人们日常使用的语言,可以是汉语、英语或其它语言。,4.1.3 算法的表示,表示算法的方法有许多种,如自然语言、伪代码、传统流程图、结构化流程图等。,例4.1 求两个正整数的最大公约数的欧几里德算法。 从键盘输入两个正整数m和n的值; 求出m除以n的余数r; 若r=0,则转至第步,否则,执行第步; 用n取代m,用r取代n; 转到第步,继续求新的m和n的最大公约数; 输出n的值,n的值即为当初那两个数的最大公约数。,伪代码:是用介于自然语言和计算机语言之间的文字和符号(包括数学符号)来描述算法。,2. 伪代码表示法,用伪代码描述的欧几里德算法为: 从键盘输入两个正整数m和n的值; r = m Mod n; If r = 0 then 转至第步; m= n : n = r 转到第步; Print n。,处理框,起止框,I/O框,判断框,流程线,连接点,(1) 流程图中的基本符号,3. 流程图表示法, 顺序结构, 选择结构,(2) 三种基本结构的表示,基本结构的特点: (1)只有一个入口 (2)只有一个出口 (3)不存在死语句 (4)不存在死循环, 循环结构,例4.2 用流程图表示欧几里德算法,N-S流程图是对流程图表示法加以改进之后得到的一种新的、符合结构化程序设计思想的流程图形式。, 选择结构,4. 用N-S流程图表示算法, 循环结构,例4.3 用N-S流程图表示欧几里德算法,N-S 流程图示例,例4.4: 从100个数中选出最大的数,Private Sub Form_Click( ) Dim n%, w%, i%, r% InputBox是输入数据的函数 n = Val(InputBox(“请输入一个正整数!“, “判别素数的程序“, 17) w = 1 : i = 2 w=1表示假设n是素数 Do DoLoop是循环控制语句 r = n Mod i Mod是除取余数的运算符 If r = 0 Then w = 0 余数r = 0表示n能被i整除 i = i + 1 先求i +1的值,再把结果送给i Loop Until (i = n Or w = 0) If w = 1 Then MsgBox (n & “是一个素数!“) Else MsgBox是输出数据的函数 MsgBox (n & “不是一个素数!“) End If End Sub,例4.6 用VB语言表示出判别素数的算法.,5. 用计算机语言表示算法,4.2 顺序结构程序设计,4.2.1 注释语句,注释语句是在编程工作中经常使用的语句之一,在程序中对一些关键的语句加以注释, 可以提高整个程序结构的清晰度,使得程序更加易于理解。 注释语句的一般形式为: Rem 注释内容 注释语句的简化应用形式为: 注释内容 例如: Rem 本程序的功能是计算球的体积 Const PI as Double= 3.1415926535 定义符号常量PI 注意:注释语句用的单引号必须在英文输入状态下输入 V= 4/3*PI*R3 : Rem 计算球的体积,4.2.2 赋值语句,功能: 将表达式的值赋值给变量名或指定对象的属性。 一般用于给变量赋值或对控件设定属性值. 例: sRate!=0.1 Text1.Text “欢迎使用Visual Basic 6.0” 说明: 执行过程:先求表达式的值,然后将值赋值给左边的变量。 右边的表达式可以是变量、常量、函数调用等特殊的表达式。 不要将“”理解为数学上的等号: A=A+1 将表达式A+1的值放回到变量A中。,1赋值语句的一般形式 LET = LET .属性名= ,赋值符号“=”两边的数据类型一般要求应一致。 不一致就自动转换,不能转则出错!,2赋值语句对数据类型的要求,3赋值操作过程中的数据类型转换 当类型不一致时,VB系统会自动地 将表达式的值转换成变量的类型。 例: iA% = 10 / 3 iA中的结果为3 iA% = 11 / 3 iA中的结果为4(四舍五入) iA% = -11 / 3 iA中的结果为-4(四舍五入) iA%=38000 出错,数据溢出。, 当表达式是数字字符串,变量是数值类型时,系统自动地将数字字符串转换成数值再赋值;当表达式中含有非数字字符时,则出错。 例: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# 结果为“2003-3-12“,iA% = Val(“123abc“),3赋值操作过程中的数据类型转换,例如: d$=123&“abc“ : d2$=d&“abc“,(1) 赋值符号“=”左边一定只能是变量名或对象的属性引用, 不能是常量或表达式。 如: 5=X : Abs(X)=20 (2) 赋值号两边的数据类型不兼容时,编译时就会出错。 例如:x%=“abc“ 编译错误。 x%=50000 编译错误, -32768,32767 。 (3) VB不能在一个赋值语句中同时给多个变量赋值。 (4) 同一个语句行中的多个赋值语句必须用冒号隔开。 例如:x%=5 , y%=8 编译错误, 应更改为:x%=5 : y%=8 注意:连接运算符&的两边应有空格隔开。,Dim x%,y% : x = y = 100,4赋值操作中的常见错误,x = 100 : y = 100,Print方法的一般格式: 对象名.Print,|;,说明: 对象名. 可以是窗体名、图片框名,也可是立即窗口“Debug”。若省略对象,则表示在当前窗体上输出。 用Print方法在图片框和立即窗口对象中输出与在窗体对象中输出完全相同。,4.2.3 数据的输入与输出 1. Print方法,Format函数的一般格式: Format ( , “格式字符串“),2. Format函数,将表达式的值按指定的格式转换成字符串,例如:有下列语句如下: x%= Val(InputBox(“请输入一个数“, “输入框“, “100“) 语句执行后打开如下对话框。,缺省值,标题,提示,3. InputBox函数,$=InputBox( ,标题 ,默认值 ,x坐标 ,Y坐标 ),4. MsgBox函数和MsgBox过程,函数形式:变量% = MsgBox(,按钮图标+ 缺省按钮+模式,标题) 过程形式: MsgBox ,按钮图标 +缺省按钮+ 模式,标题,说明: “标题”和“提示”与InputBox函数中对应的参数相同; “按钮图标 +缺省按钮+模式”是整型表达式,决定信息框按钮数目、出现在信息框上的图标类型及操作模式 若程序中需要返回值,则使用函数,否则可调用过程。,按钮及图标值如下:,MsgBox常用参数说明,根据用户所选按钮, 函数返回值17!,MsgBox ,按钮图标+缺省按钮+模式,标题,MsgBox函数示例,MsgBox “李钢是不是计算机学院的?“,3+32, “我要找李钢“,5. 利用文本框和标签控件来输入/输出数据,例4.10 编写程序,利用文本框(Text1)输入一个三位的整数,计算这个三位数的逆序数,并用文本框(Text2)和标签控件(Label2)两种方式同时输出运算结果。,Private Sub Command1_Click() Dim m%, n%, a% , b% , c% m=Val(Text1.Text) a = m100 b = (m mod 100)10 c = m mod 10 n = c*100+b*10+a Text2= n 省略了属性名Text Label2 = m & “的逆序数是:“ & n End Sub,输入数据,输出数据,4.2.4 字体、字形和颜色,1Font属性组, FontName, FontSize, FontBold, FontItalic, FontStrikethru, FontUnderline,2颜色属性及颜色值,颜色属性主要有ForeColor(前景色) 和BackColor(背景色)两种., RGB函数 RGB(红色值,绿色值,蓝色值),0255, QBColor函数 QBColor(颜色值),015, 颜色常量 vbBlack、vbRed、vbGreen、vbYellow、vbBlue、vbMagenta、vbCyan、vbWhite等。, 颜色值(用十六进制表示的数) &H004080FF&,(1) 在属性窗口中设置颜色,(2) 在代码中设置颜色,4.3 选择结构,Visual Basic用关系运算或逻辑运算来判断条件是否能够得到满足,并根据计算的结果决定程序的不同流程,实现选择结构的程序设计。 Visual Basic用来实现选择的结构化语句是If条件语句和Select Case语句,也可以使用更为简捷的选择函数来实现较为简单的选择功能。,4.3.1 单行结构的If语句,单行结构If语句的一般形式: If Then Else ,说明: 表达式一般为关系表达式或逻辑表达式, 也可以是算术表达式。若为算术表达式,则表达式的值非零时为TRUE,零为FALSE。 语句块可以是一个语句,也可以是多个语句,多个语句之间一定要用冒号分隔。,If ab then t=a : a=b : b=a,If ab Then max=a Else max=b,例4.11 计算分段函数的y值。,Private Sub Form_Click() Dim x!, y! x=Val(InputBox(“请输入一个数x“) If x=0 then y= x*x+3 else y=x*x*x+2 Print “x=“ ; x ; “y=“ ; y End Sub,Private Sub Form_Click() Dim x!, y! x=Val(InputBox(“请输入一个数x“) y=x*x*x+2 If x=0 then y= x*x+3 Print “x=“ ; x ; “y=“ ; y End Sub,4.3.2 块结构的If语句,块结构If语句的一般形式:,m= y If xy Then m = x End If,If xy Then m = x Else m = y End If,If Then Else End If,必须换行 !,m = y If xy Then m=x End If,4.3.3 多分支的If语句,1. 多分支If语句的一般形式:,If Then ElseIf Then ElseIf Then Else End If,ElseIf 不能分开,只能有一个End If,Else If,2. 多分支的If语句的流程图,只能有一个分支得到执行,Private Sub Form_Click() Dim s!, f! s = Val(InputBox(“输入里程数(单位:公里)“) If s =3 Then f = 5 ElseIf s =10 Then f = 5+(s-3)*1.2 Else f = 5+7*1.2+(s-10)*1.5 End If Print “Taxi行驶:“; s; “公里,收费:“; f; “元!“ End Sub,例4.13 计算Taxi收费金额,4.3.4 Select Case语句,1. Select Case语句的一般形式:,Select Case Case Case Case Else End Select,可含变量,只能是数值型或字符串型,只能包含常量,且必须与类型相同!,Case 与 之间要用空格隔开!,四种形式之一: Case 85 Case 71,75,78 Case 60 to 69 Case Is 60 可混合使用: Case 78,80 to 85,Private Sub Form_Click() Dim s!, f! s = Val(InputBox(“输入里程数(单位:公里)“) Select Case s Case Is = 3 f = 5 Case Is = 10 f=5+(s-3)*1.2 Case Else f = 5+7*1.2+(s-10)*1.5 End Select Print “Taxi行驶:“; s; “公里,收费:“; f; “元!“ End Sub,例4.14 计算Taxi收费金额2,4.3.5 条件结构的嵌套,If s =3 Then f = 5 Else IF s=10 Then f = 5+(s-3)*1.2 Else f = 5+7*1.2+(s-10)*1.5 End If End If,If s =10 Then IF s=3 Then f = 5 Else f = 5+(s-3)*1.2 End If Else f = 5+7*1.2+(s-10)*1.5 End If,IIf函数的使用格式: IIf(,) 说明: (1)与If语句中的相同, 用来描述选择条件 。 (2)当为真时,函数返回的值; 当为假时,函数返回的值。 (3)、可以是任何表达式。 例如: Max =IIf(XY, X, Y ) 它与下面语句等价: IF XY Then Max = X Else Max=Y,4.3.6 条件函数,1. IIf函数,Choose函数使用格式: Choose(,. ) 说明: Choose函数根据的值来决定返回其后中的那个表达式的值。如果的值为1,则返回的值,如果的值为2,则返回的值,以此类推。若的值小于1或大于n,则函数返回Null( 空)。 例如:根据Nop的值,得到+、-、*,/的运算符,可由下面语句来实现。 Nop= Int(Rnd * 4)+ 1 OP= Choose(Nop, “+“, “-“, “*“, “/“),2. Choose函数,f=Choose(Nop, “汉族“,“蒙古族“,“回族“,“藏族“),Switch函数形式是: Switch(条件表达式1,条件表达式1为True时的值 ,条件表达式2,条件表达式2为True时的值),3. Switch函数,自左至右,只能返回一个值。,例如:根据Nop的值,得到+、-、*,/的运算符,也可由下面的语句来实现。 Nop= Int(Rnd * 4)+ 1 OP = Switch(Nop=1 ,“+“, Nop=2,“-“, Nop=3,“*“, Nop=4,“/“),f=Switch (m=1, “汉族“, m=2, “蒙古族“, m=3, “回族“, m=4, “藏族“),例4.17 求一元二次方程的根,4.3.7 选择结构应用程序举例,Private Sub Form_Click() Dim a!, b!, c!, disc!, p!, q! a = Val(InputBox(“请输入系数a“) b = Val(InputBox(“请输入系数b“) c = Val(InputBox(“请输入系数c“) Print “方程:“ & a & “*x*x+(“ & b & “)*x+(“ & c & “)=0“ If a = 0 Then Print “a=0,该方程不是二次方程!“ Else disc = b * b - 4 * a * c p = Round(-0.5 * b / a , 2) q = Round(0.5 * Sqr(Abs(disc) / a , 2) . End If End Sub,Select Case disc Case 0 Print “有两个相等的实跟:x1= x2= “ Print “, x2= “ & p & “-“ & q & “!“ End Select,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 = 0 Then flag = True Else flag = flase End If Else flag = True End If Else flag = flase End If Print y; IIf(Flag,“年是闰年!“,“年不是闰年!“) End Sub,例4.16 闰年问题,判断某年是否为闰年的两个条件: 该年年号能被4整除,但不能被100整除; 该年年号能被400整除。,所有年号,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) Print y; IIf(Flag,“年是闰年!“,“年不是闰年!“) End Sub,For 循环变量初值 to 终值 Step 步长 语句块1 Exit For 语句块2 Next 循环变量,4.4 循环结构程序设计 4.4.1. For循环语句,循环次数,一般用于循环次数已知的循环结构,例: For I=2 To 13 Step 3 Print I ; Next I Print “I=“;I,循环体执行次数: Int(13-2)/3+1)=4 输出I的值分别为: 2 5 8 11 出了循环输出为: I= 14,For循环语句示例,例4.18 编程计算:S=1+3+5+7+99,Dim S% , I% S=0 累加前变量S为0 For I=1 to 99 Step 2 S=S+I Next I Print “S=“,S,例4.18的算法流程图,For循环示例4.18,注意:在循环体内对循环控制变量可多次引用;但最好不要对其赋值,否则影响原来的循环控制规律。,求:S=1+2+3+100 Dim S% , I% S=0 累加前变量S为0 For I=1 to 100 Step 1 S=S+I Next I Print “S=“,S,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=i+3时的循环执行情况: i=1,3,5,7,9,11,13,15,17,19共10次!,例题4.19 通过改变循环变量,控制循环提前结束。,题目:打印出最小的水仙花数(一个三位数,其值等于它的三个数位的值的立方之和,例如: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 Print End 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 m=1000 End If Next m End Sub,Exit For,For m = 999 To 100 Step -1,形式1:(当型循环) Do While 语句块1 Exit Do 语句块2 Loop,4.4.2 Do WhileLoop循环语句,形式2:(当型循环) Do 语句块1 Exit Do 语句块2 Loop While ,例4.20 求两个整数的最大公约数,Dim n%,m%, r% m=Val(InputBox(“m=“) n=Val(InputBox(“n=“) r=m mod n Do While (r 0) m=n n=r r= m mod n Loop Print “最大公约数=“, n,循环结构示例4.20,辗转相减法求最大公约数 当 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 2 Loop,Do r = m mod n m=n n=r Loop While (r 0) Print “最大公约数=“, m,4.4.3 DoLoop Until循环语句,形式1:(直到型循环) Do 语句块1 Exit Do 语句块2 Loop Until ,形式2:(直到型循环) Do Until 语句块1 Exit Do 语句块2 Loop,Private Sub Form_Click() Dim t#, pi#, n& pi=1:n=1:t=1 第1项t的值为1 Do n = n + 1 从第2项开始累加 t =IIf(n Mod 2=1,1,-1)/(2*n-1) IIf(n Mod 2=1,1,-1) 与 (-1)(n+1) 等价 pi = pi + t Loop Until Abs(t)0.000001 Print “pi=“ & pi * 4 End Sub,例4.21,程序运行的结果为:pi=3.14159465358569,(1)当使用While构成循环时,当条件为“真”,则反复执行循环体,当条件为“假”,则退出循环。 (2)当使用Until 构成循环时,当条件为“假”,则反复执行循环体,直到条件成立,即为“真”时,则退出循环。 (3)在循环体内一般应有一个专门用来改变条件表达式中变量的语句,以使随着循环的执行,条件趋于不成立(或成立),最后达到退出循环。 (4)语句Exit Do的作用是退出它所在的循环结构,它只能用在DO/Loop结构中,并且常常是同选择结构一起出现在循环结构中,用来实现当满足某一条件时提前退出循环。,与DoLoop语句有关的说明:,Do 没有条件的DoLoop语句 语句块1 If Then Exit Do 语句块2 Loop,While Wend,4.4.4 WhileWend语句,说明:与Do While .Loop语句 实现的循环基本相同, 只是不能用Exit提前退出循环!,例4.22 判断一个给定的整数是否为素数。,Private Sub Form_Click() Dim n%, w%, i%, r% n = Val(InputBox(“请输入一个正整数!“) i = 2 : w = 0 w = 0表示先假定没有数能被n整除 While (w=0 And i=n-1) 没有数能整除 并且i=n-1,继续 r = n Mod i If r = 0 Then w = 1 在这儿找到一个能整除,w改为1 i = i + 1 Wend Print n & IIf(w=0, “是“,“不是“) & “一个素数!“ End Sub,While (i=n-1) r = n Mod i If r = 0 Then w = 1 : i = n i = i + 1 Wend,4.4.5 用Goto语句和If语句构成循环,Private Sub Form_Click() Dim x% , s% s = 0 abc:x=Val(InputBox(“输入一个数,输入0结束程序!“) Print x; s = s + x if (x0) Then goto abc Print “The total sum is“ ; s End Sub,例4.23 从键盘输入一组数据,以0作为结束输入数据的 标志,求这组数据之和。,语句标号,语句标号,多重循环结构 如果在一个循环内完整地包含另一个循环结构,则称为多重循环,或循环嵌套。例如:,4.4.6 循环的嵌套,(1)For I=1 To 10 For J=3 To 8 . Next J Next I,(2)For I=10 To 80 Do While x10 . Loop Next I,(3)Do While x10 For J=2 To 7 . Next J Loop,(4)Do While x=10 Loop,Print Tab(36);“九九乘法表“ For i = 1 To 9 For j = 1 To 9 se = i Next j Print Next i,例4.24:打印九九乘法表.,i,Dim n%, Factor%, First As Boolean n = InputBox(“请输入一个大于2的整数“) First = True : Factor = 2 第1个可能的质因素是2 Do While n Mod Factor =0 相同的质因素可能有多个 Print IIf(First , n First = False 第1个已输出 n = n / Factor 从整数中分离出这个质因素 Wend Factor= Factor+1 预期的下1个因素 Loop Until n =1,例4.25:分解出一个正整数的所有质因素.,输入360,输出:360=2*2*2*3*3*5,(1) 内循环变量与外循环变量不能同名; (2) 外循环必须完全包含内循环,不能交叉; (3) 不能从循环体外转向循环体内, 也不能 从外循环转向内循环.,循环嵌套注意事项:,For i =1 To 10 For i =1 To 20 Next i Next i 语法上没问题,For i =1 To 10 For j =1 To 20 abc : Print j Next j If i=8 Then Goto abc Next i,For i =1 To 10 For j =1 To 20 If j=8 Then Goto abc Next j abc : Print i Next i,此类问题都要使用循环,根据问题的要求,确定循环变量的初值、终值或结束条件及用来表示计数、和、阶乘的变量的初值。,4.4.7 应用程序举例 1. 求累加和、连积的问题,1100的5或7的倍数的和 Sum = 0 For i = 1 To 100 If i Mod 5 = 0 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,思考:若把循环体前面置各变量初值的语句放在循环体内,程序运行时会产生什么情况?,例4.28 求s=n!+(n+1)! +(n+2)!.+m!。正整数nm,Private Sub Form_Click() Dim n% , m%, s# , jc# s = 0 给存放累加和的变量s赋初值0 jc = 1 给存放连积的变量jc赋初值1 n = Int(Rnd*6+4) : m =n+ Int(Rnd*4+2) For i=1 To m 求1!,2!,3!.m! jc = jc *i If i=n Then 从n!开始求累加和 s=s+jc If i=n Then Print i End If Next i Print “=“ & s End Sub,如:8!+9!+10!+11!+12!= 522950400,在若干个数中求最大值, 一般先假设一个较小的数为最大值的初值, 若无法估计较小的值,则取第一个数为最大值的初值;然后将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值;依次逐一比较。 例4.29 随机产生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 “最大值=“; Max End Sub,2. 极值问题,Private Sub Form_Click() Dim i% , x% , m% m = Val(InputBox(“输入第一个数“) For i=2 To 10 x = Val(InputBox(“输入一个数“) Print x; If m x Then m=x Next i Print Print “Min = “ & m End Sub,例4.30 从键盘输入10个数,并求出它们的最小值,“穷举法”也称为“枚举法”或“试凑法”, 即将所有可能出现的各种情况一一测试,判断是否满足条件。 如求水仙花数、求极值的算法都是用的“穷举法” 。 例4.31 百元买百鸡问题。 设公鸡,母鸡,小鸡各为x,y,z只,列出以下方程为: x+y+z =100 3x+5y+z/3 = 100 三个未知数,两个方程,只能用“试凑法”。 先导出y与x的关系式: y=(200-8x)/14 x = 0,1,2,32533; y =(200-8x)/14 (只要y是正整数即可); z=100-x-y,3. 穷举法,“百元买百鸡”程序,Private Sub Form_Click() Dim x%, y%, z% For x = 0 To 25 y = (200 - 8 * x) 14 赋值时去掉了小数 z = 100 - x - y 可以保证鸡数是100 If 3*x+5*y+z/3 =100 Then 验算钱数也必须是100 Print “公鸡“; x; “只;母鸡“; y; “只;小鸡“; z; “只!“ End If Next x End Sub,Private Sub Form_Click() Dim x%, y%, z% For x = 0 To 33 100块钱最多能买33只公鸡 For y = 0 To (100-3*x)5 剩钱最多母鸡数 z= (100-3*x-5*y)*3 再剩下的钱买小鸡 If x+y+z=100 Then 验算是否100只鸡 Print “公鸡“; x; “只;母鸡“; y; “只;小鸡“; z; “只!“ End If Next y Next x End Sub,公鸡 4 只;母鸡 12 只;小鸡 84 只! 公鸡 11 只;母鸡 8 只;小鸡 81 只! 公鸡 18 只;母鸡 4 只;小鸡 78 只! 公鸡 25 只;母鸡 0 只;小鸡 75 只!,例4.32:爱因斯坦的阶梯问题,设有一阶梯,每步跨2阶,最后余1阶;每步跨3阶,最后余2阶;每步跨5阶,最后余4阶;每步跨6阶,最后余5阶;每步跨7阶时,最后正好到达阶梯顶。问共有多少阶梯?,Private Sub Form_Click() Dim i% i = 7 Do While (i Mod 3 2) Or (i Mod 5 4) Or (i Mod 6 5) i = i + 14 Loop Print “共有“; i; “个阶梯“ End Sub,奇数,7的倍数,长度为321米的钢材料,要将它截取成17米和27米的短料, 问分隔成a, b各多少段后,剩余的残料 r 最少? 分析,该题利用“穷举法”通过循环求残料r的最小值。 程序如右:,Rem 打印出所有可能的情况 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 b End Sub,例4.33 实际应用,求最短残料。,Rem 打印出残料小于3的情况 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 If r3 Then Print a, b, r Next b End Sub,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 Next b Print ma, mb, mr End Sub,改进:如何找出残料最小时的多种组合情况?,4. 递推法,“递推法” 的基本思想是把一个复杂的计算过程转化为简单过程的多次重复。 例4.34 猴子吃桃。 分析:设第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 i End Sub,例4.36 Fibonacci数列,著名意大利数学家Fibonacci 曾提出这样一个有趣的问题:设有一对新生的兔子,从第三个月开始它们每个月都生一对兔子。按此规律,并假设没有兔子死亡,一年后共有多少对兔子?,一月: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 i End Sub,当最后一项的绝对值小于0.000001时停止计算,输出其计算的结果及其计算了多少项。 编程分析:这是用来求多项式和的一类题目,这类题目一般要写成s=s+t(t为通项)这种形式。 本题中t第1项的值为1 。递推公式为: t=-t/ (2*i)*(2*i+1),例4.37 编程序计算多项式的和.,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=“; i End Sub,二分法迭代公式:c=(a+b)/2 : a=c或b=c,迭代法算法思想:迭代法在数学上也称“递推法”,凡是由一给定的初值,通过某一算法(公式)可求得新值,再由新值按照同样的算法又可求得另一个新值,这样经过有限次即可求得其解。,5. 迭代法,牛顿迭代公式:x=x0-f(x0)/f(x0),例4.38 二分法高次方程求根。,其递推方法如下: (1) 输入两个点的x坐标值a,b, 使f(a)* f(b)0,即确保在区间a,b内有一根。 (2) 求区间a,b的中点c= (a+b)/2。 (3) 计算f(c)的值,若该值小于给定的精度要求,则 c为求 得的近似根,程序结束;否则执行步骤(4)。 (4) 若f(a)与f(c)同号,则a,c无根,用c代替a;否则c,b 无根,用c代替b;使求根区间缩小一半,并重复上述 步骤(2)(4),直到求出近似根为止。,Private Sub Form_Click() Dim a!,b!,c!,fa!,fb!,fc! do a=inputbox(“a=“):b =inputbox(“b=“) fa=3*a*a*a- 4*a*a-5*a+13 fb=3*b*b*b- 4*b*b-5*b+13 Loop while(fa*fb0) do c=(a+b)/2: fc=3*c*c*c- 4*c*c-5*c+13 if (fa*fc0) a=c else b=c Loop while(abs(fc)0.0001) print “3*x*x*x-4*x*x-5*x+13=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025安徽国控资本有限公司所属企业四季度社会招聘4人笔试历年常考点试题专练附带答案详解试卷3套
- 2025四川广安市武胜县文创旅游开发有限公司招聘3人(第三次)笔试历年典型考点题库附带答案详解试卷3套
- 2025中国人民保险集团股份有限公司招聘笔试历年常考点试题专练附带答案详解试卷3套
- 恩施 公务员考试试题及答案
- 石灰岩矿开采及综合利用项目风险评估报告
- 老旧小区改造建设工程施工方案
- 大数据处理与分析平台搭建方案
- 北京故宫公务员考试面试试题及答案
- 铜矿资源勘探与评估方案
- 澳门大陆公务员考试试题及答案
- 《煤矿安全规程》2025版
- 2025年广东省事业单位统考试题
- 新版中华民族共同体概论课件第六讲“五胡入华”与中华民族大交融(魏晋南北朝时期)-2025年版
- 国外代理合作协议书范本5篇
- 中西医对比教学课件
- 雨污管道检测施工方案
- 辽医药护理中职单招题库及答案解析
- 2025年电工职业技能鉴定试卷(初级工)实操试题及答案解析
- 小学生心理健康教育课程的设计与实施研究
- 2025秋人教版八年级上册英语试卷 Unit 6 单元考试试卷【原卷+听力音频+听力原文+答案】
- 电梯安装技术交底
评论
0/150
提交评论