全国计算机等级考试二级C-第四章 选择结构.ppt

上传人:椰子壳 文档编号:5024736 上传时间:2020-01-29 格式:PPT 页数:57 大小:454.50KB
返回 下载 相关 举报
全国计算机等级考试二级C-第四章 选择结构.ppt_第1页
第1页 / 共57页
全国计算机等级考试二级C-第四章 选择结构.ppt_第2页
第2页 / 共57页
全国计算机等级考试二级C-第四章 选择结构.ppt_第3页
第3页 / 共57页
全国计算机等级考试二级C-第四章 选择结构.ppt_第4页
第4页 / 共57页
全国计算机等级考试二级C-第四章 选择结构.ppt_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《全国计算机等级考试二级C-第四章 选择结构.ppt》由会员分享,可在线阅读,更多相关《全国计算机等级考试二级C-第四章 选择结构.ppt(57页珍藏版)》请在三一文库上搜索。

1、全国计算机等级考试二级C,第四章 选择结构,2010年10月- 2011年3月,第四章 选择结构,4.1 关系运算和逻辑运算 4.2 if语句和if语句构成的选择结构 4.3 条件表达式构成的选择结构 4.4switch语句以及switch语句和break语句构成的选择结构 4.5 语句标号和goto语句,C语言提供了可以进行逻辑判断的若干选择语句,由这此选择语句可构成程序中的选择结构,通常又称为分支结构。,选择结构,4.1.1 C语言的逻辑值 关系表达式和逻辑表达式的运算结果都会得到一个逻辑值。逻辑值只有两个,分别用“真”和“假”来表示。在C语言中,没有专门的“逻辑值”,而是用非0表示“真”

2、,用0表示“假”。,4.1 关系运算和逻辑运算,4.1.2关系运算符和表达式 在程序中经常需要比较两个量的大小关系,以决定程序下一步的工作。比较两个量的运算符称为关系运算符。 关系运算符是双目运算符,具有自左至右的结合性。,关系运算符及其优先次序 (大于) = (大于或等于) = (等于) != (不等于),4.1.2.1 C语言的关系运算符,说明: 关系运算符的优先级低于算术运算符 关系运算符的优先级高于赋值运算符,4.1.2.2.关系表达式及关系表达式的值,关系表达式 用关系运算符将两个表达式(可以是算术表达式或 关系表达式,逻辑表达式,赋值表达式,字符表达式) 接起来的式子,称关系表达式

3、 关系表达式的一般形式为: 表达式 关系运算符 表达式 例:ab,a+bb+c,(a=3)(b=5),ab)(bb”的值为“真”,表达式的值为1。,C语言中没有专用的逻辑值,1代表真,0代表假,关系表达式举例: a+bc-d x3/2 a+1(bc) a!=(c=d) 关系表达式的值是真”和“假”,用“1”和“0”表示。 如: 50的值为“真”,即为1。 (a=3)(b=5)由于35不成立,故其值为假,即为0。,【例】 main() char c=k; int i=1,j=2,k=3; float x=3e+5,y=0.85; printf(“%d,%dn“,a+5=k+1); printf(

4、“%d,%dn“,1j5,x-5.25=x+y); printf(“%d,%dn“,i+j+k=-2*j,k=j=i+5); 在本例中求出了各种关系运算符的值。字符变量是以它对应的ASCII码参与运算的。对于含多个关系运算符的表达式,如k=j=i+5,根据运算符的左结合性,先计算k=j,该式不成立,其值为0,再计算0=i+5,也不成立,故表达式值为0。,4.1.3 逻辑运算符和逻辑表达式,一、逻辑运算符及其优先次序 & (逻辑与) 相当于其他语言中的AND | (逻辑或) 相当于其他语言中的OR ! (逻辑非) 相当于其他语言中的NOT 例:a&b 若a,b为真,则a&b为真。 a|b 若a,

5、b之一为真,则a|b为真。 !a 若a为真,则!a为假。,优先次序: 与运算符&和或运算符|均为双目运算符。具有左结合性。 非运算符!为单目运算符,具有右结合性。 运算符优先级的关系可表示如下:!(非)&(与)|(或) 逻辑运算符中的“&”和“|”低于关系运算符,“!”高于算术运算符。,按照运算符的优先顺序可以得出: ab & cd 等价于 (ab)&(cd) !b=c|dc&x+yc)&(x+y)b),逻辑表达式 用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式 逻辑表达式的值应该是一个逻辑量“真”或“假”。,任何非零的数值被认作“真”,例:设a=4,b=5: !a的值为0 a&

