1、*SWITCH语句 7.1 switch 语句语句:switch 语句语句是一条多分支选择语句是一条多分支选择语句.在实际应用中,要在多种情况中选择一种情况在实际应用中,要在多种情况中选择一种情况,执行某执行某一部分语句。一部分语句。当然可以使用嵌套的当然可以使用嵌套的if,if else if语句来处理,但其分支过语句来处理,但其分支过多,程序冗长,难读多,程序冗长,难读,不够灵巧。不够灵巧。*switch语句是语句是C语言中语言中处理多路选择处理多路选择问题的一种问题的一种更直观更直观和有效的手段和有效的手段.在测试某个表达式是否与在测试某个表达式是否与一组常量一组常量表达表达式式中中的某
2、一值相配时的某一值相配时,switch语句显得更为方便语句显得更为方便.一般形式如下:一般形式如下:*switch(表达式表达式)case 常量表达式常量表达式1:语句语句1 break;case 常量表达式常量表达式2:语句语句2 break;case 常量表达式常量表达式n:语句语句n break;default:语句语句n+1 说明说明:(1).关关于于表表达达式式:表表达达式式可可以以是是整整型型、字字符符型等表达式。型等表达式。有一个确定的值有一个确定的值(不是逻辑值不是逻辑值).(2).关于常量表达式关于常量表达式1n:只起到一个标号的只起到一个标号的作用作用,根据表达式的值来判断
3、根据表达式的值来判断,找到一个相匹配找到一个相匹配的入口处的入口处,程序往下执行。程序往下执行。各个各个case后的常量表达式的值必须互不相同后的常量表达式的值必须互不相同.(3).每个每个case分支可有多条语句,可不用分支可有多条语句,可不用花括号花括号。*switch(表达式表达式)case 常量表达式常量表达式1:语句语句1 break;case 常量表达式常量表达式2:语句语句2 break;case 常量表达式常量表达式n:语句语句n break;default:语句语句n+1 (4).各个各个case 语句只是一个入语句只是一个入口标号口标号,并不确定执行的终止点并不确定执行的终
4、止点.(5).一般在各个一般在各个case 语句最后应该加一语句最后应该加一break语句语句,可使程序流程跳出可使程序流程跳出Switch结构结构.否则会从入口处一直向下执行否则会从入口处一直向下执行.(6 6).).各个各个casecase和和defaultdefault出现的先后次序,并不影响执行结果出现的先后次序,并不影响执行结果.defaultdefault可以没有可以没有.*(7).多个多个case可共用可共用一组执行语句一组执行语句.例如为了统计一段文例如为了统计一段文字中的数字字中的数字,字母及分字母及分隔符的个数隔符的个数,可用下列程序段实现可用下列程序段实现:switch(
5、ch)case 0:case 1:.case 8:case 9:digit+;break;case :case n:case t:white+;break;default:character+;break;这里有一这里有一个空格个空格.表达式后都有表达式后都有一冒号一冒号”:”.*无无break语句句表达式表达式=常量表达式常量表达式1?语句序列句序列真真(非非0)break假假(0)有有break语句句无无break语句句表达式表达式=常量表达式常量表达式2?语句序列句序列2break有有break语句句真真(非非0)假假(0)表达式表达式=常量表达式常量表达式n?语句序列句序列nbreak
6、真真(非非0)假假(0)无无break语句句语句序列句序列n+1有有break语句句switch(表达式表达式)*说明:说明:switch语句不等同于语句不等同于if语句语句:1.switch只能进行值的只能进行值的相等性相等性的检查的检查.2.if语句不但可以进行相等性的检查语句不但可以进行相等性的检查,还可以计算关还可以计算关系系表达式表达式或逻辑表达式或逻辑表达式,进行进行逻辑逻辑判断判断的真假的真假.只进行值的只进行值的相等性相等性的检查的检查,不是逻辑判断不是逻辑判断!*例例7.17.1 键盘输入键盘输入0-60-6之间的整数,分别代表每周的星期日、之间的整数,分别代表每周的星期日、
7、星期一、星期一、星期六、星期六#include int main()int day;printf(请输入星期的数字编号请输入星期的数字编号(0-6):);scanf(%d,&day);.Ch7_7_1.c .switch(day)case 0:printf(星期日星期日 n);break;case 1:printf(星期一星期一 n);break;case 2:printf(星期二星期二 n);break;case 3:printf(星期三星期三 n);break;case 4:printf(星期四星期四 n);break;case 5:printf(星期五星期五 n);break;case
8、6:printf(星期六星期六 n);break;default:printf(输入有误,请输入输入有误,请输入0-6之间的数字!之间的数字!n);return 0;每个每个case分支可有多条语句,分支可有多条语句,可不用花括号可不用花括号,也可以用。也可以用。表表达达式式有有一一个个确确定定的的值值(不不是是逻辑值逻辑值).*例例7.27.2 求执行下列程序段后求执行下列程序段后k的值的值#include int main()char c=2;int k=1;switch(c+1-0)case 2:k+=1;case 2+1:k+=2;case 4:k+=3;printf(k=%dn,k)
9、;return 0;一般在各个一般在各个case 语句最后应该加一语句最后应该加一break语语句句,可使程序流程跳出可使程序流程跳出Switch结构结构.否则会从入口处一直向下执行否则会从入口处一直向下执行.0的的ASCII值为值为48.Ch7_7_2.c*例例7.37.3 执行下列程序,当分别输入执行下列程序,当分别输入A、B、C、E时,求时,求K的值的值.char c;int k=2;scanf(“%c”,&c);switch(c-A)case 0:k+;case 1:K+=2;break;default:k*=k;case 4:k*=3;printf(“k=%d”,k);Ch7_7_3
10、.c*例例7.47.4 输入一字符,如果是输入一字符,如果是Y,N或或y,n,则分别执行一则分别执行一输出语句,如果是其他字母则执行另一输出语句。输出语句,如果是其他字母则执行另一输出语句。#include void main()char ch;printf(Please input Y/N(y/n):);scanf(%c,&ch);.Ch7_7_4.c .switch(ch)case y:case Y:printf(this is Y or y.n);break;case n:case N:printf(this is N or n.n);break;default:printf(this
11、is other char.n);多个多个case可共用一组可共用一组执行语句执行语句.表表达达式式有有一一个个确确定定的的值值(不不是是逻辑值逻辑值).*例例7.57.5 编写程序,实现如下功能。编写程序,实现如下功能。输入一个实数后,屏幕显示如下菜单输入一个实数后,屏幕显示如下菜单:1.1.输出相反数输出相反数 2.2.输出平方数输出平方数 3.3.输出平方根输出平方根 4.4.退出退出#include void main()int i,c=5;float m;printf(输入任意一个整型数:输入任意一个整型数:n);scanf(%f,&m);printf(*n);printf(1,输出
12、相反数输出相反数n);printf(2,输出平方数输出平方数n);printf(“3,输出开方根输出开方根n);printf(4,退出退出n);printf(*n);Ch7_7_5.c*.while(1)scanf(%d,&c);switch(c)case 1:printf(输出相反数输出相反数:%fn,-m);break;case 2:printf(输出平方数输出平方数:%fn,m*m);break;case 3:printf(输出平方根输出平方根:%fn,sqrt(m);break;case 4:break;default:printf(请输入请输入14之间的数字!之间的数字!n);if(
13、c=4)break;Ch7_7_5.c*例7.6 根据输入字符(0-9及A-F(AF)显示与该字符所表示的十六进制数相对应的十进制数。(例如,输入A,输出10,输入0,输出0)#include#includeint main()char ch;for(;)printf(“n请输入十六进制数请输入十六进制数 0 F(输入输入Q 或或 q 退出退出):);scanf(%c,&ch);getchar();printf(输入的是:输入的是:%c,ch);.当输入一个字符当输入一个字符,打一个回车后打一个回车后,输入结束输入结束.但在输入缓冲区中存在二个字符但在输入缓冲区中存在二个字符:输入的字符输入的
14、字符,还还有一个是有一个是n.当打了一个回车后当打了一个回车后(其实是二个动作其实是二个动作:回车回车,换行换行.c语言会把回车语言会把回车,换行自动转换为换行自动转换为n.反之亦然反之亦然.*switch(ch)case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:printf(十进制数十进制数:%dn,ch-0);break;case A:case B:case C:case D:case E:case F:printf(十进制数十进制数:%dn,ch-55);break;Ch7_7_6.cASCII值值
15、:048A65a”97*case a:case b:case c:case d:case e:case f:printf(十进制数十进制数:%dn,ch-87);break;case Q:case q:printf(退出程序退出程序n);exit(0);default:printf(输入有误输入有误!);return 0;ASCII值值:048A65a”97*示例示例:输输入入1010个个字字符符,分分别别统统计计出出其其中中空空格格或或回回车车、数数字字和和其他字符的个数。其他字符的个数。*voidmain()intblank,digit,i,other;charch;blank=digit
16、=other=0;printf(input10characters:);.for(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=%dn”,blank,digit,other);*input10characters:Reold123?blank=1,di
17、git=3,other=6例例例例:#includevoidmain()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注意所属关系*例例7.7 编写一个简易计算器编写一个简易计算器编写一个简易计算器编写一个简易计算器.Ch7_7_7.c*#include#includeintmain()floatnumb1=0,numb2=0;intmenu=1,flag;floattota
18、l=0;charcalType;.*for(;)flag=1;printf(nt希望进行哪种运算希望进行哪种运算?nn);printf(t1:加法加法n);printf(t2:减法减法n);printf(t3:乘法乘法n);printf(t4:除法除法n);printf(t0:退出计算器退出计算器n);printf(nt输入你的选择:输入你的选择:);.*.scanf(%d,&menu);if(menu=0)exit(0);else if(menu4)printf(t 无效的选择无效的选择!n);else printf(t输入两个数中的第一个数:输入两个数中的第一个数:);scanf(%f,&
19、numb1);printf(t输入两个数中的第二个数:输入两个数中的第二个数:);scanf(%f,&numb2);.退出程序.*switch(menu)case1:total=numb1+numb2;calType=+;break;case2:total=numb1-numb2;calType=-;break;case3:total=numb1*numb2;calType=*;break;case4:if(numb2=0)printf(nt不能被不能被0除除n);flag=0;break;total=numb1/numb2;calType=/;break;default:printf(无效的
20、选择!无效的选择!n);*if(flag=1)printf(nn*);printf(nnt%.3f%c%.3f=%.3f,numb1,calType,numb2,total);printf(nn*nn);return0;Ch7_7_7.c*问输出为问输出为?:?:A)K=3 A)K=3 B)K=4B)K=4 C)K=2 D)K=0 C)K=2 D)K=0 main()main()int k=0;char c=int k=0;char c=A A;do do swich(c+)swich(c+)case case A A:K+;break;:K+;break;case case B B:K-;:
21、K-;case case C C:k+=2;break;:k+=2;break;case case D D:K=K%2;continue;:K=K%2;continue;case case E E:K=K*10;break;:K=K*10;break;default:K=K/3;default:K=K/3;K+;K+;while(cwhile(cG G););printf(printf(“K=%dnK=%dn”,K);,K);第第1次次.第第2次次.3.4.5.6.K=2 k=4 k=7 k=1 k=11 k=4c=B c=C c=D c=E c=F c=G*注注:每次执行每次执行switch
22、(C+)switch(C+)时时,先取先取C C的值的值,找到入找到入 口口,然后然后C C增增1.1.当执行到当执行到continuecontinue时时,流程跳过流程跳过do-whiledo-while语句语句 中当未执行的语句中当未执行的语句,而直接转向而直接转向whilewhile的条件表的条件表 达式达式,判循环是否进行判循环是否进行.*练习与实践:练习与实践:1百分制转换成五分制百分制转换成五分制.#includeintmain()intx;printf(请输入学生百分制成绩请输入学生百分制成绩:n输入负数结束程序输入负数结束程序:n);scanf(%d,&x);课本课本P101:
23、1题题*while(x0)switch(x/10)case10:case9:printf(五分制为五分制为:n5nn);break;case8:printf(五分制为五分制为:n4nn);break;case7:printf(五分制为五分制为:n3nn);break;case6:printf(五分制为五分制为:n2nn);break;default:printf(五分制为五分制为:n1nn);break;课本课本P101:1题题*printf(请输入学生百分制成绩请输入学生百分制成绩:n输入负数结束程序输入负数结束程序:n);scanf(%d,&x);printf(谢谢使用,再见谢谢使用,再见
24、:n);return0;*#include#includeintmain()doublex,s;inty;printf(Inputanumber:n);scanf(%lf,&x);2计算计算sin(),cos(),tan().*while(1)printf(您希望进行哪种运算您希望进行哪种运算?n);printf(1.计算计算sin(x)n);printf(2.计算计算cos(x)n);printf(3.计算计算tan(x)n);scanf(%d,&y);switch(y)case1:s=sin(x);printf(sin(%f)=%fn,x,s);break;case2:s=cos(x);printf(cos(%f)=%fn,x,s);break;case3:s=tan(x);printf(tan(%f)=%fn,x,s);break;default:printf(“输入有误,请输入输入有误,请输入1-3之间的数字!之间的数字!n);*if(y=1|y=2|y=3)break;printf(谢谢使用谢谢使用:n);return0;*