VisualBasic5章选择结构与循环结构.ppt

上传人:za****8 文档编号:6360983 上传时间:2020-02-23 格式:PPT 页数:64 大小:830.51KB
返回 下载 相关 举报
VisualBasic5章选择结构与循环结构.ppt_第1页
第1页 / 共64页
VisualBasic5章选择结构与循环结构.ppt_第2页
第2页 / 共64页
VisualBasic5章选择结构与循环结构.ppt_第3页
第3页 / 共64页
点击查看更多>>
资源描述
第五章选择结构与循环结构程序设计 5 1选择结构程序设计5 2For循环结构程序设计5 3While循环结构程序设计5 4Do循环结构程序设计5 5多重循环5 6综合应用程序举例 在结构化程序设计中 选择结构是最常用的结构之一 其作用是要求系统根据给定的条件是否满足 结果是否成立来选择程序执行的方向 从书写形式上区分 单行结构条件语句 块结构条件语句 5 1 1单行结构条件语句 一 单分支结构 IfThen说明 条件 通常是关系表达式或逻辑表达式 语句 可以是简单句或复合句功能 表达式的结果为真时执行语句块 当表达式结果为假时 跳过语句块执行 例5 1输入三个数 输出其中最大值 通过流程图帮助理解和编程 PrivateSubCommand1 Click Dima b c max a InputBox 请输入第一个数 b InputBox 请输入第二个数 c InputBox 请输入第三个数 max aIfb maxThenmax bIfc maxThenmax cPrinta b c 中最大值是 maxEndSub 思考 已知两个数x和y 比较它们的大小 使得x大于y Ifx yThent x x y y t重要的是学会两个数的交换 若上述语句次序变一下 结果如何 二 双分支结构 格式 IfThenElse功能 若条件成立或为非0值 则执行 语句1 否则执行语句2 其中 条件 通常是关系表达式或逻辑表达式 语句1 和 语句2 可以是简单句或复合句 例 计算分段函数sinx x2 1 x 0 y cosx x3 3x x 0 Ifx0Theny sin x Sqr x 2 1 Elsey cos x x 3 3 x用单分支结构 y cos x x 3 3 xIfx0Theny sin x Sqr x 2 1 5 1 2块结构条件语句 IfThen语句块1Else语句块2EndIf If条件1Then语句块1 ElseIf条件2Then语句块2 ElseIf条件3Then语句块3 Else语句块n EndIf 块结构条件语句 If条件1Then语句块1 ElseIf条件2Then语句块2 ElseIf条件3Then语句块3 Else语句块n EndIf 块结构条件语句的功能是 如果 条件1 为True 则执行 语句块1 否则如果 条件2 为True 则执行 语句块2 否则执行 语句块n 最后执行EndIf结束选择 例题5 2 某商场为了促销 采用购物打折的优惠办法 每位顾客一次购物 1 1000元以上 按九五折优惠 2 2000元以上 按九折优惠 3 3000元以上 按八五折优惠 4 5000元以上 按八折优惠编写程序 输入购物款数 计算并输出优惠价 方法一 PrivateSubCommand1 Click DimxAsSingle yAsSinglex val Text1 Text Ifx 1000Theny xElseIfx 2000Theny 0 95 xElseIfx 3000Theny 0 9 xElseIfx 5000Theny 0 85 xElsey 0 8 xEndIfEndIf EndIfEndIfText2 Text Str y EndSub上面的这个程序出现多次If语句嵌套 程序长 不便阅读 为此VB提供了带ElseIf的块If语句 使程序简化易写 其格式如下 IfThenElselfThen Else EndIf 方法二 PrivateSubCommand1 Click DimxAsSingle yAsSinglex Val Text1 Text Ifx 1000Theny xElseIfx 2000Theny 0 95 xElseIfx 3000Theny 0 9 xElseIfx 5000Theny 0 85 xElsey 0 8 xEndIfText2 Text Str y EndSub 例5 3输入系数a b和c求二次方程ax2 bx c 0的实根 PrivateSubCommand1 Click Dima b c d x1 x2 xa Val InputBox 请输入系数a b Val InputBox 请输入系数b c Val InputBox 请输入系数c d b b 4 a cIfd 0Thenx1 b Sqr d 2 a x2 b Sqr d 2 a Print x1 x1 x2 x2ElseIfd 0Thenx b 2 a Print x xElsePrint 此方程无实根 EndIfEndIfEndSubPrivateSubCommand2 Click EndEndSub 例5 4给出a b c的值 问它们能否构成三角形的3边 如能构成三角形 计算此三角形的面积 PrivateSubCommand1 Click Dima b c p s a Val InputBox 请输入第一个数 b Val InputBox 请输入第二个数 c Val InputBox 请输入第三个数 Ifa 0Andb 0Andc 0ThenIfa b cAndb c aAnda c bThenp a b c 2s Sqr p p a p b p c Print 三角形的边长和面积依次为 a b c sElsePrint 这三个数不能构成三角形的三个边 EndIfEndIfEndSub 两种条件结构语句的异同 1 条件语句中的条件不仅仅是逻辑表达式或关系表达式 还可以是数值表达式 2 then语句仅跟在If语句之后 语句块 中的语句不能与then在同一行 否则VB认为是一个单行结构的条件语句 3 块结构条件语句 必须以Endif结束 而单行结构的条件语句不需要endif 5 1 3情况语句 更为清晰的多分支结构 使用多分支语句SelectCase也可以实现多分支选择 更有效 更易读 并且易于跟踪调试 SelectCase测试表达式Case表达式表1语句块1 Case表达式表2语句块2 CaseElse 语句块n EndSelect 功能 先计算表达式的值 然后将该值依次与结构中的每个Case的值进行比较 如果该值符合某个Case指定的值条件时 就执行该Case的语句块 然后跳到EndSelect 从EndSelect出口 如果没有相符合的Case值 则执行CaseElse中的语句块 功能 根据 测试表达式 的值 从多个语句块中选择符合条件的一个语句块执行 说明 1 测试表达式 的值与 表达式表列 的值均不匹配的时候 执行caseelse子句 2 测试表达式可以是数值表达式或字符串表达式 3 Case子句可以是一行或多行语句 4 表达式表列 中的表达式必须与测试表达式的类型一致 5 表达式表通常是一个具体值 如Case1 每一个值确定一个分支 三种方法可以确定设定值 P110 1 当 测试表达式 的值与其中之一相同 就执行该Case子句中的语句块 Case1 3 5 表示条件在1 3 5范围内取值2 To当 测试表达式 的值落在表达式1和表达式2之间 含自身 则执行该Case子句中的语句块 表达式1当 测试表达式 的值满足 关系表达式 指定条件时 执行该Case子句中的语句块 简单条件 CaseIs 5 表示条件在小于5范围取值综合 caseIs 5 1to2 例5 5从键盘上输入学生成绩 然后在文件框中显示其等级 按5级计分值输出不及格 及格 中等 良好 优秀 PrivateSubCommand1 Click DimscoreAsInteger strxAsStringstart score InputBox 请输入学生成绩 SelectCasescoreCase0To59 strx 不及格 Case60To69 strx 及格 Case70To79 strx 中等 Case80To89 strx 良好 Case90To100 strx 优秀 CaseElseMsgBox 请输入0 100范围内的整数 GoTostartEndSelectText1 Text scoreText2 Text strx EndSub 例5 6商店售货 按购买货物的款数多少分别给予不同优惠折扣如下 编程计算购物款数 PrivateSubCommand1 Click Dimm d m InputBox 请输应付款 SelectCasemCaseIs 250 d 0CaseIs 500 d 0 05CaseIs 1000 d 0 075CaseIs 2000 d 0 1CaseElse d 0 15EndSelectText1 Text Str m Text2 Text Str d Text3 Text Str m 1 d EndSubPrivateSubCommand2 Click EndEndSub 5 1 4IIf函数 格式 Iif 条件 True部分 False部分 功能 当条件为真时 返回true部分的值为函数值 而当条件为假时 返回False部分的值为函数值 说明 内似单行结构 1 条件是逻辑表达式或关系表达式 2 True部分和False部分是表达式 3 True部分和False部分的返回值必须与结果变量类型一致 例子5 7 5 1 5Choose函数形式 适用于简单的多重判断场合 可代替SelectCase语句Choose 数字类型变量 值为1的返回值 值为2的返回值 例如 Nop是1 4的值 转换成 运算符的语句如下 Op Choose Nop 当值为1 返回字符串 然后放入Op变量中 值为2 返回字符串 依次类推 当Nop是1 4的非整数 系统自动取Nop的整数办法在判断 若Nop不在1 4之间 函数返回Null值 Goto语句 格式 GoTo功能 把控制转移到 标号 所在的程序行 并从该行开始往下执行 说明 1 标号是一个标识符或整型数 2 程序必须给GoTo语句提供唯一的转向入口 入口处格式为 3 不能用GoTo语句转向另一个过程 例5 5 设计一个程序 从键盘上输入学生的分数 统计其中及格的人数以及总平均分 5 2For循环结构程序设计 For循环也称For Next循环或计数循环 用于循环次数已知的程序结构中 格式 For循环变量 初值To终值 Step步长 语句块 ExitFor 语句块Next循环变量功能 For循环按确定的次数执行循环体 该次数由循环变量的初值 终值和步长确定的 循环变量 必须为数值型变量步长 是指每循环一次 循环变量的值增加的大小 若缺省 取默认值1 值得注意的是 若初值 终值 则步长必须为负数 否则为死循环 按Ctrl Break中止 ExitFor 退出循环 执行Next的下一条命令循环次数 n int 终值 初值 步长 1For循环结构的流程图如右 步长为正时 如果步长为负 则是判断循环变量大于等于终值 For语句和Next语句必需成对出现 步长为正 例5 8求自然数n的阶乘 PrivateSubForm Click Dimn i k n InputBox 请输入n值 k 1Fori 1Tonk k iNextiPrintn kEndSub 例5 9输入一个班的学生成绩 50人内 统计其中及格的学生人数 并计算出全班的平均分数 P117 PrivateSubCommand1 Click Dimscore i passn sum n sum 0 passn 0 n 0Fori 1To50score InputBox 请输入学生成绩 输入负数结束 Ifscore 60Thenpassn passn 1n n 1 sum sum scoreEndIfNextiText1 Text Str n Text2 Text Str passn Text3 Text Str sum n EndSubPrivateSubCommand2 Click EndEndSub 例子5 10求1 1 2 1 3 1 4 1 n思路 解决这类求部分和问题的关键是找出多项式中的通项 它是Ai 1 IPrivateSubForm Click DimnAsInteger aAsSingleSum 0n Val Text1 Text Fori 1Tona 1 0 iSum Sum aNextiPrintn 项的和是 SumEndSub 注意 出了循环 循环控制变量值的问题 例程序段 Fori 2To13Step3循环执行次数Printi 输出i的值分别为 Nexti25811Print Print I i出了循环输出为 I 14在循环体内对循环控制变量可多次引用 但最好不要对其赋值 否则影响原来的循环控制规律 见后 例子 改变循环控制变量对循环的影响 PrivateSubCommand1 Click j 0Fori 1To20Step2i i 3j j 1Print 第 j 次循环i iNextiPrint 退出循环后i iEndSub传统情况 i 1 3 5 7 9 11 13 15 17 19现在 i 4 9 14 19 5 3While循环 格式 While条件 循环体 Wend功能 当给定条件为True时 执行循环体 说明 1 先对 条件 进行测试 才决定是否执行循环 2 循环体中应含有对 条件 的修改操作 使循环体能正常结束 否则 会构成死循环 3 循环可嵌套 不许交叉 每个Wend和最近的While相匹配 例5 11小红今年12岁 她父亲比她大30岁 编程计算出她父亲在几年后比她年龄大一倍 那时父女的年龄各为多少 PrivateSubForm Click DimageAsIntegerage 12Whileage 2age 30age age 1WendPrint 经过 age 12 年 小红父女的年龄分别是 age 30 和 ageEndSub 5 4Do循环结构程序设计 格式1 Do While Until ExitDo Loop格式2 Do ExitDo Loop While Until 见书 功能 当循环 条件 为真 While条件 或直到指定的循环结束 条件 为真之前 Until条件 重复执行循环体 说明 1 注意While Until的区别 2 格式1中 先判断条件 再决定是否执行循环体 格式2中 先执行循环体 再判断条件决定是重复循环还是终止循环 求1 100的自然数之和为例 比较Do循环的几种形式 P120 例5 12编写程序 对任意输入的正整数n n 3 判断其是否为素数 PrivateSubForm Click Dimn i k n InputBox 请输入一个正整数 3 i 2 k Int n 2 k int sqr n DoWhileikThenPrintn 是素数 ElsePrintn 不是素数 EndSub 例5 13输入两个正整数 求它们的最大公约数 PrivateSubForm Click Dimm n r t m InputBox 请输入第一个整数 n InputBox 请输入第二个整数 Ifm nThent m m n n tDor mModnm nn rLoopUntilr 0Print 最大公约数是 mEndSub 辗转相除法 1 对于已知两数m n 使得m n 2 m除以n得余数r 3 若r 0 则n为最大公约数结束 否则执行 4 4 m n n r 再重复执行 2 例求m 24 n 16的最大公约数 5 14求方程F x X3 2X 5 0在区间 1 5 2 5 上的一个实根 自行看书 5 5多重循环 在一个循环体内又包含了一个完整的循环 这样的结构称为多重循环或循环的嵌套 在程序设计时 许多问题要用二重或多重循环才能解决 我们前面学过的For循环 While循环 Do循环都可以互相嵌套 如在For Next的循环体中可以使用While循环 而在While Wend的循环体中也可以出现For循环等 二重循环的执行过程是外循环执行一次 内循环执行一遍 在内循环结束后 再进行下一次外循环 如此反复 直到外循环结束 分析 观察多项式就会发现 奇数项为正 偶数项为负 各项分子的指数与分母的阶乘数相同 各相邻项指数相差为2 因此 可以设计一个二重循环 内层循环实现每项的计算 外层循环完成对各项的求和 PrivateSubForm Click DimnAsInteger xAsSingle yAsSingle SignAsIntegerDimFactorAsInteger XpowerAsSinglex InputBox 请输入X n InputBox 请输入n y x 多项式的第一项作为初值Sign 1 符号变量初值为 1Fori 2Ton 外循环从2开始累加 一直累加到第N项Factor 1 表示阶乘Xpower 1Forj 1To2 i 1 内循环计算多项式第I项的分子和分母Factor Factor j 计算第I项的分母Xpower Xpower x 计算第i项的分子NextjSign Signy y Sign Xpower Factor 外循环每执行一次累加一项NextiPrint sinx yEndSub 对于循环的嵌套 要注意以下事项 1 在多重循环中 各层循环的循环控制变量不能同名 但并列循环的循环控制变量名可以相同 也可以不同 2 外循环必须完全包含内循环 不能交叉 ForI 1to9ForJ 1toIPrintI JJ J 1NextII I 1NextJ ForI 1to9ForI 1to10PrintI II I 1NextII I 1NextI 5 6常用算法 算法是对某个问题求解过程的描述 1 累加 连乘 1 100的5或7的倍数的和Sum 0Fori 1To100IfiMod5 0OriMod7 0ThenSum Sum iEndIfNextiPrintSum 3 10的乘积t 1Fori 3To10t t iNextiPrintt 思考 若把循环体前面置各变量初值的语句放在循环体内 程序运行时会产生什么情况 例5 14 补 求自然对数e的近似值 要求其误差小于0 00001 近似公式为 该例题涉及两个问题 1 用循环结构求级数和的问题 本例根据某项值的精度来控制循环的结束与否 2 累加 e e t循环体外对累加和的变量清零e 0连乘 n n i循环体外对连乘积变量置1n 1 PrivateSubForm Click Dimi neEndSub 2 求素数素数是一个大于2 除了1和自身外 不能被任何整数整除的整数 判别某数m是否为素数最简单的方法是 对于m 从i 2 3 m 1判别m能否被i整除 只要有一个能整除 m不是素数 否则m是素数 例5 15 补 求100以内的素数 代码如下 Form 2To100Fori 2Tom 1If mModi 0ThenGoToNotNextMNextiPrintm NotNextM Nextm m是否为素数 求100以内的素数 思考 此例用GoTo语句对非素数不作判断 若不用GoTo语句 如何修改程序 3 穷举法 穷举法 也称为 枚举法 或 试凑法 即将可能出现的各种情况一一测试 判断是否满足条件 一般采用循环来实现 例5 16 补 百元买百鸡问题 假定小鸡每只5角 公鸡每只2元 母鸡每只3元 现在有100元钱要求买100只鸡 编程列出所有可能的购鸡方案 设母鸡 公鸡 小鸡各为x y z只 根据题目要求 列出方程为 x y z 1003x 2y 0 5z 100三个未知数 两个方程 此题有若干个解 解决此类问题采用 试凑法 把每一种情况都考虑到 方法一 最简单三个未知数利用三重循环来实现 方法二 从三个未知数的关系 利用两重循环来实现 例子 百钱买白鸡问题一只公鸡值5钱 一只母鸡值三钱 三只小鸡值1钱 问一百元能买100只鸡 公鸡 母鸡 小鸡各多少只 小鸡利用方程 列出了两个等式 5x 3y z 3 100X y z 100无穷解 PrivateSubForm Click Print cock hen chick Forx 0To100Fory 0To100z 100 x yIf5 x 3 y z 3 100ThenPrintx y zNextyNextxEndSub执行100X100次循环 可改进 20 34 X 4 递推法 递推法 又称为 迭代法 其基本思想是把一个复杂的计算过程转化为简单过程的多次重复 每次重复都从旧值的基础上递推出新值 并由新值代替旧值 例5 17 补 猴子吃桃子 小猴在某天摘桃若干个 当天吃掉一半多一个 第二天吃了剩下的桃子的一半多一个 以后每天都吃剩下桃子的一半多一个 到第7天要吃时只剩下一个 问小猴共摘下了多少个桃子 分析 这是一个 递推 问题 先从最后一天推出倒数第二天的桃子 再从倒数第二天的桃子推出倒数第三天的桃子 设第n天的桃子数为xn 那么它是前一天的桃子数的xn 1的一半减1 即xn xn 1 2 1 即xn 1 xn 1 2 5 最小 最大值在若干个数中求最大值 一般先假设一个较小的数为最大值的初值 若无法估计较小的值 则取第一个数为最大值的初值 然后将每一个数与最大值比较 若该数大于最大值 将该数替换为最大值 依次逐一比较 例5 18 补 随机产生10个100 200之间的整数 求最大值 PrivateSubCommand1 Click Max 100Fori 1To10 x Int Rnd 101 100 Printx Ifx MaxThenMax xNextiPrintPrint 最大值 MaxEndSub 5 19编写程序 打印如下数字金子塔 PrivateSubForm Click Fori 0To8PrintTab 27 3 i 确定每行的起点Forj 1Toi 打印一行的前半部分Printj NextjForj i 1To1Step 1 打印一行的后半部分Printj NextjPrintNextiEndSub 常见错误1 不循环或死循环的问题主要是循环条件 循环初值 循环终值 循环步长的设置有问题 2 循环结构中缺少配对的结束语句For缺少配对的Next3 循环嵌套时 内外循环交叉4 累加 连乘时 存放累加 连乘结果的变量赋初值问题 1 一重循环在一重循环中 存放累加 连乘结果的变量初值设置应在循环语句前 2 多重循环这要视具体问题分别对待 5 16编写程序 输出100 200的所有的素数 PrivateSubForm Click DimNumberAsInteger xAsInteger iAsInteger kAsIntegerNumber 0Forx 101To199Step2 外循环直接排除偶数 只对奇数进行判断i 2k Int x 2 除数除到此数的1 2就可以了DoWhileikThenPrintx Number Number 1 统计素数的个数IfNumberMod5 0ThenPrint 每输出5个数就换行EndIfNextxEndSub 综合应用举例 例子 5 17编写程序 打印如下的乘积表 PrivateSubForm Click FontSize 20PrintTab 14 乘积表 ForeColor HFF 设置输出字符为红色FontSize 12PrintPrint 输出第一行Forx 3To12Step3Printx NextxPrintPrintFory 15To20 输出第一列ForeColor HFF Printy ForeColor H80000012 设为黑色Forx 3To12Step3 输出乘积Printx y NextxPrintNextyEndSub 5 18一个两位数的正整数 如果将其各位数与十位数对调所生成的数称为对调数 如28是82的对调数 现给定一个两位的正整数 请找到另一个两位的正整数 使这两个数之和等于他们各自的对调数之和 如 56 32 65 23问题 如何求对调数为Xf Xmod10 10 int x 10 PrivateSubForm Click DimxAsInteger YAsInteger XfAsInteger YfAsIntegerDox Val InputBox 请输入一个2为正整数 LoopWhile x99 Xf xMod10 10 Int x 10 ForY 10To99Yf YMod10 10 Int Y 10 Ifx Y Xf YfThenPrintx Y Xf Yf x YEndIfNextYEndSub 5 21求整数351 432之间既不能被3整除 又不能被8整除的数的个数及这些数之和 分析 一层循环表示351 432之间的整数 对循环中每一个数进行判断 符合要求的进行相应处理 PrivateSubForm Click DimiAsInteger nAsInteger sumAsLongFori 351To432If iMod30 And iMod80 Thenn n 1Printi Spc 4 IfnMod5 0ThenPrintsum sum iEndIfNextiPrintPrint 数的个数是 nPrint 数的和是 sumEndSub 5 22在 200 900 范围内同时满足以下两个条件的十进制数 1 其个位数字与十位数字之和除以10所得的余数是百位数字2 该数是素数问有几个这样的数 问题分解 如何得到个位 十位和百位上的数如何判断素数 PrivateSubForm Click DimiAsInteger j g s b DimisprimeAsBoolean numberAsIntegernumber 0Fori 200To900g iMod10 获得个位上的数s iMod100 10 获得十位上的数b i 100 获得百位上的数If b g s Mod10 Thenisprime TrueForj 2Toi 1If iModj 0 Thenisprime FalseExitForEndIfNextjIfisprimeThennumber number 1Printi IfnumberMod5 0ThenPrintEndIfEndIfNextiPrintPrint 这样的数的个数为 numberEndSub
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!