《第5讲 分支程序设计优秀PPT.ppt》由会员分享,可在线阅读,更多相关《第5讲 分支程序设计优秀PPT.ppt(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第5讲讲 分支程序设计分支程序设计现在学习的是第1页,共27页分支程序设计分支程序设计选择结构是三种基本结构(顺序、选择、循环)之一。作用是根据所指定的条件是否满足,决定从给定的两组操作选择其中的一种。C语言中的选择结构是用if语句实现的。if语句的常用的形式是:If(关系/逻辑表达式)语句1;else语句2;Switch语句现在学习的是第2页,共27页一、关系运算符和关系表达式一、关系运算符和关系表达式关系运算是逻辑运算中比较简单的一种,“关系运算”就是“比较运算”。x0是比较运算,也就是关系运算,“”是一种关系运算符。假如x=4,那么x0条件满足,就是说关系运算x0的结果为“真”。现在学
2、习的是第3页,共27页一、一、关系运算符和关系表达式关系运算符和关系表达式1 关系运算符及其优先次序关系运算符及其优先次序现在学习的是第4页,共27页一、一、关系运算符和关系表达式关系运算符和关系表达式关于优先次序:(1)前4种关系运算符的优先级别相同,后两种也相同。前4种高于后两种。(2)关系运算符的优先级低于算术运算符。(3)关系运算符的优先级高于赋值运算符。例:ca+b等价于c(a+b);关系运算符的优先级低于算术运算符ab=c等价于(ab)=c;“”优先级高于“=”a=bc等价于a=(bc);“c等价于a=(bc);关系运算符的优先级高于赋值运算符。现在学习的是第5页,共27页一、一、
3、关系运算符和关系表达式关系运算符和关系表达式2 关系表达式关系表达式用关系运算符将两个表达式(算术、关系、逻辑、赋值表达式等)连接起来所构成的表达式,称为关系表达式。关系表达式的值是一个逻辑值,即“真”或“假”。C语言没有逻辑型数据,以1代表“真”,以0代表“假”。例:假如a=3,b=2,c=1,则:关系表达式“ab”的值为“真”,即表达式的值为:1。关系表达式“b+cb&xy等价于(ab)&(xy)a=b|x=y等价于(a=b)|(x=y)!a|ab等价于(!a)|(ab)现在学习的是第7页,共27页二、二、逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式 2 逻辑表达式逻辑表达式逻辑表达式:用
4、逻辑运算符(逻辑与、逻辑或、逻辑非)将关系表达式或逻辑量连接起来构成逻辑表达式。逻辑表达式的值是一个逻辑量“真”或“假”。C语言编译系统在给出逻辑运算结果时,以1代表“真”,以0代表“假”,但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”(即认为一个非0的数值是“真”)。例:非0值作为逻辑值参与运算=“真”(此时与1的作用一样)若a=4,则!a值为0(假)。若a=4,b=5,则a&b值为1(真),a|b值为1(真),!a|b值为1(真)4&0|2值为1(真)c(真)&d(真)值为1现在学习的是第8页,共27页二、二、逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式从例子还可以看出:系
5、统给出的逻辑运算结果不是0就是1,不可能是其它数值。而在逻辑表达式中作为参与逻辑运算的运算对象可以是0(作为“假”)也可以是任何非0的数值(按“真”对待)。事实上,逻辑运算符两侧的对象不但可以是0和1或者是0和非0的整数,也可以是任何类型的数据(如字符型、实型、指针型)。如果在一个表达式中不同位置上出现数值,应区分哪些是作为数值运算或关系运算的对象(原值),哪些是作为逻辑运算的对象(逻辑值)。现在学习的是第9页,共27页二、逻辑运算符和逻辑表达式二、逻辑运算符和逻辑表达式判断某一年是否闰年。(闰年的条件是符合下面两个条件之一:1、能被4整除,但不能被100整除;2、能被4整除,又能被400整除
6、)。因为能够被400整除一定能被4整除所以第二个条件可以简化为能够被400整除。判断闰年的条件可以用一个逻辑表达式表示:(year%4=0&year%100!=0)|year%400=0表达式为“真”,闰年条件成立,是闰年,否则非闰年。注意:a&b如果表达式A为假则b不再运算a|b如果表达式A为真则b不再运算A=1,b=2;A=A+2&b+y)printf(“%d”,x);(2)if(表达式)语句1else语句2例如:if(xy)printf(“%d”,x);elseprintf(“%d”,y);(3)if(表达式1)语句1elseif(表达式2)语句2elseif(表达式3)语句3elsei
7、f(表达式m)语句melse语句m+1现在学习的是第11页,共27页三、三、if语句语句 现在学习的是第12页,共27页三、三、if语句语句说明:(1)三种形式的if语句中的“表达式”一般为关系表达式或逻辑表达式,但不限于这两种表达式。记住:C语言中需要逻辑值的地方,只有0代表“假”,非0(其它)均代表“真”。例如:if(a)printf(“%d”,a);-printf()这条语句一定运行,因为a=97,即“真”。例如:bit=(mask&n)?1:0。mask,n都是整数,&(位与)后也是整数。(2)else子句不能单独使用,必须是if语句的一部分,与if配对使用。在if和else后面可以只
8、含一个内嵌的操作语句,也可以有多个操作语句构成的语句块(复合语句)。语句块用括起来,语句块后面不要“;”号。现在学习的是第13页,共27页三、三、if语句语句输入两个实数,按数值由小到大的次序输出这两个数。(难点:交换数据算法)main()floata,b,t;/*t-临时变量*/scanf(%f%f,&a,&b);if(ba)t=a;a=b;b=t;/*交换a,b*/printf(%f,%f,a,b);533.000000,5.000000去掉大括号if(ba)t=a;a=b;b=t;结果有什么变化现在学习的是第14页,共27页三、三、if语句语句if语句的嵌套:if语句的if块或else块
9、中,由包含一个if语句。注意:应当注意if与else的配对关系。else总是与它上面的最近的未配对的if配对。特别是if/else子句数目不一样时(if子句数量只会大于或等于else子句数量)。利用确定配对关系。将没有else子句的if语句用括起来。if(x60)if(x0)x=0;Elsex=60;现在学习的是第15页,共27页三、三、if语句语句main()floatx;scanf(%f,&x);if(x60)if(x0)x=0;/*没有分号*/elsex=60;printf(%f,x);现在学习的是第16页,共27页三、三、if语句语句求一元二次方程ax2+bx+c=0的根。现在学习的是
10、第17页,共27页三、三、if语句语句#includemath.hmain()floata,b,c,d,disc,x1,x2,realpart,imagpart;scanf(%f%f%f,&a,&b,&c);printf(Theequation);if(fabs(a)=1e-6)printf(isnotaquadratic);elsedisc=b*b-4*a*c;现在学习的是第18页,共27页三、三、if语句语句if(fabs(disc)1e-6)x1=(-b+sqrt(disc)/(2*a);x2=(-b-sqrt(disc)/(2*a);printf(hasdistinctrealroot
11、s:%8.4fand%8.4fn,x1,x2);else现在学习的是第19页,共27页三、三、if语句语句realpart=-b/(2*a);imagpart=sqrt(-disc)/(2*a);printf(hascomPlexrootsn);printf(%8.4f+%8.4fin,realpart,imagpart);printf(%8.4f-%8.4fin,realpart,imagpart);程序中用disc代表b2-4ac,先计算disc的值,以减少以后的重复计算。对于判断b2-4ac是否等于0时,要注意一个问题:由于disc(即b2-4ac)是实数,而实数在计算和存储时会有一些微
12、小的误差,因此不能直接进行如下判断:if(disc=0)因为这样可能会出现本来是零的量,由于上述误差而被判别为不等于零而导致结果错误。所以采取的办法是判别disc的绝对值(fabs(disc)是否小于一个很小的数(例如10-6),如果小于此数,就认为disc=0。程序中以realpart代表实部P,以imagpart代表虚部q,以增加可读性。现在学习的是第20页,共27页四、条件运算符四、条件运算符条件运算符(?:)在if语句中,在表达式为“真”和“假”时,都只执行一个赋值语句给同一个变量赋值时,可以使用简单的条件运算符来处理。例如:if(ab)max=a;elsemax=b;可以使用条件运算
13、符来处理:max=ab?a:b;(注:ab关系运算有没有()都一样)。它这样执行,ab为“真”吗?如果为“真”,条件表达式为a,否则为b。条件表达式的一般形式:表达式1?表达式2:表达式3现在学习的是第21页,共27页四、条件运算符四、条件运算符说明:(1)条件运算符的执行顺序:先求解表达式1,若为非0(真)则求解表达式2,表达式2的值就是整个条件表达式的值。若表达式1的值为0(假),则求解表达式3,此时表达式3的值就是整个条件表达式的值。(2)条件运算符的优先级高于赋值运算符,低于关系运算符和算术运算符。例如:max=ab?a:b等价于:max=(ab)?a:b)(3)条件运算符的结合性“自
14、右向左”。例如:ab?a:cd?c:d。先 考 虑 优 先 级、再 考 虑 结 合 性:上 面 表 达 式 等 价 与:(ab)?a:(cd)?c:d)。现在学习的是第22页,共27页四、条件运算符四、条件运算符(4)表达式2和表达式3不仅可以是数值表达式,还可以是赋值表达式,函数表达式。例如:ab?(a=100):(b=100);ab?prinf(“%d”,a):prinf(“%d”,a);(5)表达式1,表达式2,表达式3的类型都可以不同。条件表达式值的类型是表达式2,表达式3中类型较高的类型。例如:xy?1:1.5整个表达式类型为实型。现在学习的是第23页,共27页五、五、switch语
15、句语句多分支可以使用嵌套的if语句处理,但如果分支较多,嵌套的if语句层数多,程序冗长,降低可读性。C语言中switch语句是多分支选择语句。其一般形式:switch(表达式)case常量表达式1:语句1case常量表达式2:语句2case常量表达式n:语句ndefault:语句n+1switch语句case中语句的终止可以使用break.现在学习的是第24页,共27页五、五、switch语句语句说明:(1)switch括号后面的表达式,允许为任何类型。(2)当“表达式”的值与某个case后面的常量表达式的值相等时,就执行此case后面的语句。如果表达式的值与所有常量表达式都不匹配,就执行de
16、fault后面的语句(如果没有default就执行跳出switch,执行switch语句后面的语句)。(3)各个常量表达式的值必须互不相同,否则出现矛盾。(4)各个case,default出现的顺序不影响执行结果。(5)执行完一个case后面的语句后,流程控制转移到下一个case中的语句继续执行。此时,“case常量表达式”只是起到语句标号的作用,并不在此处进行条件判断。在执行一个分支后,可以使用break语句使流程跳出switch结构,即终止switch语句的执行(最后一个分支可以不用break语句)。(6)case后面如果有多条语句,不必用括起来。(7)多个case可以共用一组执行语句。(
17、注意break使用的位置)现在学习的是第25页,共27页五、五、switch语句语句输入年月求该月天数输入年月求该月天数main()intyear,month,days;scanf(%d%d,&year,&month);switch(month)case1:case3:case5:case7:case8:case10:case12:days=31;break;现在学习的是第26页,共27页五、五、switch语句语句case2:if(year%4=0&year%100!=0)|year%400=0)days=29;elsedays=28;break;default:days=30;break;printf(%d,days);现在学习的是第27页,共27页