6、b的值为1 a|b的值为1 !a|b的值为1 4&0|2的值为1,逻辑表达式的一般形式为: 表达式 逻辑运算符 表达式 其中的表达式可以又是逻辑表达式,从而组成了嵌套的情形。 例如: (a&b)&c 根据逻辑运算符的左结合性,上式也可写为: a&b&c 逻辑表达式的值是式中各种逻辑运算的最后值,以“1”和“0”分别代表“真”和“假”。,表达式值为0,在逻辑表达式的求解中,并不是所有的逻辑运算符都要被执行。 (1)a&b&c 只有a为真时,才需要判断b的值,只有a和b都为真时, 才需要判断c的值。 (2)a|b|c 只要a为真,就不必判断b和c的值,只有a为假,才 判断b。a和b都为假才判断c,

7、例:(m=ab)&(n=cd) 当a=1,b=2,c=3,d=4,m和n的原值为1时,由于“ab”的值 为0,因此m=0,而“n=cd”不被执行,因此n的值不是0而 仍保持原值1。,答 (year%4=0&year%100!=0)|year%400=0 案 值为真(1)是闰年,否则为非闰年。,逻辑运算的值也为“真”和“假”两种,用“1”和“0 ”来表示。其求值规则如下: 1. 与运算 &:参与运算的两个量都为真时,结果才为真,否则为假。 例如: 50 & 42 由于50为真,42也为真,相与的结果也为真。 2. 或运算|:参与运算的两个量只要有一个为真,结果就为真。 两个量都为假时,结果为假。

