VB第5章(分支与循环)_第1页
VB第5章(分支与循环)_第2页
VB第5章(分支与循环)_第3页
VB第5章(分支与循环)_第4页
VB第5章(分支与循环)_第5页
已阅读5页,还剩105页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章选择分支与循环

选择分支与循环是非常重要的两种算法结构。选择分支可依据判决条件的满足与否,执行不同的操作;循环可依据循环控制条件重复执行给定的操作。他们又统称为“控制结构”。 VB提供了实现选择分支与循环的相关语句。5.1分支结构语句

1.If--Then结构

格式一:

If

<条件>

Then

<语句>

示例:

判断口令字。如果口令不符,打印出错信息。条件语句假(0)真(非0)格式二:

If

<条件>

Then

<语句>

EndIf示例:

判断口令字。如果口令不符,以对话框方式输出出错信息。

2.If---Then---Else结构

条件语句1语句2真(非0)假(0)

格式一:

If<条件>

Then

<语句1>

Else

<语句2>

示例:假设有两个变量a,b,输出两个中较大的。格式二:

If<条件>

Then

<语句1>

Else

<语句2>

EndIf示例:求解计算三角形面积

由文本框输入三条线段的长度,求这三条线段所构成的三角形面积。a,b,c是否均大于0判断两边之和大于第三边输入三线段长度:a,b,c根据公式求三角形面积输出三角形面积结束YY打印“无解”NN公式:

3.If---Then---ElseIf

格式:

If<条件1>Then

<语句1>

ElseIf<条件2>Then

<语句2>

ElseIf<条件3>Then

<语句3>

……

Else

<语句>

EndIf条件2条件1语句2语句1条件3语句3语句4真假真假真假示例:测试一下你的体形是否标准。输入你的体重(单位为公斤)和身高(厘米),计算体形参数P,公式为:示例:计算下列分段函数的值,并在窗体上显示计算结果.4.SelectCase--EndSelect结构语句格式:

Select

Case变量或测试表达式

Case

测试值列表1 <语句1>

Case测试值列表2 <语句2>……

CaseElse <语句n>

EndSelect执行Selectcase语句的一般过程如下:首先计算测试表达式的值,然后与语句中每个case子句的表达式的值进行比较。如果相等,就执行与该Case相关联的语句,接着执行SelectCase语句的后继语句。如果没有一个case子句的表达式的值与测试表达式的值相等,则执行caseElse部分的语句,接着执行selectcase语句的后继语句。若无cascElse部分,则直接执行SelectCase语句的后继语句。计算测试表达式与测试值1相同吗?语句1与测试值2相同吗?语句2语句nSelectCase语句的下一条语句是不是是都不是注意:

(1)测试表达式必须为数值型或字符型数据(2)测试值列表必须与测试表达式的值的类型

一致(3)测试值列表有以下三种类型

A枚举型如:case1,5,7,9

case"a","b","C","d"

B范围型如:case1to9case"a"to"z"

C关系表达式型如:caseIs<100caseIs>"a"再次提醒:用关键字To来指定一个范围时,必须把较小的值写在前面,较大的值写在后面,字符串常量的范围必须按字母顺序写出。如果同一个域值的范围在多个Case子句中出现,则只执行符合要求的第一个Case子句的语句块,这时Case子句的顺序对执行结果有影响。因此,在编程时,一般都使各个Case子句是“互斥”的(即只有一个子句的范围满足)。机票优惠

某航空公司规定在旅游旺季5-10月份,如果订票数超过20张,优惠票价的15%,20张以下,优惠5%;在旅游淡季1-4月份、11月份,订票超过20张,优惠30%,20张以下,优惠20%。

设计一个程序,能根据月份和旅客订票张数决定优惠率。个人收入调节税示例:根据职称显示不同的信息示例:计算下列分段函数的值,并在窗体上显示计算结果.5.If语句的嵌套

在If语句中又包含—个或者多个If语句,称为语句的嵌套。

If<条件>

Then

<语句1>Else

<语句2>EndIf示例:假设有三个变量a,b,c,输出其中的最大数。

