1、第五章 选择分支与循环,算法及其描述,1.算法的概念 是解决问题的有序步骤。 2.算法的特征 (1) 有穷性。 (2) 确定性。 (3) 有效性。 (4) 零个或多个输入。 (5) 至少有一个输出。,3.算法的描述 (1)自然语言文字冗长、表达不确切、二义性。 (2)流程图图形方法,直观、形象、易于理解,应用广泛。 (3)N-S图是流程图的发展,去掉了流程线,算法都表示在一个矩形框内。,4.三种基本控制结构 (1)顺序结构 在顺序结构中,算法的每一步操作都是按从上到下的线性次序执行的。 (2)选择结构 又称分支结构,根据给出的条件,选择执行一个分支。因此,在选择结构中,必然包含了条件判断。 (
2、3)循环结构 又称重复执行结构。根据给出的条件,判断是否重复执行某一组操作。,基本的循环结构有两种:当循环和直到循环。 当循环:首先判断条件是否成立,若成立,执行循环体再判断条件,决定是否继续进行循环;若不成立,跳过这组操作,执行此循环结构后面的操作。 直到循环:首先执行循环体,然后判断条件是否成立,若成立,则继续进行循环操作;若不成立,执行此循环结构后面的操作。在程序设计中,算法是由一系列的控制结构构成,每一个控制结构又由若干个语句组成。语句是程序中有确切含义的基本单位,也是构成程序的基本成分,程序功能是由一条条语句的执行来实现的,可把语句视为命令。,5.1.1分支结构1. IfThen语句
3、(单分支结构)If Then语句块End If(注意多行if语句要有End If)或 If Then ,例:已知两个数x和y,比较它们的大小,使得x大于y.If xy Thent=xx=yy=tEnd If或 If xy Then t=x: x=y: y=t,2. IfThenElse语句(双分支结构)If ThenElseEnd IfIf Then Else ,3. IfThenElseIf语句(多分支结构)形式: If ThenElseIf Then Else 语句块 n+1 End If,例5.1(补) 已知变量strC中存放了一个字符,判断该字符是字母字符、数字字符还是其它字符。 用多
4、分支结构实现:If Ucase(strC) =“A“ And Ucase (strC) =“0“ And strC =“9“ Then Print strC + “是数字字符“ Else Print strC + “是其它字符“ End If,不管有几个分支,依次判断,当某条件满足,执行相应的语句,其余分支不再执行;若条件都不满足,且有Else子句,则执行该语句块,否则什么也不执行。.ElseIf不能写成 Else If。,计算三角形面积,求三个数中的最大值,三个数排序,:与同类型的下面四种形式之一:具体取值 例: “A”,3,5一组枚举表达式(用逗号分隔) 2,4,6,8 连续的数据范围 6
5、0 To 100 满足某个判决条件 Is 60,5.1.2 Select Case语句(情况语句) 形式:Select Case 变量或表达式Case 表达式列表1语句块1Case 表达式列表2语句块2Case Else语句块n+1End Select,数值型或字符串表达式,例: 变量strC中存放了一个字符,判断该字符类型。用多分支结构实现:If Text1.Text = “A“ And Text1.Text = “a“ And Text1.Text = “0“ And Text1.Text = “9“ Then MsgBox Text1.Text + “是数字字符“, 48, “提示信息“
6、 Else MsgBox Text1.Text + “是其他字符“, 48, “提示信息“ End If 用Select Case语句实现:Select Case Text1.TextCase “a“ To “z“,“A“ To “Z“MsgBox Text1.Text + “是字母字符“, 48, “提示信息“Case “0“ To “9“MsgBox Text1.Text + “是数字字符“, 48, “提示信息“Case ElseMsgBox Text1.Text + “是其他字符“, 48, “提示信息“End Select,5.2循环结构与循环结构语句,Do-Loop For-Nex
7、t,5.2. 1DoLoop循环语句(用于控制循环次数未知) 形式1: Do While|Until 语句块Exit Do 语句块Loop,形式2:Do 语句块Exit Do语句块Loop While|Until ,以求1100的自然数之和为例,比较Do循环的几种形式:,(1) n=1:Sum=0Do While n=100Sum=Sum+nn=n+1LoopPrint “Sum=”; Sum,(2) n=1:Sum=0Do Until n100Sum=Sum+nn=n+1LoopPrint “Sum=”; Sum,(3) n=1:Sum=0Do Sum=Sum+nn=n+1Loop whil
8、e n=100Print “Sum=”; Sum,(4) n=1:Sum=0DoSum=Sum+nn=n+1Loop Until n100Print “Sum=”; Sum,例1:设计用殴几里德算法求解两个自然数的最大公约数,例2:我国有13亿人口,按人口年增长0.8%计算,多少年后我国人口超过26亿。 分析:解此问题可利用Do Loop循环求得,,Private Sub Command1_Click()x = 13n = 0Do While x 26x = x * 1.008n = n + 1LoopPrint “年数:“; n, “人口(亿):“; x End Sub,例:编写程序,对于任
9、意输入的正整数n(n=3),判断其 是否是素数。素数就是质数。用MOD. 如5 MOD 2 =3,5.2.2 For-Next循环结构语句1. For循环语句 (一般用于循环次数已知) 形式For 循环变量初值 to 终值 Step 步长语句块Exit For语句块Next 循环变量,循环变量, =,终值,语句块,Exit For,语句块,循环变量加步长,T,F,循环变量得初值,循环体,例:计算1100的奇数和,程序段如下:Dim i %, s% 等价于: Dim i %, s%s=0 s=0 : i = 1For i = 1 To 100 step 2 re: If i = 100 Then
10、 s = s + i s = s + i Next i i = i +2 GoTo reEnd If,0 初值终值 =0 死循环,循环次数,要注意:出了循环,循环控制变量值的问题。例程序段:For i=2 To 13 Step 3 循环执行次数 Print i , 输出 i的值分别为:Next i 2 5 8 11 Print “I=“; i 出了循环输出为: I=14在循环体内对循环控制变量可多次引用;但最好不要对其赋值,否则影响原来的循环控制规律。,步长,例1:求自然数n的阶乘,例2:输入一个班的学习成绩,统计其中及格的学生人数,并计算出全班的平均分数。学生人数不定,输入负数时截止。,循环
11、的嵌套一个循环体内又包含了一个完整的循环结构称为循环的嵌套.例:打印九九乘法表.For i = 1 To 9For j = 1 To 9se = i Next jPrintNext i,For j = 1 To i,5.2.3 循环的嵌套(多重循环)一个循环体内又包含了一个完整的循环结构称为循环的嵌套.例:打印九九乘法表.,编写程序,输出100200之间的所有素数。,For ii =1 To 10For jj=1 To 20 Next ii Next jj,For ii =1 To 10For ii=1 To 20 Next ii Next ii,For ii =1 To 10For jj=1
12、 To 20 Next jjNext ii,For ii =1 To 10Next iiFor ii =1 To 10Next ii,对于循环的嵌套,要注意以下事项: 内循环变量与外循环变量不能同名; 外循环必须完全包含内循环,不能交叉; 不能从循环体外转向循环体内,反之则可以。 正确 错误,VB提供了一个可以产生01均匀分布的随机数函数Rnd(x)。 其中x决定了生成随机数的方式。 生成某个范围内的随机数,可以使用 Randomize Int(upbound-lowerbound+1)*Rnd+lowerbound),其它辅助控制语句1. Go To 语句形式: Go To 标号|行号作用:
13、无条件地转移到标号或行号指定的那行语句。标号是一个字符序列,行号是一个数字序列。2.Exit语句多种形式: Exit For、Exit Do、Exit Sub、Exit Function等。作用:退出某种控制结构的执行。3. End语句多种形式: End、 End If、 End Select、 End With、 End Type、 End Sub、 End Function、 作用:End结束一个程序的运行;其余表示某个结构的结束,与对应的结构语句配对出现。,习题讲解,1. 在窗体中添加一个命令按钮(Name属性为Command1),然后编写如下代码:Private Sub Command
14、1_Click()s = 0For k = 1 To 3If k = 1 Thenx = 1ElseIf k = 2 Thenx = 2ElseIf k = 3 Thenx = 3Elsex = 4End IfPrint x; s = s + xNext kPrint sEnd Sub 程序运行后,单击命令按钮,输出结果是( ) A)3 3 3 9 B)1 2 1 6 C)1 1 1 3 D)1 2 3 6,2. 在窗体上画一个名称为Command1的命令按钮,然后编写如下事件过程: Private Sub Command1_Click()x=InputBox(“请输入整数“)Select C
15、ase xCase 1,3Print “分支 1“Case Is 4Print “分支 2“Case ElsePrint “Else 分支 “End Select End Sub 程序运行后,如果在输入对话框中输入5,则窗体上显示的是( ) A)分支1 B)分支2 C)Else分支 D)程序出错,3. 在窗体上画一个名称为Command1的命令按钮,然后编写如下事件过程: Private Sub Command1_Click()x = 0n = InputBox(“)For i = 1 To nFor j = 1 To ix = x + 1Next jNext iPrint x End Sub
16、 程序运行后,单击命令按钮,如果输入3,则在窗体上显示的内容是( ). A)3 B)4 C)5 D)6,4. 在窗体(Name属性为Form1)上画两个文本框(其Name属性分别为Text1和Text2)和一个命令按钮(Name 属性为Command1),然后编写如下事件过程: Private Sub Command1_Click()a=Text1.Text+Text2.TextPrint a End Sub 程序运行后,在第一个文本框(Text1)和第二个文本框(Text2)中分别输入123和222,然后单击命令按钮,则输出结果为( )。 A) 123222 B) 321123 C) 345
17、 D) 222123,5. 有如下程序:Private Sub Command1_Click()Dim s as integers=0i=1While i=100s=s+iWendEnd Sub运行后的输出结果是( )。A)5050 B)5051 C)死循环,直到溢出 D)无穷大的数,6. 以下叙述正确的是( )。 A)Select Case语句中的测试表达式可以是任何形式的表达式 B)Select Case语句中的测试表达式只能是数值表达式或字符串表达式 C)在执行Select Case语句时,所有Case子句均按出现的次序被顺序执行 D)如下Select Case语句中的Case表达式是错
18、误的Select Case x Case 1 to 10 End Select,常用算法,算法是对某个问题求解过程的描述。 1. 累加、连乘,1100的5或7的倍数的和 Sum = 0For i = 1 To 100If i Mod 5 = 0 Or i Mod 7 = 0 ThenSum = Sum + iEnd IfNext iPrint Sum,310的乘积 t = 1For i =3 To 10t = t * iNext iPrint t,例1:求自然对数e的近似值,要求其误差小于0.00001,近似公式为:该例题涉及两个问题:(1)用循环结构求级数和的问题。本例根据某项值的精度来控制
19、循环的结束与否。(2)累加:e=e+t 循环体外对累加和的变量清零 e=0连乘:n=n*i 循环体外对连乘积变量置1 n=1,2.穷举法 “穷举法”也称为“枚举法”或“试凑法”,即将可能出现的各种情况一一测试,判断是否满足条件,一般采用循环来实现。 例2: 百元买百鸡问题。假定小鸡每只5角,公鸡每只2元,母鸡每只3元。现在有100元钱要求买100只鸡,编程列出所有可能的购鸡方案。设母鸡、公鸡、小鸡各为x、y、z只,根据题目要求,列出方程为:x+y+z=1003x+2y+0.5z=100 三个未知数,两个方程,此题有若干个解。 解决此类问题采用“试凑法”,把每一种情况都考虑到。方法一:最简单三个
20、未知数利用三重循环来实现。方法二:从三个未知数的关系,利用两重循环来实现。,3.递推法“递推法”又称为“迭代法”,其基本思想是把一个复杂的计算过程转化为简单过程的多次重复。每次重复都从旧值的基础上递推出新值,并由新值代替旧值。 例:猴子吃桃子。小猴在某天摘桃若干个,当天吃掉一半多一个;第二天吃了剩下的桃子的一半多一个;以后每天都吃剩下桃子的一半多一个,到第7天要吃时只剩下一个,问小猴共摘下了多少个桃子? 分析:这是一个“递推”问题,先从最后一天推出倒数第二天的桃子,再从倒数第二天的桃子推出倒数第三天的桃子。设第n天的桃子数为xn,那么它是前一天的桃子数的xn-1 的一半减1,即 xn = xn-1 /2-1,即 xn-1=( xn+1)*2,