8、 例如: 50|58 由于50为真,相或的结果也就为真。 3. 非运算!:参与运算量为真时,结果为假;参与运算量为假时,结果为真。 例如: !(50) 的结果为假。 虽然编译在给出逻辑运算值时,以“1”代表“真”,“0 ”代表“假”。 但反过来在判断一个量是为“真”还是为“假”时,以“0”代表“假”,以非“0”的数值作为“真”。 例如:由于5和3均为非“0”因此5&3的值为“真”,即为1。 又如: 5|0的值为“真”,即为1。,逻辑运算的值,【例】 main() char c=k; int i=1,j=2,k=3; float x=3e+5,y=0.85; printf(“%d,%dn“,!x

9、*!y,!x); printf(“%d,%dn“,x|i 本例中!x和!y分别为0,!x*!y也为0,故其输出值为0。由于x为非0,故!x的逻辑值为0。对x| i & j-3式,先计算j-3的值为非0,再求i & j-3的逻辑值为1,故x|i&j-3的逻辑值为 1。对ij&xy式,由于ij的值为1,而xy为0故表达式的值为0相与1 ,最后为0,对i=5&c&(j=8)式,由于i=5为假,即值为0,该表达式由两个与运算组成,所以整个表达式的值为0。对于式x+ y|i+j+k由于x+y的值为非0,故整个或表达式的值为1。,4.2 if语句和if语句构成的选择结构,用if语句可以构成分支结构。它根据

10、给定的条件进行判断,以决定执行某个分支程序段。语言的if语句有三种基本形式。,第一种形式为基本形式: (1)if (表达式) 语句 其语义是:如果表达式的值为真,则执行其后的语句, 否则不执行该语句。其过程可表示为下图。 例: if(xy) printf(“%d”,x);,If语句的三种基本形式,4.2.1 If语句,【例】 main() int a,b,max; printf(“n input two numbers:“); scanf(“%d%d“, 本例程序中,输入两个数a,b。把a先赋予变量max,再用if语句判别max和b的大小,如max小于b,则把b赋予max。因此max中总是大数

11、,最后输出max的值。,(2)if(表达式) 语句1 else 语句2 其语义是:如果表达式的值为真,则执行语句1,否则执行语句2 。 其执行过程可表示为下图。 例: if (xy) printf(“%d”,x); else printf(“%d”,y);,第二种形式为基本形式,【例】 main() int a, b; printf(“input two numbers: “); scanf(“%d%d“, 输入两个整数,输出其中的大数。 改用if-else语句判别a,b的大小,若a大,则输出a,否则输出b。,前二种形式的if语句一般都用于两个分支的情况。 当有多个分支选择时,可采用if-el

12、se-if语句,其一般形式为: (3)if(表达式1)语句1 else if(表达式2)语句2 else if(表达式3)语句3 else if(表达式m)语句m else 语句n 其语义是:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。 如果所有的表达式均为假,则执行语句n。然后继续执行后续程序。 if-else-if语句的执行过程如上图所示。,第三种形式为基本形式,【例】 #include“stdio.h“ main() char c; printf(“input a character: “); c=getchar(); if(c=0

13、,本例要求判别键盘输入字符的类别。可以根据输入字符的ASCII码来判别类型。由ASCII码表可知ASCII值小于32的为控制字符。 在“0”和“9”之间的为数字,在“A”和“Z”之间为大写字母, 在“a”和“z”之间为小写字母,其余则为其它字符。 这是一个多分支选择的问题,用if-else-if语句编程,判断输入字符ASCII码所在的范围,分别给出不同的输出。例如输入为“g”,输出显示它为小写字符。,例: if (number500) cost=0.15; else if(number300) cost=0.10; else if(number100) cost=0.075; else if(

14、number50) cost=0.05; else cost=0;,在使用if语句中还应注意以下问题: 1) 在三种形式的if语句中,在if关键字之后均为表达式。 该表达式通常是逻辑表达式或关系表达式, 但也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量。 例如: if(a=5) 语句; if(b) 语句; 都是允许的。只要表达式的值为非0,即为“真”。 如在: if(a=5); 中表达式的值永远为非0,所以其后的语句总是要执行的,当然这种情况在程序中不一定会出现,但在语法上是合法的。 又如,有程序段: if(a=b) printf(“%d“,a); else printf(“a=0“

15、); 本语句的语义是,把b值赋予a,如为非0则输出该值,否则输出“a=0”字符串。这种用法在程序中是经常出现的。,2) 在if语句中,条件判断表达式必须用括号括起来,在语句之后必须加分号。 3) 在if语句的三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用括起来组成一个复合语句。但要注意的是在之后不能再加分号。 例如: if(ab) a+; b+; else a=0; b=10;,if语句(例题),例:输入两个实数,按代数值由小到大的顺序输出这两个数。 #include void main() float a,b,t; scanf(“%f,%f

16、”,例:输入三个数a,b,c,要求按由小到大的顺序输出。,If ab 将a和b对换 If ac 将a和c对换 If bc 将b和c对换,#include void main ( ) float a,b,c,t; scanf(“%f,%f,%f”, ,4.2.2嵌套的if语句,一、当if语句中的执行语句又是if语句时,则构成了if 语句嵌套的情形。 其一般形式可表示如下: if(表达式) if语句; 或者为 if(表达式) if语句; else if语句; 在嵌套内的if语句可能又是if-else型的,这将会出现多个if和多个else重叠的情况,这时要特别注意if和else的配对问题。,例如:

