第四章流程控制(2)_循环结构.ppt_第1页
第四章流程控制(2)_循环结构.ppt_第2页
第四章流程控制(2)_循环结构.ppt_第3页
第四章流程控制(2)_循环结构.ppt_第4页
第四章流程控制(2)_循环结构.ppt_第5页
已阅读5页,还剩90页未读 继续免费阅读

下载本文档

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

文档简介

4 3循环结构 4 3 1for语句4 3 2while语句4 3 3do while语句 4 3 1for语句 例4 9 输入2个整数lower和upper 输出一张华氏 摄氏温度转换表 华氏温度的取值范围是 lower upper 每次增加1 F 例如 输出 fahrcelsius30 1 131 0 6320 0330 6341 1351 7 输入 3035 一 程序解析 温度转换表 includeintmain void intfahr lower upper doublecelsius printf 输入最低值 scanf d fahr fahr 1 Enterlower 30Enterupper 35fahrcelsius30 1 131 0 6320 0330 6341 1351 7 例4 9中for语句的流程 for fahr lower fahr upper fahr celsius 5 0 9 0 fahr 32 printf d 6 1f n fahr celsius Enterlower 30Enterupper 35fahrcelsius30 1 131 0 6320 0330 6341 1351 7 到VC中看看执行过程 for 表达式1 表达式2 表达式3 循环体语句实现C语句的重复执行 二 for语句 循环语句 3个表达式 循环体语句 书写顺序和执行顺序不同 表达式1只执行一次 循环 控制 变量 for语句中 通过改变或判断某个变量的值来控制循环的执行for fahr lower fahr upper fahr celsius 5 0 9 0 fahr 32 0 printf d 6 1f n fahr celsius for语句中的循环变量 赋初值 判断其值 改变其值 for fahr lower fahr upper fahr celsius 5 0 9 0 fahr 32 0 printf d 6 1f n fahr celsius 表达式1 给循环变量赋初值 指定循环的起点 fahr lower表达式2 给出循环的条件 决定循环的继续或结束 fahr upper表达式3 设置循环的步长 改变循环变量的值 从而可改变表达式2的真假性 fahr 语句 被反复执行的语句 一条语句 for语句的说明 for fahr lower fahr upper fahr celsius 5 0 9 0 fahr 32 0 printf d 6 1f n fahr celsius for fahr lower fahr upper fahr fahr 1 celsius 5 0 9 0 fahr 32 0 printf d 6 1f n fahr celsius 注意复合语句 和空语句 for fahr lower fahr upper fahr fahr 1 celsius 5 0 9 0 fahr 32 0 printf d 6 1f n fahr celsius 不要在for语句中随意加分号 例4 10求1 2 100抽取具有共性的算式 sum sum isum初值为0 该算式重复100次 i从1变到100设i为循环变量 则 指定循环起点的表达式1 i 1给出循环条件的表达式2 i 100设置循环步长的表达式3 i 循环体语句 sum sum i for i 1 i 100 i sum sum i 三 指定次数的循环程序设计 计算1 2 3 100 includeintmain inti sum sum 0 置累加和sum的初值为0 for i 1 i 100 i 循环重复100次 sum sum i 反复累加 printf sum d n sum 输出累加和 return0 源程序 求1 2 100 for i 1 i 100 i sum 0 sum sum i 结果如何 sum 5050 计算1 2 3 100 includeintmain inti sum sum 0 for i 1 i 100 i sum sum i printf sum d n sum return0 模仿练习 求1 1 2 1 3 1 100 for i 1 i 100 i sum sum 1 0 i inti doublesum printf sum f n sum 在上例基础上改写 一般包含四个部分 初始化 指定循环起点给循环变量赋初值 如i 1 进入循环之前 设置相关变量的初值 如sum 0 条件控制 只要i100 循环结束 指定次数的循环程序设计 输入一个正整数n 求前n项和 即循环n次 计算1 2 3 100 includeintmain void inti sum sum 0 for i 1 i 100 i sum sum i printf sum d n sum return0 例4 11求1 2 3 n for i 1 i n i sum sum i printf Entern scanf d Entern 100Sum 5050 计算1 2 3 n includeintmain inti sum printf Entern scanf d 模仿练习 求1 1 2 1 3 1 n 求1 1 2 1 3 1 n includeintmain inti n doublesum printf Entern scanf d 求前n项和 即循环n次 每次累加1项 for i 1 i n i sum sum item 第i项 问题是第i项item如何计算 考虑与i的关系 item 1 0 2 i 1 例4 12求1 1 3 1 5 的前n项和 for i 1 i n i item 1 0 2 i 1 计算第i项的值 sum sum item 累加第i项的值 思路一 求前n项和 即循环n次 每次累加1项 for i 1 i n i sum sum item 第i项 问题是第i项item如何计算 分母总是比前一项大2 求1 1 3 1 5 的前n项和 思路二 deno 1 for i 1 i n i item 1 0 deno 计算第i项的值 sum sum item 累加第i项的值 deno deno 2 计算下一项的分母 includeintmain void inti n doubleitem sum printf Entern scanf d 源程序 求1 1 3 1 5 的前n项和 模仿练习 1 求的前n项和 结果保留3位小数2 求的前n项和 结果保留3位小数3 求的前n项和 结果保留3位小数 求前n项和 即循环n次 每次累加1项 for i 1 i n i sum sum item 第i项 关键是第i项item的计算 符号和前一项相反 分母比前一项大2deno deno 2flag flagitem flag 1 0 deno 求1 1 3 1 5 的前n项和 方法1 deno 1 flag 1 for i 1 i n i item flag 1 0 deno 计算第i项的值 sum sum item 累加第i项的值 deno deno 2 计算下一项的分母 flag flag 计算下一项的符号 方法2 flag 1 for i 1 i n i item flag 1 0 2 i 1 计算第i项的值 sum sum item 累加第i项的值 flag flag 计算下一项的符号 includeintmain intdeno flag i n doubleitem sum printf Entern scanf d 模仿练习源程序 例4 13阶乘表 product 1 for i 1 i n i 计算i的阶乘 前一项结果 i 输出结果 输入一个整数n 输出1 n的阶乘表 12624 product product i printf d d n product includeintmain void inti n product printf inputn n scanf d 例4 13源程序1 结果用int型 13以前的能正确计算 从14开始结果出错 超出int型的表达范围 includeintmain void inti n doubleproduct printf inputn n scanf d 例4 13源程序2 结果用double型 21以前的可以正确计算 22以后都是近似结果 double型也不是万能的 只有16位有效数字 例4 14n个数求和 从键盘输入一个整数n和n个整数 输出这n个整数的和思路分析 1 定义 初始化变量 读入整数n 2 控制循环进行n次 循环内容 读入一个整数a 把a累加到sum上 3 输出sum的值 includeintmain inti n a sum scanf d 例4 15n个数求和源程序 循环变量不一定要在循环体内参与运算 本例中 循环变量i只起到控制循环次数的作用 模仿练习 1 输入n 然后输入n个整数 输出这n个整数的最大值 思路分析 1 scanf d 若当前整数a比max大 则更新max 4 输出max 例4 15数列和 计算的前20项和 先找规律 后一项与前一项相比 符号如何变 分子如何变 分母如何变 解题思路 1 定义相关变量i num 分子 demo 分母 flag 符号 sum 累加和 2 读入x 3 初始化 flag 1 num x demo 1 sum 0 4 计算前20项for i 1 i 20 i sum sum flag num demo 计算当前项并累加 为下一项做准备flag flag 符号取反num num x x 计算下一项的分子demo demo 2 i 2 i 1 计算下一项分母 5 输出结果 includeintmain inti flag doublex num demo sum scanf lf 例4 14数列和程序 模仿练习 1 求1 2 100 2 输入n和a 求a aa aaa aa a n个a 如当n 3 a 2时 2 22 222的结果为246 提示1 for i 1 i 100 i 求出第i项itemsum sum item 先找规律 后一项与前一项相比 求1 2 100 由i的阶乘如何求出i 1的阶乘 提示2 输入n和a 求a aa aaa aa a n个a 1 首先初始化sum 0 term 0 2 每次循环 i从1到n 前一项乘10加a 得到当前项 term term 10 a累加当前项 sum sum term 例4 16 统计输入的一批字符中各类字符的数量 编程 输入10个字符 统计其中英文字母 数字字符和其他字符的个数 思路分析 1 定义相关变量i letter digit other ch 并初始化 2 控制循环进行10次for i 1 i 10 i 1 读入一个字符 2 if 该字符是字母 letter增1elseif 该字符是数字 digit增1elseother增1 3 输出letter digit other includeintmain void intdigit i letter other charch digit letter other 0 printf Enter10characters for i 1 i a input10characters Reold123 letter 5 digit 3 other 2 多层缩进的书写格式使程序层次分明 程序解析 例4 17查询自动售货机中商品的价格 假设自动售货机出售4种商品 薯片 crisps 爆米花 popcorn 巧克力 chocolate 和可乐 cola 售价分别是每份3 0 2 5 4 0和3 5元 在屏幕上显示以下菜单 用户可以连续查询商品的价格 当查询次数超过5次时 自动退出查询 不到5次时 用户可以选择退出 当用户输入编号1 4 显示相应商品的价格 输入0 退出查询 输入其他编号 显示价格为0 1 Selectcrisps 2 Selectpopcorn 3 Selectchocolate 4 Selectcola 0 Exit 思路分析 1 定义相关变量choice i price 2 控制循环执行5次for i 1 i 5 i 1 用多个printf显示菜单 2 读入用户的选择choice 3 如果用户选择0 则用break终止循环 4 用swtich语句根据用户的不同选择把不同的价格值赋给变量price 5 输出price includeintmain intchoice i doubleprice for i 1 i 5 i printf 1 Selectcrisps n printf 2 Selectpopcorn n printf 3 Selectchocolate n printf 4 Selectcola n printf 0 exit n printf Enterchoice scanf d switch choice case1 price 3 0 break case2 price 2 5 break case3 price 4 0 break case4 price 3 5 break default price 0 0 break printf price 1f n price for结束printf Thanks n 此break用来终止for循环 运行结果 1 Selectcrisps 2 Selectpopcorn 3 Selectchocolate 4 Selectcola 0 ExitEnterchoice 1price 3 0 1 Selectcrisps 2 Selectpopcorn 3 Selectchocolate 4 Selectcola 0 ExitEnterchoice 7price 0 0 1 Selectcrisps 2 Selectpopcorn 3 Selectchocolate 4 Selectcola 0 ExitEnterchoice 0Thanks 上机作业 1 输入n 输出1 2 3 n的结果2 输入n n 10 输出1 2 3 n的结果3 输入n 输出1 1 2 1 3 1 n的结果 结果保留2位小数4 输入n 输出1 1 3 1 5 1 n的结果 结果保留2位小数5 输入n 输出1 1 3 1 5 1 n的结果 结果保留2位小数6 输入n 然后输入n个整数 输出n个整数的和 7 输入n 然后输入n个整数 输出n个整数的最大值8 输出1 100的自然对数表 对数保留4位小数nn的对数10 000020 6931 9 输入10个字符 统计其中数字字符 0 9 个数 10 四则运算 要求能实现多次计算 但最多不超过5次 程序运行后首先提示输入两个实数 然后显示菜单 1 相加2 相减3 相乘4 相除5 退出然后读入用户的选择 根据用户选择输出相应的结果 4 3 2while语句 例4 18 使用格里高利公式求 的近似值 要求精确到最后一项的绝对值小于10 4 不知道循环次数 循环结束的条件是 最后一项的绝对值小于10 4 includeintmain void intdeno flag doubleitem pi flag 1 deno 1 item 1 0 pi 0 while fabs item 0 0001 item flag 1 0 deno pi pi item flag flag deno deno 2 pi pi 4 printf pi f n pi return0 一 程序解析 求 的近似值 pi 3 141613 item 0 0 fabs item 0 0001 二 while语句 while 条件 循环体语句 循环条件 循环体 一条语句 课堂练习 以下程序段的运行结果 1 i 0 while i 5 printf i d n i i i 0i 1i 2i 3i 4 请用for循环改写这个程序段 for i 0 i 5 i printf i d n i 课堂练习 以下程序段的运行结果 2 i k 1 while i 5 k i printf i d k d n i k i 1 k 2i 1 k 3i 1 k 4i 1 k 5i 1 k 6 死循环 i 5永真 课堂练习 以下程序段的运行结果 3 i 0 while i 4 printf n i 2 死循环 无论i值在循环体中如何变化 i 4为永真是死循环 课堂练习 以下程序段的运行结果 4 i 0 while i 4 printf i d n i i 2 无输出 进入循环时首先测试i 4的值为假 结束循环 循环体一次也不执行 无输出 while语句和for语句都是在循环前先判断条件 while语句说明 表达式1 while 表达式2 for的循环体语句 表达式3 把for语句改写成while语句for 表达式1 表达式2 表达式3 循环体语句 while和for的比较 for i 1 i 10 i sum sum i i 1 循环变量赋初值while i 10 循环条件sum sum i i 循环变量的改变 循环体 小练习 思路分析 1 累加变量sum初始化为0循环变量i初始化为1 2 while i n 做 把i累加到sum上 i自增1 3 输出sum 用while语句实现 求1 2 n 关于for语句的三个表达式 for 表达式1 表达式2 表达式3 循环体语句中的三个表达式都可缺省 但两个分号不能缺省 for i 1 i n i sum sum i i 1 for i n i sum sum i i 1 for i n sum sum i i i 1 for sum sum i i if i n break 退化为相当于while语句 循环条件为永真 相当于while 1 需要在循环体中设置出口 例4 19从键盘输入一批学生的成绩 计算平均分 输入负数表示输入结束 分析 求累加和确定循环条件不知道输入数据的个数 无法事先确定循环次数用一个特殊的数据作为正常输入数据的结束标志 比如选用一个负数作为结束标志 三 用while语句进行程序设计 思路分析 1 定义变量i num 计数 score total 2 读入一个成绩score 3 while score大于0 做 把成绩累加到total上 人数num增1 读下一个学生成绩 4 if 人数num大于0 输出平均成绩total numelse输出平均成绩为0 includeIntmain void intnum doublescore total num 0 total 0 printf Enterscore n scanf lf Entergrades 6788735482 1Gradeaverageis72 80 Entergrades 16788735482Gradeaveragemarkis 模仿练习 从键盘输入一批学生的成绩 输出最高分 输入负数表示输入结束 4 3 3do while语句 do 循环体语句 while 表达式 先执行一次循环 后判断 真 假 表达式 循环体语句 do while的下一条语句 while是先判别条件 再决定是否循环 do while是先至少循环一次 然后再根据循环的结果决定是否继续循环 while和do while的比较 循环语句的选择 如果循环次数已知使用for语句如果循环次数未知如果循环条件在进入循环时明确使用while语句如果循环条件需要在循环体中明确使用do while语句 例4 20辗转相处法求最大公约数 辗转相除法求m和n的最大公约数gcd m n 例 求24和15的最大公约数 过程如下 mn余数r241591596963630当余数为0时 n 3就是最大公约数 例 求54和36的最大公约数 过程如下 mn余数r54361836180当余数为0时 n 18就是最大公约数 解题思路 1 假定m n 如果m n 则二者互换 2 求余数r m n 3 用 n r 代替 m n 把n赋给m 把r赋给n 4 若r不为0 则返回第 2 步若r为0 m即所求 do 2 求余数r m n 3 用 n r 代替 m n 把n赋给m 把r赋给n while r 0 m即所求 在这一步 若r为0 n即所求 在这一步 把n赋给m了 所以 m即所求 includeintmain intm n r temp scanf d d 上例也可以用while实现 假定m n while n 0 r m n m n n r 循环结束时 m即最大公约数 小练习 用do while语句求1 2 n 4 3 4流程转向语句 1 break语句利用break语句能够强制结束循环 转到后续语句执行 2 continue语句中断循环体的本次执行 即跳过循环体中尚未执行的语句 立即开始执行下一次循环 3 return语句return语句的用途是结束本函数 将控制返回到它的调用处 例4 21判断素数 输入一个正整数m 判断它是否为素数 定义 除了1和m 不能被其它数整除 例如 判断13769是否是素数如何判断 尝试用2 3 4 5 13738去除有两种可能情况 1 尝试完所有数 均不能整除m 则m是素数 2 尝试到某一个数i 能整除m 可得出结论m不是素数 不用再往下尝试 分析 编程实现 逐个尝试 2 m 1 看能不能整除m 设i取值 2 m 1 如果m不能被该区间上的任何一个数整除 即对每个i m i都不为0 则m是素数只要找到一个i 使m i为0 则m肯定不是素数分析 缩小范围 m不可能被大于m 2的数整除i取值 2 m 2 再进一步分析 m若不是素数 必有一个因数在 2 即若m不能被 2 的数整除 m必为素数 实现思路 1 flag 1 是否为素数的标志 1代表素数 0代表非素数k sqrt m 2 尝试2 kfor i 2 i k i if m是i的倍数 则m不是素数 flag 0 break 否则 做下一次循环 尝试下一个整数 3 若flag 1 则m是素数 否则 m不是素数 只要有一个i能整除m 就可以得到m不是素数的结论 提前结束循环 主要代码 k sqrt m flag 1 1代表素数 0代表非素数for i 2 i k i if m i 0 flag 0 break if flag 1 printf yes n elseprintf no n Break语句用于提前结束循环 continue与break 例子 输出1 999 遇到7的倍数则跳过 for i 1 i 999 i if i 7 0 continue printf d i 遇到7的倍数 立即执行下一次循环 输出 123456891011121315161718 if i 7 0 printf d i continue与break for i 1 i 999 i if i 7 0 break printf d i 遇到第一个7 就中断了循环 输出 123456 模仿练习 输出1 999 遇到7的倍数或含有数字7的数则跳过提示 取n的个位上的数字 n 10取n的十位上的数字 n 10 10取n的百位上的数字 n 100 10若你确定n不多于3位 百位为n 100 return语句 return语句的用途是结束本函数的执行 将控制返回到它的调用处 return语句有两种形式 不带表达式的return语句 形式为 return 不带表达式的return语句只返回控制 不返回值 带表达式的return语句 形式为 return 表达式 或return表达式 带表达式的return语句在返回控制的同时 将表达式的值返回到调用处 return应用举例 输入一个百分制成绩 输出其对应的等级 若输入大于100或小于0 输出 输入错误 intmain scanf d 4 3 5多重循环 如果循环语句的循环体内又包含了另一条循环语句 则称为循环的嵌套 例4 22 计算 s 11 22 33 44 nn n由用户输入 后一项似乎不能有前一项递推得到 每一项的值都需要用循环计算 解题思路 1 输入n 累加变量sum初始化为0 2 控制循环进行n次for i 1 i n i 3 计算第i项的值item 即ii 4 sum sum item 5 输出sum item需要用循环计算 即把i累乘i次 item 1 累乘变量初始化for j 1 j i j item item i includeintmain inti j n sum item item存放阶乘 scanf d 逗号表达式 for sum 0 i 1 i n i 这里是一个逗号表达式 其中的各表达式按顺序执行 逗号表达式也有值 其值是最后一个表达式的值 a 3 b a 2 a a a 则b的值为 36执行过程如下 先执行赋值表达式 把6赋给a 再计算a a即36作为逗号表达式的值 a 3 b 2 a a a 则b的值为 9执行过程如下 先计算第一个表达式 值为6再计算a a即9作为逗号表达式的值 到vc中试试 for sum 0 i 1 i n i item 1 for j 1 j i j item item i sum sum item 注意内层循环的初始化 item 1 for sum 0 i 1 i n i for j 1 j i j item item i sum sum item 右边的程序会有什么问题 分析一下 到VC中试试 例4 23 用如下的格式输出乘法九九表 12345678911234567892468101214161939121518212427416202428323655550354045636624854749566386472981 每个整数占4列 4d 解题思路 1 输出表头行 12345 用循环实现 printf for i 1 i 9 i printf 4d i 输出一个回车 2 控制循环进行9次 输出9行for i 1 i 9 i 3 输出一个i值 4 空i 1个位置 即4 i 1 个空格 用循环实现 5 输出i i i 1 i i 2 i 的值 用循环实现 for j 1 j 4 i 1 j printf for j i j 9 j printf 4d i j includeintmain inti j printf 4c printf for i 1 i 9 i printf 4d i printf n for i 1 i 9 i 输出1 9行 输出第i行printf 4d i 每行第一列的i值for j 1 j 4 i 1 j 输出i 1个空位置printf for j i j 9 j 输出i 1 9与i的乘积printf 4d i j printf n 每行一个回车 例4 23源程序 输出第一行 另一种写法 for i 1 i i printf 4d i j elseprintf printf n 如果列号大于等于行号 输出乘积 否则输出4个空格 模仿练习 九九乘法表 下三角 12345678911224336944812165510152025661218243036771421283542498816243240485664991827364554637281 4 3 6循环结构程序设计应用 例4 241张100元兑换成100张零钞 将一张面值为100元的人民币等值换成5元 1元和0 5元的零钞 要求每种零钞不少于1张 且总张数为100张 一共有哪几种组合 书本例4 20有错 枚举的基本思想 根据问题的描述和相关的知识 为相关变量分别确定一个大概的取值范围 在这个范围内对变量依次取值 判断所取的值是否满足数学模型中的条件 直到找到 全部 符合条件的值为止 这种解决问题的方法称作 枚举 如本题 5元钞张数i的

温馨提示

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

评论

0/150

提交评论