switch语句是多分支选择语句,用来实现多分支选择结构。例如,学生成绩等级分类(等级A:90分以上;B:80≤score<90;C:70≤score<80,D:60≤score<70;E:score<60),设计一个简单的计算器等。虽然这些都可以用嵌套的if语句来实现,但如果分支较多,则嵌套的if语句层数多,程序长,可读性差,容易出错,若使用switch语句则相对清晰简单。
switch语句格式为:
格式说明:
(1)switch语句的执行过程:首先计算switch后圆括号内的表达式的值,然后用该值逐个与case后的常量表达式进行比较。当找到相匹配的值时,就执行其后的语句。如果所有case后面的常量表达式的值都不匹配时,则执行default后的语句。
(2)switch、case、break和default都是关键字。switch的语句体必须用“{}”括起来。表达式的值可以是整型、字符型或枚举型数据,要用小括号括起来且后面没有分号。
(3)case与常量表达式之间必须用空格隔开。每个case后面常量表达式的值必须互不相同,否则就会出现互相矛盾的现象,即对于表达式的同一个值,却有两种或多种不同的处理语句。
(4)break语句是可选项,可根据具体情况选择使用或不使用break语句。在执行匹配case后的语句时,如果没有break语句,程序将接着执行后面,“case常量表达式”只是起语句标号作用,并不是在该处进行条件判断。如果有break语句,则不再执行后面的case里的语句,而是立即跳出switch语句,去执行switch的后续语句。也就是说break语句的功能是终止switch语句的执行。图3-5所示的是有break语句的情况。
(5)当case后包含多个语句时,可以不用花括号括起来,系统会自动识别并顺序执行所有语句。
(6)各个case出现的次序不影响执行结果,可以交换顺序。多个case可以共用一组执行语句。例如下列语句中,当表达式值取10和9时都执行同一组语句。
…
case 10:
case 9:printf("A");break;
…
图3-5 switch语句流程图
下面给出示例程序。
【例3-14】程序li3_2_1。
【程序说明】
(1)用switch语句处理多分支问题时,首先要确定switch后的表达式。考虑到成绩的分布特点,表达式确定为score/10。
90≤score≤100时,score/10的取值分别10、9
80≤score<90时,score/10的取值分别8
70≤score<80时,score/10的取值分别7
60≤score<70时,score/10的取值分别6
score<60时,score/10的取值均小于6
(2)根据表达式score/10的各种取值情况,确定case后常量表达式的值为6、7、8、9、10,score/10小于6时执行default后的操作。
(3)一定要有break语句,使流程及时跳出switch结构,否则会出错。假如程序中所有的break语句都去掉,当输入score的值为90时,输出结果为如下所示,很显然不符合要求。
输入成绩0~100的整数:90
【例3-15】程序li3_2_2。
【例3-16】程序li3_2_3。
【程序说明】
(1)语句scanf("%lf %c %lf",&s1,&op,&s2);中,格式控制符之间设有空格,在执行时数值和运算符之间可以有任意个空格,但如果第一个%lf和%c之间没有空格,则在执行时不能用空格进行分隔,否则会将空格赋给变量op。
(2)在除法运算中,要判断分母是否为0。因为s2是浮点数,浮点数的存储具有近似性,如0.2,可能存储为0.1999999,所以,浮点数不能用“==”或“!=”来判断是否相等,而是要用两个浮点数的差的绝对值是否足够小来判断。所以,判断s2是否为0可以用语句(fabs(s2)>1e-10)来进行,1e-10是一个非常小的浮点常数,表示1-10,接近于零。
项目小结
本项目主要讲了C语言程序设计3种基本结构中的选择结构。重点讲述了if语句和switch语句。
选择结构又称为分支结构,其特点是根据条件来判断哪些语句被执行。如图3-1所示,虚线框内是一个简单的选择结构,先计算条件表达式的值,根据其值分成两个分支。如果为真,则执行程序段A,如果为假,则执行程序段B,所以A程序段和B程序段是有选择的进行执行,不可能两个模块都执行。选择结构主要用于解决不同条件选择不同操作的多分支类的问题,在大多数程序设计中都会用到。选择结构是结构化设计三种基本结构之一,同样只有一个入口(a点)和一个出口(b点)。
按照分支数的不同分为单分支选择结构、双分支选择结构和多分支选择结构,C语言提供了if语句和switch语句实现这些分支结构。if语句,主要用于单向选择;if…else语句,主要用于双向选择;if…else…if语句和switch语句,用于多向选择。
课后习题
一、单项选择题
1.if后面的逻辑表达式之值( )。
A.只能是0或1B.只能是正整数或负整数
C.只能是整型或字符型数据D.可以是任何类型的数据
2.为了避免嵌套的i f…else语句的二义性,C语言规定else总是与( )组成配对关系。
A.缩排位置相同的i fB.在其之前未配对的i f
C.在其之前最近的未配对的i fD.同一行上的i f
3.选择出合法的if语句(设int x,a,b,c;)( )。(www.xing528.com)
A.if(a=b)x++;B.if(a=<b)x++;
C.if(a<>b)x++;D.if(a=>b)x++;
4.以下不正确的if语句是( )。
A.if(x>y);
B.if(x=y)&&(x!=0)x+=y;
C.if(x!=y)scanf("%d",&x);else scanf("%d",&y);
D.if(x<y){x++;y--;}
5.若定义float x;int a,b;,则正确的switch语句是( )。
A.switch(x)
B.switch(x)
C.switch(a+b)
D.switch(a+b)
6.执行下列程序,输入为1的运行结果是________,输入为3的运行结果是________。
①A.1 B.2 C.2 3 4 5 D.1 2 3 4
②A.3 B.4 C.3 4 D.4 5
7.执行下列程序,输入为1的运行结果是_________,输入为3的运行结果是_________。
①A.1 B.2 C.2 3 4 5 D.1 2 3 4
②A.3 B.4 C.3 4 D.4 5
8.以下程序的运行结果是( )。
A.a=2,b=1 B.a=1,b=1 C.a=1,b=0 D.a=2,b=2
二、填空题
1.有定义int x;则“x是偶数”的表达式是_________。
2.有定义int a,b;则“a是b的整数倍”的表达式是________。
3.有定义int a,b,c;它们表示三个边长,则能够构成一个直角三角形的条件是_________。
4.有定义int a,b,c;它们表示三个边长,则能够构成一个三角形的条件是_________。
5.以下程序的运行结果是_________。
6.以下程序的运行结果是________。
7.以下程序的运行结果是________。
8.以下程序的运行结果是_________。
三、编程题
1.假设今天是星期日,编写一个程序,求123456天后是星期几。
2.报数游戏。A、B、C、D、E、F、G、H共8人站成一排,按下图所示的方法从1开始报数。问谁先报到123456。
ABCDEFGH
1→ 2→3→4→5→6→7→8
14←13←12←11←10←9
15→16→17→18→19→20→21→22
28←27←26←25←24←23
29→30→…
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。