17、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配对,因此对上述例子应按前一种情况理解。,【例】 main() int a,b; printf(“please input A,B: “); scanf(“%d%d“, ,比较两个数的大小关系 本例中用了if语句的嵌套结构。采用嵌套结构实质上是为了进行多分支选择,实际

18、上有三种选择即AB、AB或A=B。这种问题用if-else-if语句也可以完成。而且程序更加清晰。因此,在一般情况下较少使用if语句的嵌套结构。以使程序更便于阅读理解。,匹配规则: else总是与它上面的,最近的,统一复合语句中的,未配对的if语句配对。,例: If() if() 语句1 else if() 语句2 else 语句3,例: If() if() 语句1 else if() 语句2 else 语句3,当if和else数目不同时,可以加花括号来确定配对关系。,-1 (x0) 算法1: 算法2: 输入x 输入x 若x0,则y=1 若x=0,则y=0 输出y 若x0,则y=1 输出y,#

19、include void main() int x,y; scanf(“%d”, ,上例中的程序段有四个,请判断哪个是正确的? 程序1: 程序2: If(x=0) Y=-1; if(x0) y=1; Else else y=0; If(x=0) y=0; else y=-1; Else y=1; 程序3: 程序4: Y=-1; y=0; If(x!=0) if(x=0) If(x0) y=1; if(x0) y=1; Else y=0; Else y=-1;,正 确,正 确,4.3 条件表达式构成的选择结构,如果在条件语句中,只执行单个的赋值语句时, 常可使用条件表达式来实现。不但使程序简洁,

20、也提高了运行效率。 条件运算符为?和:,它是一个三目运算符,即有三个参与运算的量。 格式: 表达式?表达式表达式 功能: 判断表达式1的值,如果成立就执行表 达式2,否则就执行表达式3 使用场合:若在语句中,当被判别的表达式的 值为“真”或“假” 时,都执行一个赋值语 句且向同一个变量赋值时,可以用一个 条件运算符来处理。,例: () =; ; 当ab时将a的值赋给max,当ab时将b的值赋给max,可以看到无论ab是否满足,都是向同一个变量赋值。 可以用下面的条件运算符来处理: ()?; 执行该语句的语义是:如ab为真,则把a赋予max,否则把b 赋予max。,使用条件表达式时,还应注意以下

21、几点: 1)条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。 因此 max=(ab)?a:b 可以去掉括号而写为 max=ab?a:b 2) 条件运算符?和:是一对运算符,不能分开单独使用。 3) 条件运算符的结合方向是自右至左。 例如: ab?a:cd?c:d 应理解为 ab?a:(cd?c:d) 这也就是条件表达式嵌套的情形,即其中的表达式3又是一个条件表达式。,【例】 main() int a,b,max; printf(“n input two numbers: “); scanf(“%d%d“, 用条件表达式对上例重新编程,输出两个数中的大数。,例:输入一个字符,判别

22、它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。 #include void main ( ) char ch; scanf(“%c“, ,如果字符变量ch的值为大写字母,则条件表达式的值为(),即相应的小写字母。如果ch的值不是大写字母,则条件表达式的值为,即不进行转换。,说明: (1).条件运算符的执行顺序:先求解表达式,若为非(真) 则求解表达式,此时表达式的值就作为整个条件表达式 的值。若表达式的值为(假),则求解表达式,表达 式的值就是整个条件表达式的值。 (2).条件运算符优先级高于赋值运算符 ,低于关系运算符 和算术运算符。 (3).条件运算

23、符的结合方向为“自右至左”。 (4).“表达式2”和“表达式3”不仅可以是数值表达式,还可以 是赋值表达式或函数表达式。 (5).条件表达式中,表达式的类型可以与表达式和表达 式的类型不同。,4.4 switch语句以及switch语句和break语 句构成的选择结构,switch语句的格式: (表达式) 常量表达式:语句 常量表达式:语句 常量表达式:语句 :语句 ,例: 要求按照考试成绩的等级输出百分制分数段,用 switch语句实现: () (); (); (); (); (); ,说明: 后面括弧内的“表达式”, 标准允许 它为任何类型。 (2) 当表达式的值与某一个后面的常量表达式的

24、值相 等时,就执行此后面的语句,若所有的 中的常量表达式的值都没有与表达式的值匹配的,就执行 后面的语句。 (3) 每一个的常量表达式的值必须互不相同,否则就 会出现互相矛盾的现象(对表达式的同一个值,有两种或 多种执行方案)。,(4) 各个和的出现次序不影响执行结 果。例如,可以先出现“:”,再出现 “ :”,然后是“ :”。 (5) 执行完一个后面的语句后,流程控制转移到下一 个继续执行。“常量表达式”只是起语句 标号作用,并不是在该处进行条件判断。在执行 语句时,根据后面表达式的值 找到匹配的入口标号,就从此标号开始执行下去,不再进 行判断。应该在执行一个分支后,可以用一个 语句来终止s

25、witch语句的执行。 (6) 多个可以共用一组执行语句。,【例】 main() int a; printf(“input integer number: “); scanf(“%d“, ,本程序是要求输入一个数字,输出一个英文单词。但是当输入3之后,却执行了case3以及以后的所有语句,输出了Wednesday 及以后的所有单词。这当然是不希望的。为什么会出现这种情况呢?这恰恰反应了switch语句的一个特点。在switch语句中,“case 常量表达式”只相当于一个语句标号, 表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch 语句,所以出现了继续

26、执行所有后面case语句的情况。 这是与前面介绍的if语句完全不同的,应特别注意。为了避免上述情况,语言还提供了一种break语句,专用于跳出switch语句,break 语句只有关键字break,没有参数。在后面还将详细介绍。修改例题的程序,在每一case语句之后增加break 语句, 使每一次执行之后均可跳出switch语句,从而避免输出不应有的结果。,【例】 main() int a; printf(“input integer number: “); scanf(“%d“, ,在使用switch语句时还应注意以下几点: 1) 在case后的各常量表达式的值不能相同,否则会出现错误。 2

27、) 在case后,允许有多个语句,可以不用括起来。 3) 各case和default子句的先后顺序可以变动,而不会影响程序执行结果。 4) default子句可以省略不用。,break语句 break语句通常用在循环语句和开关语句中。当break用于开关语句switch中时,可使程序跳出switch而执行switch以后的语句;循环语句中如果没有break语句,则将成为一个死循环而无法退出。break在switch 中的用法已在前面介绍开关语句时的例子中碰到,这里不再举例。 break语句用于do-while、for、while循环语句中时,可使程序终止循环而执行循环后面的语句, 通常brea

