




已阅读5页,还剩82页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C 程序设计 2 2020年4月12日星期日 3 11循环结构和循环语句 在程序中 常常需要重复地执行某些操作 循环控制语句是基本流程控制语句之一 在循环语句中 重复执行的操作叫做循环体 循环体可以是单条语句 块语句甚至是空语句 C 提供三种循环语句 3 2020年4月12日星期日 3 11循环结构和循环语句 while语句 while语句也称为当循环 语句格式为 while 表达式 循环体语句 while语句的执行流程图 注意 while 条件表达式 后面分号不可省去 4 2020年4月12日星期日 设计一个计算 5 2020年4月12日星期日 step1s 1step2s 2step3s 3 step99s 99step100s 100step101输出s 6 2020年4月12日星期日 step10 sstep21 nstep3如果n 100 转去step6step4s nstep5n 转step3step6输出s 7 2020年4月12日星期日 3 11循环结构和循环语句 例 累加程序求1 3 5 99的值 求1 3 5 99 includeintmain inti 1 sum 0 while i 100 sum sum i i i 2 cout sum sum endl return0 8 2020年4月12日星期日 3 11循环结构和循环语句 9 2020年4月12日星期日 3 11循环结构和循环语句 例 求1 2 3 4 100的值 N个连续整数相加算法1 设置变量i用来放加数 变量sum用来放被加数与和值 并初始化 2 从第一个数开始 依次将加数赋给i 并进行操作sum sum i 称为累加 3 输出sum 细化算法2 while 还有加数 i 当前加数 sum i i准备接受下一个加数 10 2020年4月12日星期日 3 11循环结构和循环语句 源程序如下 includeusingnamespacestd constintn 100 用常变量利于修改程序intmain inti 1 sum 0 循环初始条件while i n sum i i 修改循环条件 cout sum sum endl return0 11 2020年4月12日星期日 3 11循环结构和循环语句 注意 通常循环开始前对循环条件进行初始化 而在循环体语句中要包含修改循环条件的语句 否则循环将不能终止而陷入死循环 while语句的四个要素 循环变量初始化 继续条件 循环体 改变循环变量的表达式 12 2020年4月12日星期日 C 表达方式灵活 上例中的循环语句还可以写成 while i n sum i 或者while sum i i n 循环体为空语句 13 2020年4月12日星期日 3 11循环结构和循环语句 do while语句 do while语句称为直到循环 格式为 do循环体语句while 表达式 do while语句的执行流程图 14 2020年4月12日星期日 3 11循环结构和循环语句 例 用迭代法求a的平方根近似值 求平方根的迭代公式为 要求前后两个迭代根之差小于10 5 迭代法求解 a是已知正数 x0是迭代初值 给x0一个值 假定x0 a 2 则用迭代公式依次计算 x1 x0 a x0 2 x2 x1 a x1 2 xk 1 xk a xk 2 当 xk 1 xk 是一个较小的正数 时 迭代终止 取xk 1的值为a的平方根近似值 15 2020年4月12日星期日 3 11循环结构和循环语句 1 输入a a 0 及较小正数delta 也可用常变量 2 x0 a 2 用迭代公式算x1 x0 a x0 2 3 while x1 x0 delta x0 x1 把最近的值给x0 x1 x0 a x0 2 求xk 1时只需要知道xk的值 所以只需2个变量4 取x1的值为a的平方根近似值 输出 2 3步骤很适合用do while语句实现 x1 a 2 do x0 x1 x1 x0 a x0 2 while x1 x0 delta 和迭代法对应的程序算法是递推算法 16 2020年4月12日星期日 3 11循环结构和循环语句 intmain floatx0 x1 a cout a if a 1e 5 cout a 的平方根为 x1 endl return0 2020年4月12日星期日 17 例 读入一系列整数 统计出正整数个数i和负整数个数j 读入0则结束 分析 需要读入一系列整数 但是整数个数不定 要在每次读入之后进行判断 因此使用while循环最为合适 循环控制条件应该是n 0 由于要判断数的正负并分别进行统计 所以需要在循环内部嵌入选择结构 算法的基本控制结构 2020年4月12日星期日 18 1 正数计数器pc 0 负数计数器nc 02 读入一个整数3 如果是正数 pc 4 如果是负数 nc 5 如果不是0 转2否则继续6 输出pc nc 2020年4月12日星期日 19 includeusingnamespacestd intmain inti 0 j 0 n cout n if n 0 i if n 0 j while n 0 cout 正整数个数 i 负整数个数 j endl includeusingnamespacestd intmain inti 0 j 0 n cout n while n 0 if n 0 i if n n cout 正整数个数 i 负整数个数 j endl 20 21 2020年4月12日星期日 循环结构和循环语句 例 输入一段文本 统计文本的行数 单词数及字符数 假定单词之间以空格或跳格或换行符间隔 且文本开始没有空行 算法分析 1 逐个读入文本中的字符 直到读到一个输入结束符EOF为止 2 如何算行数 行结束标志为读到字符 n 3 如何算单词数 设一个变量isword 读到字符时isword 1 读到间隔符时isword 0 如果读到一个间隔符而此时isword值为1 则说明刚读完一个单词 如果读到一个字符而此时isword值为0 则说明刚开始读一个单词 4 如何算字符数 22 2020年4月12日星期日 3 11循环结构和循环语句 算法 1 设置变量line word ch分别代表行数 单词数 非分隔字符数 并初始化 设置变量isword来辅助统计单词数 2 do 从键盘读入一个字符c if c n line if 是单词开头 word if c不是分隔符 ch while c EOF 3 输出统计结果 includeusingnamespacestd includeintmain charc intline 0 word 0 ch 0 intisword 0 cout 输入一段文本 无空行 endl c cin get do if c n line 遇换行符行数 1if c 24 2020年4月12日星期日 3 11循环结构和循环语句 do while语句和while语句的区别 do while语句至少执行一次循环体后再判断循环条件是否满足 while语句先判断条件是否满足 然后才执行循环体 可能一次也不执行 多数情况下可以互相替代 25 2020年4月12日星期日 3 11循环结构和循环语句 注意 应用while语句与do while语句时应注意 一般来说在循环体中 应该包含改变循环条件表达式的语句 否则便会造成无限循环 死循环 在本例中 改变循环条件的语句是 i i 这两个程序在任何时候运行结果都相同吗 在什么时候结果不相同 对比下列程序 程序1 includeusingnamespacestd intmain inti sum 0 cin i while i 10 sum i i cout sum sum endl 算法的基本控制结构 程序2 includeusingnamespacestd intmain inti sum 0 cin i do sum i i while i 10 cout sum sum endl 26 2020年4月12日星期日 27 for语句 语法形式for 表达式1 表达式2 表达式3 语句 算法的基本控制结构 28 2020年4月12日星期日 3 11循环结构和循环语句 for循环语句的格式为 for 表达式1 表达式2 表达式3 循环体语句 29 2020年4月12日星期日 3 11循环结构和循环语句 上述格式可理解为 for 循环变量赋初值 循环条件 循环变量增值 循环体 for是关键字 表达式1 表达式2和表达式3是任意表达式 语句为循环体 它可以是一条语句 也可以是复合语句 还可以是空语句 for循环语句的执行过程 计算表达式1的值 计算表达式2的值 并进行判断 如果表达式2的值为0 false 则退出该循环 执该循环体后面的语句 如果表达式2的值为非0 true 转 3 执行循环体的语句 计算表达式3的值 转 30 2020年4月12日星期日 3 11循环结构和循环语句 for循环语句执行过程图 31 2020年4月12日星期日 3 11循环结构和循环语句 例 求1 3 5 7 99分析 求1 100的之间的奇数和就是一个累加的算法 累加过程是一个循环过程 可以用for语句实现 运行结果 sum 2500 表达式1可以省略 此时表达式1应出现在循环语句之前 表达式3可以省略 即将循环变量增量的操作放在循环体内进行 表达式1不仅可以设置循环变量的初值 同时还可以通过逗号表达式设置设置一些其它变量的值 表达式2和表达式3都可以这样 表达式2如果省略 即不判断其循环条件 则循环将无终止地进行下去 要结束循环 需要在循环体内设置break语句 退出循环 32 2020年4月12日星期日 3 11循环结构和循环语句 for语句 while语句 do while语句比较 inti 1 sum 0 循环初始条件while i 4 sum i i 修改循环条件 inti 1 sum 0 循环初始条件do sum i i 修改循环条件 while i 4 inti sum 0 for i 1 i 4 i sum i 习惯上 表达式1 循环初始条件 表达式2 循环终止条件 表达式3 修改循环条件 for语句最简单的形式也是最容易理解的格式如下 for 循环变量赋初值 循环条件 循环变量增值 语句例如for i 1 i 100 i sum sum i 它的执行过程与图3 10完全一样 它相当于以下语句 i 1 while i 100 sum sum i i 显然 用for语句简单 方便 for语句的使用有许多技巧 如果熟练地掌握和运用for语句 可以使程序精炼简洁 说明 1 for语句的一般格式中的 表达式1 可以省略 此时应在for语句之前给循环变量赋初值 for 表达式2 表达式3 2 如果表达式2省略 即不判断循环条件 循环无终止地进行下去 也就是认为表达式2始终为真 for 表达式1 表达式3 3 表达式3也可以省略 但此时程序设计者应另外设法保证循环能正常结束 for 表达式1 表达式2 4 可以省略表达式1和表达式3 只有表达式2 即只给循环条件 for 表达式2 5 3个表达式都可省略 for 6 表达式1可以是设置循环变量初值的赋值表达式 也可以是与循环变量无关的其他表达式 7 表达式一般是关系表达式 如i 100 或逻辑表达式 如a b x y 但也可以是数值表达式或字符表达式 只要其值为非零 就执行循环体 C 中的for语句比其他语言中的循环语句功能强得多 可以把循环体和一些与循环控制无关的操作也作为表达式1或表达式3出现 这样程序可以短小简洁 但过分地利用这一特点会使for语句显得杂乱 可读性降低 建议不要把与循环控制无关的内容放到for语句中 1 3种循环都可以用来处理同一问题 一般情况下它们可以互相代替 2 while和do while循环 是在while后面指定循环条件的 在循环体中应包含使循环趋于结束的语句 如i 或i i 1等 for循环可以在表达式3中包含使循环趋于结束的操作 甚至可以将循环体中的操作全部放到表达式3中 因此for语句的功能更强 凡用while循环能完成的 用for循环都能实现 3 用while和do while循环时 循环变量初始化的操作应在while和do while语句之前完成 而for语句可以在表达式1中实现循环变量的初始化 3 11 4几种循环的比较 38 2020年4月12日星期日 3 11循环结构和循环语句 for语句的应用 for语句的几点说明 1 是先判断型的 同while语句 2 使用更为灵活 三个表达式可以是任意表达式 因此它们就可以实现循环初始化 计算 修改循环条件等任务 而不一定非在循环体中进行 39 2020年4月12日星期日 3 11循环结构和循环语句 例 设计程序输出Fibonacii数列的前20项 要求每行输出5个数据 Fibonacii数列定义如下 算法分析 除了第0项和第1项外 每一项都是由类似方法产生 即前两项之和 所以求当前项时 只需要记住前两项 程序不需要为每一项设置专用变量 属递推算法 40 2020年4月12日星期日 3 11循环结构和循环语句 算法 1 设置变量n表示第几项 变量f1和f2用来记住当前项f3之前的两项 变量初始化n 0 2 while 当前项不到第20项 if 当前项是第0项 f1 0 if 当前项是第1项 f2 1 if 当前项是第2项或更高项 f3 f1 f2 按要求输出f3 f1 f2 f2 f3 记住最近两项当前项后移一位 41 2020年4月12日星期日 3 11循环结构和循环语句 程序如下 intmain intfib0 0 fib1 1 fib2 cout setw 5 fib0 setw 5 fib1 endl for intn 3 n 20 n fib2 fib0 fib1 cout setw 5 fib2 if n 5 0 cout endl 控制每行5个数据fib0 fib1 fib1 fib2 return0 42 2020年4月12日星期日 3 11循环结构和循环语句 例 输入一个不超过5位的整数 将其反向后输出 例如输入247 变成742输出 算法分析 1 将整数的各个数位逐个位分开 用一个数组保存各个位的值 然后反向组成新的整数 2 将整数各位数字分开的方法是 通过求余得到个位数 然后将整数缩小十倍 再求余 并重复上述过程 分别得到十位 百位 直到整数的值变成0为止 43 2020年4月12日星期日 3 11循环结构和循环语句 数据处理 1 设置变量num表示输入的整数 整型数组digit 5 用来存放num的各个位 变量i用来表示数组的当前下标 算法 1 输入num 变量初始化 i 0 2 while num 0 num对10取余 得num的当前个位数digit i num整除10 即去掉个位数 十位变个位 百位变十位 i 数组digit准备记录下一位 3 将数组元素按下标从低到高的顺序输出 44 2020年4月12日星期日 3 11循环结构和循环语句 程序如下 intmain inti num subscript intdigit 5 cout num cout0 for i 0 i subscript i 整数的反向组合num num 10 digit i cout 反向后整数为 num endl return0 45 2020年4月12日星期日 3 12循环的嵌套 嵌套循环 当循环语句中的循环体中又有循环语句时 就构成了嵌套循环 嵌套层次一般不超过3层 以保证可读性 3种循环 while循环 do while循环和for循环 可以互相嵌套 for while 一个循环体内又包含另一个完整的循环结构 称为循环的嵌套 内嵌的循环中还可以嵌套循环 这就是多层循环 3种循环 while循环 do while循环和for循环 可以互相嵌套 例如 下面几种都是合法的形式 1 while while 3 12循环的嵌套 2 do do while while 3 for for 4 while do while 5 for while 6 do for while 2020年4月12日星期日 50 例2 8 输入一个整数 求出它的所有因子 算法的基本控制结构 2020年4月12日星期日 51 1 输入n2 输出13 for i 2 i n 1 i if n i 0 输出i 4 输出n includeusingnamespacestd intmain intn k cout n cout Number n Factors for k 1 k n k if n k 0 cout k cout endl 52 运行结果1 Enterapositiveinteger 36Number36Factors123469121836运行结果2 Enterapositiveinteger 7Number7Factors17 53 54 2020年4月12日星期日 例 打印如下图形 分析 根据按行输出的特点 语句书写如下 for i 1 i 5 i 打印第i行 Bcout endl 准备输出下一行 细化第B行 第i行可以看作两部分 先输出若干空格 接着输出若干 每行输出的 数是同的 而空格数则与所在行相关 很明显 第i行空格数为5 i 故B行细化为以下两个语句 for j 1 j i j cout for j 1 j 11 j cout 3 12循环的嵌套 55 2020年4月12日星期日 打印5行符号图形for i 1 i 5 i 打印第i行字符图形 for i 1 i 5 i 打印i个 打印11个 回车换行 56 2020年4月12日星期日 for i 1 i 5 i for j 1 j i j cout for j 1 j 11 j cout cout endl 57 2020年4月12日星期日 include includeusingnamespacestd intmain inti j for i 1 i 5 i 外层循环的大括号一定不能丢掉for j 1 j i j cout 输出若干空格for j 1 j 11 j cout 输出若干 cout endl 准备输出下一行 return0 3 12循环的嵌套 2020年4月12日星期日 58 例2 9编写程序输出以下图案 算法的基本控制结构 打印上面4行打印下面3行 for i 1 i 1 i 2 i 1个 换行 第i行 for i 3 i 1 i 2 i 1个 7 2 i 1 个 换行 第i行 includeusingnamespacestd intmain inti j n cin n for i 1 i n i 输出前4行图案 for j 1 j 30 j cout 在图案左侧空30列for j 1 j 8 2 i j cout for j 1 j 2 i 1 j cout cout endl 60 for i 1 i n 1 i 输出后3行图案 for j 1 j 30 j cout 在图案左侧空30列for j 1 j 7 2 i j cout cout endl 61 62 2020年4月12日星期日 分析 1 计算机的输出是按行进行的 因此可以先用一个循环语句输出第一行表头 2 表中各行数据的输出可以用下面的算法描述 for i 1 i 10 i cout i 输出行号输出第i行数据 Acout endl 准备输出下一行 例 打印九九表 打印格式为 123456789112243369 991827364554637281 3 12循环的嵌套 63 2020年4月12日星期日 3 第A行需要进一步细化 由于第i行数据是一组有规律的数列 每个数的值是其所在行与列的乘积 因此输出第i行可以 for j 1 j 10 j cout setw 4 i j 4 按上述算法输出的每一行都将有九列 即打印出的是矩形表而不是下三角形表 进一步分析发现每一行的列数与所在行数相关 因此要输出三角形表 上面的循环语句需稍作修改 for j 1 j i j cout setw 4 i j 将此语句放到顶层算法的A行即可 3 12循环的嵌套 64 2020年4月12日星期日 算法 1 输出表头 用一个循环语句即可 2 输出表体 for i 1 i 10 i cout i 输出行号输出第i行数据 Acout endl 准备输出下一行 3 A行细化 for j 1 j i j cout setw 4 i j 3 12循环的嵌套 65 2020年4月12日星期日 intmain inti j cout setw 3 setw 4 for i 1 i 10 i cout setw 4 i 输出表头 乘数 cout endl endl for i 1 i 10 i cout setw 3 i setw 4 输出行号 被乘数 for j 1 j i j cout setw 4 i j 输出表中数据 乘积 cout endl 准备输出下一行 return0 3 12循环的嵌套 2020年4月12日星期日 66 break和continue语句 break语句使程序从循环体和switch语句内跳出 继续执行逻辑上的下一条语句 不宜用在别处 continue语句结束本次循环 接着判断是否执行下一次循环 算法的基本控制结构 67 2020年4月12日星期日 3 13break语句和continue语句 break语句的功能是 中断所在循环体或switch case语句块 跳转本层循环体外 break语句 break语句的格式如下 例 判断一个数是否为素数 分析 素数是不能被大于或等于2的数整除的数 用一个循环依次判断此数是否被大于等于2的数整除 一旦被一个数整除 就用break跳出循环 宣布此数不是素数 break 68 2020年4月12日星期日 3 13break语句和continue语句 运行结果 5 5是素数6 6不是素数7 7是素数0 当判断不是一个素数时 用break中断循环 由于break所在的是多重循环的内层 因此外层循环仍未中断 break中断了最外层循环 中止了继续从键盘继续输入数据 注意 既然break语句用来中断循环 它一定要用在循环体或swtich case体中 用在其它地方就会出错 69 2020年4月12日星期日 例2 18 给定正整数m 判定其是否为素数 分析 如果m 2 m是素数的条件是不能被2 3 取整 整除 因此可以用2 3 取整 逐个去除m 如果被其中某个数整除了 则m不是素数 否则是素数 算法属于穷举法 1 输入被测数m m 2 令整型变量k sqrt m 2 判断m是否素数 设置辅助整型变量i 使i从2开始直到k依次测试m能否整除i 若能 则不是素数 for i 2 i k i if m i 0 break 条件满足 m不是素数 停止测试 结束for语句 3 根据i是否已达到k 输出结果是否为素数 3 13break语句和continue语句 70 2020年4月12日星期日 intmain intm i k cout m if m 2 coutk cout m 是素数 endl 循环提前终止表示是非素数elsecout m 不是素数 endl return0 3 13break语句和continue语句 71 2020年4月12日星期日 3 13break语句和continue语句 continue语句的格式如下 continue continue语句 continue语句只能用在循环语句中 用来终止本次循环 当程序执行到continue语句时 将跳过其后尚未执行的循环体语句 开始下一次循环 下一次循环是否执行仍然取决于循环条件的判断 continue语句与break语句的区别在于 continue语句结束的只是本次循环 而break结束的是整个循环 72 2020年4月12日星期日 3 13break语句和continue语句 例 使用continue改写判断素数的程序 当不是素数 直接跳到第15行继续执行 程序结果错误 73 2020年4月12日星期日 输出1 100之间所有素数 for i 3 i 100 1 issushu 1 for j 2 j i 1 j if i j 0 issushu 0 break if issushu cout i isasushu endl 74 2020年4月12日星期日 3 13break语句和continue语句 例 输出1 100内3的倍数 分析 设置整型变量I从1变化到100 依次测试I是否3的倍数 算法属于穷举法 for
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医疗合作合同协议书范本
- 交通免责赔偿协议书范本
- 啤酒供货商合同协议模板
- 合同外增加项目补充协议
- 双面打印盖章的合同范本
- 厂房招商租售协议书模板
- 合伙盖房拆迁合同协议书
- 加气块承包生产合同范本
- 嘉定区家具运输合同范本
- 介绍工程居间协议书范本
- (完整)托管班托管协议
- ICU 危重患者CVC 及PICC 导管的留置选择及护理研究新进展
- 宝钢国际集团胜任能力模型
- 二年级四宫格六宫格数独练习
- LS/T 3243-2015DHA藻油
- GB/T 2423.7-1995电工电子产品环境试验第2部分:试验方法试验Ec和导则:倾跌与翻倒(主要用于设备型样品)
- 医院进修生结业鉴定表
- 西师版四年级数学上册第一单元测试题(A)
- 花甲水库库底清理实施方案(修订稿)
- 鞘内镇痛泵置入术全程图解课件
- 水产食品原料中的生物活性物质课件
评论
0/150
提交评论