分校C课件第8讲循环结构.ppt

上传人:xt****7 文档编号:5333545 上传时间:2020-01-26 格式:PPT 页数:53 大小:602.31KB
返回 下载 相关 举报
分校C课件第8讲循环结构.ppt_第1页
第1页 / 共53页
分校C课件第8讲循环结构.ppt_第2页
第2页 / 共53页
分校C课件第8讲循环结构.ppt_第3页
第3页 / 共53页
点击查看更多>>
资源描述
第八讲循环结构 1 掌握循环的概念 循环就是重复地执行的一组指令或程序段 需反复执行的程序段称为循环体 控制循环进行的变量称为循环变量 2 掌握三种循环语句 while语句实现当型循环 dowhile语句实现直到型循环和for语句实现次数控制的循环 掌握利用他们设计程序的方法 3 掌握break和continue语句的功能和使用方法 4 掌握多重循环的设计方法 达到简单运用 5 掌握goto语句构造循环的方法及缺点 教学要求 2 40 While循环结构 while语句while C语言代码举例 循环结构 intproduct 2 while product 10 product 2 product while循环结构是单入 单出结构 1 功能 while语句一般完成当型循环 2 语句格式为 while 表达式p 循环体 3 执行过程 当表达式P为真时 反复执行A操作 而当表达式P为假 0 时停止执行 可以是两种语句单语句复合语句 P A 3 40 例cw0701 1 c 求 include definePprintfintmain inti 1 sum 0 while i 100 sum sum i i P d n sum for i 1 i 25 i P P n return0 求和变量赋初值为0 后面一个循环起什么作用 此处可否用一个语句代替 i 以后类推 4 40 cw0702 c includeintmain intn t 1 longints 1 printf 求多少的阶乘 scanf d 分析 n n n 1 n 2 2 1 0 1 即S0 1 Sn n Sn 1 可以从S0开始 依次求出S1 S2 Sn 令S等于阶乘值 S的初值为0 1 变量i为计数器 i从1变到n 每一步令S S i 则最终S中的值就是n 例cw0702 c求n 求多少的阶乘 55 120Pressanytocontinue 注意如果阶乘太大可能造成数据溢出 此时应当设为双精度 用指数形式表示 5 40 计数器控制的循环 源代码分析 cw0703 c includeintmain intcounter grade total average total 0 注意为什么这么样被始化 counter 0 while counter 10 printf Entergrade scanf d 赋值语句 initialization 执行循环 executeloop 输入累加结束 termination 最后的计算输出结果 计算某班10个学生考试的班平均成绩 分析与设计输入每个学生的成绩 累计总成绩 计算平均分 显示结果 采用计数器控制的循环 重复执行操作 输入一个学生的成绩 就进行累加 对于任意多学生怎么办 6 40 标记控制的循环 举例问题 编写一个班级平均分计算程序 每次执行该程序 都能够处理任意数量的学生分数 思考 学生人数未知 何时结束输入 标记控制的循环使用标记 flag 指定 数据输入的结束 即当用户输入标记值时 循环结束标记的其他名称 信号值 signalvalue 哨兵 sentinel 标记值不应与正常的用户输入混淆本例可以采用 1 教材P68例5 20用 但同时标记值也是合法的输入适用于不确定的循环 即循环次数未知 循环结构 7 40 标记控制的循环 进一步细化初始化变量输入考试的分数 求分数总和 并计数 计算考试人数 循环结构 设置总分 total 初值为0设置计数器 counter 初值为0 输入第一个分数 grade 可能是标记值 While输入的分数不是标记值把当前分数加到总分中计数器加1输入下一个分数 可能是标记值 被0除 将导致致命错误会导致程序崩溃 If计数器不等于0总分除以计数器的结果就是班级平均分显示班级平均分Else显示 没有输入成绩 计算并显示班级平均分 8 40 标记控制的循环 循环结构 includeintmain floataverage intcounter grade total 0 计数 成绩 总分 0counter 0 计算参加考试人数初值必须设为0printf Entergrade 1toend scanf d 赋初值 处理 结束判断标记 源代码分析 cw0704 c 结束 Entergrade 1toend 70Entergrade 1toend 60Entergrade 1toend 65Entergrade 1toend 1Classaverageis65 00 9 40 do while循环结构 1 功能 do while语句一般完成直到型循环 2 格式为 do while 3 执行过程 先执行循环体 后判定表达式 直到表达式的值为 假 时 循环结束 循环结构 do while循环结构是单入 单出结构 先执行循环体语句 再判断循环条件 10 40 do while语句 举例 cw0701 2 c 问题 用do while计算 循环结构 includeintmain ints 0 i 1 do s s i i while i 100 printf 1 2 100 d n s return0 既是循环控制计数器 也是加数 includeintmain ints 0 i 100 do s s i i while i printf 1 2 100 d n s return0 cw0701 2f c 用do while计算 while x 0 可写成while x 即省了 0while x 0 可写成while x 即省了 0非x不等于0 即恒等于0 P64中部 11 40 do while语句 比较do while语句与while语句 循环结构 cw0705 1 c intmain ints 0 n scanf d cw0705 2 c intmain ints 0 n scanf d 1s 3 n 3 3s 0 n 3 1s 3 n 3 3s 3 n 4 1 2 do while的循环体至少被执行一次 cw0705 1 c cw0705 2 c 注意 do while后有分号 12 40 for循环结构 循环结构 分号作为表达式的分隔符 只计算一次 1 功能 用于循环次数已确定或给定循环条件 次数不知 的情况 适合于描述一个事物从初始态到终止态的变化过程 最为灵活 2 语句格式为 for 循环体 表达式1 一般为赋值表达式 给控制变量赋初值 表达式2 关系表达式或逻辑表达式 循环控制条件 表达式3 一般为赋值表达式 给控制变量增量或减量 循环体 当有多条语句时 必须使用复合语句 13 40 for语句 for语句能够自动处理计数器控制的循环的细节举例 打印1 10 cw0705 c 循环结构 includeintmain intcounter for counter 1 counter 10 counter printf d counter printf n return0 循环条件 控制变量增1 对控制变量进行初始化 12345678910 执行过程为 先求解表达式1 初值 再求解表达式2 并判定其值是否为真 若为真 则执行循环体中的语句 如果执行了循环体 则循环体每执行一次 都求解表达式3 然后重新计算表达式2 再判定其值是否为真 直至表达式2的值为假 退出for循环 执行for循环后的语句 14 40 for语句 for语句使用说明三个表达式都是可选的 都可以为空 但分号不能少如果表达式2为空 那么就假定该循环条件为真 循环结构 for i 0 i printf 2d i for i 0 1 i printf 2d i 强行终止无限循环 结束程序的执行 常用逗号表达式 for s 0 i 1 i 100 i s i for s 0 i 1 i 100 s i i 对多个变量初始化 修改多个变量的值 则创建一个无限循环 表达式1和表达式3可以是任何合法的表达式 常用逗号表达式 15 40 includeintmain inti sum for sum 0 i 1 i 100 i sum sum i printf d n sum return0 求和变量赋初值为0 计算起始值为1 Cw0701 3 c用for语句求 求 循环结构 ex0520jcp68 l5 20 c统计输入的字符个数 并输出他们 以 终止 includeintmain charchr ints for s 0 s chr getchar if chr break elseprintf c chr printf ns d n s return0 1 100 5050 Abcd123 bbbAbcd123 S 10 标记 表达式2省总为真 16 40 求水仙花数 ex0518jcp67 l5 18 c求水仙花数 即这个数等于它的百位 十位和个位数的立方和 例如153是一个水仙花数 因为153 13 53 33 includeintmain intn 100 i j k printf 水仙花数是 n for n 100 n 1000 n i n 100 j n 10 10 k n 10 if n i i i j j j k k k printf d n n return0 水仙花数是 153370371407Pressanykeytocontinue jcp67 l5 18 c 17 40 for语句使用要点 1 for中的表达式1可以省略 但在for循环之前应给循环变量赋值 2 表达式2也可以省略 但循环将陷入死循环 例如 i 1 for i 100 i sum sum i 用Ctrl C强行终止无限循环 结束程序的执行 例如 for i 1 i sum sum i 3 表达式3也可以省略 但应在循环体中增加使循环变量值改变的语句 例如 for sum 0 i 0 i 100 sum sum i i 18 40 4 表达式1和表达式3同时省略也允许 例如 i 1 sum 0 for i 100 sum sum i i 这是完全与while循环等同 5 三表达式都可省 但 不能省略 for sum sum i 循环将无休止的执行下去 for语句使用要点 循环结构 ex0518jcp67 l5 18 c求水仙花数 即这个数等于它的百位 十位和个位数的立方和 例如153是一个水仙花数 因为153 13 53 33 省三个表达式 不能省略 includeintmain intn 100 i j k printf 水仙花数是 n for if n 1000 i n 100 j n 10 10 k n 10 if n i i i j j j k k k printf d n n n return0 水仙花数是 153370371407 必须用ctrl c终止程序 不会出现 Pressanykeytocontinue 19 40 includeintmain intx y z for x 1 x 20 x for y 1 y 34 y z 100 x y if z 3 0 例cw0706 c百鸡问题 一只母鸡值5个钱 一只公鸡值3个钱 三只小鸡值1个钱 现有100个钱 要买100个鸡 是否可以 要求三种鸡都有 分析 设母鸡x只 公鸡y只 小鸡z只 则可知z 100 x y 且5x 3y z 3 100采用试探法 20 40 例 cw0707 c 打印10行 号 第1行打印1个 第2行打印2个第n行有n个星号 第10行打印10个 嵌套的控制结构 循环结构 外层循环控制行数 内层循环控制列数 cw0707 1 c 21 40 程序设计举例 源代码分析 cw0707 1 c 循环结构 问题输出图形 分析共有10行第n行先输出n 1个空格 再输出10 n 1 个星号用计数器控制的循环实现 见cw0706 c的正三角十行 这两图如何编 看程序 22 40 程序设计举例 源代码分析图2 cw0718 c 循环结构 includeintmain intm n for n 1 n 5 n for m 1 m 5 n m printf for m 1 m 2 n 1 m printf printf n for n 4 n 1 n for m 1 m 5 n m printf for m 1 m 2 n 1 m printf printf n return0 返回 23 40 循环的嵌套 一个循环语句的循环体内又包含另一个完整的循环语句 称为循环的嵌套 这种嵌套过程可以有很多重 一个循环外面仅包围一层循环叫二重循环 一个循环外面包围两层循环叫三重循环 一个循环外面包围多层循环叫多重循环 注意要点 1 内循环必须完整地嵌套在外循环内 两者不允许交叉 2 并列的循环变量可以同名 但嵌套循环变量不允许同名 3 while语句 do while语句和for语句都可以互相嵌套 甚至可以多层嵌套 但不得交叉 4 选择结构和循环结构彼此间也可以互相嵌套 但二者不允许交叉 5 可用break语句从内循环跳转到外循环 但不允许从外循环跳转到内循环 即不能用goto语句 6 不能在for循环体内修改循环变量 防止循环失控 24 40 循环语句的注意点 1 在多重循环中 应尽可能将最长的循环放在最内层 最短的循环放在最外层 以减少CPU跨层循环的次数 2 建议for语句的循环控制变量的取值采用 半开半闭区间 写法 半开半闭区间写法for n 0 n 10 n 和闭区间写法for n 0 n 9 n 虽功能相同 但相比之下 半开半闭区间写法更加直观 3 循环要尽可能的短 要使代码清晰 一目了然 如果一个循环代码超过一显示屏 会让读代码的人发狂的 解决的办法有两个 第一 重新设计这个循环 确认是否这些操作都必须放在这个循环里 第二 将这些代码改写成一个子函数 循环中只调用这个子函数即可 一般来说循环内的代码不要超过20行 4 把循环嵌套控制在3层以内 25 40 break语句 break语句break 当在while do while for或switch结构中执行break语句时 break语句会造成程序从该结构中退出 程序接着执行该结构之后的第一条语句 注意 执行break语句后 for语句的表达式3不被执行常规应用 在for结构中提前从循环结构中退出 表示终止本层循环 switch结构中跳过剩余部分 循环结构 26 40 break语句 举例 cw0708 c 循环结构 includeintmain intx for x 1 x 10 x if x 5 break printf d x if x 5 printf n用break时当x 5时跳出循环体 n return0 1234用break时当x 5时跳出循环 与if配合使用 如果改用cotinue 27 40 break语句 在switch和for语句中的使用 循环结构 cw0708x c用break退出本级结构 intmain inti for i 1 i 3 i switch i case1 printf n break case2 printf n break case3 printf n break return0 cw0708y c用break退出for循环结构 intmain inti for i 1 i 3 i if i 1 printf n break if i 2 printf n break if i 3 printf n break return0 28 40 continue语句 continue语句 循环结构 当在while do while或for结构中执行continue语句时 continue语句能够跳过该层结构中剩余语句 执行下一个循环过程 continue表示终止本次 本轮 循环 include cw0708 2 c intmain intx for x 1 x 10 x if x 5 continue printf d x printf n return0 1234678910Pressanykeytocontinue 举例 cw0708 2 c 用continue时暂停x 5时的本次循环 后面的循环继续执行 include cw0708 1x c intmain intx for x 1 x 10 x if x 5 break printf d x if x 5 printf n用break时当x 5时跳出循环体 n return0 29 40 includeintmain intx x 1 do if x 5 continue printf d x x while x 10 printf 在dowhile中用continue造成死循环 return0 continue语句 continue语句举例 循环结构 includeintmain intx x 1 while x 10 if x 5 continue printf d x x return0 1234 cw0708 4 c cw0708 3 c 1234 死循环 注意 在while和do while结构中continue语句被执行之后 立即进行循环条件的测试在for结构中先执行表达式3之后 才能进行循环条件的测试 没有退出提示 按ctrl c强行退出 30 40 结束本次循环 接着判定下一次是否执行循环 语句只能用于循环结构中 一旦执行了continue语句 程序就跳过循环体中位于该语句后的所有语句 提前结束本次循环周期并开始新一轮循环 例 cw0709 1 c 把100 200之间的不能被3整除的数输出 continue语句 循环结构 只结束能被3整除的本次循环不用输出而已 n还要增1 再判断 includeintmain intn i 0 for n 100 n 200 n if n 3 0 continue printf d n i if i 6 0 printf n printf n return0 31 40 分析 首先可确定分成的这4个数是4的倍数 相应的和 差 积 商 设为x 也为4的倍数 采用试探法 使得x从8开始 每次加4循环判断 直到找到这4个数为止 18 x2第一个数x1 x 4第二个数x2 x 4第三个数x3 x 4第四个数x4 x 43判断x1 x2 x3 x4是否等于100 如果是转5 否则转4 4x 4 x转25输出x1 x2 x3 x4 程序设计举例 循环结构 例 cw0709 2 c 将100分成4个数之和 使得第一个数加上4 第二个数减去4 第三个数乘以4 第四个数除以4后得到的和 差 积 商相等 问这4个数是多少 32 40 程序设计举例 循环结构 cw0709 2 c 将100分成4个数之和 使得第一个数加上4 第二个数减去4 第三个数乘以4 第四个数除以4后得到的和 差 积 商相等 问这4个数是多少 includeintmain intx x1 x2 x3 x4 for x 8 x 4 x1 x 4 x2 x 4 x3 x 4 x4 x 4 if x1 x2 x3 x4 100 break printf x1 d tx2 d tx3 d tx4 d n x1 x2 x3 x4 return0 33 40 goto语句 goto语句goto 立即执行语句标号指向的语句 合理的使用 与if语句一起构成循环结构从循环体内跳到循环体外特别是从多层嵌套循环的内部跳到外层循环 或者直接跳出 循环结构 语句标号是一个标识符放在可执行语句前面 结构化编程技术限制使用goto语句滥用goto语句使得程序无结构可言 可读性差 调试和维护困难 34 40 goto语句 goto语句举例 cw0701 4 c 循环结构 includeintmain ints 0 i 1 Loop s s i i if i 100 gotoLoop printf 1 2 100 d n s return0 1 2 100 5050 用条件和goto计算 break可以用在3种循环结构和开关结构中退出该层结构 continue一般与for结构用得比较多 用于退出当次循环 后续的循环继续 Goto可以一次退出1层甚至多层循环 与if可以组成循环 35 40 程序设计举例 问题找出1 100之间的全部素数源代码分析 cw0714 c 循环结构 include includeIntmain intm k i cout 0 for m 1 mk cout printf 4d m if cout 6 0 printf n printf n return0 36 40 小结 建立循环时特别注意三个方面 明确定义结束循环的条件确保在循环判断中使用的值在第一次使用之前已经初始化确保循环在每个周期中更新了判断值构造循环结构的流程控制语句 循环结构 跳转语句break语句continue语句goto语句结构化程序设计的规则 whiledo whileFor其中 do while提供退出条件循环while和for提供入口条件循环 请自学本章教材内容并预习下一章的内容与实验 请自己做本章的习题与实验体验 本章到此结束 谢谢您的光临 THANKYOUVERYMUCH 访问软件屋 南开100题二级C 38 40 程序设计举例 问题求下面公式的前n项之和分析累加求和 s s ai关键在于写出ai的表达式用计数器控制的循环实现 循环结构 初始化累加和变量s为0初始化计数器变量i为1输入要累加的项数 放入变量nWhilei n计算第i项的值 结果放入ai累加 s s ai修改计数器变量 i 输出结果s 不确定量的数据来源 输入获得计算获得 n 39 40 程序设计举例 第一种实现的源代码分析 cw0710 c 循环结构 include includeintmain inti 1 n floats 0 ai scanf d while i n ai pow 1 i 1 2 i 1 s ai i printf sum 3f n s return0 不划算 1sum 1 000 2sum 0 667 5sum 0 835 0sum 0 000 40 40 程序设计举例 第二种实现的源代码分析 cw0711 c 循环结构 includeintmain inti 1 n sign 1 floats 0 ai scanf d 1sum 1 000 2sum 0 667 5sum 0 835 0sum 0 000 现在ai表示每一项的绝对值 41 40 程序设计举例 问题用下面的公式求 的近似值 直到最后一项的绝对值小于10 6为止 分析先计算等式右边的和累加求和 s s ai当 ai 10 6时 停止累加用标记控制的循环实现 循环结构 初始化累加和变量s为0初始化计数器变量i为1第1项的值ai 1While ai 10 6累加 s s aii增一计算第i项 下一项 的值 结果放入ai计算 s 4输出结果 42 40 程序设计举例 第一种实现的源代码分析 cw0712 c 循环结构 includeintmain inti 1 n sign 1 doubles 0 ai ai 1 while ai 1e 6 s sign ai i sign 1 ai 1 0 2 i 1 printf pi 8lf n s 4 return0 pi 3 14153162 ai保存的是第i项的绝对值 43 40 程序设计举例 第二种实现的源代码分析 cw0713 c 循环结构 includeIntmain inti 1 n sign 1 doubles 0 an for an 1 0 2 i 1 if an 1e 6 break s sign an sign 1 i printf pi 8lf n s 4 return0 pi 3 14153162 使用break语句违背了结构化程序设计的原则continue语句也有类似的问题 44 40 程序设计举例 数的范围无法确定把输入的第一个数作为最大数和最小数将其余的数与最大数 最小数分别比较每次根据比较的结果更新最大数和最小数用计数器控制的循环实现 循环结构 问题任意输入10个数 找出最大数和最小数分析 45 40 程序设计举例 源代码分析 cw0714 c 循环结构 includeintmain inti d max min printf Input10integers n scanf d 把输入的第一个数作为最大数和最小数变量的初值 根据比较的结果更新最大数和最小数变量的值 46 40 程序设计举例 问题判断整数m是否素数源代码分析 cw0715 c 循环结构 include includeintmain intm k i scanf d 如果break被执行了 则该数不是素数 那么i k 如果要找出1 100之间的全部素数该怎么做呢 cw0716 c 47 40 程序设计举例 源代码分析图1 cw0717 c 循环结构 includeintmain intm n for n 1 n 5 n for m 1 m 5 n m printf for m 1 m 2 n 1 m printf printf n return0 问题输出下面的图形 48 40 程序设计举例 问题用二分法求下面方程在区间 10 10 上的根 2x3 4x2 3x 6 0二分法 循环结构 近似计算 49 40 程序设计举例 二分法确定有根的区间指定一个区间 x1 x2 如果函数f x 在此区间是单调变化的 则可以根据f x1 和f x2 是否同号来确定方程f x 0在区间 x1 x2 内是否有一个实根 若f x1 和f x2 不同号 则f x 0在区间 x1 x2 内有一个 且只有一个 实根 如果f x1 和f x2 同号 则f x 0在区间 x1 x2 内没有实根 要重新改变x1和x2的值 把区间一分为二当确定f x 0在区间 x1 x2 内有实根后 可采用二分法将 x1 x2 区间一分为二 再判断在哪一个小区间中有实根 循环如此不断进行下去 直到小区间足够小为止 即该区间的中点是f x 0的近似根 循环结构 50 40 程序设计举例 算法设计输入并确定有根的初始区间输入两个数放入x1和x2 表示区间 x1x2 判断区间内是否有根若无根 则重复上面两步 直到得到合法的区间二分法求近似根计算当前近似根x0 x1 x2 2把当前区间一分为二 x1x0 和 x0 x2 判断根在哪一个小区间更新当前区间 x1x2 判断当前近似根是否达到精度要求否则 重复上述步骤 直到满足要求输出近似根 循环结构 51 40 程序设计举例 算法设计 细化 输入并确定有根的初始区间输入两个数放入x1和x2 表示区间 x1x2 计算fx1和fx2判断区间内是否有根 即fx1和fx2是否异号若同号 则重复上面步骤 直到得到合法的区间二分法求近似根计算当前近似根x0 x1 x2 2计算fx0把当前区间一分为二 x1x0 和 x0 x2 判断根在哪一个小区间更新当前区间 x1x2 和相应的fx 判断当前近似根是否达到精度要求否则 重复上述步骤 直到满足要求输出近似根 循环结构 do while do while if else process output input 52 40 程序设计举例 源代码分析 cw0719 c 循环结构 includeintmain floatx0 x1 x2 fx0 fx1 fx2 do printf Inputx1 x2 scanf f f do while do while if else process output input 53 40 程序设计举例 源代码分析 循环结构 do x0 x1 x2 2 fx0 x0 x0 2 x0 4 3 6 if fx0 fx1 1e 5 printf x 2f x0 return0 do while do while if else process output input
展开阅读全文
相关资源
相关搜索

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


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

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


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