资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,3,章 选择结构程序设计,选择结构(分支结构)的处理过程为:先判断一个条件,然后根据条件是否成立,执行不同的代码。,C,语言提供了作为判断条件的关系表达式和逻辑表达式,还有实现分支结构的,if,语句和,switch,语句。,第,3,章 选择结构程序设计,第一节 关系运算符和关系表达式,3,.1关系运算符和关系表达式,关系运算符:比较两个量的运算符,在,C,语言中,关系运算符有六种,关系表达式:用关系运算符将运算对象连接起来的式子。,例:37 a=c-d,关系表达式求解的结果:成立或不成立,即“真,(true),”或“假,(flase),”,,C,语言中,,1”,代表,“真”,,,“,0”,代表,“假”,。,3,.1.1关系运算符,运算符优先级的高低次序,结合性为自左至右,3,.1.2 关系表达式,例:int a=7,b=4,c=1,d;,a%2=0,a%bb,(d=a)b,d=abc,0,0,注意:,在C语言中要判断a大于b且b大于c时,写成逻辑表达式ab&bc,其中&是逻辑与运算符。,1,1,0,例:,a b=c,d=a b,ch a+1,d=a+b c,3=x b)=c,d=(a b),ch (a+1),d=(a+b)c),(3=x)=a,&,ch=A,&,ch=3,&,x=5,3,.2 逻辑运算符和逻辑表达式,对于,&,,如果其左侧表达式的值为假,则右侧表达式不进行求解(即不执行)。,对于,|,,如果其左侧表达式的值为真,则右侧表达式不进行求解。,例如:,int x=10,y=20;,(x=0)&(y=30)/y,的值没变,(x=0)|(y=30)/y,的值变成,30,第,3,章 选择结构程序设计,第,三节,if,语句,3,.3 if,语句,语言中的,if,语句有三种基本形式。,形式一:,if(,表达式,),语句,形式二:,if(,表达式,),语句,1,else,语句,2,形式三:,if(,表达式,1),语句,1,else if(,表达式,2),语句,2,else if(,表达式,3),语句,3,.,else,语句,n ,分支条件,任何类型,一定要用小括号,“,(),”,括起来,可以是一条语句,也可以是多条语句,此时一定要用大括号,“,”,括起来成为一条复合语句,3,.3 if,语句,单分支,if,语句的执行过程:,先求解表达式的值,如果表达式的值为真,则执行其后的语句,否则不执行该语句。,3,.3 if,语句,【,例,3-1】,求,x,的绝对值。,思路:,先求解表达式,x0,的值,判断,x,是否为负数,如果结果为真,则执行内嵌的语句,x=-x;,,否则不执行该语句。,#include int main()int x;,return 0;,运行一次,,输入:,-10,运行结果:,|x|=10,再运行一次,,输入:,10,运行结果:,|x|=10,scanf(%d,if(xy),t=x;,x=y;,y=t;,/,复合语句,printf(%d,%dn,x,y);,3,.3 if,语句,2.,双分支,if,语句,例如:,if(x0),printf(%d,x);,else,printf(%d,-x);,if(,表达式,),语句,1,else,语句,2,3,.3 if,语句,双分支,if,语句的执行过程:,先求解表达式的值,如果表达式的值为真,则执行语句1,否则执行语句2。,3,.3 if,语句,【,例,3-3】,求两个整数中较大者。使用双分支,if,语句实现。,分析:定义变量,x,、,y,,存储两个数,定义变量,max,,存储较大的数。,#include int main()int x,y,max;,return 0;,运行一次,,输入:,5,10,运行结果:,Max=10,scanf(%d,%d,if,(xy),max=x;/if,的内嵌语句,else,max=y;/else,的内嵌语句,printf(max=%dn,max);,3,.3 if,语句,else,不能作为语句单独使用,它必须是,if,语句的一部分,与,if,配对使用。,例如:,if(xy),x=y;y+;/if,的内嵌语句,else,y=x;x-;/else,的内嵌语句,如果写成:,if(xy),x=y;y+;,else,y=x;x-;,语法错误,3,.3 if,语句,3.,多分支,if,语句,多分支,if,语句可以看成双分支,if,语句的扩展形式,即在双分支,if,语句中,,else,的内嵌语句是另一个双分支的,if,语句。,一般形式:,if(表达式1)语句1,else if(表达式2)语句2,else if(表达式3)语句3,else,语句n,3,.3 if,语句,多分支,if,语句的执行过程:,如果表达式1的值为真,则执行语句1,否则判断表达式2。如果表达式2的值为真,则执行语句2,否则判断表达式3,依次类推。如果所有表达式的值都为假,则执行语句n。,3,.3 if,语句,【,例,3-4】,输入一个百分制的分数,输出相应的等级。本题要求使用多分枝,if,语句实现。,要求如下:,成绩,=90,,输出,A,89=,成绩,=80,,输出,B,79=,成绩,=70,,输出,C,69=,成绩,=60,,输出,D,成绩,=90),printf(score grade is An);,else if(score=80),printf(score grade is Bn);,else if(score=70),printf(score grade is Cn);,else if(score=60),printf(score grade is Dn);,else,printf(score grade is En);,3,.3 if,语句,在,if,语句中,,if,和,else,的内嵌语句可以是任何语句,如果又是,if,语句,则称为,if,语句的嵌套。,3,.3 if,语句,例如:,if(ab),if(bc),printf(%d is biggestn,a);,else,printf(%d is not biggestn,a);,else,与哪个,if,配对?,3,.3 if,语句,语言规定:,else,总是与它上面最近的未曾配对的,if,配对。,if(),if(),if(),else.,else.,else.,3,.3 if,语句,【,例,3-5】,求三个数中最大者。使用嵌套,if,语句实现。,#include int main()int x=4,y=5,z=2,max;,printf(max=%d,max);,return 0;,max=x;,if(zy),if(zx),max=z;,else,if(yx),max=y;,运行结果:,max=5,第,3,章 选择结构程序设计,第四节,switch,语句,3,.4 switch语句,switch,语句是专门用于处理多分支结构的条件选择语句,又称开关语句。,switch(,表达式,),case,E1,:,语句组,1;,break;,case,E2,:,语句组,2;,break;,.,case,En,:,语句组,n;,break;,defaul,t:,语句组,;,break,;,执行过程,3,.4 switch语句,switch,语句的执行过程:,首先求解,switch,后面括号中表达式的值,然后用此值依次与各个,case,后面的常量表达式的值进行比较。,若括号中表达式的值与某个,case,后面的常量表达式的值相等,则执行此,case,后面的语句。语句执行后若,遇到,break,语句或,switch,的结束符,“,”,就终止,switch,语句,,否则就继续,执行下一个,case,后面的语句,依次类推。,若括号中表达式的值与所有,case,后面的常量表达式都不相等,则执行,default,后面的语句,n+1,,然后终止,switch,语句,程序流程转向开关语句的下一条语句。,3,.4 switch语句,例如:执行以下程序代码,int no;,scanf(%d,switch(no),case 1:printf(firstn);break;,case 2:printf(secondn);,case 3:printf(,“,thirdn,”,);,运行,一次,:,输入:,1,运行结果:,first,再,运行,一次,:,输入:,2,运行结果:,second,third,3,.,4,switch语句,说明:,例:,switch(no),default:printf(lastn);break;,case 2:printf(secondn);break;,case 1:printf(firstn);break;,case 3:printf(thirdn);break;,(1),case和常量表达式之间要有空格,常量表达式只起语句标号作用,,跳出switch必须用break语句,。如果每个case和default后面都有break语句,则它们出现的次序不影响执行结果。,(2),case后面常量表达式的值必须互不相同。,(3),多个case可共用一组执行语句,case后可包含多个可执行语句,且不必加“”,进入某个case后,会顺序执行本case后面的所有语句。,(4)default部分可以省略。如果省略,当switch后面括号中表达式的值与所有case后面的常量表达式的值都不相等时,则不执行任何一个分支直接退出switch语句。,(5)switch语句可以嵌套。,3,.4 switch语句,【,例,3-6】,将例,3-4,进行修改,用,switch,语句实现。输入一个百分制的分数,输出相应的等级。,比较,switch,语句与嵌套,if,语句的差异。,要求如下:,成绩,=90,,输出,A,89=,成绩,=80,,输出,B,79=,成绩,=70,,输出,C,69=,成绩,=60,,输出,D,成绩,y?x:y;/将x和y中较大者赋给max,y=x0?x:-x;,/将x的绝对值赋给y,3,.5 条件运算符和条件表达式,说明,(2),条件运算符的优先级高于赋值运算符和逗号运算符,低于其它运算符。,例:a%3?a+2:a-2 等价于(a%3)?(a+2):(a-2),a5&a5&a7?10:20 等价于 b=(a+3)7?10:20),(3),条件运算符的结合方向为自右至左。条件表达式可以嵌套,当一个条件表达式中出现多个条件运算符时,应该将位于最右边的问号与离它最近的冒号配对,并按这一原则正确区分各条件运算符的运算对象。,例:,ab?10:bc?20:30 等价于 ab?10:(bc?20:30),第,3,章 选择结构程序设计,第六节 选择结构程序举例,3,.6 选择结构程序举例,【,例,3-8】,从键盘输入一个字符,判断该字符是否为大写字母,如果是转换为小写字母输出,如果不是,原样输出。,本题要点:,1.ASCII,码应用,2.,判断某个字符是否为大写字母的方法。,3,.6 选择结构程序举例,#include int main()char ch;,ch=getchar();,if(ch=A&ch=Z),ch=ch+32;,printf(%cn,ch);,return 0;,运行一次,输入:,A,运行结果:,a,3,.6 选择结构程序举例,【,例,3-9】,从键盘输入一个数字字符,输出对应的星期名称,其中,0,对应星期日,,1-6,分别对应星期一到星期六。,本题要点:,1.switch,语句应用;,2.break,语句的作用。,#includeint main()char ch;,ch=getchar();,switch(ch),case 0:printf(Sundayn);break;,case 1:printf(Mondayn);break;,case 2:printf(Tuesdayn);break;,case 3:printf(Wednesdayn);break;,case 4:printf(Thursdayn);break;,case 5:printf(Fridayn);break;,case 6:printf(Saturdayn);break;,default:printf(errorn);,return 0;,运行一次,输入:,5,运行结果:,Friday,3,.6 选择结构程序举例,【,例,3-10】,判断某一年是否为闰年。,本题要点:,闰年的判断条件可以简单总结为:四年一闰,百年不闰,四百年再闰,。,年份,如果,不能被,4整除,则不是闰年;,如果,能被4整除,但不能被100整除,则是闰年;,如果,是整百的年份,需要能被400整除,才是闰年,否则就不是闰年。例如2000年、2016年是闰年,而2001年、2100年不是闰年。,分析:,1.,定义整型变量,year,2.,判断,year,是否闰年的条件表达式:,(,year%4=0&year%100!=0,)|(,year%4=0,),3,.6 选择结构程序举例,#includeint main()int year;,printf(Please input a year:n);,scanf(%d,if(,year%4=0&year%100!=0,)|(,year%4=0,),printf(n%d is a leap year!n,year);,else,printf(n%d is not a leap year!n,year);,return 0;,运行一次:,输入:,2016,运行结果:,2016 is a leap year!,再运行一次:,输入:,2100,运行结果:,2100 is not a leap year!,作业题,习题,3,3,5,6,7,
展开阅读全文