只要满足结构规则,If语句可以有任意多的嵌套。在编写嵌套程序的时候,需要注意If与ELse的配对关系。配对的原则是:先从最内层的E1se开始找,Else总是与离它最近的而且在它前面未配对的If配对,如此逐层配对。按照锯齿形的书写格式书写,容易看出各层的嵌套关系。示例:输入自变量x和z,求一个双变量的分段函数。

对比一下可以看出,SelectCase语句只在语句开头计算一次表达式的值,然后用这个值依次去与Case后面的表达式值列表中列出的值进行比较,即可作出判定,而If_Then_E1seIf语句每次都要计算条件表达式的值,然后再去进行比较和判定。这是这两个多重选择语句的不同之处。

但正是由于Selectcase语句只计算一个表达式的值,而If_Then_ElseIf语句要计算多个表达式的值,所以只有在If和每一个ElseIf涉及的是相同表达式时,才能用SelectCase语句替换If_Then_ElseIf语句。也就是说,对于多重选择而言,If_Then_ElseIf语句的适应性比SelectCase要强,使用范围更广。5.2循环结构与循环结构语句

在实际工作中,常遇到一些操作过程不太复杂,但又需要反复进行相同处理的问题,比如,统计本单位所有人员的工资,求全班同学各科的平均成绩等等。这些问题的解决逻辑上并不复杂,但如果单纯用顺序结构来处理,那将得到一个非常乏味且冗长的程序。例如:计算1~100所有奇数的平方和,如果用顺序结构来解决这个问题,我们就会给出下面的程序:

由上面的例子不难看出,程序的绝大部分是在反复执行两条语句x=x+2和s=s+x^2,不同的是x的值在变化。程序当然非常简单易懂,但缺乏最基本的编程技巧。要想方便地解决这类问题,最好的办法就是用循环语句。

所谓循环就是重复地执行一组语句。

我们用循环语句解决上面的问题,程序非常简短:

VB提供了三种不同风格的循环语句,它们分别是:(1)Do…Loop语句。(2)For…Next语句; (3)While…Wend语句;我们将对前2种循环语句作一介绍。

(1)Do---Loop循环

格式一:

DoWhile<条件>

<语句块>[ExitDo]<语句块>Loop True条件语句False求n=1:s=0n<=100s=s+n:n=n+1是否循环初始部分循环条件循环体DoUntil

<条件>

<语句块>[ExitDo]<语句块>

Loop

False条件语句True

(1)Do---Loop循环

格式二:

求n=1:s=0n>100s=s+n:n=n+1否是循环初始部分循环条件循环体Do

<语句块>[ExitDo]<语句块>LoopWhile<条件>

语句条件TrueFalse求Do

<语句块>[ExitDo]<语句块>

LoopUntil<条件>语句条件FalseTrue求

比较这两段小程序,区别只是把“Whilen<=100”的位置移动了一下。但我们不要因此以为两种形式是多余的,有时候,代码细微的变动会给编写程序带来很大的方便。DoWhile__Loop循环的特点:

先判断条件,后执行循环体。

循环体有可能一次也不执行Do__LoopWhile循环的特点:

先执行循环体,后判断条件。

至少执行一次循环体Do_Loopwhile可转化成Dowhile__Loop结构(2)For---Next循环

格式:

For循环变量=初值To终值[

step步长] <语句块>

[ExitFor

]<语句块>

Next

[循环变量]正常情况下,执行的次数为:Int((终值-初值)/步长)+1注意:循环变量:亦称“循环控制变量”、“控制变量”或“循环计数器”。它是一个数值型变量。初值:循环变量的初值,它是一个数值表达式。

终值:循环变量的终值,它是一个数值表达式。

步长:循环变量的增量,是一个数值表达式。其值可以是正数(递增循环)或负数(递减循环),但不能为0。如果步长为1,则Stepl可略去不写。循环体:在For语句和Next语句之间的语句序列,可以是一个或多个语句。

