C语言程序设计第4章 选择结构.pptx
第 6章 数组第 7章 函数第 8章 结构体、共用体和枚举类型第 9章 指针第 10章 文件目录页 Contents page第 1章 初识 C语言第 2章 数据类型、运算符与表达式第 3章 顺序结构程序设计第 4章 选择结构第 5章 循环结构目 录 页第 4章选择结构 学习目标案例 目标u 熟悉 条件表达式的构成和运算规则u 掌握 逻辑推理与判断问题的数值化求解方法u 熟悉使用 if语句进行选择结构程序设计目 录 页第 4章选择结构 学习目标学习目标u 掌握关系运算和逻辑运算的运算规则u 掌握 if语句的 3种基本形式,及 if语句的嵌套方法u 掌握 switch语句的使用方法u 能够使用 if语句和 switch语句,进行选择结构程序设计目 录 页第 4章选择结构 案例 4 谁是盗贼【 问题描述 】公安人员审问四名盗贼嫌疑犯。已知,这四名人当中仅有一名是盗贼,还知道这四个人中每人要么是诚实的,要么是说谎的。在回答公安人员的问题中甲说 “乙没有偷,是丁偷的。 ”乙说 “我没有偷,是丙偷的。 ”丙说 “甲没有偷,是乙偷的。 ”丁说 “我没有偷。 ”根据这四人的答话,小明想了想,用笔在纸上画了画, 5分钟后作出答案是乙偷的。请问小明是怎么知道的,他的判断正确吗目 录 页第 4章选择结构 案例 4 谁是盗贼【 问题分析 】假设用变量 A、 B、 C、 D分别代表四个人,变量的值为 1代表该人是盗贼,为 0就不是盗贼。由题目已知四人中仅一人是盗贼,且这四人中每个人要么说真话,要么说假话,而由于甲、乙、丙三人都说了两句话 “X没有偷, Y偷了 ”,故不论该人是否说谎,他提到的两人之中必有一人是小偷。故在列条件表达式时,可以不关心谁说谎,谁说实话。这样,可列出下列条件表达式甲说 “乙没有偷,是丁偷的。 ” BD1乙说 “我没有偷,是丙偷的。 ” BC1丙说 “甲没有偷,是乙偷的。 ” AB1丁说 “我没有偷。 ” ABCD1目 录 页第 4章选择结构 案例 4 谁是盗贼【 算法设计 】1 定义四个变量 A、 B、 C、 D分别代表四个人,变量的值为 1代表是窃贼 ;2 根据对话,列出判断条件表达式bd 1 acd0 表达式( *)的值是否为真如果表达式( *)的值为真,则判断正确,否则小明的判断错误。目 录 页第 4章选择结构 案例 4 谁是盗贼【 算法设计 】参考代码如下include void mainint a,b,c,d;b 1; /*盗贼者是乙 */a c d 0; /*盗贼者不是甲、丙、丁 */ifbd1 else printf“小明的判断错误,盗窃者不是乙 n“;目 录 页第 4章选择结构 案例 4 谁是盗贼【 知识准备 】谁是盗贼的算法要点首先把问题进行数值化处理,根据对话列出条件表达式,最后用 C语言选择结构,计算表达式的值 , 验证小明给出的判断。本案例涉及到 C语言的条件表达式 ,以及选择结构。日常生活中,经常需要判断某一个 “条件 ”是否成立,并根据条件作出选择。要完成上面的任务,必须熟悉条件表达式的构成和运算规则 ,掌握逻辑推理与判断问题的数值化处理方法 ,熟悉使用 if语句进行选择结构程序设计。目 录 页第 4章选择结构 4.1 条件判断表达式4.1.1关系表达式1关系运算符关系运算是指对两个运算量之间大小的比较,关系运算的结果为逻辑值或称 “布尔 ”(boolean)值,其值只有两种可能 “真 ”或 “假 ”。 C语言中提供 6种关系运算符,如表 4-1所示。表 4-1 关系运算符目 录 页第 4章选择结构 4.1 条件判断表达式4.1.1关系表达式2关系表达式用关系运算符将两个表达式连接起来的式子称为关系表达式。其一般形式为例如,下面的关系表达式都是合法的。ab5,a b2, a b1目 录 页第 4章选择结构 4.1 条件判断表达式3. 关系表达式的值 -逻辑值( “真 ”或 “假 ”)在 C编译系统中,没有 “逻辑 ”类型数据,用 1和 0分别表示逻辑值的 “真 ”和 “假 ”。在进行判断时系统视非零值为 “真 ”,零值为 “假 ”;而关系运算的结果若为 “真 ”则其值为 1,若为 “假 ”则其值为 0,结果值是无符号整数,又可参与其后的运算。例如35 2*4 即判断( 3 5)是否等于( 2*4),结果值为 1。3 5-3 等价于 2355-3,结果值为 1。x 54 3 等价于先求 54结果为 1,再进行 1 3的比较 ,结果为 0, 即 关系运算的结果值为 0,最后将 0赋值给变量 x。目 录 页第 4章选择结构 4.1 条件判断表达式4.1.2 逻辑表达式关系表达式描述单一条件,例如 “x-5”,那么就要借助于逻辑表达式。1逻辑运算符逻辑运算是表示运算对象的逻辑关系。 C语言提供 3种逻辑运算符,如表 4-2所示。表 4-2 逻辑运算符目 录 页第 4章选择结构 4.1 条件判断表达式2. 运算规则逻辑运算真值表见表 4-3。即 当且仅当两个运算量的值都为 “假 ”时,运算结果为 “假 ”,否则为 “真 ”; 当运算量的值为 “真 ”时,运算结果为 “假 ”;当运算量的值为 “假 ”时,运算结果为 “真 ”。表 4-3 逻辑运算 “ 真值表 ”目 录 页第 4章选择结构 4.1 条件判断表达式3逻辑表达式用逻辑运算符( 功能如果表达式的值为 “真 ”(非 0) ,则执行语句 1;否则执行语句 2。其流程图如图 4-2所示。目 录 页第 4章选择结构 4.3 选择结构3多分支 if 语句格式 if表达式 1 语句 1else if表达式 2语句 2else if表达式 n语句 nelse 语句 n1功能 依次判断表达式的值,当出现某个值为真时,则执行其对应的语句,然后跳到整个 if语句之外继续执行程序。如果所有的表达式均为假,则执行语句 n1, 然后继续执行后续语句。目 录 页第 4章选择结构 4.3 选择结构4 if语句使用注意事项1 if后面的条件表达式必须用圆括号括起来。2 每个表达式后面的语句如果不止有一条 C语言语句时,必须用一对花括号 “”括起来组成复合语句;否则只能执行前面的一条语句 。例如 ifaba;belse a0;b1;3 表达式可以是任意类型的 C语言合法表达式,除常见的算术表达式、关系表达式或逻辑表达式外,也可以是其它表达式,如赋值表达式,甚至也可以是一个变量。目 录 页第 4章选择结构 4.3 选择结构4.3.2 if 语句的嵌套所谓 if 语句的嵌套,就是在 if语句中又包含了一个或多个 if语句。在 if语句中可根据需要,用 if语句的三种形式进行互相嵌套 。一般 形式如下1 嵌套在 if子句中if 表达式 if 语句else 语句 2;2 嵌套在 else子句中if 表达式 语句 1;else if语句目 录 页第 4章选择结构 4.3 选择结构4.3.3 条件运算符 “ ”为条件运算符,条件运算符有三个操作数,是 C语言中唯一的三目运算符。其连接的表达式为条件表达式。条件表达式的格式如下 功能 首先 计算表达式 1的值,如果表达式 1的值为非 0真 ,则整个条件表达式的值取表达式 2的值;否则,整个条件表达式的值取表达式 3的值。目 录 页第 4章选择结构 4.3 选择结构4.3.4 switch语句switch 语句是一个多分支结构的语句,它所实现功能与多分支 if语句很相似,但在大多数情况下, switch语句表达方式更直观、简单、有效。1. switch语句的语法格式switch case ;break;case ;break;case ;break;default ;break;目 录 页第 4章选择结构 4.3 选择结构2 switch语句执行过程switch语句执行过程可以用图 4-4表示。1 首先计算 switch后的表达式的值。2 然后将结果值与 case后的常量表达式值比较,如果找到相匹配的 case,程序就执行相应的语句序列,直到遇到 break语句 ,switch语句执行结束;如果找不到匹配的 case,就归结到default处,执行它的语句序列,直到遇到 break语句为止;如果没有 default,则不执行任何操作。其它其它常量表达式常量表达式 n常量表达式常量表达式 2常量表达式常量表达式 1语句序列语句序列 1 语句序列语句序列 2 语句序列语句序列 n 语句序列语句序列 n1表达式表达式图图 4-4 switch语句流程图语句流程图目 录 页第 4章选择结构 4.3 选择结构3. 使用 switch语句的注意事项1 switch后面的 “表达式 ”和 “常量表达式 ”必须是整数类型或枚举类型,如 int、 char、sbyte、 ushort、 short、 uint、 int、 ulong、 long。2 case后的 “常量表达式 ”必须互异,不能有重复,其中 default和 可以省略。3 switch语句中的 case和 default的出现次序是任意的,且 case的次序不要求按常量表达式的大小顺序排列。4 case后面的常量表达式仅起语句标号作用,必须在运行前就是确定的,不能改变的。系统一旦找到入口标号,就从此标号开始执行,不再进行标号判断,所以必须加上 break语句,以便结束 switch语句。目 录 页第 4章选择结构 4.4情景应用 案例拓展4.4.1案例 4-1判断闰年【 问题描述 】从键盘输入一个表示年份的整数,判断该年份是否为闰年,并显示判断结果。【 算法设计 】设 year为某一年份, year为闰年的条件是 year可以被 4整除且不可以被 100整除,或者year可以被 400整除,可用如下表达式来表示year4 0 printf“请输入年份 “;scanf“d“,if year4 0 打印是闰年else printf“d 不是闰年 .n“,year; 打印不是闰年目 录 页第 4章选择结构 4.4情景应用 案例拓展4.4.3案例 4-3计算某日是该年的 第几天【 问题描述 】要求编一个计算天数的程序,即从键盘输入当天的日期(年、月、日),在屏幕中输出此日期是该年的第几天。程序运行结果如图 4-5所示。图 4-5 计算今天是该年的第几天