第章C程序设计ppt课件.ppt_第1页
第章C程序设计ppt课件.ppt_第2页
第章C程序设计ppt课件.ppt_第3页
第章C程序设计ppt课件.ppt_第4页
第章C程序设计ppt课件.ppt_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

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

文档简介

5 1关系运算符和关系表达式5 2逻辑运算符和逻辑表达式5 3if语句5 4switch语句5 5程序举例 第5章选择结构程序设计 在第3章中已介绍了选择结构 它是三种基本结构之一 在大多数程序中都会包含选择结构 它的作用是 根据所指定的条件是否满足 决定从给定的两组操作选择其一 在本章中介绍如何用c语言实现选择结构 在c语言中选择结构是用if语句实现的 if语句最常用的形式是if 关系表达式 语句1else语句2例如 if x 0 y 1 elsey 1 其中x 0是一个关系表达式 是一个关系运算符 5 1关系运算符和关系表达式 关系运算是逻辑运算中比较简单的一种 所谓 关系运算 实际上是 比较运算 将两个值进行比较 判断其比较的结果是否符合给定的条件 例如 a 3是一个关系表达式 大于号 是一个关系运算符 如果a的值为5 则满足给定的 a 3 条件 因此关系表达式的值为 真 即 条件满足 如果a的值为2 不满足 a 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 关系表达式的值是一个逻辑值 即 真 或 假 例如 关系表达式 5 3 的值为 假 5 0 的值为 真 c语言没有逻辑型数据 Pascal语言以True表示 真 以false表示 假 PascaL和FORTRAN等语言都有逻辑型变量和逻辑型常 量 以1代表 真 以 0 代表 假 例如 a 3 b 2 c 1 则 关系表达式 a b 的值为 真 表达式的值为1 关系表达式 a b c 的值为 真 因为a b的值为1 等于c的值 表达式的值为1 关系表达式 b c a 的值为 假 表达式的值为0 如果有以下赋值表达式 d a bd的值为1 f a b cf的值为0 因为 运算符是自左至右的结合方向 先执行 a b 得值为1 再执行关系运算 1 c 得值0 赋给f 用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式 在basic和Pascal语言中有以下形式的逻辑表达式 AND是逻辑运算符 a b AND x y 如果a b且x y 则上述逻辑表达式的值为 真 下面介绍c语言中的逻辑运算符和逻辑运算 5 2 1逻辑运算符及其优先次序C语言提供三种逻辑运算符 5 2逻辑运算符和逻辑表达式 1 逻辑与 相当于其他语言中的aND 2 逻辑或 相当于其他语言中的 3 逻辑非 相当于其他语言中的N T 和 是 双目 元 运算符 它要求有两个运算量 操作数 如 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为假 在一个逻辑表达式中如果包含多个逻辑运算符 如 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代表 假 但在判断一个量是否为 真 时 以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表达式自左至右扫描求解 首先处理 5 3 因为关系运算符优先于 在关系运算符两侧的5和3作为数值参加关系运算 5 3 的值为1 再进行 1 8 4 0 的运算 8的左侧为 右侧为 运算符 根据优先规则 应先进行 的运算 即先进行 8 4 0 的运算 现在4的左侧为 右侧为 运算符 而 优先于 因此应先进行 4 0 的运算 由于 的级别最高 因此先进行 0 的运算 得到结果1 然后进行 4 1 的运算 得结果3 再进行 8 3 的运算 得0 最后进行 1 0 的运算 得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 也就是说 对 运算符来说 只有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 若表达式值为真 year为非闰年 请注意表达式中右面的括弧内的不同运算符 0 的运算优先次序 5 3if语句if语句是用来判定所给定的条件是否满足 根据判定的结果 真或假 决定执行给出的两种操作之一 5 3 1if语句的三种形式C语言提供了三种形式的if语句 1 if 表达式 语句例如 if x y printf d x 这种if语句的执行过程见图5 5 a 2 if 表达式 语句1else语句2例如 if x y printf d x elseprintf d y 见图5 5 b 图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 a b x y printf a b x y 在执行if语句时先对表达式求解 若表达式的值为0 按 假 处理 若表达式的值为非0 按 真 处理 执行指定的语句 假如有以下if语句 if 3 printf k 是合法的 执行结果输出 k 因为表达式的值为3 按 真 处理 由此可见 表达式的类型不限于逻辑表达式 可以是任意的数值类型 包括整型 实型 字符型 指针型数据 例如 下面的if语句也是合法的 if a printf d a 执行结果 输出 a 的ASCII码97 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语句2内嵌ifelseif 语句3else语句4内嵌if 应当注意if与else的配对关系 else总是与它上面的最近的if配对 假如写成 if if 语句1elseif 语句2else语句3内嵌if编程序者把else写在与第一个if 外层if 同一列上 希望else与第一个if对应 但实际上else是与第二个if配对 因为它们相距最近 因此最好使内嵌if语句也包含else部分 如本节 5 3 2节 最早列出的形式 这样if的数目和else的数目相同 从内层到外层一一对应 不致出错 如果if与else的数目不一样 为实现程序设计者的企图 可以加花括弧来确定配对关系 例如 if if 语句1 else语句2 内嵌if 这时 限定了内嵌if语句的范围 因此else与第一个if配对 例5 3有一函数 y 1 x0 编一程序 输入一个x值 输出y值 可以先写出算法 输入x若x0y 1输出y或输入x若x0y 1输出y 也可以用流程图表示 见图5 7 图5 7 有以下几个程序 请读者判断哪个是正确的 程序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语句 第4 6行 改为 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 只有程序1和程序2是正确的 程序1体现了图5 7的流程 显然它是正确的 程序2的流程图见图5 8 它也能实现题目的要求 程序3的流程图见图5 9 程序4的流程图见图5 10 它们不能实现题目的要求 请注意程序中的else与if的配对关系 例如程序3中的else子句是和它上一行的内嵌的if语句配对 而不与笫2行的if语句配对 为了使逻辑关系清晰 避免出错 一般把内嵌的if语句放在外层的else子句中 如程序1那样 这样由于有外层的else相隔 内嵌的else不会被误认为和外层的if配对 而只能与内嵌的if配对 这样就不会搞混 如像程序3和程序4那样写就很容易出错 图5 9 图5 10 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语言中唯一的一个三目运算符 条件表达式的一般形式为图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 条件表达式中 表达式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是实型 比整型高 见第3章3 7 因此 将1转换成实型值1 0 例5 4输入一个字符 判别它是否大写字母 如果是 将它转换成小写字母 如果不是 不转换 然后输出最后得到的字符 关于大小写字母之间的转换方法 在本书例3 7中已做了介绍 因此可直接编写程序 main charch scanf c ch ch ch a ch Z ch 32 ch printf c ch 运行结果如下 a a 条件表达式中的 ch 32 其中32是小写字母和大写字母ASCII码的差值 5 4Switch语句Switch语句是多分支选择语句 用来实现如图3 6所表示的多分支选择结构 if语句只有两个分支可供选择 而实际问题中常常需要用到多分支的选择 例如 学生成绩分类 90分以上为 a 等 80 89分为 b 等 70 79分为 c 等 人口统计分类 按年龄分为老 中 青 少 儿童 工资统计分类 银行存款分类 当然这些都可以用嵌套的if语句来处理 但如果分支较多 则嵌套的if语句层数多 程序冗长而且可读性降低 c语言提供Switch语句直接处理多分支选择 它相当于Pascal语言中的case语句 它的一般形式如下 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分支后 使流程跳出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

温馨提示

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

评论

0/150

提交评论