ExitFor:退出循环。这是中途退出循环的语句。用ExitFor只能退出当前循环,即它所在的最内层循环。

Next:循环终端语句,在Next后面的“循环变量”与For语句中的“循环变量”必须相同。Next后的“循环变量”可以省略。计算初值、终值、步长循环变量=初值循环变量超过终值?循环体语句循环变量=循环变量+步长FalseTrue这里所说的“超过”有两种含义:当步长为正值时,检查循环变量是否大于终值;当步长为负值时,判断循环变量的值是否小于终值。For循环变量=初值To终值[

step步长] <语句块>Next

[循环变量]求例:

用for循环求

所谓“水仙花数”是指一个3位数,其各位数字的立方和等于该数本身。例如:因为153=13+53+33所以153是一个“水仙花数”。同样370、371、407也是水仙花数。开始m=100a=m\100,b=(mmod100)\10,(b=m\10mod10)c=mmod10a3+b3+c3=m打印结果Ym=m+1m<=999结束NNY请分别用DoWhile和ForNext循环语句解决上面的问题。

使用For-Next循环应注意的问题:

(a)循环出口问题 正常出口非正常出口

判断素数素数就是除过1和自身之外,没有其他因子的自然数。试编程,输入任意一个正整数n,判断n是否是素数。I=2输入nI>n-1nModI=0I=I+1TFTFPrivateSubcalculate_Click()DimnAsInteger,IAsIntegern=Text1ForI=2Ton-1IfnModI=0ThenExitForNextIIfI>n-1ThenMsgBoxn&"是素数"ElseMsgBoxn&"不是素数"EndIfEndSub(b)循环参数的类型问题例:DimIAsIntegerForI=1.0To10.5Step1.5…NextI…上述循环如何执行?©循环参数在循环体中的变化问题。例:DimIAsInteger,yAsIntegery=2ForI=1Toy+8Stepy…y=y+2…NextI上述循环如何执行?循环的嵌套

一个循环体内又包括另外一个完整的循环体结构,称为循环的嵌套。内嵌的循环体中还可以嵌套循环,这就是多层循环。循环嵌套的概念对各种语言都是一样的。单循环可以解决一些简单的问题,但实际上有许多问题需要用两层,甚至多层循环解决。示例:用多重循环求水仙花数。

同一种循环和不同循环之间都列以相互嵌套,例如下列循环嵌套都是合法的:必须注意:小循环一定要完整地被包含在大循环之内,不得相互交叉。在多重循环中,各层循环的循环控制变量不能同名。示例:打印乘法口诀表

基本算法

算法是问题求解过程的精确描述,一个算法由有限条可完全机械地执行的、有确定结果的指令组成。通常求解一个问题可能会有多种算法可供选择,选择的主要标准是算法的正确性和可靠性,简单性和易理解性。其次是算法所需要的存储空间少和执行更快等。

经常采用的算法设计技术主要有迭代法、递推法、穷举搜索法、贪婪法、回溯法、分治法、动态规划法等等。

在计算机数值程序设计中,迭代与递推是两个重要的基础算法。

一、迭代

许多的实际问题都能转化为解方程F(x)=0的实数解的问题。求根可以直接从方程出发,逐步缩小根的存在区间,把根的近似值逐步精确到要以满足具体实际问题的需要为止,该算法称为迭代。

迭代的一般原则可以用一个数学模型来描述,要求出方程F(x)=0的解。

先设F(x)=G(x)-x

则方程F(x)=0可化为x=G(x)

这就产生了一个迭代算法的数学模型

Xn+1=G(Xn)

从某一个数X0出发,按此迭代模型,求出一个序列:

{X0,X1,X2,X3,……,Xn-2,Xn-1,Xn}

当Xn-Xn-1小于一个特定值(误差许可值)时,X≈Xn-1≈Xn,这时可认定x=G(x)。也就是说,求出的Xn已经可以作为原方程f(x)=0

根的

近似值了。迭代法有精确迭代法和近似迭代法。所谓精确迭代是指算法本身提供了问题的精确解。如对N个数求和、求均值、求方差等,这些问题都适合使用精确迭代法解决。

