c语言第5章
第5章 选择结构程序设计,“关系运算”实际上是“比较运算”,比较的结果,得到关系表达式的值,或者为“真”,或者为“假”。5.1.1关系运算符及其优先次序C语言提供6种关系运算符:、 >= 优先级相同(高)= = 、!= 优先级相同(低)优先次序: 算术运算符 (高) 关系运算符 赋值运算符 (低),5.1关系运算符和关系表达式,5.1.2 关系表达式用关系运算符将两个表达式连接起来,得到的式子称为关系表达式。关系表达式的值是逻辑值,“真”或“假”。用1代表“真”,用0代表“假”。当a=3、b=2、c=1时,a>b为“真”, 表达式“a>b”的值为1。 (a>b )= =c为“真”, 表达式“(a>b )= =c”的值为1。以下赋值表达式d=a>b d 的值为1。f= a>b >c f 的值为0。(先计算a>b, 值为1, 再计算1 >c, 值为0。),5.2 逻辑运算符和逻辑表达式,5.2.1逻辑运算符及其优先次序三种逻辑运算符: && 逻辑与、| | 逻辑或、! 逻辑非 例: a&&b: 只有a和b都为真时, a&&b为真, 其它情况 下a&&b为假. a| |b:只有a和b都为假时, a | | b为假,其它情况下a | | b为真. !a : !a 的真假与a相反.,优先次序: ! (非) (高) 算术运算符 关系运算符 &&和| | 赋值运算符 (低) 例: (a>b)&&(x>y) 可简写为a>b&&x>y (a= =b)| |(x= =y) 可简写为a= =b | | x= =y (!a)| |(a>b) 可简写为!a | | a>b,5.2.2 逻辑表达式在判断逻辑表达式的真假时, 以0代表假, 以非0代表真。(1) 若a=4,则 !a 的值为0。(2) 若a=4,b=5,则 a&&b 的值为1。(3) 若a=4,b=5,则 a | | b 的值为1。(4) 若a=4,b=5,则 ! a | | b 的值为1。(5) 4 && 0 | | 2 的值为1。,注意:在表达式的不同位置上出现的数码,有的是数值,有的是逻辑值。例如左下面表达式中的2就是逻辑值,即非0(真)。5>3&&2| |83)&&2)| |(8<(4-!0)实际上,逻辑运算符两侧既可以是值为0或1的整型变量或常量,又可以是值为0或非0的整型变量或常量,还可以是字符型、实型或指针型。系统最终以0或非0来判断它们是逻辑“真”还是逻辑“假”。例如,c && d的值为1,即“真”。,小结运算符的优先级别,() 单目运算符 !、+、-、-、类型转换运算符算术运算符 *、/、%+、- 关系运算符 、 =、 、 =、!= 逻辑运算符 | 赋值运算符 = (包括所有复合赋值运算符)逗号运算符 ,,高低,5.3 if 语句,5.3.1 if 语句的三种形式 1、 if (表达式) 语句 例if(x>y)printf(“%d”,x); 2 、 if (表达式) 语句1 else 语句2 例if(x>y)printf(“%d”,x); else printf(“%d”,y); 3、 if (表达式1) 语句1 else if (表达式2) 语句2 else if (表达式m) 语句m else 语句n,1、if (表达式) 语句 2 、if (表达式) 语句1 else 语句2,3、,说明:,1、if后的表达式可以时任意数据类型,但一般为逻辑表达式或关系表达式。 例:if(a=b) printf(“ok!”);if(3) printf(“ok!”); if(a) printf(“ok!”); 2、else子句不能作为语句单独使用,它必须是if语句的一部分,与if配对使用。 3、if和else后面可以用复合语句。 例:if(a>b) t=a;a=b;b=t;,例如: if (number>500) cost=0.15; else if(number>300) cost=0.10; else if(number>100) cost=0.075; else if(number>50) cost=0.05; else cost=0;,例5.1 输入两个实数,然后由小到大输出。 main( ) float a,b,t;scanf(“%f,%f”, ,例5.2 输入三个数,按大小顺序输出。 main( ) float a,b,c,t;scanf(“%f,%f,%f”, ,5.3.2 if 语句的嵌套 在if语句中又包含一个或多个if语句。if ( )if ( ) 语句1 else 语句2else if ( ) 语句3else 语句4注意:if和else的配对关系, else总是与它上面最近的未曾配对的if的配对。,例5.3 编程序,输入x值,输出y值。 x0时y=1。 main( ) int x,y;scanf(“%d”, ,有一函数:-1 (x0),求符号函数: 分析:根据x的取值范围,来确定y的值。 看下面的程序段是否正确:,if(x0) y=1;,if(x<0) y=-1; else if(x=0) y=0; else y=1;,y=1; if(x<=0) if(x<0) y=-1;else y=0;,y=1; if(x<0) y=-1; else y=0;,if(x>0) y=1; if(x<0) y=-1; else y=0;,y=0; if(x>=0) if(x>0) y=1; else y=-1;,小结运算符的优先级别:,() 单目运算符 !、+、-、-、类型转换运算符 算术运算符 *、/、%+、- 关系运算符 、 =、 、 =、!= 逻辑运算符 | 条件运算符 ?: 赋值运算符 = (包括所有复合赋值运算符) 逗号运算符 ,,高低,5.4 switch语句,一般形式 : switch (表达式) case 常量表达式1:语句1 case 常量表达式2:语句2 case 常量表达式n:语句n default :语句n+1 ,说明:,1、switch后的表达式可以是任意数据类型。 2、当表达式的值与某一个case后面的常量表达式的值相等时,就执行此case后面的语句;否则就执行default后面的语句。 3、每一个case后面的常量表达式的值必须互不相同。 4、各个case 和default的出现次序不影响执行结果。 5、执行完一个case后面的语句后,流程控制转移到下一个case继续执行。要想终止语句的执行,可以用一个break语句。 6、多 个case可以共用一组执行语句。,例如: switch (grade) case A : printf(“85-100n”); case B : printf(“70-84n”); case C : printf(“60-69n”); case D : printf(“<60n”); default : printf(“errorn); ,switch(grade) case A : printf(“85-100n”);break; case B : printf(“70-84n”);break; case C : printf(“60-69n”);break; case D : printf(“<60n”);break; default : printf(“errorn”); ,5.5 程序举例,例5.5 判断某一年是否是闰年。条件是:能被4整除,但不能被100整除;或能被4整除,又能被400整除。流程图如下:变量year是年份,变量leap=1是闰年,变量leap=0是非闰年。,main() int year , leap ; scanf(“%d”, ,例 5.6 求ax2+bx+c=0方程的解。流程图如下:,# include main() float a,b,c,disc,x1,x2,real,imag;scanf(“ ,else /*此时判别式小于零*/real=-b/(2*a); imag=sqrt(-disc)/(2*a);printf(“有两个不同的复根: n”); printf(“%8.4f+ %8.4f i n”, real, imag);printf(“%8.4f - %8.4f i n”, real, imag); ,例 5.7 给出一个不多于5位的正整数,(1)求出它是几位数,(2)分别打印出每一位数码,(3)按逆序打印出各位数码,例如原来是321,打印123。 main() long int shu; int ge,shi,bai,qian,wan,wei;printf(“请输入一个整数(099999):”); scanf(“%ld”,wan=shu/10000; qian=(shu-wan*10000)/1000;bai=(shu-wan*10000-qian*1000)/100;shi=(shu-wan*10000-qian*1000-bai*100)/10;ge=shu-wan*10000-qian*1000-bai*100-shi*10;printf(“此数的每位数字是:”);switch(wei)case 5: printf(“%d,%d,%d,%d,%d”,wan,qian,bai,shi,ge);printf(“n反序数字为:”);printf(“%d%d%d%d%dn”,ge,shi,bai,qian,wan); break;case 4:printf(“%d,%d,%d,%d”,qian,bai,shi,ge);printf(“n反序数字为:”);printf(“%d%d%d%dn”,ge,shi,bai,qian); break;,case 3: printf(“%d,%d,%d”, bai,shi,ge);printf(“n反序数字为:”);printf(“%d%d%dn”,ge,shi,bai); break;case 2: printf(“%d,%d”, shi,ge);printf(“n反序数字为:”);printf(“%d%dn”,ge,shi); break;case 1: printf(“%d”, ge);printf(“n反序数字为:”);printf(“%dn”, shi); break; ,