您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 《C语言程序设计教程》课件--第4章
第4章选择结构程序设计北京科技大学计算机系C语言程序设计2020/1/102本章主要内容4.1if语句4.1.1if语句的一般形式4.1.2if语句的嵌套4.2switch语句4.2.1switch语句的一般形式4.2.2break语句4.3选择结构程序设计举例2020/1/103简单分支语句语句一般格式if(表达式)语句功能:–计算表达式的值,如果是一个非0值(即逻辑真),就执行内嵌语句,否则(即逻辑假)跳过内嵌语句,顺序执行后续语句。内嵌语句,可为:赋值语句函数调用语句控制语句复合语句空语句可为算术、关系、逻辑、赋值等表达式2020/1/104简单分支语句的算法:例如:⑴if(x0)m++;⑵if(ab){c=a;a=b;b=c;}表达式非0TF语句N-S结构图语句流程图NY表达式非0?2020/1/105双重分支语句语句一般格式if(表达式)语句1else语句2功能:–计算表达式的值,如果它的值是一个非0值(逻辑真),就执行内嵌语句1,之后跳过内嵌语句2,执行后续语句;否则跳过内嵌语句1,执行内嵌语句2,之后执行后续语句。2020/1/106双重分支语句的算法:例如:⑴if(x0)m++;elsem--;⑵if(ch='a'&&ch='z'){ch=ch-32;printf(%c\n,ch);}elseprintf(%c\n,ch);表达式非0TF语句1语句2N-S结构图语句1语句2流程图NY表达式非0?2020/1/107多重分支语句语句一般格式if(表达式1)语句1elseif(表达式2)语句2……elseif(表达式m)语句melse语句n功能:–依次计算并判断表达式i,为非0时执行后面的语句,都为0时,执行语句n–无论执行完那个语句分支,都转到后续语句2020/1/108多重分支语句的算法流程图表达式2?表达式1?语句n语句1语句2语句m…YNYNNY表达式m?2020/1/109多重分支语句的算法N-S结构图表达式1?TF表达式2?语句1TF语句2…表达式m?TF语句m语句n例如:if(a0)x=-1;elseif(a==0)x=0;elsex=1;2020/1/1010if语句的简单应用【例4.1】输入一个字符,如果是大写字母,则将其转换为小写字母输出,否则直接输出。输入:用getchar或scnaf函数ch是否为大写字母:ch='A'&&ch='Z'(或ch=65&&ch=90)大写字母转换为小写字母:ch=ch+32输出:用putchar或printf函数思路:2020/1/1011程序:#includestdio.hmain(){charch;ch=getchar();if(ch='A'&&ch='Z')ch=ch+32;printf(%c\n,ch);}程序运行情况如下:Gg运行jc4_1可使用条件表达式代替putchar(ch='A'&&ch='Z'?ch+32:ch);putchar('\n')2020/1/10124.1.2if语句的嵌套如果if的内嵌语句中又使用了一个if语句,则构成if语句的嵌套。【例4.a】比较两个整数的关系。#includestdio.hmain(){intx,y;printf(EnterintegerXandY:);scanf(%d%d,&x,&y);if(x!=y)if(xy)printf(XY\n);elseprintf(XY\n);elseprintf(X=Y\n);}应该正确判断:•if的内嵌语句•if和else的配对运行jc4_a提倡缩格书写有利于阅读程序2020/1/1013if语句嵌套的形式简单if语句的嵌套形式if(表达式)if语句双重(或多重)分支if语句的嵌套形式if(表达式)if语句elseif语句可以是各种形式的if语句可以是各种形式的if语句如果是简单if语句,必须用“{}”括起2020/1/1014例如:⑴if(c=100)if(c=50)printf(50=c=100\n);⑵if(c=100)if(c=50)printf(50=c=100\n);elseprintf(c50\n);elseif(c=150)printf(100c=150\n);elseprintf(c150\n);⑶if(c=100)if(c=50)printf(50=c=100\n);elseprintf(c50\n)与哪个if配对?2020/1/1015再例如:if(ab)if(ac)if(ad)m=1;elsem=2;elsem=3;问题:哪一个else和哪一个if相匹配?规则:在嵌套的if~else语句中,else总是与上面的离它最近的尚未配对的if配对。2020/1/1016举例【例4.4】输入一个数,判断它是奇数还是偶数,如果是奇数则进一步判断它是否为5的倍数。定义变量x输入x的值x是奇数TF输出“odd”x是5的倍数输出“even”TF是5的倍数2020/1/1017程序:main(){intx;scanf(%d,&x);if(x%2!=0){printf(%disanodd\n,x);if(x%5==0)printf(%disthetimesof5\n,x);}elseprintf(%disaneven\n,x);}运行jc4_4思考:如果没有,算法和输出如何?2020/1/1018学习if语句的难点if~else语句的配对正确用表达式描述条件例如:当x大于5小于10时令x自增if(5x10)x++;正确判断内嵌语句例如:if(xy)x=x+3;y=y-2;elsex=x-3;y=y+2;if(x5&&x10)x++;{}{}2020/1/1019熟悉常用的if表达式形式例如有定义:inta,b=0;a等于什么值时,执行b=2;语句?if(a==0)b=2;if(a==1)b=2;if(a!=0)b=2;if(a=1)b=2;if(a=0)b=2;if(a)b=2;if(!a)b=2;等价于等价于2020/1/10204.2switch语句switch语句的一般形式switch(表达式){case常量表达式1:语句序列1case常量表达式2:语句序列2……case常量表达式n:语句序列ndefault:语句序列n+1}功能:–计算表达式的值,与常量表达式的值比较,等于第i个值时,顺序执行语句序列i、i+1、…、n+1–若与所有常量表达式值都不相等,执行语句序列n+1。2020/1/1021switch语句的算法描述N-S结构图计算表达式常量表达式1语句序列1常量表达式2语句序列2…………常量表达式n语句序列ndefault语句序列n+1例如:switch(a){case5:printf(&);case2:printf(#);default:printf($);}当a等于5,输出:$当a等于2,输出:#$当a是其他值,输出:$2020/1/1022说明:“case常量表达式i:”等价于语句标号,计算出的表达式值等于哪个语句标号,就从哪个位置开始顺序向下执行语句序列。∴语句位置影响运行结果例如:switch(a){case2:printf(#);default:printf($);case5:printf(&);}switch与break语句结合才能实现程序的分支break;break;break;2020/1/1023switch语句的简单应用【例4.3】已知x=100,y=15,要求输入一个算术运算符(+、-、*或/),并对x和y进行指定的算术运算。思路:•设x和y为float型变量并赋初值;•输入的运算符op为char型变量;•根据op的值(为'+'、'-'、'*'、'/')进行x和y的相加、相减、相乘、相除运算(选择分支);•还要考虑到输入字符不是+、-、*或/时的情况2020/1/1024程序:#includestdio.hmain(){floatx=100,y=15,z;charop;op=getchar();switch(op){case'+':z=x+y;break;case'-':z=x-y;break;case'*':z=x*y;break;case'/':z=x/y;break;default:z=0;}if((int)z!=0)printf(%f%c%f=%f\n,x,op,y,z);elseprintf(%cisnotanoperator\n,op);}运行jc4_3•实型数通常不使用z==0或z!=0的比较•可用if((int)z)代替2020/1/1025注意:switch语句的书写格式:语句体本身必须用花括号括起;case和default后面如果有多条语句,则可以不必使用花括号;case和常量表达式之间必须有空格;default可以写在语句体的任何位置,也可以省略不写break语句可以改变case的语句标号作用,终止后续case语句序列的执行。switch语句和break语句结合,可以实现程序的选择控制(break语句还可以在循环语句中使用)允许switch嵌套使用,但同一个switch语句中,任意两个case的常量表达式值不能相同。2020/1/10264.3选择结构程序设计举例【例4.6】求一元二次方程ax2+bx+c=0的根。思路:一元二次方程的根取决于系数a,b,c求根公式:aacbbx2422,1判别式d=b2-4ac•当d=0时,方程有两个相等的实根:x1=x2=-b/(2*a)•当d0时,方程有两个不相等的实根:x1=(-b+sqrt(d))/(2*a)x2=(-b-sqrt(d))/(2*a)•当d0时,方程有两个虚根:x1=jp+ipix2=jp-ipi实部jp=-b/(2*a)虚部ip=sqrt(-d)/(2*a)2020/1/1027算法:定义变量a、b、c、d、x1、x2、jp、ip输入系数a、b、ca==0TF计算d=b*b-4*a*c不是二d==0次方程TFd0计算重根TF输出重根计算实根计算虚根输出实根输出虚根2020/1/1028程序:#includemath.hmain(){floata,b,c,d,x1,x2,lp,ip;scanf(%f%f%f,&a,&b,&c);printf(theequation);if(fabs(a)1e-6)printf(isnotquadratic);else{d=b*b-4*a*c;if(fabs(d)=1e-6)/*相等的实根*/{printf(hastwoequalroots:\n);printf(x1=x2=%8.4f\n,-b/(2*a));}2020/1/1029程序(续):elseif(d1e-6)/*不相等的实根*/{x1=(-b+sqrt(d))/(2*a);x2=(-b-sqrt(d))/(2*a);printf(hastworealroots:\n);printf(x1=%8.4f,x2=%8.4f\n,x1,x2);}else/*虚根*/{lp=-b/(2*a);ip=sqrt(-d)/(2*a);printf(hastwocomplexroots:\n);printf(x1=%8.4f+%8.4fi\n,lp,ip);printf(x2=%8.4f-%8.4fi\n,lp,ip);}}}运行jc4_62020/1/1030举例(续):【例4.b】输入年份,判别该年是否为闰年。思路:年份year为闰年的条件为①能够被4整除,但不能被100整除的年份;②能够被400整除的年份。只要满足任意一个就可以确定它是闰年。例如:1996年、2000年是闰年1998年、1900年不是闰年设定标志变量leap,只要符合其中一个条件的就是闰年,令leap=1;否则令leap=02020/1/1031算法:定义变量year、leap输入年份year能被4整除且不能被
本文标题:《C语言程序设计教程》课件--第4章
链接地址:https://www.777doc.com/doc-2864564 .html