c语言(第五章选择结构)课件_第1页
c语言(第五章选择结构)课件_第2页
c语言(第五章选择结构)课件_第3页
c语言(第五章选择结构)课件_第4页
c语言(第五章选择结构)课件_第5页
已阅读5页,还剩167页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五章选择结构程序设计第五章选择结构程序设计选择结构根据所指定的条件是否满足,决定从给定的两组操作选择其一PAB真假选择结构根据所指定的条件是否满足,决定从给定的两组操作选择其2本章主要内容关系运算符和关系表达式逻辑运算符和逻辑表达式if语句switch语句程序举例本章主要内容关系运算符和关系表达式35.1关系运算符和表达式关系运算:判断两个数据间的某种关系是否成立3>5不成立(假)5>3成立(真)关系运算符种类:<<===>=>!=结合方向:自左向右优先级别:高于赋值运算符低于算术运算符5.1关系运算符和表达式关系运算:判断两个数据间的某种关系是4前4个运算符(<,<=,>,>=)的优先级是6级后2个运算符(==,!=)的优先级是7级例c>a+b//c>(a+b)a>b!=c//(a>b)!=ca==b<c//a==(b<c)a=b>c//a=(b>c)高算术运算符关系运算符赋值运算符低(优先级关系)前4个运算符(<,<=,>,>=)的优先级是6级例5例inta=3,b=2,c=1,d,f;a>ba>b==cb+c<ad=a>bf=a>b>c(a=3)>(b=5)//表达式值1//表达式值1//表达式值0//表达式的值1,d的1//表达式的值0,f的值0//表达式的值0关系表达式:用关系运算符将两个表达式(可以是算术表达式、关系表达式、逻辑表达式、赋值表达式、字符表达式)连接起来的式子,称为关系表达式的值:只有两个值“真”或“假”,用1(真)和0(假)表示例inta=3,b=2,c=1,d,f;//表达式值6关系运算注意:(1)若a=0;b=0.5;x=0.3;则a<=x<=b的值为0(2)5>2>7>8在C中是允许的,值为0(3)inti=1,j=7,a;a=i+(j%4!=0);则a=2关系运算注意:(1)0(2)0(3)27(4)‘a’>’b’结果为‘a’>0结果为‘A’>100结果为100(5)注意区分“=”与“==”inta=0,b=1;a=b赋值表达式结果为1a==b关系表达式结果为0(4)100(5)注意区分“=”与“==”8/*ch5_01.c*/main(){charc='c';inti=1,j=2,k=1;floatx=3e+5,y=0.85;printf("%d,%d\n",'a'+1<c,-i-2*j>=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+1);}运行结果:1,01,10,0/*ch5_01.c*/运行结果:95.2逻辑运算符和表达式逻辑运算符种类:!(非,not)&&(并且,and)||(或者,or)5.2逻辑运算符和表达式逻辑运算符10逻辑运算真值表ab!a!ba&&ba||b真真假假真真真假假真假真假真真假假真假假真真假假逻辑运算真值表ab!a!ba&&ba||b真真假假真真真假假11优先级:!高于算术运算符&&||低于关系运算符

!

算术运算符关系运算符

&&

||赋值运算符

低优先级关系

优先级:12

()

-!++--&

*/%

+-

<<=>>=

==!=

&&

||

?:

赋值运算符

逗号运算符()13例a<=x&&x<=ba>b&&x>ya==b||x==y!a||a>b//(a<=x)&&(x<=b)//(a>b)&&(x>y)//(a==b)||(x==y)//(!a)||(a>b)结合方向:!:从右向左&&:从左向右||:从左向右例//(a<=x)&&(x<=b)//(a>14逻辑表达式用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。逻辑表达式的值应该是一个逻辑量“真”或“假”。运算量:

0表示“假”非0表示“真”运算结果:

“假”用0表示“真”用1表示逻辑表达式运算量:15例a=4;b=5;!aa&&ba||b!a||b4&&0||25>3&&2||8<4-!0‘c’&&‘d’//值为1//值为0//值为1//值为1//值为1//值为1//(5>3)&&2||(8<(4-(!0)))值为1例//值为1//值为0//值为1//值为1//值为1//16短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符.a&&b若表达式a的值为0则不论表达式b为何值,整个表达式的值都为0。因此,在计算时先求解表达式a,若a为非0值,再求解表达式b,根据b的值来决定整个表达式的值;若a为0,则不再求解表达式b。短路特性:17a||b若表达式a的值为非0值则不论表达式b为何值,整个表达式的值都为1。因此,在计算时先求解表达式a,若a为0时,再求解表达式b,根据b的值来决定整个表达式的值;若a为非0值,则不再求解表达式b。a||b若表达式a的值为非0值则不论表达式b为何值,18例a&&b&&c

