1、switch 语句,08:37:32,7.1 switch 语句:switch 语句是一条多分支选择语句.在实际应用中,要在多种情况中选择一种情况,执行某一部分语句。 当然可以使用嵌套的if , if else if语句来处理,但其分支过多,程序冗长,难读, 不够灵巧。,08:37:32,switch语句是C语言中处理多路选择问题的一种更直观和有效的手段. 在测试某个表达式是否与一组常量表达式中的某一值相配时,switch语句显得更为方便.,一般形式如下:,08:37:32,switch(表达式 ) case 常量表达式1:语句1 break;case 常量表达式2:语句2 break;cas
2、e 常量表达式n:语句nbreak;default: 语句n+1,说明:(1). 关于表达式: 表达式可以是整型、字符型等表达式。有一个确定的值(不是逻辑值).,(2). 关于常量表达式1n: 只起到一个标号的作用,根据表达式的值来判断, 找到一个相匹配的入口处,程序往下执行。各个case后的常量表达式的值必须互不相同.,(3). 每个case分支可有多条语句,可不用花括号 。,08:37:32,switch(表达式 ) case 常量表达式1:语句1 break;case 常量表达式2:语句2 break;case 常量表达式n:语句nbreak;default: 语句n+1,(4). 各个
3、case 语句只是一个入口标号,并不确定执行的终止点.,(5). 一般在各个case 语句最后应该加一break语句, 可使程序流程跳出Switch结构. 否则会从入口处一直向下执行.,(6). 各个case和default 出现的先后次序,并不影响执行结果. default可以没有.,08:37:32,(7). 多个case可共用一组执行语句.例如为了统计一段文字中的数字,字母及分隔符的个数, 可用下列程序段实现:,switch(ch) case 0: case 1:. case 8:case 9: digit + ; break ; case :case n: case t:white+
4、; break ;default :character+; break;,这里有一个空格.,表达式后都有一冒号”:” .,08:37:32,无break语句,switch(表达式),08:37:32,说明:,switch语句不等同于if语句: 1. switch只能进行值的相等性的检查.2. if语句不但可以进行相等性的检查, 还可以计算关系表达式或逻辑表达式,进行逻辑判断的真假.,只进行值的相等性 的检查,不是逻辑判断!,08:37:32,例7.1 键盘输入0-6之间的整数,分别代表每周的星期日、星期一、星期六,#include int main( ) int day;printf(“请输入
5、星期的数字编号(0-6): “);scanf(“%d“, .,Ch7_7_1.c,08:37:32,.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 6: printf(“星期六 n“); break;default: printf(“输入有
6、误,请输入0-6之间的数字!n“);return 0; ,每个case分支可有多条语句,可不用花括号 ,也可以用。,表达式有一个确定的值(不是逻辑值).,08:37:32,例7.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);return 0; ,一般在各个case 语句最后应该加一break语句, 可使程序流程跳出Switch结构.否则会从入口处一直向下执行.,0的ASCII值为48.,
7、Ch7_7_2.c,08:37:32,例7.3 执行下列程序,当分别输入A、B、C、E时,求K的值. char c; int k=2; scanf(“%c”, ,Ch7_7_3.c,08:37:32,例7.4 输入一字符,如果是Y, N或y, n,则分别执行一输出语句,如果是其他字母则执行另一输出语句。,#include void main() char ch;printf(“Please input Y/N (y/n): “);scanf(“%c“, .,Ch7_7_4.c,08:37:32,.switch(ch)case y:case Y: printf(“this is Y or y.
8、n“); break;case n:case N:printf(“this is N or n. n“); break;default: printf(“this is other char. n“); ,多个case可共用一组执行语句.,表达式有一个确定的值(不是逻辑值).,08:37:32,例7.5 编写程序,实现如下功能。输入一个实数后,屏幕显示如下菜单:1. 输出相反数2. 输出平方数3. 输出平方根4. 退出,08:37:32,#include void main() int i, c=5;float m;printf(“输入任意一个整型数:n“);scanf(“%f“, ,Ch7_
9、7_5.c,08:37:32,while(1)scanf(“%d“, ,Ch7_7_5.c,08:37:32,例7. 6 根据输入字符(0-9及A-F(af)显示与该字符所表示的十六进制数相对应的十进制数。 (例如,输入A,输出10,输入0,输出0),08:37:32,#include #include int main( ) char ch;for(; ; )printf(“n请输入十六进制数 0 F ( 输入Q 或 q 退出): “);scanf(“%c“, .,当输入一个字符,打一个回车后,输入结束.但在输入缓冲区中存在二个字符:输入的字符,还有一个是n.,当打了一个回车后(其实是二个动
10、作:回车,换行.c语言会把回车,换行自动转换为n.反之亦然.,08:37:32,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.c,ASCII值: 0 48 A 65 a” 97,08:37:32,case a: case
11、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值: 0 48 A 65 a” 97,08:37:32,示例:输入10个字符,分别统计出其中空格或回车、数字和其他字符的个数。,void main( ) int blank, digit, i, other; char ch; blank = digit = other = 0; printf(“inpu
12、t 10 characters: “);.,08:37:32,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); ,
13、input 10 characters: Reold 123? blank=1, digit=3, other=6,08:37:32,例: #include void main( ) int i ; for(i = 0; i 3; i+) switch(i) case 1: printf(“%d“,i);case 2: printf(“%d“,i);default: printf(“%d“,i); ,以下程序的输出结果是: A. 011122 B. 012 C. 012020 D. 120,注意所属关系,08:37:32,例7. 7 编写一个简易计算器.,Ch7_7_7.c,08:37:32,
14、#include #include int main() float numb1 = 0, numb2 = 0;int menu = 1, flag;float total=0;char calType;.,08:37:32,for(;)flag=1;printf(“nt希望进行哪种运算?nn“);printf(“t 1:加法n“);printf(“t 2:减法n“);printf(“t 3:乘法n“);printf(“t 4:除法n“); printf(“t 0:退出计算器n“);printf(“nt输入你的选择:“);.,08:37:32,.scanf(“%d“,.,退出程序.,08:37
15、:32,switch(menu)case 1: total=numb1+numb2;calType=+; break;case 2: total=numb1-numb2; calType=-; break;case 3: total=numb1*numb2;calType=*;break;case 4: if(numb2=0) printf(“nt不能被0除n“); flag=0;break; total=numb1/numb2;calType=/;break; default: printf(“无效的选择!n“);,08:37:32,if(flag=1)printf(“nn*“);print
16、f(“nnt%.3f %c %.3f = %.3f“, numb1, calType, numb2, total);printf(“nn*nn“);return 0; ,Ch7_7_7.c,08:37:32,问输出为?: A) K=3 B) K=4 C)K=2 D)K=0main( ) int k=0; char c=A;do swich(c+) case A: K+; break;case B: K-;case C: k+=2; break;case D: K=K%2; continue;case E: K=K*10; break;default: K=K/3;K+;while(cG);pr
17、intf(“K=%dn”,K); ,第1次. 第2次. 3. 4. 5. 6. K=2 k=4 k=7 k=1 k=11 k=4 c=B c=C c=D c=E c=F c=G,08:37:32,注: 每次执行switch(C+)时,先取C的值,找到入口,然后C增1. 当执行到continue时,流程跳过do-while语句 中当未执行的语句,而直接转向while的条件表达式,判循环是否进行.,08:37:32,练习与实践:1百分制转换成五分制.#includeint main()int x;printf(“请输入学生百分制成绩:n输入负数结束程序:n“);scanf(“%d“,课本 P101
18、: 1题,08:37:32,while(x0) switch(x/10)case 10: case 9:printf(“五分制为:n5nn“);break; case 8:printf(“五分制为:n4nn“);break;case 7: printf(“五分制为:n3nn“);break;case 6: printf(“五分制为:n2nn“);break;default:printf(“五分制为:n1nn“);break;,课本 P101: 1题,08:37:32,printf(“请输入学生百分制成绩:n输入负数结束程序:n“);scanf(“%d“, ,08:37:32,#include #include int main() double x,s;int y;printf(“Input a number:n“);scanf(“%lf“,2计算sin(),cos(),tan().,08:37:32,while(1)printf(“您希望进行哪种运算?n“);printf(“1.计算sin(x)n“);printf(“2.计算cos(x)n“);printf(“3.计算tan(x)n“);scanf(“%d“,08:37:32,if(y=1|y=2|y=3)break;printf(“谢谢使用:n“);return 0; ,08:37:32,