《C语言第2章选择结构及其应用.ppt》由会员分享,可在线阅读,更多相关《C语言第2章选择结构及其应用.ppt(52页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1第第2 2章章选择结构及其应用选择结构及其应用C语言程序设计2第第2章章 选择结构及其应用选择结构及其应用 关系运算符和关系表达式关系运算符和关系表达式 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式 if语句语句 switch语句语句3概述概述选择结构是程序的基本结构。所谓选择结构,就是根据不同选择结构是程序的基本结构。所谓选择结构,就是根据不同的条件,选择不同的程序块(分程序)进行处理。的条件,选择不同的程序块(分程序)进行处理。例:例:4if-elseifelse嵌套嵌套ifif-elseif-elseif(表达式)表达式)语句语句;if(表达式)表达式)语句语句;else语句语句;if
2、(表达式)表达式)语句语句;if(表达式)(表达式)语句语句;else语句语句;else语句语句;if(表达式)表达式)语句语句;elseif(表达式)(表达式)语句语句;elseif(表达式)(表达式)语句语句;else语句语句;switchswitch(表达式)(表达式)case常量常量1:语句:语句1;case常量常量2:语句:语句2;case常量常量n:语句:语句n;default:语句语句n+1;52.12.1关系运算符和关系表达式关系运算符和关系表达式关系运算符和关系表达式关系运算符和关系表达式关系运算符关系运算符关系运算符是对两个操作量进行大小比较的运算符,其操作关系运算符是对两
3、个操作量进行大小比较的运算符,其操作结果是结果是“真真”或或“假假”。用。用“1”表示真;表示真;“0”表示假。表示假。=(大于或等于大于或等于)(大于大于)5)2 结果为:结果为:1例:判断下列关系表达式的值:例:判断下列关系表达式的值:6=(3+3);(x=3)5+(y=6)10=(4+(x=6)值为值为1值为值为1值为值为172.2 2.2 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式逻辑真与逻辑假逻辑真与逻辑假逻辑运算是用来判断一件事情是逻辑运算是用来判断一件事情是“成立成立”还是还是“不成立不成立”,判,判断的结果只有两种,分别用数断的结果
4、只有两种,分别用数“1”和和“0”来表示。其中来表示。其中“1”表示该逻辑运算的结果是表示该逻辑运算的结果是“成立成立”的,的,“0”表示该逻辑表示该逻辑运算的结果是运算的结果是“不成立不成立”的。的。C语言的数据类型里没有逻辑数据类型,但对参与逻辑运算的所语言的数据类型里没有逻辑数据类型,但对参与逻辑运算的所有的数值,都将转换为有的数值,都将转换为“逻辑真逻辑真”或或“逻辑假逻辑假”后才参与逻辑运后才参与逻辑运算。算。如果参与逻辑判断的数值为如果参与逻辑判断的数值为“0”,则把它作为,则把它作为“逻辑假逻辑假”处理。处理。如果参与逻辑判断的数值不为如果参与逻辑判断的数值不为“0”,则把它作为
5、,则把它作为“逻辑真逻辑真”处处理。理。不是将数值不是将数值1作为逻辑真,而是将非作为逻辑真,而是将非0的数值都作为逻辑真。的数值都作为逻辑真。上述的逻辑判断方法可以归纳为:上述的逻辑判断方法可以归纳为:判假不判真,非假即真。判假不判真,非假即真。82.2 2.2 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式逻辑运算符逻辑运算符!(逻辑非逻辑非)单目运算符单目运算符&(逻辑与逻辑与)双目运算符双目运算符|(逻辑或逻辑或)双目运算符双目运算符逻辑运算把一切逻辑运算把一切“非非0”的数作为真,把的数作为真,把“0”数作为假。数作为假。逻辑运算是逻辑运算是
6、“非非0”和和“0”两类数据或真和假两种状态的运算。两类数据或真和假两种状态的运算。C语言中有三个逻辑运算符:逻辑与、逻辑或、逻辑非。语言中有三个逻辑运算符:逻辑与、逻辑或、逻辑非。9&与与逻辑与逻辑与AB结结果果0 假假非非 0真真0 假假非非0真真 0 假假0 假假0 假假0 假假0 假假非非0真真 非非 0真真非非 0真真有假则假,全真才真。有假则假,全真才真。S1,S2是两个开关,是两个开关,L是一个灯是一个灯泡,在这个电路图中开关泡,在这个电路图中开关S1和和S2只有两种状态:闭合只有两种状态:闭合(用用1表表示示)和断开和断开(用用0表示表示);灯泡也;灯泡也只有两种状态:亮只有两
7、种状态:亮(用用1表示表示)和和不亮不亮(用用0表示表示)。灯泡是否亮和。灯泡是否亮和两个开关的闭合、断开之间就两个开关的闭合、断开之间就形成了一种逻辑运算形成了一种逻辑运算。例如:例如:5&3 4&0 10|或或逻辑或逻辑或有真则真,全假则假。有真则真,全假则假。例如:例如:5|3 4|0 11!非非逻辑非逻辑非非非0(真真)0(假假)0(假假)非非0(真真)例如:例如:!2 !0 122.22.2逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式逻辑表达式逻辑表达式是用逻辑运算符把操作对象连接起来而构成的式子。是用逻辑运算符把操作对象连接起来而构成的式
8、子。逻辑表达式运算结果值为逻辑表达式运算结果值为1或或0。注意区分逻辑量与逻辑值注意区分逻辑量与逻辑值例:例:4&7的逻辑值为的逻辑值为1。逻辑量逻辑量凡是参加逻辑运算的变量、常量都是逻辑量,凡是参加逻辑运算的变量、常量都是逻辑量,以以0代表代表“假假”,以非,以非0代表代表“真真”。逻辑值逻辑值逻辑量、逻辑表达式的运算结果的值就是逻辑逻辑量、逻辑表达式的运算结果的值就是逻辑值。逻辑值只能是值。逻辑值只能是“0”和和“1”这二个数。这二个数。“1”表示逻辑表示逻辑真(成立);真(成立);“0”表示逻辑假(不成立)。表示逻辑假(不成立)。逻辑量与逻辑值间的关系:一切非逻辑量与逻辑值间的关系:一切
9、非“0”的逻辑量其逻辑值都为真。的逻辑量其逻辑值都为真。注意注意2xy)printf(“the bigger one is%d”,x);15Please input a:99 CROK!#include“stdio.h”main()int a;printf(“n Please input a:”);scanf(“%d”,&a);if(a%3=0)printf(“OK!”);运行程序运行程序例例:若输入一个整数是若输入一个整数是3的倍数的倍数,则显示则显示“OK!”。否则什么也不显示。否则什么也不显示。注意:判断是否相等注意:判断是否相等用用“=”,而不能用赋,而不能用赋值运算符值运算符“=”1
10、6例例2.3:求两个数:求两个数a和和b中较大的数。中较大的数。#include stdio.hvoid main()int a,b,x;/*定义定义3个变量个变量*/printf(please input two integers:);/*屏幕输出提示语屏幕输出提示语*/scanf(%d%d,&a,&b);/*输入两个整数输入两个整数*/x=a;/*假设假设a是较大的数先赋给是较大的数先赋给x*/if(a 100)printf(“bigger than 100.n”);else printf(“less than or equal to 100.n”);Please input a numb
11、er:89 CRless than or equal 100.运行程序运行程序例:例:输入一个整数,判断其值是否大于输入一个整数,判断其值是否大于100。21#include“stdio.h”main()int a,b;printf(“n Please input a and b:”);scanf(“%d,%d”,&a,&b);if(a b)printf(“max=%d”,a);else printf(“max=%d”,b);Please input a and b:100,99CRmax=100运行程序运行程序例例:输入两个整数,将较大的数输出。输入两个整数,将较大的数输出。222.3.3多
12、分支多分支ifelseifelse形式形式程序形式程序形式:if(表达式表达式1)语句语句1;elseif(表达式(表达式2)语句语句2;elseif(表达式(表达式3)语句语句3;else语句语句4;表达表达式式语句语句4语句语句3表达式表达式2程序流程程序流程表达式表达式1真真语句语句1假假语句语句2表达式表达式3假假假假真真真真if-else if-else多分支结构可以判断多种情况。多分支结构可以判断多种情况。23A=90,A.(90-100)。B=80,B.(80-89)。C=70,C.(70-79)。D=60,D.(60-69)。E=0,E.(0-59)。main()float s
13、core;printf(“n Enter a score:”);scanf(“%f”,&score);if(score=90)printf(“A n”);else if(score=80)printf(“B n”);else if(score=70)printf(“C n”);else if(score=60)printf(“D n”);else if(score=0)printf(“E n”);else printf(“Error Data!”);例例:学生成绩分学生成绩分A、B、C、D、E 五等。五等。任给一个成绩,判断它属于哪一等,用任给一个成绩,判断它属于哪一等,用 if-else i
14、f 分支语句编程。分支语句编程。该程序该程序score大于大于100,输出,输出A。score小于小于0,输出,输出Erroe Data!。score值应在值应在0-100之间。之间。24例:计算并输出例:计算并输出y的值的值 3x-1x06x2+9x-50=x10y=10=x=25#include“math.h”#include“stdio.h”main()floatx,y;scanf(“%f”,&x);if(x0)y=3*x-1;elseif(x10)y=6*x*x+9*x-5;elseif(xy);(2)if(xy)a=10elsea=100;(3)if(x=y)a=10;printf(
15、“%d”,a);elsea=100;(4)if(5)a=10;(2)(3)(2)if(xy)a=10;else a=100;(3)if(x=y)a=10;printf(“%d”,a);else a=100;262.3.4 嵌套的嵌套的if语句语句if(e1)if(e2)S3;else S4;else if(e3)S5;else S6;入入口口入入口口出出口口出出口口出出口口出出口口出出口口出出口口分支嵌套应注意:分支嵌套应注意:if和和else的配对关系。的配对关系。程序的走向,即程序的入口和出口、执行部分和非执行程序的走向,即程序的入口和出口、执行部分和非执行(跳出跳出)部分。部分。if(e
16、1)S1;elseS2;在程序设计中,经常用到条件分支嵌套。条件分支嵌套就是在程序设计中,经常用到条件分支嵌套。条件分支嵌套就是在一个分支中包含(嵌套)另一个分支。在一个分支中包含(嵌套)另一个分支。s4假真e2e3s3s5s6假假真真e1每个分支都要有每个分支都要有被执行的可能性被执行的可能性27main()int x,y,z,min;printf(“n Please input x,y,z:”);scanf(“%d%d%d”,&x,&y,&z);if(x y)if(xz)min=x;else min=z;else if(yz)min=y;else min=z;printf(“n min=%
17、d”,min);Please input x,y,z:100 5 29CRmin=5运行程序运行程序例例:任意输入三个整数,求其中最小的数。任意输入三个整数,求其中最小的数。if与与else配对关系:一个配对关系:一个else总是与其上面距它最近总是与其上面距它最近的,并且没有其它的,并且没有其它else与其配对的与其配对的if相配对。最好将相配对。最好将程序中配对的程序中配对的if-else的位置对齐,这样可以提高程序的的位置对齐,这样可以提高程序的可读性;可读性;程序的走向,即程序的入口和出口、执行部分和非执程序的走向,即程序的入口和出口、执行部分和非执行行(跳出跳出)部分。部分。每个每个
18、if-else有一个入口,两个出口。有一个入口,两个出口。if与与else配对关系与程序的走向:配对关系与程序的走向:if(e1)if(e2)s1;elseif(e3)s2;elses3;入口入口真真e3e1e2S1S2S3真真真真假假假假假假出出口口出出口口出出口口出出口口if(e1)if(e2)s1;elseif(e3)s2;elses3;入口入口出出口口出出口口出出口口出出口口假假e3e1e2S1S2S3真真真真真真假假假假if与与else配对关系:配对关系:对于选择结构的对于选择结构的程序来说,每次程序来说,每次运行程序时,只运行程序时,只能从一个入口进,能从一个入口进,一个出口出,即
19、一个出口出,即只能有一个分支只能有一个分支被执行。被执行。30例:假定所有变量均已正确定义,下列程序段执行例:假定所有变量均已正确定义,下列程序段执行后,后,x的值是:的值是:a=b=c=0;x=35;if(!a)x-;elseif(b);if(c)x=3;elsex=4;A)34B)4C)35D)3答案:答案:Bif(!a)x-;else if(b);if(c)x=3;else x=4;x=34x=4313.3.5 开关分支开关分支在计算机程序设计中,实际问题常常需要用到在计算机程序设计中,实际问题常常需要用到多分支的选择。多分支的选择。if-else语句只能有两个分支可供选择,不能满语句只
20、能有两个分支可供选择,不能满足多分支的需要;足多分支的需要;if-elseif嵌套形式可以满足多分支的要求;嵌套形式可以满足多分支的要求;也可选用也可选用switch语句,语句,switch是多分支选择语是多分支选择语句。句。32其中其中,e是表达式。是表达式。c1、是常量表达式。是常量表达式。s1、s2sn、sn+1是一个语是一个语句或程序块。句或程序块。开关分支开关分支是分支结构的另一种形式,该语句执行时它根据是分支结构的另一种形式,该语句执行时它根据条件的取值来选择程序中的一个分支。条件的取值来选择程序中的一个分支。switch分支语句形分支语句形式如下:式如下:switch(e)cas
21、ec1:s1;break;casec2:s2;break;casecn:sn;break;default:sn+1;break;程序流程图程序流程图.语句语句1casec1switch表达式表达式语句语句n语句语句n+1casecndefault有有break语句的执语句的执行情况行情况下一条语句下一条语句.33main()char a;printf(“Please input the salary level:n”);printf(“Between 1 to 5,which is char type.n”);scanf(“%c”,&a);switch(a)case 1:printf(“tax
22、is=60%n”);break;case 2:printf(“taxis=40%n”);break;case 3:printf(“taxis=20%n”);break;case 4:printf(“taxis=8%n”);break;case 5:printf(“taxis=0%n”);break;default:printf(“Error”);例例:输出不同工资水平的税率。输出不同工资水平的税率。34switch语句的特点:语句的特点:在在switch语句中,语句中,“case 常量表达式常量表达式”只相当于一只相当于一个语句标号,个语句标号,表达式的值和某标号相等则转向该标表达式的值和某标
23、号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出号执行,但不能在执行完该标号的语句后自动跳出整个整个switch 语句。这与前面介绍的语句。这与前面介绍的if分支语句完全分支语句完全不同,不同,应特别注意应特别注意。为此语言提供了为此语言提供了break语句,专用于跳出语句,专用于跳出switch语句,语句,break语句只有关键字语句只有关键字break,没有参数。,没有参数。35main()char a;printf(“Please input the salary level:n”);printf(“Between 1 to 5,which is char type.n”);
24、scanf(“%c”,&a);switch(a)case 1:printf(“taxis=60%n”);case 2:printf(“taxis=40%n”);case 3:printf(“taxis=20%n”);case 4:printf(“taxis=8%n”);case 5:printf(“taxis=0%n”);default:printf(“Error”);例例:输出不同工资水平的税率。输出不同工资水平的税率。36例:计算器程序。用户输入运算数和四则运算符,输出例:计算器程序。用户输入运算数和四则运算符,输出计算结果。计算结果。#include stdio.hvoid main()
25、float a,b;char c;printf(please input expression:a+(-,*,/)b:n);scanf(%f%c%f,&a,&c,&b);switch(c)case+:printf(%fn,a+b);break;case-:printf(%fn,a-b);break;case*:printf(%fn,a*b);break;case/:printf(%fn,a/b);break;default:printf(input errorn);37switch(e)casec1:s1;break;casec2:s2;break;casecn:sn;break;defaul
26、t:sn+1;break;整型、字符型常量、整型、字符型常量、变量或枚举类型表达变量或枚举类型表达式。其结果值必须是式。其结果值必须是整型数据或字符型数整型数据或字符型数据据。例:例:main()chara;switch(5+6/3).switch(a).常量表达式常量表达式字符型变量字符型变量(1)switch后面的后面的e表达表达式可以是整型、字符式可以是整型、字符型等类型表达式。型等类型表达式。使用使用 switch-case 分支语句时,应注意以下几点:分支语句时,应注意以下几点:38switch(e)casec1:s1;break;casec2:s2;break;casecn:sn;
27、break;default:sn+1;break;整型、字符型常量整型、字符型常量数据或枚举常量。数据或枚举常量。例:例:case1:casea:case120:(2)case后面的后面的ci为为常量常量表达式,可以是一个整型、字表达式,可以是一个整型、字符型常量数据或枚举常量。符型常量数据或枚举常量。使用使用 switch-case 分支语句时,应注意以下几点:分支语句时,应注意以下几点:39switch(e)casec1:s1;break;casecn:sn;break;default:sn+1;break;casec2:s2;break;次序任意次序任意(3)各个各个case及及defa
28、ult(default之后有之后有break语句时语句时)的次的次序是任意的,但各序是任意的,但各case后的常量(判断)值必须不同。后的常量(判断)值必须不同。使用使用 switch-case 分支语句时,应注意以下几点:分支语句时,应注意以下几点:40switch(e)casec1:s1;break;casec2:s2;break;casecn:sn;break;没有没有default当当e与任何与任何ci均不相等时,均不相等时,则不执行则不执行switch结构中的任何部分。结构中的任何部分。建议使用建议使用default语句。增加语句。增加 default 会给会给switch 分支的逻
29、辑分支的逻辑检查带来方便。检查带来方便。(4)在在switch开关分支语句结构中开关分支语句结构中,default部分不是必须的部分不是必须的,如如果没有果没有default部分部分,则当则当e表达式的值与各表达式的值与各case后的后的ci常量表达常量表达式的值都不一致时式的值都不一致时,则程序不执行该结构中的任何部分。则程序不执行该结构中的任何部分。使用使用 switch-case 分支语句时,应注意以下几点:分支语句时,应注意以下几点:41例:例:switch(c)caseA:uppernum+;casea:lowernum+;default:sum+;没有没有break;例题分析:例题
30、分析:若若c的取值是的取值是A,则三个分支即,则三个分支即uppernum+、lowernum+、sum+都被执行都被执行;若若c的取值是的取值是a,则最后两个分支即,则最后两个分支即lowernum+、sum+被执行;被执行;若若c的取值即不是的取值即不是A也不是也不是a,则只执行,则只执行sum+。(5)各分支语句中的各分支语句中的break语句作用是控制程序退出语句作用是控制程序退出switch结构。若程序没有结构。若程序没有break语句,则程序将继续执行下面一个语句,则程序将继续执行下面一个case中的程序块。中的程序块。使用使用 switch-case 分支语句时,应注意以下几点:
31、分支语句时,应注意以下几点:42(6)在开关分支语句中,最后的在开关分支语句中,最后的break语句也可以省语句也可以省略(其作用也就消失),略(其作用也就消失),一般情况应使用它一般情况应使用它。switch(e)casec1:s1;break;casec2:s2;break;casecn:sn;break;default:sn+1;break;最后的最后的break语句可语句可以省略,但建议使用。以省略,但建议使用。使用使用 switch-case 分支语句时,应注意以下几点:分支语句时,应注意以下几点:43例:例:switch(c)case 1:case 2:case 3:printf(
32、“taxis=30%n”);break;case 4:printf(“taxis=8%n”);break;default:printf(“taxis=0%n”);break;程序中程序中case 1、case 2 和和 case 3共用共用case 3语句。语句。(7)在在switch开关分支语句结构中开关分支语句结构中,如果几种情况(多个表如果几种情况(多个表达式取值)都执行相同的程序块时达式取值)都执行相同的程序块时,则对应的多个则对应的多个case可共可共同使用同一个程序块。同使用同一个程序块。使用使用 switch-case 分支语句时,应注意以下几点:分支语句时,应注意以下几点:#i
33、nclude main()char score;printf(“n Enter the score:”);scanf(“%c”,&score);if(score=A)printf(“90-100n”);else if(score=B)printf(“80-89 n”);else if(score=C)printf(“70-79 n”);else if(score=D)printf(“60-69 n”);else if(score=E)printf(“0-59 n”);else printf(“Error Data!”);思考:将此例根据学生成绩的等级打印分数段的思考:将此例根据学生成绩的等级打
34、印分数段的if-else if 语句语句改为用改为用switch语句,比较两程序。语句,比较两程序。(8)switch语句用来实现多分支结构,条件判断如果有两个以上语句用来实现多分支结构,条件判断如果有两个以上基于同一个数据类型变量的条件表达式时,选用基于同一个数据类型变量的条件表达式时,选用switch语句比语句比选用选用if-elseif语句的嵌套形式更方便。语句的嵌套形式更方便。使用使用 switch-case 分支语句时,应注意以下几点:分支语句时,应注意以下几点:45!运行程序运行程序main()int a=2,b=7,c=5;switch(a0)case 1:switch(b0)c
35、ase 0:printf(“!”);break;case 1:printf(“”);break;default:printf(“+”);break;break;case 0:switch(c=5)case 0:printf(“*”);break;case 1:printf(“#”);break;default:printf(“$”);break;break;default:printf(“&”);break;printf(“n”);例例:读下面的程序,写出程序的输出结果。读下面的程序,写出程序的输出结果。如果没有如果没有break结果结果?如果没有如果没有break结果结果?!#!#&46#i
36、nclude main()char c,b;c=getchar();putchar(c);putchar(n);b=c;if(c=A&c=Z)b=c+a-A;putchar(b);putchar(n);AAa程序运行程序运行例例:从键盘上输入一个字符从键盘上输入一个字符,输出其对应的小写字符。输出其对应的小写字符。47#include#includemain()floata,b,c,rpart,ipart,x1,x2,p;scanf(%f,%f,%f,&a,&b,&c);if(a=0)if(b=0)printf(“a、b、careillegal.”);elsex1=(-c)/b;printf(
37、“Thereisoneroot:x=%f”,x1);elsep=b*b-4*a*c;if(p=0)if(p=0)x1=(-b)/(2*a);printf(“Therearetworoot:x1=x2=%f”,x1);elsex1=(-b)/(2*a)+sqrt(p)/(2*a);x2=(-b)/(2*a)-sqrt(p)/(2*a);printf(“Therearetworootx1=%fx2=%f”,x1,x2);ax2+bx+c=0P=b2-4acP0P100|grade 0)printf(wrong graden);else c=grade/10;switch(c)case 6:prin
38、tf(grade Dn);break;case 7:printf(grade Cn);break;case 8:printf(grade Bn”);break;case 9:case 10:printf(grade An);break;default:printf(“grade En”);break:input grade(0-100):89 grade B运行程序运行程序例例:根据百分成绩根据百分成绩,输出等级成绩输出等级成绩 A B C D E。用。用switch分支语句编程。分支语句编程。50main()int grade;printf(input grade(0-100):);scan
39、f(“%d”,&grade);if(grade100)printf(wrong graden);else if(grade=90)printf(grade An);else if(grade=80)printf(grade Bn);else if(grade=70)printf(grade Cn);else if(grade=60)printf(grade Dn);else printf(failedn);例例 根据百分成绩根据百分成绩,输出等级输出等级 A B C D。用。用if-else if 分支语句编程。分支语句编程。100:出错,出错,90-100:A,80-89:B,70-79:C,60-69:D,y)if(xz)max=x;else max=z;else if(yz)max=y;else max=z;printf(“n max=%d”,max);例如:例如:在分支程序中,用缩排在分支程序中,用缩排的书写方法,可清楚的的书写方法,可清楚的看出程序的条件为真、看出程序的条件为真、条件为假时,程序的分条件为假时,程序的分支情况。支情况。52第二章第二章 结束结束
限制150内