//只在a为真时,才判别b的值;只在a、b都为真时,才判别c的值例a||b||c

//只在a为假时,才判别b的值;只在a、b都为假时,才判别c的值例a=1;b=2;c=3;d=4;m=1;n=1;(m=a>b)&&(n=c>d)//表达式值为0,m=0,n=1例a&&b&&c//表达式值为0,m=0,19/*ch5_02.c*/main(){charc=‘c';inti=1,j=2,k=3;floatx=3e+5,y=0.85;printf("%d,%d\n",!x*!y,!!!x);printf("%d,%d\n“,x||i&&j-3,i<j&&x<y);printf("%d,%d\n",i==5&&c&&(j=8),x+y||i+j+k);}运行结果:0,01,00,1/*ch5_02.c*/运行结果:20[例]判定x是否在[a,b]的表达式a<=x&&x<=b[例]判断某年year是不是闰年闰年的条件:能被4整除,但不能被100整除能被100整除,又能被400整除闰年的判别:(year%4==0&&year%100!=0)||year%400==0非闰年的判别:!((year%4==0&&year%100!=0)||year%400==0)或者:(year%4!=0)||(year%100==0&&year%400!=0)[例]判定x是否在[a,b]的表达式215.3if语句(条件选择语句)if语句的三种形式形式一:格式:if(expression)statement执行过程:例:if(x>y)printf(“%d”,x);expressionstatement非0=05.3if语句(条件选择语句)if语句的三种形式expre22/*ch5_03.c*/#include<stdio.h>main(){intx,y;printf("Enteraninteger:");scanf("%d",&x);y=x;if(y<0)y=-y;printf("\ninteger:%d--->absolutevalue:%d\n",x,y);}例求一个数的绝对值/*ch5_03.c*/例求一个数的绝对值23运行:Enteraninteger:-12integer:-12--->absolutevalue:12运行:Enteraninteger:-1224形式二:格式:if(expression) statement1else statement2执行过程:例:if(x>y)max=x;elsemax=y;expressionstatement1statement2非0=0形式二:expressionstatement1statem25例输入两个数并判断两数相等否/*ch5_04.c*/#include<stdio.h>main(){inta,b;printf("Enterintegera:");scanf("%d",&a);printf("Enterintegerb:");scanf("%d",&b);if(a==b)printf("a==b\n");elseprintf("a!=b\n");}例输入两个数并判断两数相等否/*ch5_04.c*/26运行:Enterintegera:12Enterintegerb:12a==b运行:Enterintegera:12Enterintegerb:9a!=b运行:运行:27形式三:格式:if(expr1)statement1elseif(expr2)statement2elseif(expr3)statement3…...[elsestatementn]形式三:28=0expression1statement1非0=0expression2expression3statementnstatement3statement2非0非0=0执行过程=0expression1statement1非0=0exp29例:if(salary>1000)index=0.4;elseif(salary>800)index=0.3;elseif(salary>600)index=0.2;elseif(salary>400)index=0.1;elseindex=0;例:30例判断输入字符种类/*ch5_05.c*/#include<stdio.h>main(){charc;printf("Enteracharacter:");c=getchar();if(c<0x20)printf("Thecharacterisacontrolcharacter\n");elseif(c>='0'&&c<='9')printf("Thecharacterisadigit\n");elseif(c>='A'&&c<='Z')printf("Thecharacterisacapitalletter\n");elseif(c>='a'&&c<='z')printf("Thecharacterisalowerletter\n");elseprintf("Thecharacterisothercharacter\n");}例判断输入字符种类/*ch5_05.c*/31运行:Enteracharacter:Thecharacterisacontrolcharacter运行:Enteracharacter:8Thecharacterisadigit运行:Enteracharacter:DThecharacterisacapitalletter运行:Enteracharacter:hThecharacterisalowerletter运行:Enteracharacter:F1Thecharacterisothercharacter运行:Enteracharacter:运行:Ente32说明:if后面的表达式类型任意语句可以是复合语句if(x)if(x!=0)if(!x)if(x==0)如:if(a==b&&x==y)printf(“a=b,x=y”);if(3)printf(“OK”);if(‘a’)printf(“%d”,’a’);说明:33if(expr1)if(expr2)statement1elsestatement2内嵌ifif(expr1)if(expr2)statement1elsestatement3内嵌ifif语句嵌套:一般形式:if(expr1)内嵌ifif(expr1)内嵌ifif34if(expr1)if(expr2)statement1elsestatement2elseif(expr3)statement3elsestatement4内嵌if内嵌ifif(expr1)statement1elseif(expr3)statement3elsestatement4内嵌ifif(expr1)内嵌if内嵌ifif(expr1)内嵌35/*ch5_06.c*/#include<stdio.h>main(){intx,y;printf("Enterintegerx,y:");scanf("%d,%d",&x,&y);if(x!=y)if(x>y)printf("X>Y\n");elseprintf("X<Y\n");elseprintf("X==Y\n");}例输入两数并判断其大小关系/*ch5_06.c*/例输入两数并判断其大小关系36运行:Enterintegerx,y:12,23X<YEnterintegerx,y:12,6X>YEnterintegerx,y:12,12X==Y运行:37if~else配对原则:缺省{}时,else总是和它上面离它最近的未配对的if配对.if(……)if(……)if(……)else…...else…...else…...if~else配对原则:缺省{}时,else总是和38例:if(a==b)if(b==c)printf(“a==b==c”);elseprintf(“a!=b”);修改:if(a==b){if(b==c)printf(“a==b==c”);}elseprintf(“a!=b”);避免if与else配对错位的最佳办法是加大括号,同时,为了便于阅读,使用适当的缩进.例:if(a==b)修改:if(a==b)避免if与39例考虑下面程序输出结果:main(){intx=100,a=10,b=20;intv1=5,v2=1;if(a<b)if(b!=15)if(!v1)x=1;elseif(v2)x=10;x=-1;printf(“%d”,x);}运行结果:

