VisualBasic5章选择结构与循环结构.ppt_第1页
VisualBasic5章选择结构与循环结构.ppt_第2页
VisualBasic5章选择结构与循环结构.ppt_第3页
VisualBasic5章选择结构与循环结构.ppt_第4页
VisualBasic5章选择结构与循环结构.ppt_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

,第五章 选择结构与循环结构程序设计,5.1 选择结构程序设计 5.2 For循环结构程序设计 5.3 While循环结构程序设计 5.4 Do循环结构程序设计 5.5 多重循环 5.6 综合应用程序举例,在结构化程序设计中,选择结构是最常用的结构之一。其作用是要求系统根据给定的条件是否满足、结果是否成立来选择程序执行的方向. 从书写形式上区分: 单行结构条件语句、块结构条件语句,5.1.1 单行结构条件语句,一.单分支结构: If Then 说明: “条件”通常是关系表达式或逻辑表达式。 “语句” 可以是简单句或复合句 功能:表达式的结果为真时执行语句块,当表达式结果为假时,跳过语句块执行,例51 输入三个数,输出其中最大值。,通过流程图帮助理解和编程。 Private Sub Command1_Click() Dim a!, b!, c!, max! a = InputBox(“请输入第一个数“) b = InputBox(“请输入第二个数“) c = InputBox(“请输入第三个数“) max = a If b max Then max = b If c max Then max = c Print a; “,“; b; “,“; c; “中最大值是:“; max End Sub,思考:已知两个数x和y,比较它们的大小,使得x大于y. If xy Then t=x: x=y: y=t 重要的是学会两个数的交换,若上述语句次序变一下,结果如何?,二、 双分支结构: 格式: If Then Else 功能:若条件成立或为非0值,则执行“语句1”,否则执行语句2。 其中:“条件”通常是关系表达式或逻辑表达式。 “语句1”和“语句2”可以是简单句或复合句。,例:计算分段函数 sinx+x2+1 (x0) y= cosx-x3+3x (x=0) If x0 Then y=sin(x)+Sqr(x2+1) Else y=cos(x)-x3+3*x 用单分支结构: y=cos(x)-x3+3*x If x0 Then y=sin(x)+Sqr(x2+1),5.1.2 块结构条件语句,If Then 语句块1 Else 语句块2 End If,If 条件1 Then 语句块1 ElseIf 条件2 Then 语句块2 ElseIf 条件3 Then 语句块3 Else 语句块n End If,块结构条件语句:,If 条件1 Then 语句块1 ElseIf 条件2 Then 语句块2 ElseIf 条件3 Then 语句块3 Else 语句块n End If,块结构条件语句的功能是: 如果“条件1”为True,则执行“语句块1”;否则如果“条件2”为True,则执行“语句块2”, 否则执行“语句块n”,最后执行End If结束选择。,例题5-2:某商场为了促销,采用购物打折的优惠办法,每位顾客一次购物 (1)1000元以上,按九五折优惠 (2)2000元以上,按九折优惠 (3)3000元以上,按八五折优惠 (4)5000元以上,按八折优惠 编写程序,输入购物款数,计算并输出优惠价。,方法一: Private Sub Command1_Click() Dim x As Single, y As Single x = val(Text1.Text) If x 1000 Then y = x Else If x 2000 Then y = 0.95 * x Else If x 3000 Then y = 0.9 * x Else If x 5000 Then y = 0.85 * x Else y = 0.8 * x End If End If,End If End If Text2.Text = Str(y) End Sub 上面的这个程序出现多次If语句嵌套,程序长,不便阅读。为此VB提供了带ElseIf的块If语句,使程序简化易写。其格式如下: If Then Elself Then Else End If,方法二: Private Sub Command1_Click() Dim x As Single, y As Single x = Val(Text1.Text) If x 1000 Then y = x ElseIf x 2000 Then y = 0.95 * x ElseIf x 3000 Then y = 0.9 * x ElseIf x 5000 Then y = 0.85 * x Else y = 0.8 * x End If Text2.Text = Str(y) End Sub,例53 输入系数a,b和c求二次方程ax2+bx+c=0的实根。 Private Sub Command1_Click() Dim a!, b!, c!, d!, x1!, x2!, x a = Val(InputBox(“请输入系数a:“):b = Val(InputBox(“请输入系数b:“) c = Val(InputBox(“请输入系数c:“):d = b * b - 4 * a * c If d 0 Then x1 = (-b + Sqr(d) / (2 * a): x2 = (-b - Sqr(d) / (2 * a) Print “x1=“; x1, “x2=“; x2 Else If d = 0 Then x = -b / (2 * a): Print “x=“; x Else Print “此方程无实根“ End If End If End Sub Private Sub Command2_Click() End End Sub,例54 给出a,b,c的值,问它们能否构成三角形的3边。如能构成三角形,计算此三角形的面积。 Private Sub Command1_Click() Dim a!, b!, c!, p!, s!:a = Val(InputBox(“请输入第一个数”): b = Val(InputBox(“请输入第二个数”):c = Val(InputBox(“请输入第三个数“) If a 0 And b 0 And c 0 Then If a + b c And b + c a And a + c b Then p = (a + b + c) / 2 s = Sqr(p * (p - a) * (p - b) * (p - c) Print “三角形的边长和面积依次为“; a; b; c; s Else Print “这三个数不能构成三角形的三个边“ End If End If End Sub,两种条件结构语句的异同:,1、条件语句中的条件不仅仅是逻辑表达式或关系表达式,还可以是数值表达式。 2、then 语句仅跟在If语句之后,“语句块”中的语句不能与then在同一行,否则VB认为是一个单行结构的条件语句。 3、块结构条件语句,必须以End if 结束,而单行结构的条件语句不需要end if,5.1.3 情况语句 (更为清晰的多分支结构),使用多分支语句Select Case也可以实现多分支选择。更有效、更易读,并且易于跟踪调试。 Select Case 测试表达式 Case 表达式表1 语句块1 Case 表达式表2 语句块2 . . . Case Else 语句块n End Select,功能: 先计算表达式的值,然后将该值依次与结构中的每个Case的值进行比较,如果该值符合某个Case指定的值条件时,就执行该Case的语句块,然后跳到End Select,从End Select出口。如果没有相符合的Case值,则执行Case Else中的语句块.,功能: 根据“测试表达式”的值,从多个语句块中选择符合条件的一个语句块执行。 说明: 1、“测试表达式”的值与“表达式表列”的值均不匹配的时候,执行case else 子句。 2、测试表达式可以是数值表达式或字符串表达式。 3、Case子句可以是一行或多行语句。 4、“表达式表列”中的表达式必须与测试表达式的类型一致。 5、 表达式表通常是一个具体值(如Case 1),每一个值确定一个分支。,三种方法可以确定设定值: (P110) 1), 当“测试表达式”的值与其中之一相同,就执行该Case子句中的语句块。 Case 1,3,5 表示条件在1,3,5范围内取值 2) To 当“测试表达式”的值落在表达式1和表达式2之间(含自身),则执行该Case子句中的语句块。表达式1 当“测试表达式”的值满足“关系表达式”指定条件时,执行该Case子句中的语句块。(简单条件) Case Is5 表示条件在小于5范围取值 综合:case Is5,-1 to 2,例55 从键盘上输入学生成绩,然后在文件框中显示其等级(按5级计分值输出不及格、及格、中等、良好、优秀)。,Private Sub Command1_Click() Dim score As Integer, strx As String start: score = InputBox(“请输入学生成绩“) Select Case score Case 0 To 59: strx$ = “不及格“ Case 60 To 69: strx$ = “及格“ Case 70 To 79: strx$ = “中等“ Case 80 To 89: strx$ = “良好“ Case 90 To 100: strx$ = “优秀“ Case Else MsgBox “请输入0100范围内的整数” GoTo start End Select Text1.Text = score Text2.Text = strx$ End Sub,例56 商店售货,按购买货物的款数多少分别给予不同优惠折扣如下,编程计算购物款数。,Private Sub Command1_Click() Dim m!, d! m = InputBox(“请输应付款:“) Select Case m Case Is 250: d = 0 Case Is 500: d = 0.05 Case Is 1000: d = 0.075 Case Is 2000: d = 0.1 Case Else: d = 0.15 End Select Text1.Text = Str$(m) Text2.Text = Str$(d) Text3.Text = Str$(m * (1 - d) End Sub Private Sub Command2_Click() End End Sub,5.1.4 IIf函数,格式: Iif(条件,True部分,False部分) 功能:当条件为真时,返回true部分的值为函数值,而当条件为假时,返回False部分的值为函数值。 说明:(内似单行结构) 1、条件是逻辑表达式或关系表达式。 2、True部分和False部分是表达式。 3、True部分和False部分的返回值必须与结果变量类型一致。,例子5-7:,5.1.5 Choose函数形式,适用于简单的多重判断场合,可代替Select Case语句 Choose(数字类型变量,值为1的返回值,值为2的返回值) 例如,Nop是1-4的值,转换成 + 、-、运算符的语句如下: Op= Choose(Nop,“+“,“-“,“,“) 当值为1,返回字符串“+”,然后放入Op变量中,值为2,返回字符串“-”,依次类推;当Nop是1-4的非整数,系统自动取Nop的整数办法在判断; 若Nop不在14之间,函数返回Null值。,* Goto语句,格式:GoTo 功能:把控制转移到“标号”所在的程序行,并从该行开始往下执行。 说明:1、标号是一个标识符或整型数; 2、程序必须给GoTo语句提供唯一的转向入口,入口处格式为:: 3、不能用GoTo语句转向另一个过程。,例55:设计一个程序,从键盘上输入学生的分数,统计其中及格的人数以及总平均分。,5.2 For循环结构程序设计,For循环也称For-Next循环或计数循环,用于循环次数已知的程序结构中. 格式: For 循环变量=初值 To 终值 Step 步长 语句块 Exit For 语句块 Next 循环变量 功能: For循环按确定的次数执行循环体,该次数由循环变量的初值、终值和步长确定的。,循环变量:必须为数值型变量 步长:是指每循环一次,循环变量的值增加的大小。若缺省,取默认值1。值得注意的是:若初值终值,则步长必须为负数,否则为死循环(按Ctrl+Break中止)。 Exit For:退出循环,执行Next的下一条命令 循环次数:n=int (终值初值)/ 步长) +1 For循环结构的流程图如右: (步长为正时。如果步长为负,则是判断循环变量大于等于终值) For 语句和Next语句必需成对出现。,步长为正,例58 求自然数n的阶乘。,Private Sub Form_Click() Dim n%, i%, k% n = InputBox(“请输入n值“) k = 1 For i = 1 To n k = k * i Next i Print n; “!=“; k End Sub,例59 输入一个班的学生成绩(50人内),统计其中及格的学生人数,并计算出全班的平均分数。(P117),Private Sub Command1_Click() Dim score%, i%, passn%, sum%, n% sum = 0: passn = 0: n = 0 For i = 1 To 50 score = InputBox(“请输入学生成绩(输入负数结束)“) If score = 60 Then passn = passn + 1 n = n + 1:sum = sum + score End If Next i Text1.Text = Str$(n):Text2.Text = Str$(passn) Text3.Text = Str$(sum / n) End Sub Private Sub Command2_Click() End End Sub,例子5-10 求11/2+1/3+1/4+1/n 思路:解决这类求部分和问题的关键是找出多项式中的通项,它是Ai=1/I Private Sub Form_Click() Dim n As Integer, a As Single Sum = 0 n = Val(Text1.Text) For i = 1 To n a = 1.0 / i Sum = Sum + a Next i Print n; “项的和是:“; Sum End Sub,注意: 出了循环,循环控制变量值的问题。 例程序段: For i=2 To 13 Step 3 循环执行次数 Print i , 输出 i的值分别为: Next i 2 5 8 11 Print : Print “I=“, i 出了循环输出为: I=14 在循环体内对循环控制变量可多次引用;但最好不要对其赋值,否则影响原来的循环控制规律。(见后),例子 :改变循环控制变量对循环的影响。 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,5.3 While循环,格式: While 条件 循环体 Wend 功能:当给定条件为True时,执行循环体。 说明:1、先对“条件”进行测试,才决定是否执行循环。 2、循环体中应含有对“条件”的修改操作,使循环体能正常结束。否则,会构成死循环。 3、循环可嵌套,不许交叉。每个Wend和最近的While相匹配。,例511 小红今年12岁,她父亲比她大30岁,编程计算出她父亲在几年后比她年龄大一倍,那时父女的年龄各为多少?,Private Sub Form_Click() Dim age As Integer age = 12 While age * 2 age + 30 age = age + 1 Wend Print “经过“; age - 12; “年,小红父女的年龄分别是:“; age + 30; “和“; age End Sub,5.4 Do循环结构程序设计,格式1: Do While|Until Exit Do Loop 格式2: Do Exit Do Loop While|Until,见书,功能:,当循环“条件”为真(While条件)或直到指定的循环结束“条件”为真之前(Until条件)重复执行循环体。,说明:,1、注意While/Until的区别。 2、格式1中,先判断条件,再决定是否执行循环体;格式2中,先执行循环体,再判断条件决定是重复循环还是终止循环。,求1100的自然数之和为例,比较Do循环的几种形式(P120).,例512 编写程序,对任意输入的正整数n(n=3)判断其是否为素数。,Private Sub Form_Click() Dim n%, i%, k% n = InputBox(“请输入一个正整数(=3)“) i = 2: k = Int(n / 2) k=int(sqr(n) Do While i k Then Print n; “是素数“ Else Print n; “不是素数“ End Sub,例513 输入两个正整数,求它们的最大公约数,Private Sub Form_Click() Dim m%, n%, r%, t% m = InputBox(“请输入第一个整数“) n = InputBox(“请输入第二个整数“) If m n Then t = m: m = n: n = t Do r = m Mod n m = n n = r Loop Until r = 0 Print “最大公约数是:“; m End Sub,辗转相除法: (1)对于已知两数m,n,使得mn; (2) m除以n得余数r; (3)若r=0,则n为最大公约数结束;否则执行(4); (4)mn,nr,再重复执行(2) 例 求 m=24 ,n=16 的最大公约数.,514 求方程F(x)=X3-2X-5=0 在区间1.5,2.5上的一个实根(自行看书),5.5 多重循环,在一个循环体内又包含了一个完整的循环,这样的结构称为多重循环或循环的嵌套。在程序设计时,许多问题要用二重或多重循环才能解决。 我们前面学过的For循环、While循环、Do循环都可以互相嵌套,如在ForNext的循环体中可以使用While循环,而在WhileWend的循环体中也可以出现For循环等。 二重循环的执行过程是外循环执行一次,内循环执行一遍,在内循环结束后,再进行下一次外循环,如此反复,直到外循环结束。,分析:观察多项式就会发现,奇数项为正,偶数项为负,各项分子的指数与分母的阶乘数相同,各相邻项指数相差为2。因此,可以设计一个二重循环,内层循环实现每项的计算,外层循环完成对各项的求和。,Private Sub Form_Click() Dim n As Integer, x As Single, y As Single, Sign As Integer Dim Factor As Integer, Xpower As Single x = InputBox(“请输入X:“) n = InputBox(“请输入n:“) y = x 多项式的第一项作为初值 Sign = 1 符号变量初值为1 For i = 2 To n 外循环从2开始累加,一直累加到第N项 Factor = 1 表示阶乘 Xpower = 1 For j = 1 To 2 * i - 1 内循环计算多项式第I项的分子和分母 Factor = Factor * j 计算第I项的分母 Xpower = Xpower * x 计算第i项的分子 Next j Sign = -Sign y = y + Sign * Xpower / Factor 外循环每执行一次累加一项 Next i Print “sinx=“; y End Sub,对于循环的嵌套,要注意以下事项: (1)在多重循环中,各层循环的循环控制变量不能同名。但并列循环的循环控制变量名可以相同,也可以不同。 (2)外循环必须完全包含内循环,不能交叉。,For I=1 to 9 For J=1 to I Print I*J J=J+1 Next I I=I+1 Next J,For I=1 to 9 For I=1 to 10 Print I*I I=I+1 Next I I=I+1 Next I,5.6 常用算法,算法是对某个问题求解过程的描述。 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,思考:若把循环体前面置各变量初值的语句放在循环体内,程序运行时会产生什么情况?,例5.14(补) 求自然对数e的近似值,要求其误差小于0.00001,近似公式为: 该例题涉及两个问题: (1)用循环结构求级数和的问题。本例根据某项值的精度来控制循环的结束与否。 (2)累加:e=e+t 循环体外对累加和的变量清零 e=0 连乘:n=n*i 循环体外对连乘积变量置1 n=1,Private Sub Form_Click() Dim i%, n e End Sub,2. 求素数 素数是一个大于2,除了1和自身外,不能被任何整数整除的整数。 判别某数m是否为素数最简单的方法是: 对于m ,从 i=2,3,m-1判别m能否被i整除,只要有一个能整除,m不是素数,否则m是素数。 例5.15(补) 求100以内的素数。代码如下: 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,m是否为素数,求100以内的素数,思考: 此例用Go To语句对非素数不作判断,若不用GoTo语句,如何修改程序?,3.穷举法 “穷举法”也称为“枚举法”或“试凑法”,即将可能出现的各种情况一一测试,判断是否满足条件,一般采用循环来实现。 例5.16(补) 百元买百鸡问题。假定小鸡每只5角,公鸡每只2元,母鸡每只3元。现在有100元钱要求买100只鸡,编程列出所有可能的购鸡方案。 设母鸡、公鸡、小鸡各为x、y、z只,根据题目要求,列出方程为: x+y+z=100 3x+2y+0.5z=100 三个未知数,两个方程,此题有若干个解。 解决此类问题采用“试凑法”,把每一种情况都考虑到。 方法一:最简单三个未知数利用三重循环来实现。 方法二:从三个未知数的关系,利用两重循环来实现。,例子:百钱买白鸡问题 一只公鸡值5钱,一只母鸡值三钱,三只小鸡值1钱,问一百元能买100只鸡,公鸡/母鸡/小鸡各多少只。小鸡 利用方程,列出了两个等式: 5x+3y+z/3=100 X+y+z=100 无穷解。,Private Sub Form_Click() Print “cock“, “hen“, “chick“ For x = 0 To 100 For y = 0 To 100 z = 100 - x - y If 5 * x + 3 * y + z / 3 = 100 Then Print x, y, z Next y Next x End Sub 执行100X100次循环,可改进:20 (34X),4.递推法 “递推法”又称为“迭代法”,其基本思想是把一个复杂的计算过程转化为简单过程的多次重复。每次重复都从旧值的基础上递推出新值,并由新值代替旧值。 例5.17(补) 猴子吃桃子。小猴在某天摘桃若干个,当天吃掉一半多一个;第二天吃了剩下的桃子的一半多一个;以后每天都吃剩下桃子的一半多一个,到第7天要吃时只剩下一个,问小猴共摘下了多少个桃子? 分析:这是一个“递推”问题,先从最后一天推出倒数第二天的桃子,再从倒数第二天的桃子推出倒数第三天的桃子。设第n天的桃子数为xn,那么它是前一天的桃子数的xn-1 的一半减1,即 xn = xn-1 /2-1,即 xn-1=( xn+1)*2,5.最小、最大值 在若干个数中求最大值,一般先假设一个较小的数为最大值的初值,若无法估计较小的值,则取第一个数为最大值的初值;然后将每一个数与最大值比较,若该数大于最大值,将该数替换为最大值;依次逐一比较。 例5.18(补) 随机产生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,5-19 编写程序,打印如下数字金子塔,Private Sub Form_Click() For i = 0 To 8 Print Tab(27 - 3 * i); 确定每行的起点 For j = 1 To i 打印一行的前半部分 Print j; Next j For j = i + 1 To 1 Step -1 打印一行的后半部分 Print j; Next j Print Next i End Sub,常 见 错 误 1. 不循环或死循环的问题 主要是循环条件、循环初值、循环终值、循环步长的设置有问题。 2. 循环结构中缺少配对的结束语句 For 缺少 配对的Next 3. 循环嵌套时,内外循环交叉 4. 累加、连乘时,存放累加、连乘结果的变量赋初值问题 (1)一重循环 在一重循环中,存放累加、连乘结果的变量初值设置应在循环语句前。 (2)多重循环 这要视具体问题分别对待。,516 编写程序,输出100200的所有的素数,Private Sub Form_Click() Dim Number As Integer, x As Integer, i As Integer, k As Integer Number = 0 For x = 101 To 199 Step 2 外循环直接排除偶数,只对奇数进行判断 i = 2 k = Int(x / 2) 除数除到此数的1/2就可以了 Do While i k Then Print x, Number = Number + 1 统计素数的个数 If Number Mod 5 = 0 Then Print 每输出5个数就换行 End If Next x End Sub,综合应用举例,例子:517 编写程序,打印如下的乘积表,Private Sub Form_Click() FontSize = 20 Print Tab(14); “乘积表“ ForeColor = &HFF& 设置输出字符为红色 FontSize = 12 Print Print “ *“, 输出第一行 For x = 3 To 12 Step 3 Print x, Next x Print Print For y = 15 To 20 输出第一列 ForeColor = &HFF& Print y, ForeColor = &H80000012 设为黑色 For x = 3 To 12 Step 3 输出乘积 Print x * y, Next x Print Next y End Sub,518 一个两位数的正整数,如果将其各位数与十位数对调所生成的数称为对调数,如28是82的对调数。 现给定一个两位的正整数,请找到另一个两位的

温馨提示

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

评论

0/150

提交评论