C语言第5章.ppt_第1页
C语言第5章.ppt_第2页
C语言第5章.ppt_第3页
C语言第5章.ppt_第4页
C语言第5章.ppt_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

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

文档简介

第5章选择结构程序设计 选择结构的作用是 根据所指定的条件是否满足 决定从给定的两组操作选择其一 C语言中选择结构是用if语句实现的 if语句最常用的形式是if 关系表达式 语句1else语句2例如 if x 0 y 1 elsey 1 其中x 0是一个关系表达式 是一个关系运算符 5 1关系运算符和关系表达式 5 1 1关系运算符及其优先次序C语言提供6种关系运算符 大于 大于或等于 等于 优先级相同 低 不等于 算术运算符 高 关系运算符赋值运算符 低 图5 1 例如 c a b等效于c a b a b c等效于 a b ca bc等效于a b c 5 1 2关系表达式用关系运算符将两个表达式 可以是算术表达式或关系表达式 逻辑表达式 赋值表达式 字符表达式 连接起来的式子 称为关系表达式 例如 下面都是合法的关系表达式 a b a b b c a 3 b 5 a b b c 关系表达式的值是一个逻辑值 即 真 或 假 例如 关系表达式 5 3 的值为 假 5 0 的值为 真 以 1 代表真 以 0 代表 假 例如 a 3 b 2 c 1 则 关系表达式 a b 的值为 真 表达式的值为1 关系表达式 a b c 的值为 真 表达式的值为1 关系表达式 b c a 的值为 假 表达式的值为0 例如 a 3 b 2 c 1 如果有以下赋值表达式 d a bd的值为1f a b cf的值为0 5 2逻辑运算符和逻辑表达式 用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式 5 2 1逻辑运算符及其优先次序C语言提供3种逻辑运算符 逻辑与 逻辑或 逻辑非 和 是 双目运 元 运算符 它要求两个运算量 操作数 如 a b x y a b x y 是 一目 元 运算符 只要求一个运算量 如 a b 逻辑运算举例如下 a b若a b为真 则a b为真 a b若a b之一为真 则a b为真 a若a为真 则 a为假 表5 1逻辑运算的真值表 在一个逻辑表达式中如果包含多个逻辑运算符 如 a b x y c按以下的优先次序 1 非 与 或 即 为三者中最高的 2 逻辑运算符中的 和 低于关系运算符 高于算术运算符 见图5 2 非 高 算术运算符关系运算符 和 赋值运算符 低 例如 a b x y 可写成a b x y a b x y 可写成a b x y a a b 可写成 a a b 5 2 2逻辑表达式逻辑表达式的值应该是一个逻辑量 真 或 假 C语言编译给出逻辑运算结果时 以数值1代表 真 以0代表 假 但在判断一个量是否为 真 时 以0代表 假 以非0代表 真 即将一个非零的数值认作为 真 例如 1 若a 4 则 a的值为0 2 若a 4 b 5 则a b的值为1 3 a b值同前 a b的值为1 4 a b值同前 a b的值为1 5 4 0 2的值为1 例如 5 3 2 8 4 0最后的运算结果为1 逻辑运算符两侧的运算对象不但可以是0和1 或者是0和非0的整数 也可以是任何类型的数据 可以是字符型 实型或指针型等 系统最终以0和非0来判定它们属于 真 或 假 例如 c d 的值为1 因为 c 和 d 的ASCII值都不为0 按 真 处理 表5 2逻辑运算的真值表 在逻辑表达式的求解中 并不是所有的逻辑运算符都被执行 只是在必须执行下一个逻辑运算符才能求出表达式的解时 才执行该运算符 1 a b c的求解见图5 3 图5 3 a b c 0 假 非0 真 0 假 非0 真 0 假 非0 真 0 假 1 真 2 a b c的求解见图5 4 图5 4 a b c 非0 真 0 假 非0 真 0 假 非 真 0 假 1 真 0 假 对 运算符来说 只有a 0 才继续进行右面的运算 对 运算符来说 只有a 0 才继续进行其右面的运算 如有下面的逻辑表达式 m a b n c d 当a 1 b 2 c 3 d 4 m和n的原值为1 由于 a b 的值为0 因此m 0 而 n c d 不被执行 因此n的值不是0而仍保持原值1 熟练掌握C语言的关系运算符和逻辑运算符后 可以巧妙地用一个逻辑表达式来表示一个复杂的条件 例如 要判别某一年year是否闰年 闰年的条件是符合下面二者之一 能被4整除 但不能被100整除 能被4整除 又能被400整除 可以用一个逻辑表达式来表示 year 4 0 year 100 0 year 400 0当year为某一整数值时 如果上述表达式值为真 1 则year为闰年 否则year为非闰年 可以加一个 用来判别非闰年 year 4 0 year 100 0 year 400 0 若表达式的值为真 1 year为非闰年 也可以用下面的逻辑表达式判别非闰年 year 4 0 year 100 0 year 400 0 若表达式的值为真 1 year为非闰年 5 3if语句 5 3 1if语句的三种形式C语言提供3种if语句 1 if 表达式 语句例如 if x y printf d x 图5 5 a 表达式 语句 假 0 真 非0 2 if 表达式 语句1else语句2例如 if x y printf d x elseprintf d y 图5 5 b 表达式 语句1 语句2 3 if 表达式1 语句1elseif 表达式2 语句2elseif 表达式3 语句3 elseif 表达式m 语句melse语句n 图5 6 表达式1 语句1 语句5 表达式2 表达式3 表达式4 语句2 语句3 语句4 假 假 假 假 真 真 真 真 例如 if number 500 cost 0 15 elseif number 300 cost 0 10 elseif number 100 cost 0 075 elseif number 50 cost 0 05 elsecost 0 说明 1 三种形式的if语句中在if后面都有 表达式 一般为逻辑表达式或关系表达式 例如 if a b执行结果 输出 a 的ASCII码97 2 第二 第三种形式的if语句中 在每个else前面有一分号 整个语句结束处有一分号 例如 if x 0 printf f x else各有一个分号printf f x 3 在if和else后面可以只含一个内嵌语句 如上例 也可以有多个操作语句 此时用花括号 将几个语句括起来成为一个复合语句 如 if a b c 例5 1输入两个实数 按代数值由小到大的次序输出这两个数 main floata b t scanf f f 运行情况如下 3 6 3 2 3 20 3 60 例5 2输入3个数a b c 要求按由小到大的顺序输出 可以用伪代码写出算法 ifa b将a和b兑换 a是a b中的小者 ifa c将a和c兑换 a是a c中的小者 因此a是三者中最小者 ifb c将b和c兑换 b是b c中的小者 也是三者中次小者 然后顺序输出a b c即可 按此算法编写程序 main floata b c t scanf f f f 运行情况如下 3 7 1 1 00 3 00 7 00 5 3 2if语句的嵌套在if语句中又包含一个或多个if语句称为if语句的嵌套 一般形式如下 if if 语句1else语句2elseif 语句3else语句4 内嵌if 内嵌if 应当注意if与else的配对关系 else总是与它上面最近的if配对 假如写成 if if 语句1elseif 语句2else语句3编程者把else写在与第一个if 外层if 同一列上 希望与第一个if对应 但实际上else是与第二个if配对 内嵌if 内嵌if 因此最好使内嵌if语句也包含else部分 这样if的数目和else的数目相同 从内层到外层一一对应 不致出错 如果if与else的数目不一样 为实现程序设计者的企图 可以加花括弧来确定配对关系 例如 if if 语句1 内嵌if else语句2这时 限定了内嵌if语句的范围 因此else与第一个if配对 例5 3有一函数 编一程序 输入一个x值 输出y值 可以先写出算法 输入x若x0y 1输出y 或输入x若x0y 1输出y 有以下几个程序 请判断哪个是正确的 程序1 正确的程序 main intx y scanf d 4 6行 程序2 正确的程序 main intx y scanf d 程序3 错误的程序 main intx y scanf d 程序4 错误的程序 main intx y scanf d 5 3 3条件运算符若if语句中 在表达式为 真 和 假 时 且都只执行一个赋值语句给同一个变量赋值时 可以用简单的条件运算符处理 例如 若有以下if语句 if a b max a elsemax b 可以用下面的条件运算符来处理 max a b a b 其中 a b a b 是一个 条件表达式 它是这样执行的 如果 a b 条件为真 则条件表达式取值a 否则取值b 条件运算符要求有3个操作对象 称三目 元 运算符 它是C语言中唯一的一个三目运算符 条件表达式的一般形式为表达式1 表达式2 表达式3它的执行过程见图5 11 图5 11 表达式1 条件表达式取表达式2的值 条件表达式取表达式3的值 真 非0 假 0 说明 1 条件运算符的执行顺序 先求解表达式1 若为非0 真 则还应解表达式2 此时表达式2的值就作为整个条件表达式的值 若表达式1的值为0 假 则求解表达式3 表达式3的值就是整个条件表达式的值 max a b a b 是将a和b二者中大者赋给max 2 条件运算符优于赋值运算符 因此上面赋值表达式的求解过程是先求解条件表达式 再将它的值赋给max 条件运算符的优先级别比关系运算符和算术运算符都低 因此max a b a b 括号可以不要 可写成max a b a b 如果有a b a b 1相当于a b a b 1 而不相当于 a b a b 1 3 条件运算符的结合方向为 自右至左 如果有以下条件表达式 a b a c d c d相当于a b a c d c d 如果有a 1 b 2 c 3 d 4 则条件表达式的值为4 4 条件表达式不能取代一般的if语句 只有在if语句中内嵌的语句为赋值语句 且两个分支都给同一个变量赋值 时才能代替if语句 下面的if语句就无法用一个条件表达式代替 if a b printf d a elseprintf d b 但可以用下面的语句代替 printf d a b a b 即将条件表达式的值输出 5 条件表达式中 表达式1的类型可以与表达式2和表达式3的类型不同 如x a b X是整型变量 若x 0 则条件表达式的值为 b 表达式2和表达式3的类型也可以不同 此时表达式的值的类型为二者中较高的类型 如x y 1 1 5如果x y 则条件表达式的值为1 5 若x y 值应为1 由于1 5是实型 比整型高 将1转换成实型值1 0 例5 4输入一个字符 判别它是否大写字母 如果是 将它转换成小写字母 如果不是 不转换 然后输出最后得到的字符 main charch scanf c 运行结果如下 A a 5 4switch语句 switch语句是多分支选择语句 用来实现图2 23所表示的多分支选择结构 if语句只有两个分支可供选择 而实际问题中常常要用到多分支的选择 例如 学生成绩分类 90分以上为 A 等 80 89分为 B 等 70 79分为 C 等 当然这些都可以用嵌套的if语句来处理 但如果分支较多 则嵌套的if语句层数多 程序冗长而且可读性降低 C语言提供switch语句直接处理多分支选择 图2 23 根据表达式的值进行选择 p p1 p p2 p pm p pn B A M N a b switch的一般形式如下 switch 表达式 case常量表达式1 语句1case常量表达式2 语句2 case常量表达式n 语句ndefault 语句n 1 例如 要求按照考试成绩的等级打印出百分制分数段 可以用switch语句实现 switch grade case A printf 85 100 n case B printf 70 84 n case C printf 60 69 n case D printf 60 n default printf error n 说明 1 switch后面括弧内的 表达式 ANSI标准允许它为任何类型 2 当表达式的值与某一个case后面的常量表达式的值相等时 就执行case后面的语句 若所有的case中的常量表达式的值都没有与表达式的值匹配的 就执行default后面的语句 3 每一个case的常量表达式的值必须互不相同 否则就会出现互相矛盾的现象 4 各个case和default的出现次序不影响执行结果 例如 可以先出现 default 再出现 case D 然后是 case A 5 执行完一个case后面的语句后 流程控制转移到下一个case继续执行 case常量表达式 只起语句标号作用 并不在该处进行条件判断 在执行switch语句时 根据switch后面表达式的值找到匹配的入口标号 就从此标号开始执行下去 不再进行判断 例如 上面的例子中 若grade的值等于 A 则将连续输出 85 10070 8460 69 60error 应该在执行完一个case分支后 用break跳出switch结构 即终止switch语句的执行 将上面的switch结构改写如下 switch grade case A printf 85 100 n break case B printf 70 84 n break case C printf 60 69 n break case D printf 60 n break default printf error n 在case后面中虽然包含一个以上执行语句 但可以不用花括弧括起来 会自动执行本case后面所有的执行语句 当然加上花括弧也可以 6 多个case可以共用一组执行语句 如 case A case B case C printf 60 n break grade的值为 A B 或 C 时都执行同一组语句 5 5程序举例 例5 5写一程序 判断某一年是否闰年 例如 要判别某一年year是否闰年 闰年的条件是符合下面二者之一 能被4整除 但不能被100整除 能被4整除 又能被400整除 图5 13 year被4整除真假year被100整除真假leap 0真假leap 1leap 1leap 0leap真假 year被400整除 输出 非闰年 输出 闰年 main intyear leap scanf d main 将4 10行修改如下 intyear leap scanf d 也可以用一个逻辑表达式包含所有的闰年条件 程序如下 main intyear leap scanf d 运行情况如下 1 1989 1989isnotaleapyear 2 2000 2000isaleapyear 例5 6求ax2 bx c 0方程的解 1 a 0 不是二次方程 2 b2 4ac 0 有两个相等实根 3 b2 4ac 0 有两个不等实根 4 b2 4ac 0 有两个共轭复根 据此编写程序如下 includemain floata b c d disc x1 x2 realpart imagpart scanf f f f iffabs discle 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 re

温馨提示

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

评论

0/150

提交评论