-1例考虑下面程序输出结果:运行结果:

-1405.4条件运算符与表达式一般形式:expression1?expression2:expression3执行过程expr1取expr2值取expr3值非0=05.4条件运算符与表达式一般形式:expr1取expr41先求解表达式1的值若表达式1的值为真(非0);则求解表达式2的值,将其作为条件表达式的值。表达式3不计算。若表达式1的值为假(0);则求解表达式3的值,将其作为条件表达式的值。表达式2不计算。例:inta=1,b=2,c=3,d=4,m=5,n=6,k;k=a>b?(m=c>b):(n=b>d)结果:k=0,m=5,n=0先求解表达式1的值例:inta=1,b=2,c=3,d=442功能:相当于条件语句,但不能取代一般if语句.例if(a>b)printf(“%d”,a);elseprintf(“%d”,b);printf(“%d”,a>b?a:b);例if(a>b)max=a;elsemax=b;max=a>b?a:b;a>b?printf(“%d”,a):printf(“%d”,b);功能:相当于条件语句,但不能取代一般if语句.例pri43例求a+|b|printf(“a+|b|=%d\n”,b>0?a+b:a-b);例(a==b)?’Y’:’N’(x%2==1)?1:0(x>=0)?x:-x(c>=‘a’&&c<=‘z’)?c-’a’+’A’:c例求a+|b|例44条件运算符可嵌套如x>0?1:(x<0?-1:0)优先级:13高于赋值运算符,低于关系符、算术运算符.例a>b?a:b+1(a>b)?a:(b+1)条件运算符可嵌套例a>b?a:b+1(a>b)?a:45结合方向:自右向左如a>b?a:c>d?c:da>b?a:(c>d?c:d)例:inta=1,b=2,c=3,d=4,m=5,n=6,k;k=a<b?d:b>c?(m=c>b):(n=b>d)结果:k=4,m=5,n=6结合方向:自右向左例:46例x?‘a’:‘b’//x=0,表达式值为‘b’;x‡0,表达式值为‘a’x>y?1:1.5//x>y,值为1.0;x<y,值为1.5expr1、expr2、expr3类型可不同,若表达式2与表达式3类型不同时,则条件表达式的类型为二者较高的类型。例expr1、expr2、expr3类型可不同,若表达式47main(){floata,b,t;scanf("%f,%f",&a,&b);if(a>b){ t=a; a=b; b=t;}printf("%5.2f,%5.2f\n",a,b);}[例1]输入两个实数,按数值由小到大的次序输出这两个数main()[例1]输入两个实数,按数值由小到大的次序输48main(){floata,b,c,t;scanf("%f,%f,%f",&a,&b,&c);if(a>b){t=a;a=b;b=t;}if(a>c){t=a;a=c;c=t;}if(b>c){t=b;b=c;c=t;}printf("%5.2f,%5.2f,%5.2f\n",a,b,c);}[例2]输入3个数a,b,c,按由小到大的顺序输出main()[例2]输入3个数a,b,c,按由小到大的顺序49main(){intx,y;scanf("%d",&x);

