switch语句01:39:577.1switch语句:switch语句是一条多分支选择语句.在实际应用中,要在多种情况中选择一种情况,执行某一部分语句。当然可以使用嵌套的if,ifelseif语句来处理,但其分支过多,程序冗长,难读,不够灵巧。01:39:57switch语句是C语言中处理多路选择问题的一种更直观和有效的手段.在测试某个表达式是否与一组常量表达式中的某一值相配时,switch语句显得更为方便.一般形式如下:01:39:57switch(表达式){case常量表达式1:语句1[break];case常量表达式2:语句2[break];…case常量表达式n:语句n[break];[default:语句n+1]}说明:(1).关于表达式:表达式可以是整型、字符型等表达式。有一个确定的值(不是逻辑值).(2).关于常量表达式1~n:只起到一个标号的作用,根据表达式的值来判断,找到一个相匹配的入口处,程序往下执行。各个case后的常量表达式的值必须互不相同.(3).每个case分支可有多条语句,可不用花括号{}。01:39:57switch(表达式){case常量表达式1:语句1[break];case常量表达式2:语句2[break];…case常量表达式n:语句n[break];[default:语句n+1]}(4).各个case语句只是一个入口标号,并不确定执行的终止点.(5).一般在各个case语句最后应该加一break语句,可使程序流程跳出Switch结构.否则会从入口处一直向下执行.(6).各个case和default出现的先后次序,并不影响执行结果.default可以没有.01:39:57(7).多个case可共用一组执行语句.例如为了统计一段文字中的数字,字母及分隔符的个数,可用下列程序段实现:switch(ch){case‘0’:case‘1’:….case‘8’:case‘9’:digit++;break;case‘’:case‘\n’:case‘\t’:white++;break;default:character++;break;}这里有一个空格.表达式后都有一冒号”:”.01:39:57无break语句表达式==常量表达式1?语句序列1真(非0)break假(0)有break语句无break语句表达式=常量表达式2?语句序列2break有break语句真(非0)假(0)表达式=常量表达式n?语句序列nbreak真(非0)假(0)无break语句语句序列n+1有break语句switch(表达式)01:39:57说明:switch语句不等同于if语句:1.switch只能进行值的相等性的检查.2.if语句不但可以进行相等性的检查,还可以计算关系表达式或逻辑表达式,进行逻辑判断的真假.只进行值的相等性的检查,不是逻辑判断!01:39:57例7.1键盘输入0-6之间的整数,分别代表每周的星期日、星期一、…、星期六#includestdio.hintmain(){intday;printf(请输入星期的数字编号(0-6):);scanf(%d,&day);….Ch7_7_1.c01:39:57….switch(day){case0:printf(星期日\n);break;case1:printf(星期一\n);break;case2:printf(星期二\n);break;case3:printf(星期三\n);break;case4:printf(星期四\n);break;case5:printf(星期五\n);break;case6:printf(星期六\n);break;default:printf(输入有误,请输入0-6之间的数字!\n);}return0;}每个case分支可有多条语句,可不用花括号{},也可以用。表达式有一个确定的值(不是逻辑值).01:39:57例7.2求执行下列程序段后k的值#includestdio.hintmain(){charc=‘2’;intk=1;switch(c+1-'0'){case2:k+=1;case2+1:k+=2;case4:k+=3;}printf(k=%d\n,k);return0;}一般在各个case语句最后应该加一break语句,可使程序流程跳出Switch结构.否则会从入口处一直向下执行.‘0‘的ASCII值为48.Ch7_7_2.c01:39:57例7.3执行下列程序,当分别输入A、B、C、E时,求K的值.charc;intk=2;scanf(“%c”,&c);switch(c-’A’){case0:k++;case1:K+=2;break;default:k*=k;case4:k*=3;}printf(“k=%d”,k);Ch7_7_3.c01:39:57例7.4输入一字符,如果是Y,N或y,n,则分别执行一输出语句,如果是其他字母则执行另一输出语句。#includestdio.hvoidmain(){charch;printf(PleaseinputY/N(y/n):);scanf(%c,&ch);….Ch7_7_4.c01:39:57….switch(ch){case'y':case'Y':printf(thisis'Y'or'y'.\n);break;case'n':case'N':printf(thisis'N'or'n'.\n);break;default:printf(thisisotherchar.\n);}}多个case可共用一组执行语句.表达式有一个确定的值(不是逻辑值).01:39:57例7.5编写程序,实现如下功能。输入一个实数后,屏幕显示如下菜单:1.输出相反数2.输出平方数3.输出平方根4.退出01:39:57#includestdio.hvoidmain(){inti,c=5;floatm;printf(输入任意一个整型数:\n);scanf(%f,&m);printf(****************************\n);printf(1,输出相反数\n);printf(2,输出平方数\n);printf(“3,输出开方根\n);printf(4,退出\n);printf(****************************\n);……Ch7_7_5.c01:39:57…..while(1){scanf(%d,&c);switch(c){case1:printf(输出相反数:%f\n,-m);break;case2:printf(输出平方数:%f\n,m*m);break;case3:printf(输出平方根:%f\n,sqrt(m));break;case4:break;default:printf(请输入1~4之间的数字!\n);}if(c==4)break;}}Ch7_7_5.c01:39:57例7.6根据输入字符(0-9及A-F(a~f))显示与该字符所表示的十六进制数相对应的十进制数。(例如,输入‘A’,输出10,输入‘0’,输出0)01:39:57#includestdio.h#includestdlib.hintmain(){charch;for(;;){printf(“\n请输入十六进制数0~F(输入Q或q退出):);scanf(%c,&ch);getchar();printf(输入的是:%c,ch);….当输入一个字符,打一个回车后,输入结束.但在输入缓冲区中存在二个字符:输入的字符,还有一个是’\n’.当打了一个回车后(其实是二个动作:回车,换行.c语言会把回车,换行自动转换为’\n’.反之亦然.01:39:57switch(ch){case'0':case'1':case'2':case'3':case'4':case'5':case'6':case'7':case'8':case'9':printf(十进制数:%d\n,ch-'0');break;case'A':case'B':case'C':case'D':case'E':case'F':printf(十进制数:%d\n,ch-55);break;…Ch7_7_6.cASCII值:‘0’48‘A’65‘a”9701:39:57case'a':case'b':case'c':case'd':case'e':case'f':printf(十进制数:%d\n,ch-87);break;case'Q':case'q':printf(退出程序\n);exit(0);default:printf(输入有误!);}}return0;}ASCII值:‘0’48‘A’65‘a”9701:39:57示例:输入10个字符,分别统计出其中空格或回车、数字和其他字符的个数。voidmain(){intblank,digit,i,other;charch;blank=digit=other=0;printf(input10characters:);….01:39:57for(i=1;i=10;i++){ch=getchar();switch(ch){case‘‘:case’\n‘:blank++;break;case'0':case'1':case'2':case'3‘:case'4':case'5':case'6':case'7':case'8':case'9':digit++;break;default:other++;break;}}printf(“blank=%d,digit=%d,other=%d\n”,blank,digit,other);}input10characters:Reold123?blank=1,digit=3,other=601:39:57例:#includestdio.hvoidmain(){inti;for(i=0;i3;i++)switch(i){case1:printf(%d,i);case2:printf(%d,i);default:printf(%d,i);}}以下程序的输出结果是:A.011122B.012C.012020D.120注意所属关系01:39:57例7.7编写一个简易计算器.Ch7_7_7.c01:39:57#includestdio.h#includestdlib.hintmain(){floatnumb1=0,numb2=0;intmenu=1,flag;floattotal=0;charcalType;….01:39:57for(;;){flag=1;printf(\n\t希望进行哪种运算?\n\n);printf(\t1:加法\n);printf(\t2:减法\n);printf(\t3:乘法\n);printf(\t4:除法\n);printf(\t0:退出计算器\n);printf(\n\t输入你的选择:);….01:39:57….scanf(%d,&menu);if(menu==0)exit(0);elseif(menu1||menu4)printf(\t无效的选择!\n);else{printf(\t输入两个数中的第一个数:);scanf(%f,&numb1);printf(\t输入两个数中的第二个数:);scanf(%f,&numb2);….退出程序.01:39:57switch(menu){case1:total=numb1+numb2;calType='+';break;case2:total=numb1-numb2;calType='-';break;case3:total=numb1*numb2;calType='*';break;case4:if(numb2==0){printf(\n\t不能被0除\n);flag=0;break;}total=numb1/numb2;calType='/';break;default:printf(无效的选择!\n);}…01:39:57if(fla