c语言第5章选择结构程序设计.ppt

上传人:tia****nde 文档编号:6407507 上传时间:2020-02-24 格式:PPT 页数:40 大小:260KB
返回 下载 相关 举报
c语言第5章选择结构程序设计.ppt_第1页
第1页 / 共40页
c语言第5章选择结构程序设计.ppt_第2页
第2页 / 共40页
c语言第5章选择结构程序设计.ppt_第3页
第3页 / 共40页
点击查看更多>>
资源描述
第5章选择结构程序设计 一 教学要求 1 掌握关系运算和逻辑运算 2 学会构造正确的条件表达式 3 掌握if和switch语句的使用4 学会编写选择结构的程序二 教学重点与难点1 条件表达式的构造2 分支语句的格式与使用 if else语句和switch语句 3 编写选择结构的程序三 教学方法与课时数方法 讲授 程序演示 上机实验课时数 理论4节 上机2节 四教学内容 要设计选择结构程序 要考虑两个方面的问题 一是在C语言中如何来表示条件 二是在C语言中实现选择结构用什么语句 在C语言中表示条件 一般用关系表达式或逻辑表达式 实现选择结构用if语句或switch语句 5 1关系运算及其表达式5 2逻辑运算及其表达式5 3if语句5 4switch语句5 5选择结构程序举例 5 1关系运算及其表达式 所谓 关系运算 实际上就是 比较运算 即将两个数据进行比较 判定两个数据是否符合给定的关系 例如 a b 中的 表示一个大于关系运算 如果a的值是5 b的值是3 则大于关系运算 的结果为 真 即条件成立 如果a的值是2 b的值是3 则大于关系运算 的结果为 假 即条件不成立 5 1 1关系运算符及其优先次序1 关系运算符C语言提供6种关系运算符 大于 大于或等于 等于 不等于 注意 在 中 等于 关系运算符是双等号 而不是单等号 赋值运算符 2 优先级 1 在关系运算符中 前4个优先级相同 后2个也相同 且前4个高于后2个 2 与其它种类运算符的优先级关系关系运算符的优先级 低于算术运算符 但高于赋值运算符 5 1 2关系表达式1 关系表达式的概念所谓关系表达式是指 用关系运算符将两个表达式连接起来 进行关系运算的式子 例如 下面的关系表达式都是合法的 a b a b c d a 3 b a b b c 2 关系表达式的值 逻辑值 非 真 即 假 由于 语言没有逻辑型数据 所以用整数 表示 逻辑真 用整数 表示 逻辑假 例如 假设num1 3 num2 4 num3 5 则 1 num1 num2的值 0 2 num1 num2 num3的值 1 3 num1 num2 num3的值 1 思考题 任意改变num1或num2的值 会影响整个表达式的值吗 为什么 4 num1 num2 num3的值 6 因为num1 num2的值 1 1 5 6 再次强调 C语言用整数 1 表示 逻辑真 用整数 0 表示 逻辑假 所以 关系表达式的值 还可以参与其它种类的运算 例如算术运算 逻辑运算等 例5 1 main charc k inti 1 j 2 k 3 floatx 3e 5 y 0 85 printf d d n a 5 k 1 printf d d n 1 j 5 x 5 25 x y printf d d n i j k 2 j k j i 5 在本例中求出了各种关系运算符的值 字符变量是以它对应的ASCII码参与运算的 对于含多个关系运算符的表达式 如k j i 5 根据运算符的左结合性 先计算k j 该式不成立 其值为0 再计算0 i 5 也不成立 故表达式值为0 5 2逻辑运算及其表达式 关系表达式只能描述单一条件 例如 x 0 如果需要描述 x 0 同时 x 10 就要借助于逻辑表达式了 5 2 1逻辑运算及其优先次序 逻辑运算符及其运算规则 1 C语言提供三种逻辑运算符 逻辑与 相当于 同时 逻辑或 相当于 或者 逻辑非 相当于 否定 例如 下面的表达式都是逻辑表达式 x 0 x5 x 0 year 4 0 year 100 0 year 400 0 2 运算规则1 当且仅当两个运算量的值都为 真 时 运算结果为 真 否则为 假 2 当且仅当两个运算量的值都为 假 时 运算结果为 假 否则为 真 3 当运算量的值为 真 时 运算结果为 假 当运算量的值为 假 时 运算结果为 真 例如 假定x 5 则 x 0 x5 的值为 假 2 逻辑运算符的运算优先级 1 逻辑非的优先级最高 逻辑与次之 逻辑或最低 即 非 与 或 2 与其它种类运算符的优先关系 算术运算 关系运算 赋值运算5 2 2逻辑表达式1 逻辑表达式的概念所谓逻辑表达式是指 用逻辑运算符将1个或多个表达式连接起来 进行逻辑运算的式子 在C语言中 用逻辑表达式表示多个条件的组合 例如 year 4 0 year 100 0 year 400 0 就是一个判断一个年份是否是闰年的逻辑表达式 逻辑表达式的值也是一个逻辑值 非 真 即 假 2 逻辑量的真假判定 和非 语言用整数 表示 逻辑真 用 表示 逻辑假 但在判断一个数据的 真 或 假 时 却以 和非 为根据 如果为 则判定为 逻辑假 如果为非 则判定为 逻辑真 例如 假设num 12 则 num的值 num 1 num31的值 1 3 说明 1 逻辑运算符两侧的操作数 除可以是 和非 的整数外 也可以是其它任何类型的数据 如实型 字符型等 2 在计算逻辑表达式时 只有在必须执行下一个表达式才能求解时 才求解该表达式 即并不是所有的表达式都被求解 换句话说 1 对于逻辑与运算 如果第一个操作数被判定为 假 系统不再判定或求解第二操作数 2 对于逻辑或运算 如果第一个操作数被判定为 真 系统不再判定或求解第二操作数 例如 假设n1 n2 n3 n4 x y的值分别为1 2 3 4 1 1 则求解表达式 x n1 n2 y n3 n4 后 x的值变为 而y的值不变 仍等于1 5 3if语句用if语句可以构成分支结构 它根据给定的条件进行判断 以决定执行某个分支程序段 5 3 1if语句三种基本形式 1 第一种形式为基本形式 if 表达式 语句其语义是 如果表达式的值为真 则执行其后的语句 否则不执行该语句 其过程可表示为下图 例5 3 main inta b max printf ninputtwonumbers scanf d d 本例程序中 输入两个数a b 把a先赋予变量max 再用if语句判别max和b的大小 如max小于b 则把b赋予max 因此max中总是大数 最后输出max的值 2 第二种形式为 if elseif 表达式 语句1 else语句2 其语义是 如果表达式的值为真 则执行语句1 否则执行语句2 其执行过程可表示为下图 例5 4 main inta b printf inputtwonumbers scanf d d 输入两个整数 输出其中的大数 改用if else语句判别a b的大小 若a大 则输出a 否则输出b 3 第三种形式为if else if形式前二种形式的if语句一般都用于两个分支的情况 当有多个分支选择时 可采用if else if语句 其一般形式为 if 表达式1 语句1 elseif 表达式2 语句2 elseif 表达式3 语句3 elseif 表达式m 语句m else语句n 其语义是 依次判断表达式的值 当出现某个值为真时 则执行其对应的语句 然后跳到整个if语句之外继续执行程序 如果所有的表达式均为假 则执行语句n 然后继续执行后续程序 if else if语句的执行过程如图3 3所示 例5 5 include stdio h main charc printf inputacharacter c getchar if c 0 本例要求判别键盘输入字符的类别 可以根据输入字符的ASCII码来判别类型 由ASCII码表可知ASCII值小于32的为控制字符 在 0 和 9 之间的为数字 在 A 和 Z 之间为大写字母 在 a 和 z 之间为小写字母 其余则为其它字符 这是一个多分支选择的问题 用if else if语句编程 判断输入字符ASCII码所在的范围 分别给出不同的输出 例如输入为 g 输出显示它为小写字符 4 在使用if语句中还应注意以下问题 1 在三种形式的if语句中 在if关键字之后均为表达式 该表达式通常是逻辑表达式或关系表达式 但也可以是其它表达式 如赋值表达式等 甚至也可以是一个变量 例如 if a 5 语句 if b 语句 都是允许的 只要表达式的值为非0 即为 真 如在 if a 5 中表达式的值永远为非0 所以其后的语句总是要执行的 当然这种情况在程序中不一定会出现 但在语法上是合法的 又如 有程序段 if a b printf d a elseprintf a 0 本语句的语义是 把b值赋予a 如为非0则输出该值 否则输出 a 0 字符串 这种用法在程序中是经常出现的 2 在if语句中 条件判断表达式必须用括号括起来 在语句之后必须加分号 3 在if语句的三种形式中 所有的语句应为单个语句 如果要想在满足条件时执行一组 多个 语句 则必须把这一组语句用 括起来组成一个复合语句 但要注意的是在 之后不能再加分号 例如 if a b a b else a 0 b 10 5 3 2IF语句的嵌套 当if语句中的执行语句又是if语句时 则构成了if语句嵌套的情形 其一般形式可表示如下 if 表达式 if语句 或者为if 表达式 if语句 elseif语句 在嵌套内的if语句可能又是if else型的 这将会出现多个if和多个else重叠的情况 这时要特别注意if和else的配对问题 例如 if 表达式1 if 表达式2 语句1 else语句2 其中的else究竟是与哪一个if配对呢 应该理解为 if 表达式1 if 表达式2 语句1 else语句2 还是应理解为 if 表达式1 if 表达式2 语句1 else语句2 为了避免这种二义性 语言规定 else总是与它前面最近的if配对 因此对上述例子应按前一种情况理解 例5 6 main inta b printf pleaseinputA B scanf d d 比较两个数的大小关系 本例中用了if语句的嵌套结构 采用嵌套结构实质上是为了进行多分支选择 实际上有三种选择即A B A B或A B 这种问题用if else if语句也可以完成 而且程序更加清晰 因此 在一般情况下较少使用if语句的嵌套结构 以使程序更便于阅读理解 例5 7 main inta b printf pleaseinputA B scanf d d 案例5 8 写一程序 从键盘上输入1年份year 4位十进制数 判断其是否闰年 闰年的条件是 能被4整除 但不能被100整除 或者能被400整除 算法设计要点 1 如果 能被 整除 则余数为 即如果 的值等于 则表示 能被 整除 2 首先将是否闰年的标志leap预置为0 非闰年 这样仅当year为闰年时将leap置为1即可 这种处理两种状态值的方法 对优化算法和提高程序可读性非常有效 请读者仔细体会 参考程序如下 案例代码文件名 AL4 3 C 功能 说明if语句的嵌套格式和用法 main intyear leap 0 leap 0 预置为非闰年 printf Pleaseinputtheyear scanf d if year 4 0 if year 100 0 leap 1 else if year 400 0 leap 1 if leap printf disaleapyear n year elseprintf disnotaleapyear n year 利用逻辑运算能描述复杂条件的特点 可将上述程序优化如下 main intyear printf Pleaseinputtheyear scanf d 5 3 3条件运算符1 一般格式 表达式1 表达式2 表达式3条件表达式中的 表达式1 表达式2 表达式3 的类型 可以各不相同 2 运算规则如果 表达式1 的值为非0 即逻辑真 则运算结果等于 表达式2 的值 否则 运算结果等于 表达式3 的值 如图4 2所示 3 运算符的优先级与结合性条件运算符的优先级 高于赋值运算符 但低于关系运算符和算术运算符 其结合性为 从右到左 即右结合性 例5 9 从键盘上输入一个字符 如果它是大写字母 则把它转换成小写字母输出 否则 直接输出 案例文件名 AL4 4 C main charch printf Inputacharacter scanf c 5 4switch语句 C语言提供了switch语句直接处理多分支选择 案例5 10 从键盘上输入一个百分制成绩score 按下列原则输出其等级 score 90 等级为A 80 score 90 等级为B 70 score 80 等级为C 60 score 70 等级为D score 60 等级为E 案例代码文件名 AL4 5 C main intscore grade printf Inputascore 0 100 scanf d case8 printf grade B n break case7 printf grade C n break case6 printf grade D n break case5 case4 case3 case2 case1 case0 printf grade E n break default printf Thescoreisoutofrange n 程序运行情况如下 Inputascore 0 100 85 grade B 1 switch语句的一般形式switch 表达式 case常量表达式1 语句组 break case常量表达式2 语句组 break case常量表达式 语句组 break default 语句组 break 2 执行过程 1 当switch后面 表达式 的值 与某个case后面的 常量表达式 的值相同时 就执行该case后面的语句 组 当执行到break语句时 跳出switch语句 转向执行switch语句的下一条 2 如果没有任何一个case后面的 常量表达式 的值 与 表达式 的值匹配 则执行default后面的语句 组 然后 再执行switch语句的下一条 3 说明 1 switch后面的 表达式 可以是int char和枚举型中的一种 2 每个case后面 常量表达式 的值 必须各不相同 否则会出现相互矛盾的现象 即对表达式的同一值 有两种或两种以上的执行方案 3 case后面的常量表达式仅起语句标号作用 并不进行条件判断 系统一旦找到入口标号 就从此标号开始执行 不再进行标号判断 所以必须加上break语句 以便结束switch语句 思考题 如果去掉 案例5 10 程序中的所有break语句 且输入的成绩为75 输出会如何 4 各case及default子句的先后次序 不影响程序执行结果 5 多个case子句 可共用同一语句 组 例如 在 案例5 10 中的 case10 和 case9 共用语句 printf grade A n break case5 case0 共用语句 printf grade E n break 6 用switch语句实现的多分支结构程序 完全可以用if语句或if语句的嵌套来实现 5 5选择结构程序设计举例 案例5 12 求一元二次方程ax2 bx c 0的解 a 0 案例代码文件名 AL4 6 C 功能 求一元二次方程的解 include math h main floata b c disc x1 x2 p q scanf f f f else p b 2 a 求出两个共轭复根 q sqrt fabs disc 2 a printf x1 7 2f 7 2fi n p q 输出两个共轭复根 printf x2 7 2f 7 2fi n p q 说明 由于实数在计算机中存储时 经常会有一些微小误差 所以本案例判断disc是否为0的方法是 判断disc的绝对值是否小于一个很小的数 例如10 6 思考题 如果将系数a b c定义成整数 能否直接判断disc是否等于0 案例5 7 已知某公司员工的保底薪水为500 某月所接工程的利润profit 整数 与利润提成的关系如下 计量单位 元 profit 1000没有提成 1000 profit 2000提成10 2000 profit 5000提成15 5000 profit 10000提成20 10000 profit提成25 算法设计要点 为使用switch语句 必须将利润profit与提成的关系 转换成某些整数与提成的关系 分析本题可知 提成的变化点都是1000的整数倍 1000 2000 5000 如果将利润profit整除1000 则当 profit 1000对应0 11000 profit 2000对应1 22000 profit 5000对应2 3 4 55000 profit 10000对应5 6 7 8 9 1010000 profit对应10 11 12 为解决相邻两个区间的重叠问题 最简单的方法就是 利润profit先减1 最小增量 然后再整除1000即可 profit 1000对应01000 profit 2000对应12000 profit 5000对应2 3 45000 profit 10000对应5 6 7 8 910000 profit对应10 11 12 案例代码文件名 AL4 7 C main longprofit intgrade floatsalary 500 printf Inputprofit scanf ld 将利润 1 再整除1000 转化成switch语句中的case标号 switch grade case0 break profit 1000 case1 salary profit 0 1 break 1000 profit 2000 case2 case3 case4 salary profit 0 15 break 2000 profit 5000 case5 case6 case7 case8 case9 salary profit 0 2 break 5000 profit 10000 default salary profit 0 25 10000 profit printf salary 2f n salary 良好的源程序书写风格 注释 必要的注释 可有效地提高程序的可读性 从而提高程序的可维护性 在 语言源程序中 注释可分为三种情况 1 在函数体内对语句的注释 2 在函数之前对函数的注释 3 在源程序文件开始处 对整个程序的总体说明 函数体内的语句 是由顺序结构 选择结构和循环结构等三种基本结构构成的 在什么地方加以注释的原则是 如果不加注释 理解起来就会有困难 或者虽无困难 但浪费时间 1 顺序结构在每个顺序程序段 由若干条语句构成 之前 用注释说明其功能 除很复杂的处理外 一般没有必要每条语句都加以注释 2 选择结构在C语言中 选择结构是由if语句和switch语句来实现的 一般地说 要在前面说明其作用 在每个分支条件语句行的后面 说明该分支的含义 如下所示 1 if语句 说明功能 if 条件表达式 条件成立时的含义 else 入口条件含义 2 switch语句 说明功能 switch 表达式 case常量表达式1 该入口值的含义 语句组 case常量表达式n 该入口值的含义 语句组 default 该入口值的含义 语句组 如果条件成立时 或入口值 的含义 已经很明确了 也可不再加以注释
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!