您好,欢迎访问三七文档
第7讲switch语句及选择结构的程序设计举例教学目的与要求:掌握if语句的嵌套和swicth语句的使用掌握选择结构的程序设计教学内容提要:1、if语句的嵌套2、swicth语句3、选择结构的程序设计举例教学重点:if语句的嵌套和swicth语句的使用教学难点:选择结构的程序设计教学进度:P103~P109教学过程:语句含义:语句形式:当if语句中又包含另一个if语句时,则构成了if语句嵌套的情形。1、if语句的嵌套if(表达式1)if(表达式2)语句1;else语句2;elseif(表达式3)语句3;else语句4;1、if语句嵌套语句执行流程:else与if的配对原则:就近一致原则:else与同一层最接近它,而又没有其它else语句与之相匹配的if语句配对。真(非0)语句2假(0)表达式2语句1语句4假(0)真(非0)表达式1假(0)真(非0)表达式3语句3例1:解方程:ax2+bx+c=0。从代数知识可以知道:⑴若b2-4ac0有两个不等的实根⑵若b2-4ac=0有两个相等的实根⑶若b2-4ac0有两个虚根程序为:#includestdio.h#includemath.hvoidmain(){floata,b,c,disc,x1,x2,realpart,imagpart;scanf(%f,%f,%f,&a,&b,&c);printf(theequation);if(fabs(a)=1e-6)b=0输出“无解”输出单根:x=-c/b假真disc0输出两复数根输出两实根真假a=0真假disc=b*b-4*a*cprintf(isnotaquadratic\n);else{disc=b*b-4*a*c;if(fabs(disc)=1e-6)printf(hastwoequalroots:%8.4f\n,-b/(2*a));elseif(disc1e-6){x1=(-b+sqrt(disc))/(2*a);x2=(-b-sqrt(disc))/(2*a);printf(hasdistinctrealroots:%8.4fand%8.4f\n,x1,x2);}else{realpart=-b/(2*a);imagpart=sqrt(-disc)/(2*a);printf(hascomplexroots∶\n);printf(%8.4f+%8.4fi\n,realpart,imagpart);printf(%8.4f-%8.4fi\n,realpart,imagpart);}}}2、条件运算符?:若if语句中,在表达式为“真”和“假”时,且都只执行一个赋值语句给同一个变量赋值时,可以用简单的条件运算符来处理。例如,若有以下if语句:if(a>b)max=a;elsemax=b;可以用下面的条件运算符(?:)来处理:max=(a>b)?a:b;其中”(a>b)?a:b”是一个“条件表达式”。它是这样执行的:如果(ab)条件为真,则条件表式取值a,否则取值b.条件运算符要求有三个操作对象,称三目(元)运算符。条件表达式的一般形式为表达式1?表达式2:表达式3它的执行过程见图。表达式1表达式2表达式3T(1)F(0)例2输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。main(){charch;scanf(%c,&ch);ch=(ch='A'&&ch='Z')?(ch+32):ch;printf(%c,ch);}条件表达式不能取代一般的if语句,只有在if语句中内嵌的语句为赋值语句(且两个分支都给同一个变量赋值)时才能代替if语句;下面的if语句就无法用一个条件表达式代替。if(a>b)printf(“%d”,a);elseprintf(“%d”,b);但可以用下面语句代替:printf(”%d”,a>b?a:b);即将条件表达式的值输出。注意:2、switch语句1、语句形式:switch(表达式){case常量1:语句1;case常量2:语句2;case常量3:语句3;.......case常量n:语句n;default:语句n+1;}根据表达式的不同值,选择不同的程序分支,又称开关语句。数值型或字符型常量表达式的值必须互不相同,否则执行时将出现矛盾,即同一个开关值,将对应多种执行方案。千万不能接(;)号注意:各个case的出现次序不影响执行结果,执行完一个case后面的语句后,流程控制转到下一个case继续执行。case后面的常量表达式只是起语句标号作用,并不是在该处进行条件判断;根据switch后面表达式的值找到匹配的入口标号开始执行下去,不再进行判断。例3:根据输入成绩来判断成绩的等级。例3,根据考试成绩的等级打印出百分制分数段:main(){chargrade;scanf(“%c”,&grade);switch(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”);}}运行情况:输入B70~8460~6960error应该在执行一个case分支后,使流程跳出switch结构,即终止switch语句的执行,可用break语句来完成此功能。例3,根据考试成绩的等级打印出百分制分数段:main(){chargrade;scanf(“%c”,&grade);switch(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”);}}运行情况:输入B70~842、语句执行流程:指语句的最后一条是否为break简单语句或复合语句breakbreak有无break有无有计算表达式常量1常量2常量n=语句1…===语句2语句n其它=语句n+1无值case语句出现的次序并不影响执行结果。程序运行情况如下:3↙WednesdayThursdayFridaySaturdayError#includestdio.hmain(){intn;scanf(%d,&n);switch(n){case0:printf(Sunday\n);case1:printf(Monday\n);case2:printf(Tuesday\n);case3:printf(Wednesday\n);case4:printf(Thursday\n);case5:printf(Friday\n);case6:printf(Saturday\n);default:printf(Error);}}例4:假设用0、1、2......6分别表示星期日、星期一......星期六。现输入一个数字,输出对应的星期几的英文单词。如果输入3,输出“Wednesday”。#includestdio.hmain(){intn;scanf(%d,&n);switch(n){case0:printf(Sunday\n);break;case1:printf(Monday\n);break;case2:printf(Tuesday\n);break;case3:printf(Wednesday\n);break;case4:printf(Thursday\n);break;case5:printf(Friday\n);break;case6:printf(Saturday\n);break;default:printf(Error);}}程序运行情况如下:3↙Wednesday第四章选择结构程序设计3、说明多个case语句可以共用一组执行语句。switch(grade){case'A':case'B':case'C':printf(grade=60\n);break;default:printf(grade60);}各case和default子句的先后顺序可以变动,而不会影响程序执行结果。default语句可以省略不用。case和default与其后面的常量表达式间至少有一个空格。switch语句可以嵌套,break语句只跳出它所在的switch语句。2020/1/29voidmain(){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(“a=%d,b=%d\n”,a,b);}运行结果:a=2,b=1例5:分析下列程序的运行结果例6、企业发放的奖金根据利润提成。从键盘输入当月利润,求应发放奖金总数?10%1012%102014%204016%406018%6010020%100利润利润万利润利润万利润利润万奖金利润利润万利润利润万利润利润万利润xx=1010x≤2020x≤4040x≤6060x≤100100x(int)x/10常量0,11,22,3,44,5,66,7,8,9,1010以上用这种方法转换后,n出现了在不同区域有重复数字的情况。解决的方法有很多,其中一种是可以采用当x为10的整数倍时,将计算出的n值减1。使用switch解题的关键,通过分析找到表达式,将问题分成几种情况。#includestdio.hvoidmain(){floatx,y;intn;scanf(%f,&x);n=(int)x/10;if((int)x%10==0)n--;switch(n){case0:y=x*0.1;break;case1:y=x*0.12;break;case2:case3:y=x*0.14;break;case4:case5:y=x*0.16;break;case6:case7:case8:case9:y=x*0.18;break;default:y=x*0.2;}printf(y=%.2f\n,y);}程序如下:3、选择结构程序设计举例例7:将任意三个整数按从大到小的顺序输出。#includestdio.hmain(){intx,y,z,t;scanf(%d,%d,%d,&x,&y,&z);if(xy){t=x;x=y;y=t;}/*交换x,y的值*/if(xz){t=x;x=z;z=t;}/*交换x,z的值*/if(yz){t=y;y=z;z=t;}/*交换y,z的值*/printf(%d,%d,%d\n,x,y,z);}例8:给一个不多于4位的正整数,求出它是几位数,逆序打印出各位数字。#includestdio.hmain(){intx,a,b,c,d;/*a,b,c,d代表千、百、十、个位*/scanf(%d,&x);a=x/1000;b=x%1000/100;c=x%100/10;d=x%10;/*分解出千位、百位、十位、个位*/if(a!=0)printf(4:%d%d%d%d\n,d,c,b,a);elseif(b!=0)printf(3:%d%d%d\n,d,c,b);elseif(c!=0)printf(2:%d%d\n,d,c);elseif(d!=0)printf(1:%d\n,d);}例9:从键盘输入一个年份,判断是否是闰年。#includestdio.hmain(){intyear;scanf(%d,&year);if(year%400==0||(year%4==0&&year%100!=0))printf(%disaleapyear\n,year);elseprintf(%disnotaleapyear\n,year);}例10:程序填空:
本文标题:c语言教案第7讲
链接地址:https://www.777doc.com/doc-3377437 .html