printf(“x=%d,y=%d\n",x,y);}if(x<0) y=-1;elseif(x==0) y=0;elsey=1;if(x>=0)if(x>0)y=1;elsey=0;elsey=-1;y=-1;if(x!=0)if(x>0)y=1;elsey=0;if(x>0)y=1;if(x==0)y=0;if(x<0)=-1;y=0;if(x>=0)if(x>0)y=1;elsey=-1;[例3]:有一函数-1(x<0)y=0(x=0)1(x>0)main()if(x<0) y=-1;if(x>=50main(){charch;scanf("%c",&ch);ch=(ch>’A’&&ch<=‘Z’)?(ch+32):chprintf(“%c\n",ch);}[例4]:输入一个字符,判断它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。main()[例4]:输入一个字符,判断它是否大写字母,如果51注意:if(a>b);max=a;if(a>b)max=a;if(a+b>c,a+c>b,b+c>a)if(a+b>c&&a+c>b&&b+c>a)注意:if(a>b)max=a;if52switch(表达式){caseE1:语句1;break;caseE2:语句2;break;…….caseEn:语句n;break;[default:语句;break;]}5.5switch语句(多分支语句)一般形式:switch(表达式)5.5switch语句(多分支语53switch表达式语句组1语句组2语句组n语句组…...E1E2Endefaultcase执行过程:switch表达式语句组1语句组2语句组n语句组…...E54开关表达式的值与某个case后的常量表达式的值相等时,就执行此case后面的语句。若所有的case中的常量表达式的值都没有与开关表达式的值相匹配,则执行default后的语句,此选项亦可省略。开关表达式的值与某个case后的常量表达式的值相等时,就执行55说明switch后面括号内的表达式可以是任何类型。(若是实型数据,则将其转换为整型数据)case后的E1,E2,…En是常量表达式,在常量表达式中不允许出现变量;它们必须是整型、字符型或枚举类型,不能是实型表达式(整型或字符型);每个case后的常量表达式的值都必须各不相同各个case和default的出现次序不影响执行结果说明56case…起到语句标号的作用,必须用break跳出case后可包含多个可执行语句,且不必加{}switch可嵌套多个case可共用一组执行语句如:……case‘A’:case‘B’:case‘C’:printf(“score>60\n”);break;……..case…起到语句标号的作用,必须用break跳出如:……57例、根据考试成绩的等级(grade)打印出百分制分数段:例、根据考试成绩的等级(grade)打印出百分制分数段:58switch(grade){case'A':printf("85~100\n");case'B':printf("70~84\n");case'C':printf("60~69\n");case'D':printf("<60\n");default:printf("error\n");}运行结果:grade为A时,输出:85~10070~8460~69<60error!switch(grade)运行结果:59switch(grade){case'A':printf("85~100\n");break;case'B':printf("70~84\n");break;case'C':printf("60~69\n");break;case'D':printf("<60\n");break;default:printf("error\n");}break语句使程序跳出switch结构。switch(grade)break语句使程序跳出swi60/*ch5_07.c*/voidmain(){intx=1,y=0,a=0,b=0;switch(x){case1:switch(y){case0:a++;break;case1:b++;break;}case2:a++;b++;break;case3:a++;b++;}printf(“\na=%d,b=%d”,a,b);}运行结果:a=2,b=1/*ch5_07.c*/运行结果:a=2,b=161整除4整除100整除4005.6程序举例例[1]判某年是否是闰年整除4整除100整除4005.6程序举例例[1]判某年是否是62输入year真year被4整除假被100整除真假被400整除真假leap=0leapleap=1leap=1leap=0真假输出“闰年”输出“非闰年”输入year真year被4整除假被100整除真假被400整除63main(){intyear,leap;scanf(“%d”,&year);if(year%4==0){if(year%100==0){if(year%400==0)leap=1;elseleap=0;}elseleap=1;}elseleap=0;if(leap)printf(“%disaleapyear\n”,year);elseprintf(“%disnotaleapyear\n”,year);}main()64闰年的判别:(year%4==0&&year%100!=0)||year%400==0/*判某年是否是闰年*/main(){intyear,leap;scanf(“%d”,&year);if((year%4==0&&year%100!=0)||year%400==0)printf(“%disaleapyear\n”,year);elseprintf(“%disnotaleapyear\n”,year);}闰年的判别:/*判某年是否是闰年*/65例[2]:解方程ax2+bx+c=0,要求考虑a,b,c为任意实数的所有情况。分析:若a==0,为1次方程,若b==0,若c==0则x为任意解若c!=0则为无效方程若b!=0x=-c/b若a!=0,为2次方程计算delta=b2-4ac若delta>=0,则x1=…,x2=…delta<0,则实部re=…,虚部绝对值im=…输出re+imi,re-imi形式例[2]:解方程ax2+bx+c=0,要求考虑a,b,c为任66输入a,b,c输出有不定解输出方程无解x=-c/b输出xd=b2-4ac输出x1,x2输出x1,x2真a=0否b=0是否C=0是否d≥0是否输入a,b,c输输x=-c/b输d=b2-4ac输出x1,x67#include“math.h”voidmain(){doublea,b,c,x1,x2,x,re,im,delta;printf(“Inputa,b,c:”);scanf(“%lf%lf%lf”,&a,&b,&c);if(!a)if(!b)if(!c)printf(“xisanyrealnumber.\n”);elseprintf(“Invalidequation.\n”);else{x=-c/b;printf(“x=%.2f\n”,x);}#include“math.h”68else{delta=b*b-4*a*c;if(delta>=0){x1=(-b+sqrt(delta))/(2*a);x2=(-b-sqrt(delta))/(2*a);printf(“x1=%.2f,x2=%.2f\n”,x1,x2);}else{re=-b/(2*a);im=fabs(sqrt(-delta)/(2*a));printf(“x1=%.2f+%.2fi\n”,re,im);printf(“x2=%.2f-%.2fi\n”,re,im);}}}else69例[3]运输公司对用户计算运费。路程(s)越远,每公里运费越低。距离S(公里)越远,折扣越高:s<250没有折扣250<=s<5002%折扣500<=s<10005%折扣1000<=s<20008%折扣2000<=s<300010%折扣3000<=s15%折扣设基本运费为p计算公式:运费=基本费*重量*距离*(1-折扣)

f=p*w*s*(1-d)例[3]运输公司对用户计算运费。路程(s)越远,每公里运费越70main(){ints;floatp,w,d,f;scanf("%f,%f,%d",&p,&w,&s);if(s<250)d=0;elseif(s<500)d=0.02;elseif(s<1000)d=0.05;elseif(s<2000)d=0.08;elseif(s<3000)d=0.1;elsed=0.15;f=p*w*s*(1-d);printf("freight=%15.4f",f);}main()71main(){intc,s;floatp,w,d,f;scanf("%f,%f,%d",&p,&w,&s);if(s>=3000)c=12;elsec=s/250;switch(c){case0:d=0;break;case1:d=2;break;case2:case3:d=5;break;main()72case4:case5:case6:case7:d=8;break;case8:case9:case10:case11:d=10;break;case12:d=15;break;}f=p*w*s*(1-d/100.0);printf("freight=%15.4f",f);}case4:73例[4]:输入年号y,月份m,输出该年该月天数。分析:2月:闰年29天,平年28天;4,6,9,11月:30天;1,3,5,7,8,10,12月:31天例[4]:输入年号y,月份m,输出该年该月天数。74#include“stdio.h”voidmain(){inty,m,days;printf(“Inputyearandmonth:”);scanf(“%d%d”,y,m);if(y<1||y>10000){printf(“yearisn’tcorrect.\n”);return;}if(m>12||m<1){printf(“monthisn’tcorrect.\n”);return;}#include“stdio.h”75switch(m){case2:if(!(y%4)&&y%100||!(y%400))days=29;elsedays=28;break;case4:case6:case9:case11:days=30;break;default:days=31;}printf(“Thenumberofdaysis%d.\n”,days);}switch(m)76课堂练习[1]已有定义:intx=3,y=4,z=5;,则表达式!(x+y)+z-1&&y+z/2的值是A)6 B)0 C)2 D)1D课堂练习[1]已有定义:intx=3,y=4,z=5;,则77[2]有一函数以下程序段中不能根据x值正确计算出y值的是

-1(x<0)y=0(x=0)1(x>0)A)if(x>0)y=1;elseif(x==0)y=0;elsey=-1;C)y=0;if(x>=0);if(x>0)y=1;elsey=-1;B)y=0;if(x>0)y=1; elseif(x<0)y=-1;D)if(x>=0)if(x>0)y=1;elsey=0;elsey=-1;

