选择结构与循环结构程序设计.ppt_第1页
选择结构与循环结构程序设计.ppt_第2页
选择结构与循环结构程序设计.ppt_第3页
选择结构与循环结构程序设计.ppt_第4页
选择结构与循环结构程序设计.ppt_第5页
已阅读5页,还剩86页未读 继续免费阅读

下载本文档

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

文档简介

第四章选择结构与循环程序设计 C程序的结构 掌握C程序的编写必须掌握结构和语句 要设计选择结构与循环结构程序 要考虑两个方面的问题 一是在C语言中如何来表示条件 二是在C语言中实现选择结构用什么语句 在C语言中表示条件 一般用关系表达式或逻辑表达式 实现选择结构用if语句或switch语句 循环结构有for语句 while语句 do while语句以及他们的嵌套应用 一个c程序可以有若干个源程序文件组成一个源文件可以有若干个函数和预处理命令以及全局变量声明部分组成一个函数有函数首部和函数体组成函数体由数据声明和执行语句组成C语句分为 4 1概述 4 1 1C语句概述 1 if else 条件语句 2 for 循环语句 3 while 循环语句 4 do while 循环语句 5 continue 结束本次循环语句 6 break 中止执行switch或循环语句 7 switch 多分支选择语句 8 goto 转向语句 9 return 从函数返回语句 上面9种语句表示形式中的括号 表示括号中是一个 判断条件 表示内嵌的语句 例如 do while 的具体语句可以写成 doy x While x y 1 控制语句 控制语句用于完成一定的控制功能 C语言只有9种控制语句 它们是 2 函数调用语句 函数调用语句由一个函数调用加一个分号构成 例如 printf verygood Printf ThisisaCstatement 3 表达式语句 表达式语句由一个表达式加一个分号构成 表达式能构成语句是C语言的一大特色 最典型的是由赋值表达式构成一个赋值语句 例如 x 6是一个赋值表达式 而x 6 是一个赋值语句 可以看到一个表达式的最后加一个分号就成了一个语句 一个语句必须在最后出现分号 分号是语句中不可缺少的组成部分 而不是两个语句间的分隔符号 任何表达式都可以加上分号而成为语句 4 1 2结构化程序设计方法 结构化程序设计强调程序设计风格和程序结构的规范化 提倡清晰的结构 结构化程序设计的基本思路是 把一个复杂问题的解决过程分阶段进行 每一个阶段处理的问题都控制在人们容易理解和处理的范围内 具体一点来说 就是在分析问题时采用 自顶向下 逐步细化 的方法 设计解决方案时采用 模块化设计 方法 编写程序时采用 结构化编码 方法 自顶向下 逐步细化 是对问题的解决过程逐步具体化的一种思想方法 例如要在一组数中找出其中的最大数 首先 可以把问题的解决过程描述为 输入一组数 找出其中的最大数 输出最大数 以上三条中 第1 第3两步比较简单 对第2步可以进一步细化 任取一数 假设它就是最大数 将该数与其余各数逐一比较 若发现有任何数大于假设的最大数 则取而代之 再对以上过程进一步具体化 得到如下算法 输入一组数 找出其中的最大数 设max 第一个数 将第二个数到最后一个数依次取出 比较x与max的大小 如果x max 则使max x 3 输出max 模块化设计 就是将比较复杂的任务 分解成若干个子任务 每个子任务又分解成若干个小子任务 每个小子任务只完成一项简单的功能 在程序设计时 用一个个小模块来实现这些功能 每个小模块对应一个相对独立的子程序 对程序设计人员来说 编写程序就变得不再困难 同时 同一软件也可以由一组人员同时编写 分别进行调试 这就大大提高了程序开发的效益 结构化编码 指的是使用支持结构化方法的高级语言编写程序 C语言就是一种支持结构化程序设计的高级语言 它直接提供了顺序程序 选择程序和循环程序三种基本结构的语句 提供了定义 函数 的功能 函数相当于独立的子程序 另外 还提供了丰富的数据类型 这些都为结构化程序设计提供了强有力的工具 1 If语句的三种基本形式 1 if 表达式 语句例 if x y printf d x 4 2选择结构程序设计 4 2 1if语句 2 if 表达式 语句1else语句2例 if x y printf d x elseprintf d y 3 if 表达式1 语句1elseif 表达式2 语句2elseif 表达式3 语句3 elseif 表达式m 语句melse语句n 例如 if number 500 pro 0 15 elseif number 300 pro 0 10 elseif number 100 pro 0 075 elseif number 50 pro 0 05 elsepro 0 对If语句具体说明 1 三种形式的if语句中 在if后面都有 表达式 一般为逻辑表达式或关系表达式 例如 if a b x y printf a b x y 2 第二 第三种形式的if语句中 在每个else前面有一分号 整个语句结束处有一分号 例如 if x 0 printf f x elseprintf f x 这是由于分号是C语句中不可缺少的部分 这个分号是if语句中的内嵌语句所要求的 如果无此分号 则出现语法错误 但应注意 不要误认为上面是两个语句 if语句和else语句 它们都属于同一个if语句 else子句不能作为语句单独使用 它必须是if语句的一部分 与if配对使用 3 在if和else后面可以只含一个内嵌的操作语句 如上例 也可以有多个操作语句 此时用花括号 将几个语句括起来成为一个复合语句 如 if a b t a a b b t elseprintf d a 注意 在第二行的花括号 外面不需要再加分号 因为 内是一个完整的复合语句 不需另附加分号 if语句的3种形式的举例 书上自己上机练习 例1输入两个实数 按数值由小到大的顺序输出这两个数 includevoidmain floata b t scanf f f 例输入三个数a b c 要求按由小到大的顺序输出 Ifa b将a和b对换Ifa c将a和c对换Ifb c将b和c对换 includevoidmain floata b c t scanf f f f 程序清单如下 if语句的嵌套 在if语句中又包含一个或多个if语句称为if语句的嵌套 形式 If if 语句1else语句2Elseif 语句3else语句4 内嵌if 匹配规则 Else总是与它上面的 最近的 统一复合语句中的 未配对的if语句配对 例 If if 语句1elseif 语句2else语句3 例 If if 语句1 elseif 语句2else语句3 当if和else数目不同时 可以加花括号来确定配对关系 1 x0 算法1 算法1 输入x输入x若x0 则y 1若x 0 则y 0输出y若x 0 则y 1输出y includevoidmain intx y scanf d 上例中的程序段有四个 请判断哪个是正确的 程序1 程序2 If x 0 Y 1 if x 0 y 1 Elseelsey 0 If x 0 y 0 elsey 1 Elsey 1 程序3 程序4 Y 1 y 0 If x 0 if x 0 If x 0 y 1 if x 0 y 1 Elsey 0 Elsey 1 正确 正确 例4 3 求一元二次方程ax2 bx c 0的解 include math h main floata b c x1 x2 if a 0 0 例4 4 判断一个整数能否被3或5整除 includeintmain intnum printf Inputanumber scanf d else printf Thenumbercanbedividedby3 n elseif num 5 0 printf Thenumbercanbedividedby5 n else printf Thenumbercan tbedividedby3and5 n 4 2 2条件运算符和条件表达式 条件表达式用来处理 语句中判别的表达式的值无论为 真 或 假 都要向同一个变量赋值执行一个赋值语句的情况 格式 表达式 表达式 表达式 功能 判断表达式1的值 如果成立就执行表达式2 否则就执行表达式3使用场合 若在 语句中 当被判别的表达式的值为 真 或 假 时 都执行一个赋值语句且向同一个变量赋值时 可以用一个条件运算符来处理 例 当a b时将a的值赋给max 当a b时将b的值赋给max 可以看到无论a b是否满足 都是向同一个变量赋值 可以用下面的条件运算符来处理 说明 1 条件运算符的执行顺序 先求解表达式 若为非 真 则求解表达式 此时表达式 的值就作为整个条件表达式的值 若表达式 的值为 假 则求解表达式 表达式 的值就是整个条件表达式的值 2 条件运算符优先级高于赋值运算符 低于关系运算符和算术运算符 3 条件运算符的结合方向为 自右至左 4 表达式2 和 表达式3 不仅可以是数值表达式 还可以是赋值表达式或函数表达式 5 条件表达式中 表达式 的类型可以与表达式 和表达式 的类型不同 例输入一个字符 判别它是否大写字母 如果是 将它转换成小写字母 如果不是 不转换 然后输出最后得到的字符 includevoidmain charch scanf c 如果字符变量ch的值为大写字母 则条件表达式的值为 即相应的小写字母 如果ch的值不是大写字母 则条件表达式的值为 即不进行转换 4 2 3switch语句 switch语句的格式 switch 表达式 case常量表达式 语句 case常量表达式 语句 case常量表达式 语句 default 语句 例 要求按照考试成绩的等级输出百分制分数段 用switch语句实现 switch grade case printf case printf case printf case printf default printf 说明 1 switch后面括弧内的 表达式 标准允许它为任何类型 2 当表达式的值与某一个case后面的常量表达式的值相等时 就执行此case后面的语句 若所有的case中的常量表达式的值都没有与表达式的值匹配的 就执行default后面的语句 3 每一个case的常量表达式的值必须互不相同 否则就会出现互相矛盾的现象 对表达式的同一个值 有两种或多种执行方案 4 各个case和default的出现次序不影响执行结果 例如 可以先出现 default 再出现 case 然后是 case 5 执行完一个case后面的语句后 流程控制转移到下一个case继续执行 case常量表达式 只是起语句标号作用 并不是在条件判断 在执行switch语句时 根据switch后面表达式的值找到匹配的入口标号 就从此标号开始执行下去 不再进行判断 应该在执行一个case分支后 可以用一个break语句来终止switch语句的执行 6 多个可以共用一组执行语句 例5写程序 判断某一年是否闰年 用下图来表示判断闰年的算法 补充 程序综合举例 例求 方程的解 基本的算法 不是二次方程 有两个相等实根 有两个不等实根 有两个共轭复根 include includevoidmain floata b c disc x1 x2 realpart imagpart scanf f f f elseif disc 1e 6 x1 b sqrt disc 2 a x2 b sqrt disc 2 a printf hasdistinctrealroots 8 4fand 8 4f n x1 x2 else realpart b 2 a imagpart sqrt disc 2 a printf hascomplexroots n printf 8 4f 8 4fi n realpart imagpart printf 8 4f 8 4fi n realpart imagpart 运行情况 pleaseentera b c Theequationhastwo pleaseentera b c 2 pleaseentera b c 2 6 1 Theequationhasdistinctrealroots 0 1771and 2 8229 例运输公司对用户计算运费 路程 越远 每公里运费越低 标准如下 没有折扣 折扣 折扣 折扣 折扣 折扣设每公里每吨货物的基本运费为 货物重为 距离为 折扣为 则总运费 的计算公式为 分析折扣变化的规律性 折扣的 变化点 都是 的倍数在横轴上加一种坐标 c的值为s 250 c代表250的倍数 无折扣 折扣 4 5程序举例 续 includevoidmain intc s floatp w d f scanf f f d 运行情况 pleaseenterprice weight distance 23 345 7 136 45 freight 1081349 64 什么是循环 为什么要使用循环 问题1 问题2 求学生平均成绩分数相加后除以课数 在许多问题中需要用到循环控制 循环结构是结构化程序设计的基本结构之一 它和顺序结构 选择结构共同作为各种复杂程序的基本构造单元 循环分为两种 无休止循环和有终止循环构成有效循环的条件 循环体和循环结束条件 4 3循环结构程序设计 while语句用来实现 当型 循环结构 一般形式 while 表达式 语句当表达式为非0值时 执行while语句中的内嵌语句 其特点是 先判断表达式 后执行语句 4 3 1while语句 例求1到100的和 includevoidmain inti sum 0 i 1 while i 100 sum sum i i printf d n sum 说明 1 循环体如果包含一个以上的语句 应该用花括弧括起来 以复合语句形式出现 2 在循环体中应有使循环趋向于结束的语句 运行结果 5050 注意 循环体如果包含一个以上的语句 应该用花括弧括起来 以复合语句形式出现 在循环体中应有使循环趋向于结束的语句 如果无此语句 则i的值始终不改变 循环永不结束 do while语句的特点 先执行循环体 然后判断循环条件是否成立 执行过程 先执行一次指定的循环体语句 然后判别表达式 当表达式的值为非零 真 时 返回重新执行循环体语句 如此反复 直到表达式的值等于0为止 此时循环结束 一般形式 do循环体语句 while 表达式 例用do while求1到100的和 includevoidmain inti sum 0 i 1 do sum sum i i while i 100 printf d n sum 运行结果 5050 补充 while和do while循环的比较 凡是能用while循环处理 都能用do while循环处理 do while循环结构可以转换成while循环结构 在一般情况下 用while语句和用do while语句处理同一问题时 若二者的循环体部分是一样的 它们的结果也一样 但是如果while后面的表达式一开始就为假 0值 时 两种循环的结果是不同的 例while和do while循环的比较 1 include 2 includevoidmain voidmain intsum 0 i intsum 0 i scanf d 运行结果 1 sum 55再运行一次 11 sum 0 运行结果 1 sum 55再运行一次 11 sum 11 说明 当while后面的表达式的第一次的值为 真 时 两种循环得到的结果相同 否则 二者结果不相同 补充 用 4 1 1 3 1 5 1 7 公式求 的近似值 直到某一项的绝对值小于为止 N S图表示算法 运行结果 pi 3 141594 例求pi的近似值 include includevoidmain ints floatn t pi t 1 pi 0 n 1 0 s 1 while fabs t 1e 6 pi pi t n n 2 s s t s n pi pi 4 printf pi 10 6f n pi 4 3 3for循环语句 C语言中的for语句使用最为灵活 不仅可以用于循环次数已经确定的情况 而且可以用于循环次数不确定而只给出循环结束条件的情况 它完全可以代替while语句 一般形式 for 表达式1 表达式2 表达式3 语句 for语句的执行过程 1 先求解表达式1 2 求解表达式2 若其值为真 值为非0 则执行for语句中指定的内嵌语句 然后执行下面第 3 步 若为假 值为0 则结束循环 转到第 5 步 3 求解表达式3 4 转回上面第 2 步骤继续执行 5 循环结束 执行for语句下面的一个语句 for语句的一般形式和执行过程 循环初始条件 循环控制条件 循环体 for语句等价于下列语句 表达式1 while 表达式2 语句 表达式3 1 for语句的一般形式和执行过程 for语句最简单的形式 for 循环变量赋初值 循环条件 循环变量增值 例如 for i 1 i 100 i sum sum i 相当于 i 1 while i 100 sum sum i i 用for语句简单 方便 for语句相当灵活 形式变化多样 1 for语句的一般形式中的 表达式1 可以省略 此时应在for语句之前给循环变量赋初值 注意省略表达式1时 其后的分号不能省略 如for i 100 i sum sum i 执行时 跳过 求解表达式1 这一步 其他不变 for语句的各种形式 2 如果表达式2省略 即不判断循环条件 循环无终止地进行下去 也就是认为表达式2始终为真 如 for i 1 i sum sum i 表达式1是一个赋值表达式 表达式2空缺 它相当于 i 1 while 1 sum sum 1 i 3 表达式3也可以省略 但此时程序设计者应另外设法保证循环能正常结束 如 for i 1 i 100 sum sum i i 在上面的for语句中只有表达式1和表达式2 而没有表达式3 i 的操作不放在for语句的表达式3的位置处 而作为循环体的一部分 效果是一样的 都能使循环正常结束 4 可以省略表达式1和表达式3 只有表达式2 即只给循环条件 如 for i 100 while i 100 sum sum i 相当于 sum sum i i i 在这种情况下 完全等同于while语句 可见for语句比while语句功能强 除了可以给出循环条件外 还可以赋初值 使循环变量自动增值等 5 3个表达式都可省略 如 for 语句相当于while 1 语句即不设初值 不判断条件 认为表达式2为真值 循环变量不增值 无终止地执行循环体 6 表达式1可以是设置循环变量初值的赋值表达式 也可以是与循环变量无关的其他表达式 如 for sum 0 i 100 i sum sum i 表达式3也可以是与循环控制无关的任意表达式 表达式1和表达式3可以是一个简单的表达式 也可以是逗号表达式 即包含一个以上的简单表达式 中间用逗号间隔 如 for sum 0 i 1 i 100 i sum sum i 或for i 0 j 100 i j i j k i j 表达式1和表达式3都是逗号表达式 各包含两个赋值表达式 即同时设两个初值 使两个变量增值 在逗号表达式内按自左至右顺序求解 整个逗号表达式的值为其中最右边的表达式的值 如 for i 1 i 100 i i sum sum i 相当于for i 1 i 100 i i 2 sum sum i 7 表达式一般是关系表达式 如i 100 或逻辑表达式 如a b x y 但也可以是数值表达式或字符表达式 只要其值为非零 就执行循环体 for i 0 c getchar n i c 在表达式2中先从终端接收一个字符赋给c 然后判断此赋值表达式的值是否不等于 n 换行符 如果不等于 n 就执行循环体 注意 此for语句的循环体为空语句 把本来要在循环体内处理的内容放在表达式3中 作用是一样的 可见for语句功能强 可以在表达式中完成本来应在循环体内完成的操作 for c getchar n printf c c for语句中只有表达式2 而无表达式1和表达式3 其作用是每读入一个字符后立即输出该字符 直到输入一个 换行 为止 请注意 从终端键盘向计算机输入时 是在按Enter键以后才将一批数据一起送到内存缓冲区中去的 运行情况 Computer 输入 Computer 输出 而不是Ccoommppuutteerr 例 用for语句计算s 1 2 3 99 100 voidmain intn s 0 for n 1 n 100 n s s n printf s d n s 例求Fibonacci数列前40个数 这个数列有如下特点 第1 2两个数为1 1 从第3个数开始 该数是其前面两个数之和 即 F 1 1 n 1 F 2 1 n 2 F n F n 1 F n 2 n 3 算法如图所示 includevoidmain longintf1 f2 inti f1 1 f2 1 for i 1 i 20 i printf 12ld 12ld f1 f2 if i 2 0 printf n f1 f1 f2 f2 f2 f1 运行结果 11235813213455891442333776109871597258441816765109461771128657463687502512139319641831781151422983204013462692178309352457857022887922746514930352241578173908816963245986102334155 4 3 4循环的嵌套 一个循环体内又包含另一个完整的循环结构称为循环的嵌套 内嵌的循环中还可以嵌套循环 这就是多层循环 三种循环 while循环 do while循环和for循环 可以互相嵌套 下面几种都是合法的形式 1 while 2 do 3 for while dofor while while 4 while 5 for 6 do do while for while while 补充例题 打印如下形式的九九乘法表 main intx y for x 1 x 9 x for y 1 y 9 y printf d d 2d x y x y printf n 想一想打成三角形乘法口诀怎么改写程序 例打印由数字组成的如下所示金字塔图案编程分析 打印图案一般可由多重循环实现 外循环用来控制打印的行数 内循环控制每行的空格数和字符个数 实现打印上金字塔图案的程序如下 voidmain inti k j for i 1 i 9 i 外循环控制打印行数 for k 1 k 10 i k 每行起始打印位置 printf for j 1 j 2 i 1 j 内循环控制打印个数 printf c 48 i printf n 换行 12223333344444445555555556666666666677777777777778888888888888889999999999999999 思考与讨论 1 程序如果将程序中的数值 10 改为 20 程序的输出结果有什么不同 如果改为 5 输出结果如何 2 能否将语句 printf c 48 i 改为 printf c 0 i 4 3 5用break语句和continue语句改变循环状态 break语句可以用来从循环体内跳出循环体 即提前结束循环 接着执行循环下面的语句一般形式 break 注意 break语句不能用于循环语句和switch语句之外的任何其他语句中 例 floatpi 3 14159 for r 1 r100 break printf r f area f n r area 程序的作用是计算r 1到r 10时的圆面积 直到面积area大于100为止 从上面的for循环可以看到 当area 100时 执行break语句 提前结束循环 即不再继续执行其余的几次循环 continue语句作用为结束本次循环 即跳过循环体中下面尚未执行的语句 接着进行下一次是否执行循环的判定 一般形式 continue continue语句和

温馨提示

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

评论

0/150

提交评论