已阅读5页,还剩66页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
5 1关系运算符和关系表达式5 2逻辑运算符和逻辑表达式5 3if语句5 4switch语句5 5程序举例习题 第5章选择结构程序设计 5 1关系运算符和关系表达式 引言 C语言中逻辑值的概念关系运算及其值例如 A B若A 3 B 5 则上述关系运算的结果为 假 若A 5 B 3 则上述关系运算的结果为 真 5 1 1关系运算符及其优先次序 C语言提供6种关系运算符优先级相同 高 小于 小于或等于 大于 大于或等于 优先级相同 低 等于 不等于 关于优先次序 1 前4种关系运算符 的优先级别相同 后两种也相同 前4种高于后2种 2 关系运算符的优先级低于算术运算符 3 关系运算符的优先级高于赋值运算符 以上关系见图5 1 例如 c a b等效于c a b a b c等效于 a b ca b c等效于a b c a b c等效于a b c 图5 1 5 1 2关系表达式定义 用关系运算符将两个表达式 可以是算术表达式或关系表达式 逻辑表达式 赋值表达式 字符表达式 连接起来的式子 称关系表达式 举例 下面都是合法的关系表达式 a b a b b c a 3 b 5 a b a b b c 关系表达式的值 其值是一个逻辑值 即 真 或 假 C语言没有逻辑型数据 以1代表 真 以 0 代表 假 关系表达式的值举例若a 3 b 2 c 1 则有 例1 关系表达式 a b 的值为 真 表达式的值为1 例2 关系表达式 a b c 的值为 真 因为a b的值为1 等于c的值 表达式的值为1 例3 关系表达式 b c a 的值为 假 表达式的值为0 例4 如果有以下赋值表达式 d a b则d的值为1 例5 f a b cf的值为0 因为 运算符是自左至右的结合方向 先执行 a b 得值为1 再执行关系运算 1 c 得值0 赋给f 定义 用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式 5 2 1逻辑运算符及其优先次序C语言提供三种逻辑运算符 1 逻辑与 相当于其他语言中的AND 2 逻辑或 相当于其他语言中的 3 逻辑非 相当于其他语言中的N T 5 2逻辑运算符和逻辑表达式 逻辑运算符说明 和 是 双目 元 运算符 它要求有两个运算量 操作数 如 a b x y 是 一目 元 运算符 只要求有一个运算量 如 a b 逻辑运算举例a b若a b为真 则a b为真 a b若a b之一为真 则a b为真 a若a为真 则 a为假 逻辑运算符的优先级别在一个逻辑表达式中如果包含多个逻辑运算符 如 a b x y c按以下的优先次序 1 非 与 或 即 为三者中最高的 2 逻辑运算符中的 和 低于关系运算符 高于算术运算符 见图5 2 图5 2 逻辑运算符的优先级别 a b x y 可写成a b x y a b x y 可写成a b x y a a b 可写成 a a b5 2 2逻辑表达式逻辑表达式的值逻辑表达式的值应该是一个逻辑量 真 或 假 C语言编译系统在给出逻辑运算结果时 以数值1代表 真 以0代表 假 逻辑表达式中将普通数值作为逻辑值处理C语言在判断一个量是否为 真 时 以0代表 假 以非0代表 真 即将一个非零的数值认作为 真 逻辑表达式中将数值作为逻辑值处理的例子例 1 若a 4 则 a的值为0 因为a的值为非0 被认作 真 对它进行 非 运算 得 假 假 以0代表 例 2 若a 4 b 5 则a b的值为1 因为a和b均为非0 被认为是 真 因此a b的值也为 真 值为1 例 3 a b值同前 a b的值为1 例 4 a b值同前 a b的值为1 例 5 4 0 2的值为1 逻辑表达式中将数值作为逻辑值处理的结论由系统给出的逻辑运算结果不是0就是1 不可能是其他数值 而在逻辑表达式中作为参加逻辑运算的运算对象 操作数 可以是0 假 或任何非0的数值 按 真 对待 如果在一个表达式中不同位置上出现数值 应区分哪些是作为数值运算或关系运算的对象 哪些作为逻辑运算的对象 例如对如下表达式的理解 5 3 8 4 0 实际上 逻辑运算符两侧的运算对象不但可以是0和1 或者是0和非0的整数 也可以是任何类型的数据 可以是字符型 实型或指针型等 系统最终以0和非0来判定它们属于 真 或 假 例如 c d 的值为1 因为 c 和 d 的ASCII值都不为0 按 真 处理 逻辑表达式的求解顺序在逻辑表达式的求解中 并不是所有的逻辑运算符都被执行 只是在必须执行下一个逻辑运算符才能求出表达式的解时 才执行该运算符 例如 1 a b c只有a为真 非0 时 才需要判别b的值 只有a和b都为真的情况下才需要判别c的值 只要a为假 就不必判别b和c 此时整个表达式已确定为假 如果a为真 b为假 不判别c 见图5 3 2 a b c只要a为真 非0 就不必判断b和c 只有a为假 才判别b a和b都为假才判别c 见图5 4 图5 3 图5 4 逻辑表达式的求解顺序举例如果有下面的逻辑表达式 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 逻辑表达式设计举例要判别某一年year是否闰年 闰年的条件是符合下面二者之一 能被4整除 但不能被100整除 能被4整除 又能被400整除 可以用一个逻辑表达式来表示 year 4 0 year 100 0 year 400 0可以加一个 用来判别非闰年 year 4 0 year 100 0 year 400 0 若表达式值为真 1 year为非闰年 若表达式值为真 1 year为非闰年 也可以用下面逻辑表达式判别非闰年 year 4 0 year 100 0 year 400 0 若表达式值为真 year为非闰年 请注意表达式中右面的括弧内的不同运算符 0 的运算优先次序 5 3if语句5 3 1if语句的三种形式C语言提供了三种形式的if语句 1 if 表达式 语句例如 if x y printf d x 这种if语句的执行过程见图5 5 a 2 if 表达式 语句1else语句2例如 见图5 5 b if x y printf d x elseprintf d y 图5 5 3 if 表达式1 语句1elseif 表达式2 语句2elseif 表达式3 语句3 elseif 表达式m 语句melse语句n流程图见图5 6 图5 6 例如 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语句时先对表达式求解 若表达式的值为0 按 假 处理 若表达式的值为非0 按 真 处理 执行指定的语句 假如有以下if语句 if 3 printf k 2 第二 第三种形式的if语句中 在每个else前面有一分号 整个语句结束处有一分号 例如 if x 0 print f x else各有一个分号printf f x 这是由于分号是c语句中不可缺少的部分 这个分号是if语句中的内嵌语句所要求的 如果无此分号 则出现语法错误 但应注意 不要误认为上面是两个语句 if语句和else语句 它们都属于同一个if语句 else子句不能作为语句单独使用 它必须是if语句的一部分 与if配对使用 3 在if和else后面可以只含一个内嵌的操作语句 如上例 也可以有多个操作语句 此时用花括号 将几个语句括起来成为一个复合语句 如 if a b cprintf area 6 2f area elseprintf itisnotatrilateral 注意在第3行的花括号 外面不需要再加分号 因为 内是一个完整的复合语句 不需另附加分号 例5 1输入两个实数 按代数值由小到大的次序输出这两个数 这个问题的算法很简单 只需要作一次比较即可 对类似这样简单的问题可以不必先写出算法或画流程图 而直接编写程序 或者说 算法在编程者的脑子里 相当于在算术运算中对简单的问题可以 心算 而不必在纸上写出来一样 程序如下 main floata b t scanf f f a b if a b t a a b b t printf 5 2f 5 2f a b 运行情况如下 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 a b c if a b t a a b b t 实现a和b的互换 if a c t a a c c t 实现a和c的互换 if b c t b b c c t 实现b和c的互换 printf 5 2f 5 2f 5 2f a b c 运行情况如下 3 7 1 1 00 3 00 7 005 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 同一列上 希望else与第一个if对应 但实际上else是与第二个if配对 因为它们相距最近 因此最好使内嵌if语句也包含else部分 如本节 5 3 2节 最早列出的形式 这样if的数目和else的数目相同 从内层到外层一一对应 不致出错 内嵌if 如果if与else的数目不一样 为实现程序设计者的企图 可以加花括弧来确定配对关系 例如 if if 语句1 else语句2这时 限定了内嵌if语句的范围 因此else与第一个if配对 内嵌if 例5 3有一函数 1 x0 编一程序 输入一个x值 输出y值 有以下几个程序 请判断哪个是正确的 程序1 main intx y scanf d x if x 0 y 1 elseif x 0 y 0 elsey 1 printf x d y d n x y 程序2 将上面程序的if语句改为 if x 0 if x 0 y 1 elsey 0 elsey 1 程序3 将上述if语句改为 y 1 if x 0 if x 0 y 1 elsey 0 程序4 y 0 if x 0 if x 0 y 1 elsey 1 图5 8 5 3 3条件运算符条件运算符的概念若if语句中 在表达式为 真 和 假 时 且都只执行一个赋值语句给同一个变量赋值时 可以用简单的条件运算符来处理 例如 若有以下if语句 if a b max a elsemax b 可以用下面的条件运算符来处理 max a b a b 条件运算符要求有3个操作对象 称三目 元 运算符 它是c语言中唯一的一个三目运算符 条件表达式的一般形式为图5 11表达式1 表达式2 表达式3 它的执行过程见图5 11 图5 11 条件运算符的说明 1 条件运算符的执行顺序 先求解表达式1 若为非0 真 则求解表达式2 此时表达式2的值就作为整个条件表达式的值 若表达式1的值为0 假 则求解表达式3 表达式3的值就是整个条件表达式的值 max a b a b执行结果就是将条件表达式的值赋给max 也就是将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 4输入一个字符 判别它是否大写字母 如果是 将它转换成小写字母 如果不是 不转换 然后输出最后得到的字符 关于大小写字母之间的转换方法 在本书例3 7中已做了介绍 因此可直接编写程序 main charch scanf c ch ch ch A ch Z ch 32 ch printf c ch 5 4Switch语句多分支选择结构的必要性图3 6所表示的是典型的多分支选择结构 if语句只有两个分支可供选择 而实际问题中常常需要用到多分支的选择 例如 学生成绩分类 90分以上为 a 等 80 89分为 b 等 70 79分为 c 等 人口统计分类 按年龄分为老 中 青 少 儿童 工资统计分类 银行存款分类 多分支选择结构的嵌套if实现及其缺点当然这些都可以用嵌套的if语句来处理 但如果分支较多 则嵌套的if语句层数多 程序冗长而且可读性降低 c语言提供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继续执行 在执行switch语句时 根据switch后面表达式的值找到匹配的入口标号 就从此标号开始执行下去 不再进行判断 例如 上面的例子中 若grade的值等于 a 则将连续输出 85 10070 8460 69 60error 因此 应该在执行一个case分支后 使流程跳出switch结构 即终止switch语句的执行 可以用一个break语句来达到此目的 将上面的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 最后一个分支 default 可以不加break语句 如果grade的值为 b 则只输出 70 84 流程图见图5 12 图5 12 在case后面中虽然包含一个以上执行语句 但可以不必用花括弧括起来 会自动顺序执行本case后面所有的执行语句 当然加上花括弧也可以 6 多个case可以共用一组执行语句 如 case a case b case c printf 60 n break grade的值为 a b 或 c 时都执行同一组语句 5 5程序举例例5 5写程序 判断某一年是否闰年 我们用图5 13来表示判别闰年的算法 以变量leap代表是否闰年的信息 若某年为闰年 则令leap 1 若为非闰年 令leap 0 最后判断leap是否为1 真 若是 则输出 闰年 信息 图5 13 据此编写程序如下 main intyear leap scanf d year if year 4 0 if year 100 0 if year 400 0 leap 1 elseleap 0 else leap 1 elseleap 0 if leap printf dis year elseprintf disnot year printf aleapyear n 运行情况如下 1989 1989isnotaleapyear 2000 2000isaleapyear 也可以将程序中第5 13行改写成以下的if语句 if year 4 0 leap 0 elseif year 100 0 leap 1 elseif year 400 0 leap 0 elseleap 1 也可以用一个逻辑表达式包含所有的闰年条件 将上述if语句用下面的if语句代替 if year 4 0elseleap 0 例5 6求ax2 bx c 0方程的解 例4 12曾介绍过基本的算法 实际上应该有以下几种可能 a 0 不是二次方程 b2 4ac 0 有两个相等实根 b2 4ac 0 有两个不等实根 b2 4ac 0 有两个共轭复根 画出N S流程图表示算法 图5 14 图5 14 据此编写程序如下 includemain floata b c d disc x1 x2 realpart imagpart scanf f f f a b c printf Theequation if fabs a le 6 printf isnotaquadratic else disc b b 4 a c if fabs disc le 6 printf hastwoequalroots 8 4 n b 2 a elseif disc le 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 程序中用disc代表b2 4ac 先计算disc的值 以减少以后的重复计算 对于判断b2 4ac是否等于0时 要注意一个问题 由于disc 即b2 4ac 是 实数 而实数在计算和存储时会有一些微小的误差 因此不能直接进行如下判断 if disc 0 因为这样可能会出现本来是零的量 由于上述误差而被判别为不等于零而导致结果错误 所以采取的办法是判别disc的绝对值 fabs disc 是否小于一个很小的数 例如10 6 如果小于此数 就认为disc 0 程序中以realpart代表实部P 以imagpart代表虚部q 以增加可读性 运行结果如下 1 2 1 Theequationhastwoequalroots 1 0000 1 2 2 Theequationhascomplexroots 1 0000 1 0000i 1 0000 1 0000i 2 6 1 Theequationhasdistinctrealroots 0 1771and 2 8229例5 7运输公司对用户计算运费 路程 S 越远 每公里运费越低 标准如下 s 250km没有折扣250 S 5002 折扣500 S 10005 折扣1000 S 20008 折扣2000 S 300010 折扣3000 S15 折扣设每公里每吨货物的基本运费为P Price的缩写 货物重为w weight的缩写 距离为S 折扣为d discount的缩写 则总运费f freight的缩写 的计算公式为f P w S 1 d 分析此问题 折扣的变化是有规律的 从图5 15可以看到 折扣的 变化 点 都是250的倍数 250 500 1000 2000 3000 利用这一特点 可以在横轴上加一种坐标c c的值为S 250 c代表250的倍数 当c 1时 表示S 250 无折扣 1 c 2时 表示250 S 500 折扣d 2 2 c 4时 d 5 4 c 8时 d 8 8 c 12时 d 10 c 12时 d 15 图5 15 据此写出程序如下 main intc S floatP w d f scanf f f d P w S if S 3000 c 12 elsec S 250 switch c case0 d 0 break case1 d 2 break case2 case3 d 5 break c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 房屋预约维修协议书
- 房租修建协议书合同
- 手办定制合伙协议书
- 手术室改造合同范本
- 手机租借合同协议书
- 打击网络犯罪协议书
- 打架私人赔偿协议书
- 打造品牌协同协议书
- 托管房子附加协议书
- 复旦大学《成语与中国文化》单元测试考核答案
- 外国影视音乐拓展 久石让的动漫音乐 课件-2023-2024学年高中音乐人音版(2019) 必修 音乐鉴赏
- 宝马X5汽车说明书
- 弥漫大B细胞淋巴瘤护理查房
- 内部融资的概念
- 某电厂土建部分监理质量评估报告
- (2023)《中华人民共和国公务员法》试题及答案
- 护士执业注册健康体检表
- 超星尔雅学习通《逻辑学导论(中山大学)》章节测试含答案
- 商务英语常用单词
- 建设工程施工合同(GF-2017-0201) 专用条款模板
- 现代设备管理课程教学大纲
评论
0/150
提交评论