C[2]有一函数78[3]有以下程序,程序运行后的输出【3】

main(){inta=16,b=21,m=0;switch(a%3){case0:m++;break;case1:m++; switch(b%2){default:m++;case0:m++;break;}}printf(“%d\n”,m);}3[3]有以下程序,程序运行后的输出【3】379[4]有以下程序main(){ int i=1,j=1,k=2; if((j++‖k++)&&i++)printf("%d,%d,%d\n",i,j,k);}执行后输出结果是A)1,1,2 B)2,2,1 C)2,2,2 D)2,2,3C[4]有以下程序C80[5]有以下程序main(){ int a=5,b=4,c=3,d=2; if(a>b>c)printf("%d\n",d); elseif((c-1>=d)==1)printf("%d\n",d+1);elseprintf("%d\n",d+2)}执行后输出结果是A)2 B)3C)4 D)编译时有错,无结果B[5]有以下程序B81[6]若有以下程序main(){ int a=4,b=3,c=5,t=0; if(a<b)t=a;a=b;b=t; if(a<c)t=a;a=c;c=t; printf("%d%d%d\n",a,b,c);}执行后输出结果是【6】

503[6]若有以下程序50382[7]以下程序的输出结果是main(){inta=5,b=4,c=6,d;printf("%d\n",d=a>b?(a>c?a:c):(b));}A)5 B)4 C)6 D)不确定