迭代算法的三个环节迭代初始值迭代公式迭代终止条件

迭代法的特点是:把一个复杂问题的求解过程转化为相对简单的迭代算式,然后重复执行这个简单的算式,直到得到最终解。例:高次方程求根其中:f'(xi)是f(xi)的导数,当

|xi+1–xi|≤ε时xi+1就是方程的近似根。牛顿切线法的思想:

对方程f(x)给定一个初值x0作为方程的近似根,经过若干次迭代后,得到方程较高精度的近似根。牛顿切线法迭代公式为:f(x0)x0

(初值)x1x2牛顿切线法的几何意义x3f(x1)f(x)f(x2)x0,x1,x2,x3,x4,x*…,x*xn,n→∞示例:编写程序,利用牛顿迭代法求方程(书p78,例4-9)例:给定两个正整数m和n,求它们的最大公约数。

求最大公约数的问题一般用辗转相除法(也称欧几里德算法)求解。例如:设m=35,n=15它们的最大公约数的求法如下:r=35Mod15(余数为5)m=15:n=5(m=15,n=5)

r≠0

(r=5)r=15Mod5(余数为0)

r=0

所以

5就是最大公约数二、递推

对于一个数列来说,如果已知它的通项公式,那么,要求出数列中某项之值是十分容易的。但是,在许多情况下,要得到数列的通项公式是很困难的,甚至无法得到。然而,一个有规律的数列的相邻位置上的数项之间通常存在着一定的关系,我们可以借助已知的项,利用特定的关系逐项推算出它的后继项的值……,如此反复,直到找到所需的那一项为止,这样的方法称为递推算法。

递推算法的首要问题是得到相邻的数据项间的关系(即递推关系)。递推算法避开了求通项公项的麻烦,把一个复杂的问题的求解,分解成了连续的若干步简单运算。一般说来,可以将递推算法看成是一种特殊的迭代算法。

所谓递推法,是指利用递推公式,由简到繁逐次迭代求解。

例.斐波那契(Fibonacci)数列公元1202年,商人出身的意大利数学家斐波那契(1170~1250),完成了一部伟大的论著《算法之书》。这部中世纪的名著,把当时发达的阿拉伯和印度的数学方法,经过整理和发展之后介绍到欧洲。在斐波那契的书中,曾提出下列有趣的问题:

假定一对刚出生的小兔一个月就能长成大兔,再过一个月便能生下一对小兔,并且此后每个月都生一对小兔,一年内没有发生死亡。问一对刚出生的兔子,一年内繁殖成多少对兔子?

假定一对刚出生的小兔一个月就能长成大兔,再过一个月便能生下一对小兔,并且此后每个月都生一对小兔,一年内没有发生死亡。问一对刚出生的兔子,一年内繁殖成多少对兔子?逐月推算,可得数列:

1,1,2,3,5,8,13,21,34,55,89,144,233。

这个数列后来便以斐波那契的名字命名。数列中的每一项,则称为“斐波那契数”。第十三位的斐波那契数,即为一对刚出生的小兔,一年内所能繁殖成的兔子的对数,这个数字为233。

斐波那契数列有许多奇妙的性质,其中有一个性质是这样的:奇妙的数学魔术

涉及到的数据1,1,2,3,5,8,13恰是斐波那契数列的前七项。

在现实的自然世界中,《算法之书》里那样的神奇兔子自然是找不到的,但是这并不妨碍大自然使用斐波那契数列。例如:植物“蓟”,它们的头部几乎呈球状。在下面这个图里,标出了两条不同方向的螺旋。我们可以数一下,顺时针旋转的螺旋一共有13条,而逆时针旋转的则有21条。以这样的形式排列种子、花瓣或叶子的植物还有很多(最容易让人想到的是向日葵),事实上许多常见的植物,我们食用的蔬菜如花菜,包心菜,等的排列也具有这个特性,只是不容易观察清楚。尽管这些顺逆螺旋的数目并不固定,但它们也并不随机,它们是斐

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论