(精选)第6章 循环结构.ppt_第1页
(精选)第6章 循环结构.ppt_第2页
(精选)第6章 循环结构.ppt_第3页
(精选)第6章 循环结构.ppt_第4页
(精选)第6章 循环结构.ppt_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

第6章循环结构 6 1概述 6 2while语句 6 3dowhile语句 6 4for语句 6 6循环控制语句和goto转移语句 6 5循环嵌套 1 6 1概述 循环结构用来描述具有规律性的重复工作 例如 求若干个数的累积 输入全班所有学生的成绩等 几乎所有实用的程序都包含循环 循环结构是结构化程序设计的基本结构之一 它和顺序结构 选择结构共同作为各种复杂程序的基本构造单元 2 6 2while语句 1 while语句是当型循环控制语句 一般形式为 while循环体 说明 1 表达式 可以是任意表达式 用来判定循环是否终止 或者说判定循环体是否执行 表达式的值要么为真 要么为假 如果其值为一个数值 则非0的任何数都为真 而0代表假 如果第一次执行时 表达式 的值为假 则 循环体 中的语句一次都不执行 2 循环体 中可以是单语句 也可以是空语句 只有一个 的语句 或复合语句 如果是复合语句 则必须括在 之中 while语句的流程图见图6 1 其特点是先判断 后执行 若条件不成立 有可能一次也不执行 3 2 举例应用 例6 1求sum 1 2 3 100 分析 解决这类累加 累积问题 关键是要找出通用计算公式 即找到循环体中的部分 sum sum i是本例的通用性计算公式 公式中 sum既作为一个加数使用 也用于存放累加后的结果 其初值为0 i既作为另一个 4 加数使用 也作为循环变量 其取值范围是1到100 对于每个i值 要进行一次sum sum i的计算 如 当i 1时 sum 0 1 1 当i 2时 sum 1 2 3 当i 3时 sum 3 3 5 依此类推下去 就可以得到结果sum includevoidmain inti sum 0 i 1 while i 100 sum sum i i printf d sum 图6 2求1 2 100算法描述 5 例6 2将输入的一串字符显示在屏幕上 遇到字符 时停止 includevoidmain charc printf nPleaseinputastring n c getchar while c putchar c c getchar 6 6 3dowhile语句 1 dowhile语句的语法和框图dowhile循环语句的语法是 do 循环体语句 while 表达式 1 说明 1 表达式 可以是任意表达式 用来判定循环是否终止 或者说判定循环体是否执行 表达式的值要么为真 要么为假 如果其值为一个数值 则非0的任何数都为真 而0代表假 即使第一次执行时 表达式 的值为假 循环体 中的语句最少会被执行一次 2 循环体 中可以是单语句 也可以是空语句 只有一 7 个 的语句 或复合语句 如果是复合语句 则必须括在 之中 3 do while作为一个语句 必须以分号 结束 所以在while 表达式 后一定要有分号 2 执行顺序 执行 循环体语句 计算表达式的值 如果表达式的值非零 真 继续执行 循环体语句 直到表达式的值为零 假 循环结束 程序结构流程图如图 8 例6 3用dowhile语句求s 1 2 3 100 includevoidmain inti sum 0 i 1 do sum sum i i while i 100 printf d sum 9 例6 4计算sin x 直到最后一项的绝对值小10 7 编程思路 这道题使用递推方法来做 让多项式的每一项与一个变量n对应 n的值依次为1 3 5 7 从多项式的前一项算后一项 只需将前一项乘一个因子 x2 n 1 n 用s表示多项式的值 用t表示每一项的值 include includevoidmain doubles t x intn printf pleaseinputx 10 scanf lf 运行结果如下 pleaseinputx 1 5753sin 1 575300 0 999990 11 2 dowhile与while语句的区别 dowhile总是要先做一遍循环体 再做表达式的判断 因此循环体中的语句肯定要做一次 在设计程序时 如果不知道重复执行的次数 而且第一次必须执行时 常采用dowhile语句 1 为了避免编译系统把dowhile的while当做while语句的开始 dowhile的循环体即使是一句 也需要用括号括起 includevoidmain charc do 12 putchar c getchar while c 但是 若将上例的dowhile语句写成 doputchar c getchar while c 容易产生歧义和误解 2 由于dowhile语句是先做循环体 再判断表达式 所以有些程序不能用dowhile语句编写 例如 输入某门功课的若干个同学的成绩 以 1作为终止的特殊成绩 计算平均成绩 也就是说 不能将 1计算在内 13 例6 5求平均值的错误程序 includevoidmain intsum i a sum 0 i 0 do scanf d 但程序的逻辑是错误的 因为 1也被累加到sum中了 并且不能解决输入的第一个数就是 1的问题 14 6 4for语句 C语言中的for语句使用最为灵活 不仅可以用于循环次数已经确定的情况 而且可以用于循环次数不确定而只给出循环结束条件的情况 它完全可以代替while语句 for循环语句的语法是 for 表达式1 表达式2 表达式3 循环体语句 执行过程 1 执行表达式1 2 计算表达式2的值 3 如果表达式2的值为真 则执行循环体 再执行表达式3 转到 2 步执行 4 如果表达式2的值为假 则结束循环的执行 转而去执行for语句后的语句 15 例6 6用for语句求s 1 2 3 n includevoidmain inti sum n printf nPleaseinputainteger scanf d 16 for循环使用说明 1 for语句的表达式使用比较灵活 表达式1 表达式2 表达式3都可以省略 但是即使是三个表达式都省略了 二个 也不可省略 如下几种情形 i 1 for i 100 i sum sum i 省略表达式1 for i 1 i sum sum i if i 100 break 省略表达式2 i 1 for i 100 sum sum i i 省略表达式1和表达式3 i 1 for sum sum i if i 100 break i 三个表达式均省略 2 在表达式 和表达式 中可以使用逗号运算符把执行语句并列在一起 并且循环体可以为空 17 如 for i 1 sum 0 i 100 sum i i 3 表达式2一般是关系表达式 如i 100 或逻辑表达式 如a b只有表达式2 而无表达式1和表达式3 其作用是每读入一个字符后立即输出该字符 直到输入一个 换行 为止 18 例6 8求Fibonacci数列的前40个数 该数列的生成方法为 F1 1 F2 1 Fn Fn 1 Fn 2 n 3 即从第3个数开始 每个数等于前2个数之和 这是一个有趣的古典数学问题 有一对兔子 从出生后第3个月起每个月都生一对兔子 小兔子长到第3个月后每个月又生一对兔子 假设所有兔子都不死 问每个月的兔子总数为多少 编程思路 由题意可知 该数列的变化规律是第一项和第二项为1 从第三项起为前二项之和 令f1 f2分别为第一项和第二项 然后进入循环 首先输出f1 f2 接着执行语句 f1 f1 f2 将二项所得和的值存入f1中 这就是数列的第三项 再执行语句 f2 f2 f1 此时的f1代表第三项 将第二项和第三项所得和的值存入f2中 得到数列的第四项 重复以上步骤 每重复一次 变量f1 f2依次得到后面新的两项值 这是一个典型的递推法 19 程序流程如图 includevoidmain longintf1 1 f2 1 i for i 1 i 20 i printf 15ld 15ld f1 f2 if i 2 0 printf n f1 f2 f2 f1 20 例6 9求s aa aa a a aa a 即第一项由n个a组成 第二项由n 1个a组成 依次类推 最后一项为a a为1 9的任一数 例如 当n 4 a 2 则表达式 s 2222 222 22 2 编程思路 由表达式可知 该序列的规律是 前一项的数据比后一项大10倍 如果把前一项的数据对10进行整除 则商数即为后一项数据的值 所以程序的设计过程分为两步 第一步运用for循环求出序列的第一项 第二步还是运用循环实现取数和求和的功能 流程图如图 21 源代码如下 includevoidmain inta n i longs 0 t a scanf a d n d 22 6 5循环嵌套 一个循环体内又包含另一个完整的循环结构 称为循环的嵌套 一个循环外面仅包围一层循环叫二重循环 一个循环外面包围两层循环叫三重循环 一个循环外面包围多层循环叫多重循环 三种循环语句for while do while可以互相嵌套自由组合 如下形式 23 例6 10输出10 100之间的全部素数 编程思路 1 显然 只要设计出判断某数n是否是素数的算法 外面再套一个for循环即可 2 判断某数n是否是素数的算法 根据素数的定义 用2 n 1 之间的每一个数去整除n 如果都不能被整除 则表示该数是一个素数 实际上用不到将n除至n 1 只要将n除以2 即可 这是因为任一整数n若能被另一整数a整除 其商为b 则a和b中有一个必然大于或等于 而另一个小于或等于 故只需将n依次除以2 即可 程序流程如图 24 源程序如下 include includevoidmain inti 11 j counter 0 k flag for i 100 i 2 k sqrt i flag 1 for j 2 j k 25 例6 11输出乘法口决的下半三角 形如 1 1 12 1 22 2 43 1 33 2 63 3 94 1 44 2 84 3 124 4 16 从输出的形式可以知道 若用i表示行 用j表示列 则任一输出可表示为i j i与j的积 也可从图得到i与j的关系 第i行输出的列数等于i 程序流程如图6 11 源程序如下 voidmain inti j for i 1 i 9 i for j 1 j i j printf 2d d 2d i j i j printf n 26 例6 12某幼儿园要用100元买100件玩具 若一只熊猫3元 一只小狗2元 一只小鸭0 5元 问三种玩具各买多少只 列出所有的解 这是一个典型的使用穷举法的应用 编程思路 根据题意可知 熊猫最多不能超过20只 小狗不能超过30只 设熊猫数为x 小狗数y 则小鸭数为z 100 x y 程序流程如图 voidmain intx y z for x 1 x 20 x for y 1 y 30 y z 100 x y if 3 x 2 y 0 5 z 100 printf 熊猫 d t小狗 d t小鸭 d n x y z 27 6 6循环控制语句和goto转移语句 6 6 1break语句 功能 在循环语句和switch语句中 终止并跳出循环体或开关体 break语句的语法 break 例6 13打印半径为1到10的圆的面积 若面积超过100 则不予打印 includevoidmain intr floatarea for r 1 r 10 r area 3 141593 r r if area 100 0 break printf square f n area printf nowr d n r 28 例6 14将例6 11用break语句来改写 include includevoidmain inti 11 j counter 0 k for i k printf 6d i counter 29 注意 1 break通常要和if语句联用 能提前结束循环 在嵌套的循环中 break只能退出它所在的那一层循环 2 当循环体中包含switch语句 而break位于switch语句中时 break只强迫程序流程退出该switch而不退出switch所在的循环 在switch语句中的break只是退出switch语句 而对于循环结构无影响 3 当break处于循环嵌套结构中时 它将只跳出最内层结构 而对外层结构无影响 4 break不能用于循环语句和switch语句之外的任何其它语句之中 30 6 6 2continue语句 continue语句的功能是结束本次循环的执行 转而去执行下一次循环 即去计算条件表达式 但不退出循环结构 1 continue的语法continue 例6 15计算半径为1到15的圆的面积 仅打印出超过50的圆面积 includevoidmain intr floatarea for r 1 r 5 r area 3 141593 r r if area 50 0 continue printf square f area 31 2 continue语句和break语句的区别 continue语句只结束本次循环 而不是终止整个循环的执行 而break语句则是结束整个循环过程 不再判断执行循环的条件是否成立 3 使用注意 1 continue语句只能用在循环结构中 2 continue语句通常要和if语句联用 它只能提前结束本次循环 立即进入

温馨提示

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

评论

0/150

提交评论