C[7]以下程序的输出结果是C83[8]若有定义:floatw;inta,b;则合法的switch语句是A)switch(w){case1.0:printf("*\n");case2.0:printf("**\n");}B)switch(a);{case1printf("*\n");case2printf("**\n");}C)switch(b){case1:printf("*\n");default:printf("\n");case1+2:printf("**\n");}D)switch(a+b);{case1:printf("*\n");case2:printf("**\n");default:printf("\n");}C[8]若有定义:floatw;inta,b;则84[9]有如下程序main0{inta=2,b=-1,c=2;if(a<b)if(b<0)c=0;elsec++printf(“%d\n”,c);}该程序的输出结果是A)0B)1C)2D)3C[9]有如下程序C85[10]假定w、x、y、z、m均为int型变量,有如下程序段:w=1;x=2;y=3;z=4;m=(w<x)?w:x;m=(m<y)?m:y;m=(m<z)?m:z;则该程序运行后,m的值是itA)4 B)3 C)2 D)1D[10]假定w、x、y、z、m均为int型变量,有如下程序段86第五章选择结构程序设计第五章选择结构程序设计选择结构根据所指定的条件是否满足,决定从给定的两组操作选择其一PAB真假选择结构根据所指定的条件是否满足,决定从给定的两组操作选择其88本章主要内容关系运算符和关系表达式逻辑运算符和逻辑表达式if语句switch语句程序举例本章主要内容关系运算符和关系表达式895.1关系运算符和表达式关系运算:判断两个数据间的某种关系是否成立3>5不成立(假)5>3成立(真)关系运算符种类:<<===>=>!=结合方向:自左向右优先级别:高于赋值运算符低于算术运算符5.1关系运算符和表达式关系运算:判断两个数据间的某种关系是90前4个运算符(<,<=,>,>=)的优先级是6级后2个运算符(==,!=)的优先级是7级例c>a+b//c>(a+b)a>b!=c//(a>b)!=ca==b<c//a==(b<c)a=b>c//a=(b>c)高算术运算符关系运算符赋值运算符低(优先级关系)前4个运算符(<,<=,>,>=)的优先级是6级例91例inta=3,b=2,c=1,d,f;a>ba>b==cb+c<ad=a>bf=a>b>c(a=3)>(b=5)//表达式值1//表达式值1//表达式值0//表达式的值1,d的1//表达式的值0,f的值0//表达式的值0关系表达式:用关系运算符将两个表达式(可以是算术表达式、关系表达式、逻辑表达式、赋值表达式、字符表达式)连接起来的式子,称为关系表达式的值:只有两个值“真”或“假”,用1(真)和0(假)表示例inta=3,b=2,c=1,d,f;//表达式值92关系运算注意:(1)若a=0;b=0.5;x=0.3;则a<=x<=b的值为0(2)5>2>7>8在C中是允许的,值为0(3)inti=1,j=7,a;a=i+(j%4!=0);则a=2关系运算注意:(1)0(2)0(3)293(4)‘a’>’b’结果为‘a’>0结果为‘A’>100结果为100(5)注意区分“=”与“==”inta=0,b=1;a=b赋值表达式结果为1a==b关系表达式结果为0(4)100(5)注意区分“=”与“==”94/*ch5_01.c*/main(){charc='c';inti=1,j=2,k=1;floatx=3e+5,y=0.85;printf("%d,%d\n",'a'+1<c,-i-2*j>=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+1);}运行结果:1,01,10,0/*ch5_01.c*/运行结果:955.2逻辑运算符和表达式逻辑运算符种类:!(非,not)&&(并且,and)||(或者,or)5.2逻辑运算符和表达式逻辑运算符96逻辑运算真值表ab!a!ba&&ba||b真真假假真真真假假真假真假真真假假真假假真真假假逻辑运算真值表ab!a!ba&&ba||b真真假假真真真假假97优先级:!高于算术运算符&&||低于关系运算符

