第三章程序的基本控制结构ppt课件.ppt_第1页
第三章程序的基本控制结构ppt课件.ppt_第2页
第三章程序的基本控制结构ppt课件.ppt_第3页
第三章程序的基本控制结构ppt课件.ppt_第4页
第三章程序的基本控制结构ppt课件.ppt_第5页
已阅读5页,还剩63页未读 继续免费阅读

下载本文档

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

文档简介

冯俊2009 8 1 程序设计基础 目录 第一章绪论第二章简单数据类型与表达式第三章程序的基本控制结构第四章构造数据类型第五章结构化程序设计第六章基本数据结构第七章算法设计中的常用方法第八章以解决问题为中心 第三章程序的基本控制结构 3 1程序的基本控制结构3 2顺序结构程序设计3 3选择结构程序设计3 4循环结构程序设计3 5课程设计题目 求解方程的根 3 1程序的基本控制结构 已经证明 只需要使用三种基本控制结构就可以构建任何复杂程序或算法 这3种基本控制结构是 顺序结构 选择结构和循环结构 3 1 13种基本控制结构3 1 2对GOTO关于语句的认识 3 1 13种基本控制结构 一 一个程序包含一系列的执行语句 每个语句使计算机完成一定的操作 在编制程序时 要仔细周密地考虑各语句的排列次序 语句的排列次序不仅决定程序的正确性 而且影响程序的可读性和可维护性 要使程序清晰地表达算法的设计思想 具有良好的可读性 编制程序时应当遵循人们的思维习惯 尽量避免不必要的无条件转向 最好能使程序的执行顺序从上到下依次进行 程序结构包括数据结构和控制结构两个方面 下面主要讨论程序的3种基本的控制结构 3 1 13种基本控制结构 二 程序的基本结构有三种 顺序结构 选择结构 循环结构 顺序结构是最基本 最简单的程序组织结构 任何一个程序从整体上看 都可以认为是一个顺序结构 选择结构和循环结构是局部的 它们中的命令序列又可看成是顺序结构 这也体现了 自顶向下 逐步求精 的结构化程序设计思想 3 1 13种基本控制结构 三 1 顺序结构顺序结构是程序执行的缺省结构 即按照语句 命令 的书写顺序依次执行 如 可将一个程序划分为输入部分 处理部分和输出部分 用流程图描述如下 3 1 13种基本控制结构 四 2 选择 分支 结构选择结构是在程序执行过程中根据不同的条件 选择执行不同的语句序列 三种选择结构的结构化流程图如下 1 单向分支 2 双向分支 3 多向分支 3 1 13种基本控制结构 五 选择结构又称为判断结构或分支结构或条件结构 单向分支结构 程序设计语言中对应的是IF THEN ENDIF结构 双向分支结构 程序设计语言中对应的是IF THEN ELSE ENDIF结构 多向分支结构 根据情况k决定执行那一个命令序列 当k的取值在1到N之间时 就执行命令序列k 多向分支结构可以通过双向分支结构的嵌套来实现 不同的程序设计语言对允许嵌套的层次也不相同 3 1 13种基本控制结构 六 3 循环结构循环结构可分为 当型循环 直到型循环和步长型循环 而步长型循环实质上是前两种结构的一种特殊情况 它们的结构化流程图如下 循环结构就是使一段程序代码重复执行 直到某个条件不成立 或成立 为止 这个条件称为循环退出条件 在设计时必须要设计好循环退出条件 以免陷入死循环 当型循环结构 直到型循环结构 3 1 13种基本控制结构 七 这三种基本结构有一个共同的特征 即每种结构都严格地只有一个入口和一个出口 如果组成程序的各个分结构之间都只是如此简单的接口关系 那么 就可以相对独立地设计各个子结构 静态地分析控制关系 并验证它们的正确性 若某一子结构需要修改 只要接口不变 就不会影响到其他子结构乃至整个程序 因此 具有这样结构的程序是好结构程序 3 1 2对GOTO关于语句的认识 一 1968年Dijkstra在ACM通讯上发表了一篇题为 GOTO语句是有害的 文章 引起了软件界的一场大辩论 主张在程序设计语言中取消GOTO语句的人 其主要理由是 程序的执行是个动态的过程 如程序中不加限制地使用GOTO语句 这就使程序的静态结构和动态执行情况差异甚大 使得程序难以阅读和理解 容易出错 也难以查错 由于破坏了程序基本结构的单入口单出口原则 使程序的正确性证明复杂化 取消GOTO语句 可加强程序静态结构与动态执行情况的一致性 事实上 取消GOTO语句所带来的好处远不止这些 另一些人提出不同观点 认为GOTO语句从概念上来说是非常简明的 使用GOTO 可以提高程序的执行效率 3 1 2对GOTO关于语句的认识 二 这场辩论一直持续了数年 直到1974年Knuth发表了一篇题为 带GOTO语句的结构程序设计 的文章后 才结束了这场争论 他概括地证实了以下三点 滥用GOTO语句确实有害 应该尽量避免 完全避免使用GOTO语句也并非是个明智方法 在有些程序的有些地方使用了GOTO语句以后 将会使程序流程更清晰 效率更高 争论的焦点不应放在要不要取消GOTO语句上 而应该放在采用什么样的程序结构上 因为良好的程序结构是使程序易于理解 易于维护的重要保证 3 1 2对GOTO关于语句的认识 三 滥用GOTO语句确实有害 在程序中使用GOTO语句使得程序的逻辑文本与程序的动态执行不相对应 使程序既不易读 也不易纠错和验证 Dijkstra承认程序的可读性和效率之间有着反作用 如何避免滥用GOTO语句 理论上取消GOTO语句 消除GOTO语句的三种方法 重复编码方法 状态变量方法 转换成循环嵌套选择结构 和布尔标志技术 产生新的语言机制及新型程序设计语言 在编程过程中重要的是要考虑程序的结构 程序的清晰度及可读性 需要的是在编程过程中很少想到用GOTO语句的方式来编写程序 3 1 2对GOTO关于语句的认识 四 可以使用GOTO语句的情况 程序员应创建这样的程序P P是容易理解的并有良好的结构 然后对P进行优化 使之产生一个高效程序Q Q是可包含GOTO语句的 不过由P到Q的变换应该是完全可靠的 优化程序的方法可以通过将递归改为迭代 对于内层循环的循环体来说 应该通过建立适当的数据结构和控制结构 使内层循环的循环体更精练 因为只有内层循环的循环体运行时间愈少 程序效率才会愈高 应该忘掉过早的优化 过早的优化是一切祸害的根源 实质上 把程序分成几个层次 把变换前供交流 阅读的程序看成一个层次 把变换后高效的程序看成是另一个层次 而最后产生的目标代码又是一个层次 不同的层次目的不同 自然对它的要求也不同 3 1 2对GOTO关于语句的认识 五 结论 程序结构良好是指程序结构清晰 易于理解 也易于验证 好结构的程序从效率上看 不一定是最好的程序 但它提高了程序的可靠性 便于阅读 结构程序设计的要求是 宁可损失一些效率 也要保持程序的好结构 采用程序的三种基本结构和单入口单出口原则是设计好结构程序所应该严守的信条 一般来说 用删除GOTO的方法替换出的程序 不仅效率有所降低 而且可读性也不会得到改善 总的来说 不能简单地认为 对带有GOTO的程序 只要简单地用其他语言成分替代了GOTO 就可以得到好结构程序 真正需要的是 在设计程序的过程中就很少想到去使用GOTO语句 那么 怎样才能设计出好结构的程序呢 这个问题是与如何进行程序设计的方法紧密相关的 程序设计应该从方法学的角度进行根本性的变革 3 2顺序结构程序设计 一 顺序结构程序是最基本 最简单的一种程序结构 程序中的所有语句都是按照自上而下的顺序来执行 不会发生执行流程的跳转 虽然程序结构简单 但是在解决问题时 也应该按照程序设计步骤进行 做好问题分析 算法设计 不要急于写程序代码 在开始学习计算学科时就养成良好的程序设计风格 3 2顺序结构程序设计 二 例3 1计算应收款 试编写一个程序 用于水果店售货员结账 已知苹果每公斤3 5元 香蕉每公斤4 2元 输入顾客所买各种水果重量 计算应收款 再输入顾客付款额 计算应找顾客金额 问题分析 这个问题虽然简单 但是也需要想好解题的方法和步骤 题目要求输出数据是应收款Receivables和需要找给顾客的金额 需要输入数据是苹果的重量AppleWeight 香蕉的重量BananaWeight以及顾客付款额Pay 水果单价定义为符号常量 根据程序的基本组成结构 输入数据 处理数据 输出结果 算法设计如图3 4所示 算法中的变量说明如下 3 2顺序结构程序设计 三 CONSTApplePrice 3 5BananaPrice 4 2VARAppleWeight BananaWeight realPay realReceivables real 3 2顺序结构程序设计 四 根据算法3 1编写的C源程序如下 程序名称 CalcuReceivables cpp 程序功能 计算应收款 作者 FENGJUN 编制时间 2009年3月20日 include defineApplePrice3 5 defineBananaPrice4 2voidmain floatAppleWeight BananaWeight Pay floatReceivables printf 请输入苹果重量 scanf f 运行程序得到如下结果 请输入苹果重量 12 请输入香蕉重量 8 应收款Receivables 75 600000请输入顾客付款额 80 找零 4 400000 3 2顺序结构程序设计 五 例3 2输入三角形的3条边长 计算三角形的面积 问题分析 1 输入三角形的3条边长a b c 为了方便起见 假设这3条边能够构成三角形 2 已知三角形的3条边 求三角形面积的公式为area SQRT s s a s b s c 其中 SQRT 是求平方根函数 s a b c 2 3 输出三角形的面积 3 2顺序结构程序设计 六 根据程序的基本组成结构 输入数据 处理数据 输出结果 编写C源程序如下 程序名称 Calcuarea cpp 程序功能 计算三角形面积 作者 FENGJUN 编制时间 2009年3月20日 include include 因为要调用数学函数sqrt voidmain floata b c doubles area printf 请输入三角形的3条边长a b c scanf f f f 运行程序得到如下结果 请输入三角形的3条边长a b c 456 三角形的3条边长a b c 4 000005 000006 00000则三角形的面积area 9 921567 这个程序不完善 或者说不健壮 当输入3个数a b c 以它们为边长不能构成三角形时 程序中的计算将是没有意义的 因此 输入3个数后 应首先判断以它们为边长是否能构成三角形 只有能构成三角形 再计算三角形面积才有意义 这个问题将在3 3节中解决 3 2顺序结构程序设计 七 例3 3求一元二次方程ax2 bx c 0的根 系数a b c由键盘输入 问题分析 1 输入一元二次方程的系数a b c 为了方便起见 假设b2 4ac 0 2 确定解方程的方法 已知一元二次方程的求根公式为可以将上面的分式分为两项则x1 p q x2 p q 3 输出一元二次方程ax2 bx c 0的两个根x1和x2 3 2顺序结构程序设计 八 根据程序的基本组成结构 输入数据 处理数据 输出结果 编写C源程序如下 程序名称 SolutionEquation cpp 程序功能 解一元二次方程 作者 FENGJUN 编制时间 2009年3月20日 include include 因为要调用数学函数SQRT voidmain floata b c floatp q x1 x2 printf 请输入一元二次方程的系数a b c scanf f f f 运行程序得到如下结果 请输入一元二次方程的系数a b c 3 57 62 一元二次方程3 500000 x x 7 600000 x 2 000000 0的两个解x1 4 369558 x2 6 540987 在程序中假定输入的a b c满足条件b2 4ac 0 事实上 所输入的a b c并不一定满足条件b2 4ac 0 因此 在利用求根公式解方程时 应首先判断条件b2 4ac 0是否成立 然后再做相应地处理 这个问题将在3 3节中解决 请读者给出这两个例子的N S图算法描述 3 3选择结构程序设计 解决稍微复杂些的问题 就需要使用选择结构 选择结构包含一个测试条件和一个或多个命令序列 根据条件是否成立 决定执行哪个命令序列 在学习选择结构程序设计时 一定要搞清楚在不同条件下程序的各种不同执行流程 3 3 1单向分支选择结构程序设计3 3 2双向分支选择结构程序设计3 3 3多向分支选择结构程序设计 3 3 1单向分支选择结构程序设计 一 最简单的选择结构是单向分支选择结构 在程序设计语言中 它的一般形式为 IF条件THEN命令序列ENDIF分支点在条件处 若条件成立 则执行命令序列 否则跳过命令序列 直接执行ENDIF的后续命令 汇合点在ENDIF处 3 3 1单向分支选择结构程序设计 二 例3 4输入3个数a b c 输出最大数 问题分析 1 由键盘输入3个数a b c 再定义一个变量max用于存放最大数 2 首先将a的值赋给max 然后测试关系表达式b max 若成立 则将b的值赋给max 最后测试关系表达式c max 若成立 则将c的值赋给max 3 输出max的值 3 3 1单向分支选择结构程序设计 三 算法设计如图3 5所示 算法中的变量说明如下 VARa b c max real 3 3 1单向分支选择结构程序设计 四 C源程序如下 程序名称 max cpp 程序功能 求最大数 作者 FENGJUN 编制时间 2009年3月20日 includevoidmain floata b c max printf 请输入3个数a b c scanf f f f 运行程序得到如下结果 请输入3个数a b c 3576188 3个数a 35 0000b 76 0000c 188 0000的最大数max 188 0000 3 3 1单向分支选择结构程序设计 五 例3 5输入3个数a b c 要求由小到大排序 问题分析 1 由键盘输入3个数a b c 2 排序思想 排序后使a的值最小 c的值最大 首先比较a与b 若b小 则交换a与b的值 然后比较a与c 若c小 则交换a与c的值 最后比较b与c 若c小 则交换b与c的值 再定义一个中间变量t用于交换两个变量的值 3 输出已排序a b c的值 3 3 1单向分支选择结构程序设计 六 算法设计如图3 6所示 算法中的变量说明如下 VARa b c t real 请同学们根据该算法编写C源程序 3 3 2双向分支选择结构程序设计 一 双向分支选择结构是最完备的选择结构 在程序设计语言中 它的一般形式为 IF条件THEN命令序列1ELSE命令序列2ENDIF分支点在条件处 若条件成立 则执行命令序列1 执行完毕跳过命令序列2执行ENDIF的后续命令 否则 跳过命令序列1 执行命令序列2 再延续执行ENDIF的后续命令 命令序列1与命令序列2有且仅有一个命令序列被执行 汇合点在ENDIF处 3 3 2双向分支选择结构程序设计 二 例3 6输入三角形的3条边长 计算三角形的面积 问题分析 例3 2中的解法不完善 当输入3个数a b c后 首先判断以它们为边长是否能构成三角形 只有能构成三角形 再计算三角形面积才有意义 根据三角形知识 3条边能构成三角形的条件是任意两边之和大于第3边 因此 例3 2中的C源程序可以修改如下 3 3 2双向分支选择结构程序设计 三 include include 因为要调用数学函数sqrt voidmain floata b c floats area printf 请输入三角形的3条边长a b c scanf f f f 运行程序得到如下结果 请输入三角形的3条边长a b c 4 58 79 6 三角形的3条边长a b c 4 508 709 60则三角形的面积area 19 55 请输入三角形的3条边长a b c 6412 以a 6 00b 4 00c 12 00为边 不能构成三角形 请同学们根据程序给出N S图算法描述 3 3 2双向分支选择结构程序设计 四 例3 7求一元二次方程ax2 bx c 0的根 系数a b c由键盘输入 问题分析 在例3 3的程序中假定输入的a b c满足条件b2 4ac 0 事实上 所输入的a b c并不一定满足条件b2 4ac 0 因此 在利用求根公式解方程时 首先判断条件b2 4ac 0是否成立 然后再做相应地处理 当b2 4ac 0时 方程有两个不相等实根 当b2 4ac 0时 方程有两个相等实根 当b2 4ac 0时 方程没有实根 有一对共轭复根 3 3 2双向分支选择结构程序设计 五 解一元二次方程的算法设计如图3 7所示 算法中的变量说明如下 VARa b c realdist realp q x1 x2 real算法3 4SolutionEquation a b c 请同学们根据该算法编写源程序并上机运行 3 3 2双向分支选择结构程序设计 六 在算法3 4中 选择结构又包含了一个选择结构 这种在选择结构中又包含一个或多个选择结构 称为选择结构的嵌套 在程序设计语言中 IF结构嵌套的一般形式为 IF条件THENIF条件THEN命令序列1ELSE命令序列2ENDIFELSEIF条件THEN命令序列3ELSE命令序列4ENDIFENDIF 3 3 2双向分支选择结构程序设计 七 例3 8商店某商品的单价为980元 为了促销 商店规定 凡购买该商品50件以上优惠5 100件以上优惠7 5 300件以上优惠10 500件以上优惠15 输入购买数量 计算应收款 问题分析 解题的关键是根据购买数量 number 确定折扣率 cost 商品单价定义为符号常量 price 购买数量由键盘输入 应收款 total price 1 cost number 根据题意算法设计如图3 8所示 算法中的变量说明如下 CONSTprice 980VARnumber integercost total real 3 3 2双向分支选择结构程序设计 八 算法3 5CalcuReceivables1 number total 请同学们根据该算法编写源程序并上机运行 3 3 2双向分支选择结构程序设计 九 可以if结构的嵌套关系改为if结构的顺序关系 修改后的C源程序如下 include defineprice980voidmain intnumber floatcost total printf 请输入购买商品数量number scanf d 请同学们从程序的可读性 可维护性 程序的执行效率等方面认真分析比较这两个程序 并谈谈对if结构的认识 根据这个程序画出N S图算法描述 你还有其它解题方案吗 3 3 3多向分支选择结构程序设计 一 使用if结构可以实现多向分支选择结构 为了能够更清晰 更容易地设计和编写多向分支结构程序 许多程序设计语言都专门提供了实现多向分支的组织结构 称为CASE结构或者SWITCH结构 表3 1CASE结构的一般形式 在不同的程序设计语言中 CASE结构或者SWITCH结构的执行流程规定是有差异的 使用时必须搞清楚该结构的执行流程 3 3 3多向分支选择结构程序设计 二 例3 9商店某商品的单价为980元 为了促销 商店规定 凡购买该商品50件以上优惠5 100件以上优惠7 5 300件以上优惠10 500件以上优惠15 输入购买数量 计算应收款 问题分析 在例3 8中已经说明解题的关键是根据购买数量 number 确定折扣率 cost 这里 利用CASE结构确定折扣率 cost 的关键是根据购买数量 number 确定一个整型表达式 cas 由题设条件可以看出 折扣率的 变化点 都是50的倍数 利用这一特点 若number 500 则cas 10 否则cas number 50 即当cas 1时 表示number 50 无折扣 1 cas 2时 表示50 number 100 折扣5 2 cas 6时 表示100 number 300 折扣7 5 6 cas 10时 表示300 number 500 折扣10 cas 10 折扣15 3 3 3多向分支选择结构程序设计 三 算法设计如图3 9所示 算法中的变量说明如下 CONSTprice 980VARnumber integercas integercost total real 3 3 3多向分支选择结构程序设计 四 switch cas case0 cost 0 0 break case1 cost 0 05 break case2 case3 case4 case5 cost 0 075 break case6 case7 case8 case9 cost 0 1 break case10 cost 0 15 total price 1 cost number printf 应收款total 8 2f n total 根据算法3 6编写C源程序如下 include defineprice980voidmain intnumber intcas floatcost total printf 请输入购买商品数量number scanf d 运行程序得到如下结果 请输入购买商品数量number 36 应收款total 35280 00 请输入购买商品数量number 86 应收款total 80066 00 请输入购买商品数量number 268 应收款total 242942 00 请输入购买商品数量number 355 应收款total 313110 00 请输入购买商品数量number 865 应收款total 720544 99 3 4循环结构程序设计 在现实世界中 有许多实际问题需要进行重复处理 循环结构就是用于组织使某一段程序 循环体 重复执行所希望的次数 循环控制结构的基本要素是循环测试条件和循环体 循环体是需要重复执行的内容 循环测试条件用于确定是否再次执行循环体 大多数程序设计语言都提供了3种循环控制结构 3 4 1当型循环结构程序设计3 4 2直到型循环结构程序设计3 4 3步长型循环结构程序设计 3 4 1当型循环结构程序设计 一 循环控制结构可以分为两种基本类型 前置测试条件循环结构和后置测试条件循环结构 当型循环控制结构就是前置测试条件循环结构 通过测试条件确定是否执行循环体 表3 2当型循环控制结构的一般形式 它的执行流程是 S1 检测条件 若条件成立 则执行步骤S2 否则执行步骤S3 S2 执行循环体一次 返回步骤S1 S3 退出循环 执行循环控制结构 ENDDO 的后续命令 3 4 1当型循环结构程序设计 二 例3 10求sum 1 2 3 1000 问题分析 采用累加方法求该和式的值 用n表示式中的每一个加数 sum作为累加变量 让n从1变到1000 依次累加到sum中 算法设计如图3 10所示 算法中的变量说明如下 VARsum n integer算法3 7CalcuSum sum 3 4 1当型循环结构程序设计 三 根据算法3 7编写C源程序如下 程序名称 CalcuSum cpp 程序功能 计算累加和 作者 FENGJUN 编制时间 2009年3月20日 includevoidmain intsum 0 intn 1 while n 1000 sum sum n n n 1 printf 累加和sum d n sum 注意 累加变量sum的初值为0 变量n既是加数 也是条件中的控制变量 它的初值为1 同时变量n也记录着循环的次数 所以该循环也可以称为是一个计数器控制循环 赋初值语句n 1 条件 n 1000 循环体中语句的形式和语句的次序是一个有机整体 请同学们思考 若将条件 n 1000 改为条件 n 1000 则怎样修改其它语句才能使程序的功能保持不变 3 4 1当型循环结构程序设计 四 例3 11使用哨兵控制器组织循环 计算班级计算机课程的总成绩和平均成绩 问题分析 每个学生的成绩 result 由键盘输入 总成绩存放在累加变量sun中 班级人数存放于计数器n中 平均成绩存放于变量average中 程序设计的思路是重复做这样的事 每输入一个学生的成绩 就将其累加到变量sun中 并由计数器n记录学生人数 那么如何结束循环呢 即如何判断所有学生的成绩已输入完毕退出循环 常用的方法 也是较好的方法是输入一个特定的数据 哨兵值 作为结束循环的信号 哨兵值应该精心选择 使它在实际输入数据时不可能被误用 因为所有学生的成绩取值范围为0到100之间的数 所以哨兵值可以设置为 1 3 4 1当型循环结构程序设计 五 编写C源程序如下 includevoidmain intn 0 floatresult sum 0 0 average printf 请输入学生成绩 结束标志为 1 result scanf f 运行程序得到如下结果 请输入学生成绩 结束标志为 1 result 87 请输入学生成绩 结束标志为 1 result 56 请输入学生成绩 结束标志为 1 result 97 请输入学生成绩 结束标志为 1 result 68 请输入学生成绩 结束标志为 1 result 1 学生总人数n 4总成绩sum 308 00平均成绩average 77 00 请同学们根据该程序画出N S流程图 另一种用于结束循环的技术是 在完成一次数据处理时 询问是否还要继续处理数据 请使用这种技术将该程序进行修改 3 4 2直到型循环结构程序设计 一 直到型循环控制结构是后置测试条件循环结构 首先执行循环体一次 然后检测条件 通过测试条件确定是否再次执行循环体 表3 3直到型循环控制结构的一般形式 它的执行流程是 S1 执行循环体一次 执行步骤S2 S2 检测条件 若条件不成立 或表达式为非0 则执行步骤S1 否则执行步骤S3 S3 退出循环 执行循环控制结构 UNTIL 的后续命令 3 4 2直到型循环结构程序设计 二 例3 12求fact 1 2 3 10 问题分析 采用连续相乘的方法求该式的值 用n表示式中的每一个乘数 fact作为连续乘积变量 让n从1变到10 依次连续相乘到fact中 算法设计如图3 12所示 算法中的变量说明如下 VARfact n integer算法3 9CalcuFact fact 3 4 2直到型循环结构程序设计 三 根据算法3 9编写C源程序如下 程序名称 CalcuFact cpp 程序功能 计算连乘积 作者 FENGJUN 编制时间 2009年3月20日 includevoidmain longintfact 1 intn 1 do fact fact n n n 1 while n 10 printf 连乘积fact d n fact 运行程序得到如下结果 连乘积fact 3628800注意 变量fact的初值为1 变量n既是乘数 也是条件中的控制变量 它的初值为1 同时变量n也记录着循环的次数 所以该循环是一个计数器控制循环 3 4 2直到型循环结构程序设计 四 同一个问题既可以用当型循环结构处理 也可以用直到型循环结构处理 二者可以相互转换 在组织循环结构时 关键是要搞清楚循环的3个基本要素 一是要搞清楚需要重复处理的内容 恰当设置循环体的组织形式和语句次序 二是要准确设置循环测试条件 三是循环体中的某些变量需要确定合适的初值 测试条件中一般包含有控制变量 也要恰当设置控制变量的初始值以及值的变化 确保循环体只执行有限次 避免陷入无限循环 赋初值语句一般放在进入循环之前 当说明一个变量时 就给它赋初值是一个非常好的习惯 3 4 3步长型循环结构程序设计 一 步长型循环结构是典型的内置计数器控制循环结构 大多数程序设计语言都提供了构建内置计数器控制循环结构 以一种快捷 规范方法初始化计数器 并确定计数器增量以及计数器的终值 表3 4步长型循环控制结构的一般形式 控制变量是内置计数器 由它来控制循环体执行次数 它的执行流程是 S1 将初值赋值给控制变量 并记录终值和步长值 S2 检测控制变量的值是否超过终值 若没超过 则执行步骤S3 否则执行步骤S4 S3 执行循环体一次 使控制变量增加步长值 返回步骤S2 S4 退出循环 执行循环控制结构 NEXT ENDFOR 的后续命令 3 4 3步长型循环结构程序设计 二 例3 13国王的小麦 相传古代印度国王舍罕要褒赏聪明能干的宰相达依尔 国际象棋的发明者 国王问他需要什么 达依尔回答说 国王只要在国际象棋的棋盘第1个格子中放1粒麦子 第2个格子中放2粒麦子 第3个格子中放4粒麦子 以后按此比例在每一格中加一倍放入麦粒 一直放到第64格 国际象棋的棋盘是8 8 64格 我就感恩不尽了 其它什么都不要了 国王想 这有多少 还不容易 于是让人扛来一袋小麦 但不到一会儿全用完了 再扛来一袋很快又用完了 结果全印度的粮食全部用完还不够 国王纳闷 怎样也算不清这笔账 现在用计算机来算一算 问题分析 根据题意 棋盘每个格子中的麦子粒数如图3 13所示 麦子的总粒数是total 1 2 22 23 264采用累加的方法 首先计算出每个格子中的麦粒数p 然后将p的值累加到变量total中 据估算 1m3小麦约有1 42 108粒 计算出所用小麦的体积volume 3 4 3步长型循环结构程序设计 三 编写C源程序如下 程序名称 CalcuTotal cpp 程序功能 计算所需小麦 作者 FENGJUN 编制时间 2009年3月20日 includevoidmain doublep 1 total 1 volume intn for n 2 n 64 n p p 2 total total p volume total 1 42e8 printf 小麦总粒数total e n total printf 小麦总体积volume e n volume 运行程序得到如下结果 小麦总粒数total 1 844674e 019小麦总体积volume 1 299066e 011计算结果是棋盘格中所用小麦相当于在全中国960万平方公里的土地上铺上1 3cm厚的小麦 这是全中国几百年的粮食产量 请同学们根据该程序画出N S流程图 3 4 3步长型循环结构程序设计 四 例3 14输入一个整数m 判断它是否是素数 问题分析 所谓素数是指除了1和它本身以外 不能被任何整数整除的自然数 因此判断一个整数m是否是素数 最容易理解的一种方法就是用它除以从2到m 1之间的每一个整数 若都不能整除 则m是素数 让n取2到m 1之间的每一个整数 用求余运算m n判断m是否能被n整除 同时n还是循环控制变量 使用当型循环结构 退出循环后 当n m时 说明m是素数 3 4 3步长型循环结构程序设计 五 算法设计如图3 15所示 算法中的变量说明如下 VARm n integer算法3 11JudgePrimenumber m 3 4 3步长型循环结构程序设计 六 根据算法3 11编写C源程序如下 程序名称 JudgePrimenumber cpp 程序功能 判断m是否是素数 作者 FENGJUN 编制时间 2009年3月20日 includevoidmain longintn 2 m printf 请输入一个整数m scanf d 运行程序得到如下结果 请输入一个整数m 97 m 97是素数 请输入一个整数m 2987 m 2987不是素数 请同学们思考 能否将该程序进行优化 比如 用整数m只需除以从2到M的平方根之间的每一个整数 若都不能整除 则m是素数 又如 若整数m不能被2整除 则不能被所有偶数整除 根据这个思路 请同学们优化程序 事实上 验证一个整数m是否是素数有许多方法 3 4 3步长型循环结构程序设计 七 例3 15求100到200之间的所有素数 问题分析 只要将例3 14中的程序稍作修改 就可以得到该题的解 即让m的值从100变到200 重复执行例3 14中的程序 并以每行8个数输出100到200之间的所有素数 并统计素数个数k 修改后的C源程序如右 includevoidmain longintn m k 0 printf 100到200之间的所有素数是 n for m 101 m 200 m m 2 n 2 判断m是否能被2到m 1之间的数整除 while m n 0 n n 1 if m n 当m是素数时输出 k k 1 printf 12d m 当输出8个素数时换行 if k 8 0 printf n printf n100到200之间的素数共有k d个 n k 运行程序得到如下结果 100到200之间的所有素数是 101103107109113127131137139149151157163167173179181191193197199100到200之间的素数共有k 21个 细心的同学们已经发现 在该程序中 FOR循环结构中又包含了一个WHILE循环结构和一个IF THEN选择结构 称为循环结构的嵌套 即在一个循环体内又包含一个完整的循环结构 上述介绍的3种循环结构可以相互嵌套 请同学们从程序的可读性 可维护性 程序的执行效率等方面认真分析这个程序 并谈谈对循环结构的认识 根据这个程序画出N S图算

温馨提示

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

评论

0/150

提交评论