第6章 循环控制.ppt_第1页
第6章 循环控制.ppt_第2页
第6章 循环控制.ppt_第3页
第6章 循环控制.ppt_第4页
第6章 循环控制.ppt_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

第6章循环控制 6 1概述 问题1 假如全班41人 欲从键盘上输入每人的数学成绩 然后计算出平均成绩 问题2 编程计算n 重复执行一组语句是程序设计要求的基本语言功能之一 在C语言中可以用以下语句来实现循环 1 if和goto 2 while 3 do while 4 for 6 2goto语句以及用goto语句构成循环语法 gotolabel 其中 label是语句标号 它命名的规则同变量名 语义 使程序无条件地转向标号为label的语句去执行 如 用if语句构成循环 求sum 1 2 100main inti 1 sum 0 loop if i 100 sum sum i i gotoloop printf d sum 说明 1 标号不必进行类型说明 2 程序中的任何一个语句均可带上标号 但标号必须以冒号结束 3 不提倡使用goto语句 6 3while语句语法 while exp 循环体语句 语义 当exp为真时 执行循环体 为假时 执行循环语句的后续语句 如 用while语句构成循环 求sum 1 2 100 程序如下 main inti 1 sum 0 while i 100 sum i i printf d sum 2 循环体语句多于一个时 必须用复合语句 说明 1 在while语句中 exp 应有确定的值 以确保循环的正常开始 3 循环体内应有改变循环控制变量的语句 以确保循环进行有限次后正常结束 如 i 1 while i 100 sum sum 1 死循环 4 while循环的特点是先判断后执行 故循环有可能一次都不被执行 intn 0 while n 2 printf d n 如 i 3 while i 3 printf i d n i 一次都不被执行 该程序段的输出结果为 4 注意 main longk l m n k 1 printf n nentern n scanf ld 例 给一个正整数 按逆序打印出各位数字 并求出它是几位数 输入 230876输出 6 7 8 0 3 2 k 6 关键 6 4do while语句语法 do循环体语句 while exp 语义 当exp为真时 执行循环体 为假时 执行循环语句的后续语句 如 用do while语句构成循环 求sum 1 2 100 程序如下 main inti 1 sum 0 do sum i i while i 100 printf d sum 说明 1 循环体语句多于一个时 必须用复合语句 2 循环控制变量在执行do前必须赋初值 3 循环体内应有改变循环控制变量的语句 4 do while循环的特点是先执行后判断 故循环至少被执行一次 如 i 3 do sum sum i i while i 10 循环被执行了一次 6 5for循环语句语法 for exp1 exp2 exp3 循环体语句 语义 如 for i 1 i 100 i sum sum i 可看成 for 循环变量赋初值 循环条件 循环变量增值 语句 说明 1 显然for循环更简洁 更灵活 2 循环体可以是复合语句 3 for语法中的三个表达式均可以是逗号表达式 故可同时对多个变量赋初值及修改 如 for i 0 j 1 j n 省exp3 如 for i 1 i 5 printf d n i i 等价于for i 1 i 5 i printf d n i 省exp2 如 for i 1 i printf d n i if i 5 break 三个表达式全省时 如 for 语句 等价于while 1 语句 5 for语句中的循环体可以是空语句 如 for k 1 s 0 k 5 s s k k printf d n s 6 6循环的嵌套三种循环可以互相嵌套 例 打印九九乘法表main inti 1 j 1 for i 9 i for j 1 j 9 j printf d d 2d i j i j printf n 说明 1 内循环必须完全包含在外循环中 不能交叉 2 并列循环允许使用相同的循环变量 嵌套循环不允许使用相同的循环变量 k作循环变量 k作循环变量 n作循环变量 3 允许使用break或goto语句将循环控制从循环体内转到循环体外 也可以用continue语句将控制在循环体内转移 但不允许用任何方式从循环体外转到循环体内 6 8break语句和continue语句 6 8 1kreak语句形式 break 作用 1 跳出switch语句 2 从循环体内跳出循环体 while e1 if e2 break e1 e2 假 真 真 break 3 在多重循环中 break只能退出其所在循环 4 break只能用在循环语句 switch语句中 它的功能是强行退出循环或switch break 6 8 2continue语句形式 continue 作用 结束本次循环 跳过其后循环体内语句 进行下一次循环判断 While e1 if e2 continue 假 e1 e2 真 真 continue 例 下列程序运行的结果是 main intn for n 20 n 30 n if n 4 0 continue printf 5d n 结果为 202428 例1 计算 分析 1 这里的积分采用梯形法计算 梯形积分计算公式是 include includemain intn i floatx h xi sum scanf f d 分析 解决该问题的N S图如右 例2 用牛顿迭代法求x的平方根 牛顿迭代公式为 include includemain floatx s1 1 s2 1 s3 scanf f 例3 统计输入的行数 单词的个数 设单词是一个不包含任何空白字符的字符序列 以及输入的总的字符个数 分析 1 设变量nl nw nc分别表示输入的行数 单词的个数和输入的总字符数 初值均为0 2 对于nl 每输入一个 n 增1 对于nc 每输入一个字符 增1 而对于nw 只有当输入的字符为非空白字符 非回车且前一个字符为空或回车时才增1 3 设计变量inword 当其值0时 表示当前字符的前一字符为空白或回车 当其值为1时 表示当前字符的前一字符非空或回车 此当前字符仍为该单词中的内容 4 inword的初始值为0 5 故nw增1的条件是 当前字符非空白或回车且inword 0 defineYES1 defineNO0 includemain intc nl nw nc inword inword NO nl nw nc 0 while c getchar nc if c n nl if c c n c t inword NOelseif inword NO inword YES nw printf nl dnw dnc d n nl nw nc 例4 对于 5 x 11 10 y 9 6 z 18 求方程 x3 y3 z3 3的全部整数解 分析 1 程序设计有三种基本思维方法 枚举法 归纳法 抽象法 该题是典型的枚举法 2 枚举法 就是逐一列举出可能解的各个元素 并加以判断 直到求得所需要的解 常用在排列 组合 数据分类 信息检索 多解方程的求解上 3 使用枚举法 必须掌握两条原则 确定搜索的范围 这个范围必须是有限的 选择枚举的策略 按照一条什么样的路径来逐一枚举 这两条原则使用得好坏 对程序的工作量有巨大的影响 程序如下 includemain intx y z for x 5 x 12 x for y 10 y 10 y for z 6 z 19 z if x x x y y y z z z 3 printf 5d 5d 5d n x y z 例5 百钱百鸡问题 用100元钱买100只鸡 每只公鸡5元 每只母鸡3元 每3只小鸡1元 要求每种鸡至少买一只 且必须是整只的 问各种鸡各买多少只 分析 1 这是一个组合问题 归根到底是求三元一次方程的一组解 2 设i j k分别表示公鸡 母鸡和小鸡的只数 为了确定i j k的取值范围 可以有不同方法 不同的方法 程序的计算量相差甚远 3 方法一 i 1 20 j 1 33 k 1 100 4 方法二 i 1 18 j 1 31 k 100 i j 5 方法三 由i j k 100及5i 3j k 3 100得14i 8j 200 由此可得 i 1 13 j 1 23 k 100 i j 6 方法四 由方法三中的14i 8j 200得7i 4j 100可得 i 1 13 j 100 7i 4 k 100 i j main inti j k for i 1 i 20 i for j 1 j 33 j k 100 i j if i 5 j 3 k 3 100 printf k d j d i d n k j i 例6 求整数a和b的最小公倍数 分析 1 如果i是a和b的最小公倍数 则i必能被a和b整除 同时i必须是自然数 所以其取值范围是 2 方法一 i从1开始 依次增加 直到第一个能被a和b整除为止 这个i就是a和b的最小公倍数 3 方法二 令从i从a开始 并使i每次增加a而不是增加1 这就保证了i总是a的倍数 故每次只要判断i能否被b整除就可以了 一旦判断成立 i就是a和b的最小公倍数 程序一 includemain inta b i scanf d d 程序二 includemain inta b i scanf d d 例7 猴子第一天摘下若干桃子 当即吃了一半 还不过瘾 又多吃了一个 第二天早上又将剩下的桃子吃掉了一半 又多吃了一个 以后每天早上都吃了前一天剩下的一半零一个 到第10天早上再想吃时 发现只剩下一个桃子了 求第一天共摘多少个桃子 分析 1 归纳法 是从大量的特殊性中总结出规律性或一般性的结论 2 归纳 在程序设计上主要表现为递归和迭代 我们常常用递归和迭代的方式把一个复杂的计算过程化为简单过程的多次重复 这种重复很容易用循环来实现 3 在本例中 假设s为剩下的 则s 1为前一天的一半 而2 s 1 为前一天的总个数 依次类推 10天前的桃子数即可算出 4 归纳法的另一重要用途是用于数列和级数求和 Sn Sn 1 1 2程序如下 main ints i s 1 for i 1 i 9 i s s 1 2 printf s d n s 例8 有一张足够大的纸 厚0 09毫米 问将它对折多少次后可以达到珠穆朗玛峰的高度 8848米 分析 1 采用归纳法 2 设a为高度 初值为9 10 5米 3 对折后 高度为前一次高度的2倍 每次乘2后判断乘积是否已超过8848米 若已超过 则记下乘2的次数就是对折的次数 4 请读者自己编程 例9 用循环语句打印下列图案 分析 1 这是一个典型的循环嵌套问题 2 该图案中一共有6行 打印时需一行一行进行 设正在处理的行为第i行 则i从1 6 3 每行的字符个数

温馨提示

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

评论

0/150

提交评论