!

算术运算符关系运算符

&&

||赋值运算符

低优先级关系

优先级:98

()

-!++--&

*/%

+-

<<=>>=

==!=

&&

||

?:

赋值运算符

逗号运算符()99例a<=x&&x<=ba>b&&x>ya==b||x==y!a||a>b//(a<=x)&&(x<=b)//(a>b)&&(x>y)//(a==b)||(x==y)//(!a)||(a>b)结合方向:!:从右向左&&:从左向右||:从左向右例//(a<=x)&&(x<=b)//(a>100逻辑表达式用逻辑运算符将关系表达式或逻辑量连接起来的式子就是逻辑表达式。逻辑表达式的值应该是一个逻辑量“真”或“假”。运算量:

0表示“假”非0表示“真”运算结果:

“假”用0表示“真”用1表示逻辑表达式运算量:101例a=4;b=5;!aa&&ba||b!a||b4&&0||25>3&&2||8<4-!0‘c’&&‘d’//值为1//值为0//值为1//值为1//值为1//值为1//(5>3)&&2||(8<(4-(!0)))值为1例//值为1//值为0//值为1//值为1//值为1//102短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符.a&&b若表达式a的值为0则不论表达式b为何值,整个表达式的值都为0。因此,在计算时先求解表达式a,若a为非0值,再求解表达式b,根据b的值来决定整个表达式的值;若a为0,则不再求解表达式b。短路特性:103a||b若表达式a的值为非0值则不论表达式b为何值,整个表达式的值都为1。因此,在计算时先求解表达式a,若a为0时,再求解表达式b,根据b的值来决定整个表达式的值;若a为非0值,则不再求解表达式b。a||b若表达式a的值为非0值则不论表达式b为何值,104例a&&b&&c

//只在a为真时,才判别b的值;只在a、b都为真时,才判别c的值例a||b||c

