




已阅读5页,还剩75页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章流程控制 顺序结构选择结构循环结构其它控制语句应用举例 重点 流程结构 由这三种基本结构经过反复嵌套构成的程序称为结构化程序 顺序结构 顺序结构 按照语句出现的先后顺序依次执行 例1 编写程序 要求输入直角三角形的斜边和一条直角边 求三角形另外一条直角边 周长和面积 include includeusingnamespacestd voidmain doublea b c doublel s cout 输入斜边 直角边的长 cin c a b sqrt c c a a l a b c s a b 2 cout 另一直角边 b endl cout 周长 l endl cout 面积 s endl 选择结构 根据条件的值来判断程序的流向 if语句 实现n分支 要求n个表达式 switch语句 实现多分支 用1个表达式 1 if语句的三种形式 if 表达式 语句 if 表达式 语句1 else语句2 不能单独存在 if 表达式1 语句1 elseif 表达式2 语句2 elseif 表达式3 语句3 elseif 表达式m 语句m else语句m 1 if语句的三种形式 第一种形式的条件语句 if 表达式 语句 说明 if后面的表达式类型任意 语句可以是一句或复合语句 if x 语句 if x if x y t x x y y t cout x y if x 0 includeusingnamespacestd voidmain intx y t cout x y if x y endl 第二种形式的条件语句 if 表达式 语句 else语句2 非0 0 例2 计算分段函数 if x y sin x sqrt x x 1 elsey cos x x x 3 x 思考 要使max存放x y中大者 min存放小者 分析下面程序段正确否 if x y max x min y elsemax y min x 复合语句 第三种形式的条件语句 if 表达式 语句1 elseif语句2 例 计算分数mark属于优良中及格不及格 elseif语句3 else语句4 if mark 90 cout 优 elseif 80 mark if mark 90 cout 优 elseif 80 mark cout 良 elseif 70 mark cout 中 elseif 60 mark cout 及格 elsecout 不及格 if mark 60 cout 70 cout 80 cout 90 cout 优 elsecout 不及格 程序执行一个分支后 其余分支不再执行 elseif不能写成elseif 当多分支中有多个表达式同时满足 只执行第一个与之匹配的语句 例 编程实现分段函数 includeusingnamespacestd voidmain doublex y cout x if x 0 y x 1 cout x x y x 1 y endl 复合语句 elseif x 1 0 x 1 y 1 cout x x y y endl else 1 x y x x x cout x x y x x x y endl if语句的嵌套 if 表达式1 if 表达表2 语句1else语句2 else if 表达表3 语句3else语句4 if 表达式1 if 表达式2 语句1else语句2 if 表达式1 if 表达式11 语句11else语句12else语句2 else总是和最近的if配对 例 已知x y z三个数 使得x y z if x y t x x y y t if y z t y y z z t if x y t x x y y t x与y互换 z与y互换 复合语句 为什么要引入中间变量t 例 考虑下面程序输出结果 voidmain intx 100 a 10 b 20 intv1 5 v2 0 if a b if b 15 if v1 x 1 elseif v2 x 10 x 1 cout x 结果 1 该语句不属于选择结构中的语句 例 求一元二次方程ax2 bx c 0的根 其中系数a b c为实数 由键盘输入 include includeusingnamespacestd voidmain doublea b c delta p q cout a b c delta b b 4 a c p b 2 a q sqrt fabs delta 2 a if delta 0 cout x1 p q endl x2 p q endl else cout x1 p j q cout endl x2 p j q endl 思考 1 a 0 2 a 0 b 0 3 a 0 b 0 switch语句 switch 表达式 case常量表达式1 语句组1 case常量表达式2 语句组2 case常量表达式n 语句组n default 语句组n 1 break break break 必须为整型或字符型 说明 10常量表达式的值必须互不相等 20语句组i可以含有多个语句 30语句中含有break语句时 执行完后退出switch语句 40若某组语句不含break语句 则本组语句执行完毕后将继续执行下一组语句 50若没有常量值与表达式值相等 执行default语句n 1 若无该语句 退出switch语句 60可以多个case共用一组语句 80用switch语句实现的多分支结构程序 可用if语句或if语句的嵌套来实现 70switch语句允许嵌套 例 用switch结构求分段函数 switch int a case1 b 2 a 1 case2 case3 b a a 3 default b a 共用语句组 switch int a casea 1 关系表达式 思考 若省去break语句 情况会怎样 break break 例 从键盘上输入学生的分数 要求当学生的分数90 100 verygood 80 90 good60 80 pass0 50 Fail includeusingnamespacestd voidmain intscore cin score switch score 10 case10 case9 cout Verygood n case8 cout Good n case7 case6 cout Pass n case5 cout Fail n default cout inputerror break break break break 例 执行下列程序段后 输出结果为 inta 1 b 0 switch a case1 switch b case0 cout 0 break case1 cout 1 break case2 cout 2 break 0 2 includeusingnamespacestd voidmain intx 1 y 0 a 0 b 0 switch x case1 switch y case0 a break case1 b break case2 a b break case3 a b cout a b a 2 b 1 循环结构 while 表达式 语句 假 0 真 非0 do while while 表达式 语句 do语句while 表达式 for for 表达式1 表达式2 表达式3 语句 While语句 while 表达式 语句 执行过程 先计算表达式的值 当表达式的值为非0时执行语句 为0时执行循环的后继 退出循环 说明 循环体可为任意类型语句 下列情况 退出while循环 条件表达式不成立 为零 循环体内break return goto 表达式始终为真 while 1 例1 程序的功能 includeusingnamespacestd voidmain intn sum 0 n 1 while n 100 sum sum n n cout sum 条件表达式 复合语句 例1 求 n的值 includeusingnamespacestd voidmain intn sum 0 while n 100 sum sum n n cout sum 例1 求 n的值 n 1 问题 1 语句n 1 能放在循环体内吗 2 若语句n 100中的等号去掉 3 如要求1到100的累乘应怎样修改程序 sum 1 sum sum n 循环体内的语句受循环的控制 在循环体外的语句不受循环的控制 程序拓展 1 1 2 1 3 1 100的值 includeusingnamespacestd voidmain intn 1 intsum 0 while n 100 n cout sum sum sum 1 n floatsum 0 sum sum 1 0 n do while语句 do语句 while 表达式 执行过程 先执行语句 后判断条件 表达式的值为非0时 继续执行语句 表达式的值为0时 执行循环的后继 例 i 11 sun 0 do sun i i while i 11 例 i 11 sun 0 while i 11 sun i i while与do while的比较 do while和while可相互转化 当while后面的表达式的第一次的值为 真 时 两种循环的结果相同 否则 二者结果不相同 指二者具有相同的循环体的情况 求解表达式1 表达式2 语句 求解表达式3 下一个语句 N T 表达式1 while 表达式2 语句 表达式3 for 表达式1 表达式2 表达式3 循环体 for语句的语法 执行一次 注意 1 若省略表达式1 则需在进入循环体之前置初值 for 表达式1 表达式2 表达式3 循环体 for 表达式2 表达式3 循环体 2 若省略表达式2 表达式3 则在循环体内应有语句能够在一定条件下跳出循环 for 表达式1 循环体 3 三个表达式都省略 需用分号分隔 表示表达式2的值为非零 for 循环体 4 表达式1和3可以通过 包含一个以上的简单的表达式 for n 1 sum 0 n 100 n 循环体 5 表达式2 关系表达式 i 100 逻辑表达式 a b字符表达式 6 for语句后加分号 表示循环体为空语句 例 用上述三种循环语句求 n 1 s 0 while n 100 s s n n n 1 n 1 s 0 do s s n n n 1 while n 100 for n 1 s 0 n 100 n s s n 例 求下列级数的前m项和 分析 级数的通项为xm m 第i项ti与第i 1项ti 1之间存在如下关系 ti ti 1 x i ti 1e 5 当x 1 定义变量 i t e inti 1 floatt 1 e 0 while t 1e 5 e t t t i i 第1项 inti 1 floatt 1 e 0 for t 1e 5 e t t t i i for i 1 t 1 e 0 t 1e 5 e t t t i i 分号不能漏 空语句 inti 1 floatt 1 x e 0 cin xwhile t 1e 5 e t t t x i i 第1项 floatx cin x for i 1 t 1 e 0 t 1e 5 i e t t t x i 1 程序分析 该程序的功能是什么 写出输出结果 includeusingnamespacestd voidmain intn longt 1 s 0 for n 1 n 5 n t n s t cout s goto语句及用goto构成循环 goto语句标号 标号 语句 语句标号 给程序中的某一个语句定义的任意合法的标识符 以冒号和语句之间进行分隔 例 stopcout End endl 用作goto语句转向的目标 gotostop Goto和语句标号只能用在同一个函数中 功能 无条件转移语句说明 不能用整数作标号只能出现在goto所在函数内 且唯一只能加在可执行语句前面限制使用goto语句 例 用if和goto语句构成循环 求 includeusingnamespacestd voidmain inti sum 0 i 1 loop if i 100 sum i i gotoloop 标号 循环的嵌套 循环体内包含另一个完整的循环结构 例 打印九九乘法表 includeusingnamespacestd voidmain cout t九九乘法表 endl cout t endl for inti 1 i 9 i for intj 1 j 9 j cout j i i j t cout endl 思考 打印上三角或下三角程序如何改动 break continue语句用法 break 范围 仅用于在循环体或switch语句中 说明 在switch语句中 执行到break语句时 程序流程转移到switch的后继语句去执行 用于循环语句中 强制终止本层循环 若是多重循环 break只能使流程跳出离break最近的一层 continue语句 功能 在循环体中 当执行到continue语句时 绕过本次循环 强行进入下一次循环 说明 continue语句只能用于循环语句中 continue语句只结束本次循环 而不是终止本层循环的执行 而break语句则是结束本层循环 即它只能跳过循环体中continue后面的语句 例 break和continue语句的区别 for m 20 m 0 m if m 6 0 break cout m for m 20 m 0 m if m 6 0 continue cout m 该语句在循环中执行了几次 例1 若定义inti a k s 不是死循环的是哪些 a for i 1 i if i 10 break s s i b k 0 do k while k 0 c i 0 while 1 i if i 20 break d a 1 while a 10 if a 5 continue a 应用举例 例 从键盘输入一组数 求这组数中的最大值 cin m max m 第一个数假设为最大数while cin m m 0 if m max max m 以输入0作为结束 输入数的个数未知 max 0 设一个较小的数为最大值的初值for inti 0 i m if m max max m 例 用辗转相除法求两自然数的最大公约数 算法思想 1 对于已知两数m n 使得m n 2 m除以n得余数r 3 若r 0 则n为最大公约数 结束 否则执行 4 4 m n n r 再重复执行 2 辗转相除法while r m n 0 m n n r cout n 辗转相减法m m nm nn n mn mm n为公约数m nwhile m n if m n m n elsen m include iostream h voidmain intm n t r cout m n if m n t m m n n t while r m n 0 m n n r cout 最大公约数为 n endl 程序 例3 8 求 的近似值 include includeusingnamespacestd intmain ints 1 doublen 1 0 u 1 0 pi 0 0 while fabs u 1 0e 4 pi pi u 累加通项n n 2 s s 符号位的生成u s n 通项 cout pi 4 pi endl return0 例 求2 100之间的素数 并以每行显示8个质数 2 每行显示8个 对求得的质数计数 满8个换行 1 方法 用i 2 3 m 1逐个判别m能否被i整除 能整除 m不是素数 退出循环 若都不能整除 则m是素数 可进一步证明 若m不能被中任一整数整除 则m为质数 for i 2 i m 1 i if m i 0 break If i m m 2 k sqrt m for i 2 ik includeusingnamespacestd voidmain intm i countm 0 booltag for m 2 m 100 m tag true tag初值为truefor i 2 i m 1 i if m i 0 tag false if tag true cout m t countm if countm 8 0 cout endl 外循环 认为每个数都是素数 tag false break 例 百元买百鸡问题 假定小鸡每只5角 公鸡每只2元 母鸡每只3元 现有100元钱要买100只鸡 列出所有可能的购鸡方案 分析 for x 0 x 33 x for y 0 y 50 y for z 0 z 200 z if 3 x 2 y 0 5 z 100 例 读入一系列整数 统计出正整数个数i和负整数个数j 读入0则结束 分析 要判断数的正负并分别进行统计 需在循环内部嵌入选择结构 需读入一系列整数 但整数个数不定 要在每次读入之后进行判断 故用while循环 循环控制条件应该是n 0 includeusingnamespacestd voidmain inti 0 j 0 n cout n while n 0 if n 0 i if n n cout 正整数个数 i 负整数个数 j endl 空格 字母个数以及规律 1 外循环控制输出的行数 2 内循环中一个循环控制每行输出的空格数目 3 内循环中另一个循环控制每行输出字母输出的个数及规律 4 输完一行换行 includeusingnamespacestd voidmain inti j k charc for i 1 i 26 i 换行 for j 1 j 26 i j cout 控制每行输出的空格 for k 1 k i k c a k 1 控制每行输出的字母个数 cout c cout n 例 打印出如下图案 菱形 1 前5行一个规律 后4行一个规律 利用双重for循环 第一层控制行 第二层控制列 程序分析 空格和 includeusingnamespacestd voidmain inti j k for i 1 i 5 i for j 1 j 5 i j cout 控制空格输出 for k 1 k 2 i 1 k cout 控制 输出 cout endl for i 1 i 4 i for j 1 j i j cout for k 1 k 9 2 i k cout cout endl 扩展到n行菱形图案 includeusingnamespacestd voidmain inti j k for i 1 i 5 i for j 1 j 5 i j cout for k 1 k 2 i 1 k cout cout endl intn cin n if n 2 i n 1 2 j n 1 2 i for i 1 i 4 i for j 1 j i j cout for k 1 k 9 2 i k cout cout endl i n 2 k n 2 i 例 著名意大利数学家斐波那契 Fibonacci 1202年提出一个有趣的问题 某人想知道一年内一对兔子可以生几对兔子 他筑了一道围墙 把一对大兔关在其中 一般而言 兔子在出生两个月后 就有繁殖能力 一对兔子每个月能生出一对小兔子来 如果所有兔都不死 那么一年以后可以繁殖多少对兔子 用循环该如何实现呢 分析 表示大兔 表示小兔 1月 2月 3月 4月 5月 6月 7月 1 1 2 3 5 8 13 includeusingnamespacestd voidmain inta b c i for i 3 i 12 i c a b a b b c cout c a 1 b 1 例 利用牛顿迭代法求方程 在x0 3附近的根的近似值 0 y x x0 f x0 x1 f x1 x0 x1 x2 x3 x 输入x0值 由公式求出x1 再由x1从公式求出x2 直到 xn 1为方程f x 0在X0附近的一个近似根 设 为10 5 include includeusingnamespacestd voidmain doublex0 x1 flx fx x1 初值 x0 x1 x1 根据公式求 false x1 3 do x0 x1 fx 3 x0 x0 x0 4 x0 x0 5
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【四平】2025年吉林四平市事业单位专项招聘高校毕业生88人笔试历年典型考题及考点剖析附带答案详解
- 2025新疆天筑建工集团有限公司(分)子公司经理层市场化招聘11人笔试参考题库附带答案详解
- 安全b证市政试题及答案
- 2016上海中考物理试题及答案
- 65岁老年人健康教育
- 测绘仪器采购与现场技术指导合作协议
- 基础设施测量合同规范文本
- 餐厅装饰艺术设计与施工合同范本
- 大数据产业孵化基地入驻合作协议
- 车辆租赁保险保险责任界定及争议处理合同
- 低代码开发智慧树知到期末考试答案章节答案2024年南华大学
- eras围手术期营养管理
- 本特利3500组态中文说明
- 国外钻井新技术
- 小学人人讲安全个个会应急
- 保密工作培训
- 一年级数学100以内加减法计算题
- 菌种转让合同
- 外科总论测试题与答案
- 特种水产养殖学课件
- 新苏教版科学六年级下册全册教案(含反思)
评论
0/150
提交评论