28、k语句总是与if语句联在一起。即满足条件时便跳出循环。下一章详细介绍,【例】 Main ( ) int i=0; char c; while(1) /*设置循环*/ c=0; /*变量赋初值*/ while(c!=13 ,注意: 1) break语句对if-else的条件语句不起作用。 2) 在多层循环中, 一个break语句只向外跳一层。,4.5 语句标号和goto语句,4.5.1 语句标号,4.5.2 goto语句,4.5.1 语句标号,在C语言中,语句标号不必特意加以定义,标号可以是任意合法的标识符,当标识符后面加一个冒号,如:flag1 :、stop:,该标识符就成了一个语句标号。 注

29、意:在C语言中,语句标号必须是标识符,因此不能简单地使用10: 、15:等形式。标号可以和变量同名。 通常,标号用作goto 语句的转向目标。如: goto stop; 在C语言中,可以在任何语句前加上语句标号。例如: stop: print(“ENDn”);,4.5.2 goto语句,goto语句是一种无条件转移语句, 与BASIC中的goto语句相似。goto 语句的使用格式为: goto 语句标号; 其中标号是一个有效的标识符,这个标识符加上一个“:”一起出现在函数内某处, 执行goto语句后,程序将跳转到该标号处并执行其后的语句。另外标号必须与goto语句同处于一个函数中,但可以不在一个循环层中。通常goto语句与if条件语句连用, 当满足某一条件时, 程序跳到标号处运行。 goto语句通常不用,主要因为它将使程序层次不清,且不易读,但在多层嵌套退出时, 用goto语句则比较合理。,4.5.2 goto语句(续),【例】用goto语句和if语句构成循环, 。 main() int i,sum=0; i=1; loop: if(i=100) sum=sum+i; i+; goto loop; printf(“%dn“,sum); ,课后习题,P46-49 习题,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 商业贸易


经营许可证编号:宁ICP备18001539号-1