//只在a为假时,才判别b的值;只在a、b都为假时,才判别c的值例a=1;b=2;c=3;d=4;m=1;n=1;(m=a>b)&&(n=c>d)//表达式值为0,m=0,n=1例a&&b&&c//表达式值为0,m=0,105/*ch5_02.c*/main(){charc=‘c';inti=1,j=2,k=3;floatx=3e+5,y=0.85;printf("%d,%d\n",!x*!y,!!!x);printf("%d,%d\n“,x||i&&j-3,i<j&&x<y);printf("%d,%d\n",i==5&&c&&(j=8),x+y||i+j+k);}运行结果:0,01,00,1/*ch5_02.c*/运行结果:106[例]判定x是否在[a,b]的表达式a<=x&&x<=b[例]判断某年year是不是闰年闰年的条件:能被4整除,但不能被100整除能被100整除,又能被400整除闰年的判别:(year%4==0&&year%100!=0)||year%400==0非闰年的判别:!((year%4==0&&year%100!=0)||year%400==0)或者:(year%4!=0)||(year%100==0&&year%400!=0)[例]判定x是否在[a,b]的表达式1075.3if语句(条件选择语句)if语句的三种形式形式一:格式:if(expression)statement执行过程:例:if(x>y)printf(“%d”,x);expressionstatement非0=05.3if语句(条件选择语句)if语句的三种形式expre108/*ch5_03.c*/#include<stdio.h>main(){intx,y;printf("Enteraninteger:");scanf("%d",&x);y=x;if(y<0)y=-y;printf("\ninteger:%d--->absolutevalue:%d\n",x,y);}例求一个数的绝对值/*ch5_03.c*/例求一个数的绝对值109运行:Enteraninteger:-12integer:-12--->absolutevalue:12运行:Enteraninteger:-12110形式二:格式:if(expression) statement1else statement2执行过程:例:if(x>y)max=x;elsemax=y;expressionstatement1statement2非0=0形式二:expressionstatement1statem111例输入两个数并判断两数相等否/*ch5_04.c*/#include<stdio.h>main(){inta,b;printf("Enterintegera:");scanf("%d",&a);printf("Enterintegerb:");scanf("%d",&b);if(a==b)printf("a==b\n");elseprintf("a!=b\n");}例输入两个数并判断两数相等否/*ch5_04.c*/112运行:Enterintegera:12Enterintegerb:12a==b运行:Enterintegera:12Enterintegerb:9a!=b运行:运行:113形式三:格式:if(expr1)statement1elseif(expr2)statement2elseif(expr3)statement3…...[elsestatementn]形式三:114=0expression1statement1非0=0expression2expression3statementnstatement3statement2非0非0=0执行过程=0expression1statement1非0=0exp115例:if(salary>1000)index=0.4;elseif(salary>800)index=0.3;elseif(salary>600)index=0.2;elseif(salary>400)index=0.1;elseindex=0;例:116例判断输入字符种类/*ch5_05.c*/#include<stdio.h>main(){charc;printf("Enteracharacter:");c=getchar();if(c<0x20)printf("Thecharacterisacontrolcharacter\n");elseif(c>='0'&&c<='9')printf("Thecharacterisadigit\n");elseif(c>='A'&&c<='Z')printf("Thecharacterisacapitalletter\n");elseif(c>='a'&&c<='z')printf("Thecharacterisalowerletter\n");elseprintf("Thecharacterisothercharacter\n");}例判断输入字符种类/*ch5_05.c*/117运行:Enteracharacter:Thecharacterisacontrolcharacter运行:Enteracharacter:8Thecharacterisadigit运行:Enteracharacter:DThecharacterisacapitalletter运行:Enteracharacter:hThecharacterisalowerletter运行:Enteracharacter:F1Thecharacterisothercharacter运行:Enteracharacter:运行:Ente118说明:if后面的表达式类型任意语句可以是复合语句if(x)if(x!=0)if(!x)if(x==0)如:if(a==b&&x==y)printf(“a=b,x=y”);if(3)printf(“OK”);if(‘a’)printf(“%d”,’a’);说明:119if(expr1)if(expr2)statement1elsestatement2内嵌ifif(expr1)if(expr2)statement1elsestatement3内嵌ifif语句嵌套:一般形式:if(expr1)内嵌ifif(expr1)内嵌ifif120if(expr1)if(expr2)statement1elsestatement2elseif(expr3)statement3elsestatement4内嵌if内嵌ifif(expr1)statement1elseif(expr3)statement3elsestatement4内嵌ifif(expr1)内嵌if内嵌ifif(expr1)内嵌121/*ch5_06.c*/#include<stdio.h>main(){intx,y;printf("Enterintegerx,y:");scanf("%d,%d",&x,&y);if(x!=y)if(x>y)printf("X>Y\n");elseprintf("X<Y\n");elseprintf("X==Y\n");}例输入两数并判断其大小关系/*ch5_06.c*/例输入两数并判断其大小关系122运行:Enterintegerx,y:12,23X<YEnterintegerx,y:12,6X>YEnterintegerx,y:12,12X==Y运行:123if~else配对原则:缺省{}时,else总是和它上面离它最近的未配对的if配对.if(……)if(……)if(……)else…...else…...else…...if~else配对原则:缺省{}时,else总是和124例:if(a==b)if(b==c)printf(“a==b==c”);elseprintf(“a!=b”);修改:if(a==b){if(b==c)printf(“a==b==c”);}elseprintf(“a!=b”);避免if与else配对错位的最佳办法是加大括号,同时,为了便于阅读,使用适当的缩进.例:if(a==b)修改:if(a==b)避免if与125例考虑下面程序输出结果:main(){intx=100,a=10,b=20;intv1=5,v2=1;if(a<b)if(b!=15)if(!v1)x=1;elseif(v2)x=10;x=-1;printf(“%d”,x);}运行结果:

-1例考虑下面程序输出结果:运行结果:

-11265.4条件运算符与表达式一般形式:expression1?expression2:expression3执行过程expr1取expr2值取expr3值非0=05.4条件运算符与表达式一般形式:expr1取expr127先求解表达式1的值若表达式1的值为真(非0);则求解表达式2的值,将其作为条件表达式的值。表达式3不计算。若表达式1的值为假(0);则求解表达式3的值,将其作为条件表达式的值。表达式2不计算。例:inta=1,b=2,c=3,d=4,m=5,n=6,k;k=a>b?(m=c>b):(n=b>d)结果:k=0,m=5,n=0先求解表达式1的值例:inta=1,b=2,c=3,d=4128功能:相当于条件语句,但不能取代一般if语句.例if(a>b)printf(“%d”,a);elseprintf(“%d”,b);printf(“%d”,a>b?a:b);例if(a>b)max=a;elsemax=b;max=a>b?a:b;a>b?printf(“%d”,a):printf(“%d”,b);功能:相当于条件语句,但不能取代一般if语句.例pri129例求a+|b|printf(“a+|b|=%d\n”,b>0?a+b:a-b);例(a=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论