第三版C语言PPT课件讲解第05章+选择结构程序设计.ppt
第三版第三版C语言语言PPT课件课件讲解第讲解第05章章+选择结构选择结构程序设计程序设计5.1 5.1 关系运算符和关系表达式关系运算符和关系表达式关系运算符和关系表达式关系运算符和关系表达式 关系运算关系运算关系运算关系运算实质是实质是实质是实质是比较运算比较运算比较运算比较运算,它是将两个值进行比较,它是将两个值进行比较,它是将两个值进行比较,它是将两个值进行比较,判断其比较的结果是否符合给定的条件,其结果为判断其比较的结果是否符合给定的条件,其结果为判断其比较的结果是否符合给定的条件,其结果为判断其比较的结果是否符合给定的条件,其结果为真真真真(1 1)或者为)或者为)或者为)或者为假假假假(0 0)。)。)。)。5.1.15.1.1关系运算符及其优先次序关系运算符及其优先次序关系运算符及其优先次序关系运算符及其优先次序C C语言提供了语言提供了语言提供了语言提供了6 6种关系运算符:种关系运算符:种关系运算符:种关系运算符:小于小于小于小于 =大于大于大于大于 =大于或等于大于或等于大于或等于大于或等于 =等于等于等于等于 !=!=不等于不等于不等于不等于 优先级相同(高)优先级相同(高)优先级相同(高)优先级相同(高)优先级相同(低)优先级相同(低)优先级相同(低)优先级相同(低)说明:说明:1)关系运算符的优先级低于算术运算符;)关系运算符的优先级低于算术运算符;2)关系运算符的优先级高于赋值运算符)关系运算符的优先级高于赋值运算符5.1.2 5.1.2 关系表达式关系表达式关系表达式关系表达式 用关系运算符将两个表达式(可以是算术表达式或用关系运算符将两个表达式(可以是算术表达式或用关系运算符将两个表达式(可以是算术表达式或用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式、赋值表达式、字符表达式)关系表达式,逻辑表达式、赋值表达式、字符表达式)关系表达式,逻辑表达式、赋值表达式、字符表达式)关系表达式,逻辑表达式、赋值表达式、字符表达式)连接起来的式子,称为连接起来的式子,称为连接起来的式子,称为连接起来的式子,称为关系表达式关系表达式关系表达式关系表达式。下面为一些合法的。下面为一些合法的。下面为一些合法的。下面为一些合法的关系表达式:关系表达式:关系表达式:关系表达式:a+bb+ca+bb+c(a=3)(b=5)(a=3)(b=5)ab ab 关系表达式的结果只有两种:关系表达式的结果只有两种:关系表达式的结果只有两种:关系表达式的结果只有两种:真或假真或假真或假真或假;在;在;在;在C C语言中,语言中,语言中,语言中,以数值以数值以数值以数值1 1代表代表代表代表“真真真真”,数值,数值,数值,数值0 0代表代表代表代表“假假假假”。例:假设例:假设例:假设例:假设a=3,b=2,c=1a=3,b=2,c=1,则:,则:,则:,则:(ab)=c(ab)=cd=abd=abf=abcf=abc结果为:表达式的值为结果为:表达式的值为结果为:表达式的值为结果为:表达式的值为1(1(真真真真);结果为:结果为:结果为:结果为:d d 的值为的值为的值为的值为1,1,表达式的值为表达式的值为表达式的值为表达式的值为1 1;结果为:结果为:结果为:结果为:f f 的值为的值为的值为的值为0,0,表达式的值为表达式的值为表达式的值为表达式的值为0 0;5.2 5.2 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式5.2.1 5.2.1 逻辑运算符及其优先次序逻辑运算符及其优先次序逻辑运算符及其优先次序逻辑运算符及其优先次序C C语言提供三种逻辑运算符:语言提供三种逻辑运算符:语言提供三种逻辑运算符:语言提供三种逻辑运算符:(1)&逻辑与(与运算符)逻辑与(与运算符)(2)|逻辑或(或运算符)逻辑或(或运算符)(3)!逻辑非(非运算符)逻辑非(非运算符)说明:说明:1)“&”和和“|”为双目运算符,为双目运算符,“!”为单目运算符;为单目运算符;2)逻辑运算的结果只有两种:)逻辑运算的结果只有两种:真真或或假假。逻辑运。逻辑运 算的真值表详细情况见书算的真值表详细情况见书P93表表5.1。几种运算符的优先次序为:几种运算符的优先次序为:!(非非)(高)(高)算术运算符算术运算符关系运算符关系运算符&和和|赋值运算符赋值运算符 (低(低)例:例:!a&b|xy&c5.2.2 5.2.2 逻辑表达式逻辑表达式逻辑表达式逻辑表达式 给出逻辑运算结果给出逻辑运算结果给出逻辑运算结果给出逻辑运算结果:数值数值数值数值1 1代表代表代表代表“真真真真”,数值数值数值数值0 0代表代表代表代表“假假假假”判断一个量是否为判断一个量是否为判断一个量是否为判断一个量是否为“真真真真”:0 0代表代表代表代表“假假假假”,非非非非0 0代表代表代表代表“真真真真”例:例:例:例:1 1)若)若)若)若a=4a=4,则,则,则,则!a=0!a=0;2 2)若)若)若)若a=4a=4,b=5 b=5 则则则则 a&b=1 a&b=1;a|b=1a|b=1;!a|b=1!a|b=1;3 3)53&2|83&2|8b)&(n=cd)(m=ab)&(n=cd),如果,如果,如果,如果“ab”“ab”的值的值的值的值为为为为0 0,则,则,则,则n n将不进行赋值运算而保留原值将不进行赋值运算而保留原值将不进行赋值运算而保留原值将不进行赋值运算而保留原值(Why?Why?);一个重要的例子:一个重要的例子:一个重要的例子:一个重要的例子:判断某一年是否为闰年的方法。而为闰年的条件是判断某一年是否为闰年的方法。而为闰年的条件是判断某一年是否为闰年的方法。而为闰年的条件是判断某一年是否为闰年的方法。而为闰年的条件是符合下面两者之一:符合下面两者之一:符合下面两者之一:符合下面两者之一:(1 1)能被)能被)能被)能被4 4整除,但不能被整除,但不能被整除,但不能被整除,但不能被100100整除;整除;整除;整除;(2 2)能被)能被)能被)能被4 4整除,又能被整除,又能被整除,又能被整除,又能被400400整除;整除;整除;整除;写出逻辑表达式:写出逻辑表达式:写出逻辑表达式:写出逻辑表达式:首先分析逻辑结构:首先分析逻辑结构:首先分析逻辑结构:首先分析逻辑结构:1 1、条件(、条件(、条件(、条件(1 1)和条件()和条件()和条件()和条件(2 2)的关系应该是)的关系应该是)的关系应该是)的关系应该是“或或或或”;2 2、而每个条件内部应该为、而每个条件内部应该为、而每个条件内部应该为、而每个条件内部应该为“与与与与”关系;关系;关系;关系;3 3、条件(、条件(、条件(、条件(2 2)内,满足被)内,满足被)内,满足被)内,满足被400400整除的一定满足被整除的一定满足被整除的一定满足被整除的一定满足被4 4整整整整除,因此只需一个逻辑表达式即可;除,因此只需一个逻辑表达式即可;除,因此只需一个逻辑表达式即可;除,因此只需一个逻辑表达式即可;所以最后的逻辑表达式为:所以最后的逻辑表达式为:所以最后的逻辑表达式为:所以最后的逻辑表达式为:(year%4=0)&(year%100!=0)|(year%400=0)(year%4=0)&(year%100!=0)|(year%400=0)根据运算符的优先级关系,上式可简化为:根据运算符的优先级关系,上式可简化为:根据运算符的优先级关系,上式可简化为:根据运算符的优先级关系,上式可简化为:year%4=0&year%100!=0|year%400=0year%4=0&year%100!=0|year%400=05.3 if 语句语句5.3.1 if 5.3.1 if 语句的三种形式:语句的三种形式:语句的三种形式:语句的三种形式:1.1.if(if(表达式表达式表达式表达式)语句;语句;语句;语句;执行过程,如左图:执行过程,如左图:执行过程,如左图:执行过程,如左图:if(xy)printf(“%d”,x);if(xy)printf(“%d”,x);表达式语句假(0)真(非0)XYprintf(“%d”,x);printf(“%d”,x);假(0)真(非0)2.2.if(if(表达式表达式表达式表达式)语句语句语句语句1 1;else else 语句语句语句语句2 2;例如:例如:例如:例如:if(xy)printf(“%d”,x);if(xy)printf(“%d”,x);else printf(“%d”,y);else printf(“%d”,y);表达式语句1假(0)真(非0)语句2xyxyprintf(“%d”,x)printf(“%d”,x)假(0)真(非0)printf(“%d”,y)printf(“%d”,y)3.3.if(if(表达式表达式表达式表达式1)1)语句语句语句语句1 1;else if(else if(表达式表达式表达式表达式2)2)语句语句语句语句2 2;else if(else if(表达式表达式表达式表达式3)3)语句语句语句语句3 3;else if(else if(表达式表达式表达式表达式m)m)语句语句语句语句mm;else else 语句语句语句语句n n;表达式1语句1假真表达式2语句2真假表达式3语句3语句4真假表达式4语句5假真例:例:例:例:if (number500)cost=0.15;if (number500)cost=0.15;else if(number300)cost=0.10;else if(number300)cost=0.10;else if(number100)cost=0.075;else if(number100)cost=0.075;else if(number50)cost=0.05;else if(number50)cost=0.05;else cost=0;else cost=0;number500number500cost=0.15cost=0.15假真cost=0.10cost=0.10真假cost=0.075cost=0.075cost=0.05cost=0.05真假cost=0cost=0假真number300number300number100number100number50number50说明:说明:说明:说明:1 1)if if 语句中在语句中在语句中在语句中在if if后面都有表达式,一般为后面都有表达式,一般为后面都有表达式,一般为后面都有表达式,一般为逻辑表达式逻辑表达式逻辑表达式逻辑表达式或或或或关系表达式关系表达式关系表达式关系表达式,也可以为,也可以为,也可以为,也可以为其它表达式其它表达式其它表达式其它表达式;如果表达式的值为;如果表达式的值为;如果表达式的值为;如果表达式的值为0,0,则按则按则按则按“假假假假”处理,如果为非处理,如果为非处理,如果为非处理,如果为非0 0,则按,则按,则按,则按“真真真真”处理;处理;处理;处理;例如:例如:例如:例如:if(3)printf(“O.K.”);if(3)printf(“O.K.”);直接执行打印直接执行打印直接执行打印直接执行打印“O.K.”“O.K.”if(a)printf(“%d”,a);if(a)printf(“%d”,a);打印打印打印打印aa的的的的ASCIIASCII码码码码97972 2)注意在注意在注意在注意在if if 语句每个语句后都有分号;语句每个语句后都有分号;语句每个语句后都有分号;语句每个语句后都有分号;if (number500)cost=0.15if (number500)cost=0.15;else if(number300)cost=0.10else if(number300)cost=0.10;else if(number100)cost=0.075else if(number100)cost=0.075;else if(number50)cost=0.05else if(number50)cost=0.05;else cost=0;else cost=0;3)3)在在在在if if和和和和elseelse后面可以只含一个内嵌的操作语句,后面可以只含一个内嵌的操作语句,后面可以只含一个内嵌的操作语句,后面可以只含一个内嵌的操作语句,也可以有多个操作语句,此时须用花括号也可以有多个操作语句,此时须用花括号也可以有多个操作语句,此时须用花括号也可以有多个操作语句,此时须用花括号“”将将将将几个语句括起来成为一个几个语句括起来成为一个几个语句括起来成为一个几个语句括起来成为一个复合语句复合语句复合语句复合语句。例:例:例:例:if (a b)if (a b)m=a;m=a;printf(“The MAX number is%d”,m);printf(“The MAX number is%d”,m);else else m=b;m=b;printf(“The MAX number is%d”,printf(“The MAX number is%d”,m);m);例例例例5.15.1:输入两个实数,按代数值由小到大的次序输出这输入两个实数,按代数值由小到大的次序输出这输入两个实数,按代数值由小到大的次序输出这输入两个实数,按代数值由小到大的次序输出这 两个数;两个数;两个数;两个数;分析:分析:分析:分析:这是一个简单而重要的程序,算法的关键在与设这是一个简单而重要的程序,算法的关键在与设这是一个简单而重要的程序,算法的关键在与设这是一个简单而重要的程序,算法的关键在与设 置一个中间交换变量,用于比较两个实数的大小置一个中间交换变量,用于比较两个实数的大小置一个中间交换变量,用于比较两个实数的大小置一个中间交换变量,用于比较两个实数的大小 后进行次序的变换;后进行次序的变换;后进行次序的变换;后进行次序的变换;程序:程序:程序:程序:main()main()float a,b,t;float a,b,t;scanf(“%f,%f”,&a,&b);scanf(“%f,%f”,&a,&b);if(a b)if(a b)t=a;a=b;b=t;t=a;a=b;b=t;printf(“%5.2f,%5.2f”,a,b);printf(“%5.2f,%5.2f”,a,b);例例例例5.25.2 输入输入输入输入3 3个数个数个数个数a a、b b、c c,要求按由小到大的顺序输出;,要求按由小到大的顺序输出;,要求按由小到大的顺序输出;,要求按由小到大的顺序输出;分析分析分析分析:此题算法比上题稍微复杂一些。上题为两个变量此题算法比上题稍微复杂一些。上题为两个变量此题算法比上题稍微复杂一些。上题为两个变量此题算法比上题稍微复杂一些。上题为两个变量 比较大小,只需进行一次比较,而本题为三个变比较大小,只需进行一次比较,而本题为三个变比较大小,只需进行一次比较,而本题为三个变比较大小,只需进行一次比较,而本题为三个变 量,则需进行三次比较。量,则需进行三次比较。量,则需进行三次比较。量,则需进行三次比较。其伪代码算法为:其伪代码算法为:其伪代码算法为:其伪代码算法为:if ab if ab 将将将将a a和和和和b b对换对换对换对换 (对换之后,(对换之后,(对换之后,(对换之后,a a比比比比b b小)小)小)小)if ac if ac 将将将将a a和和和和c c对换对换对换对换 (对换之后,(对换之后,(对换之后,(对换之后,a a比比比比c c小,小,小,小,a a为最小)为最小)为最小)为最小)if bc if bc 将将将将b b和和和和c c对换对换对换对换 (对换之后,(对换之后,(对换之后,(对换之后,b b比比比比c c小,小,小,小,b b为次小)为次小)为次小)为次小)经过三次比较和变换后:经过三次比较和变换后:经过三次比较和变换后:经过三次比较和变换后:a a为最小值,为最小值,为最小值,为最小值,b b为次小值,为次小值,为次小值,为次小值,c c为最大值。为最大值。为最大值。为最大值。程序可写为程序可写为程序可写为程序可写为:#include#include Void main()Void main()float a,b,c,t;float a,b,c,t;scanf(“%f,%f,%f”,&a,&b,&c);scanf(“%f,%f,%f”,&a,&b,&c);if(a b)if(a b)t=a;a=b;b=t;t=a;a=b;b=t;if(a c)if(a c)t=a;a=c;c=t;t=a;a=c;c=t;if(b c)if(b c)t=b;b=c;c=t;t=b;b=c;c=t;printf(“%5.2f,%5.2f,%5.2f”,a,b,c);printf(“%5.2f,%5.2f,%5.2f”,a,b,c);5.3.2 if语句的嵌套语句的嵌套一般形式一般形式一般形式一般形式:if()if()if()if()语句语句语句语句1 1 else else 语句语句语句语句2 2 else else if()if()语句语句语句语句3 3 else else 语句语句语句语句4 4注意:注意:注意:注意:if if与与与与elseelse的配对关系。的配对关系。的配对关系。的配对关系。elseelse总是与它上面的总是与它上面的总是与它上面的总是与它上面的最最最最近近近近的的的的 if if 配对。配对。配对。配对。if()if()if()if()语句语句语句语句1 1elseelse if()if()语句语句语句语句2 2 else else 语句语句语句语句3 3if()if()if()if()语句语句语句语句1 1 elseelse if()if()语句语句语句语句2 2 else else 语句语句语句语句3 3此if,else配对此if,else配对它们共同构成第一个If的内嵌语句加上一个花括符,限定了内嵌if语句的范围,可避免上述错误的出现例例例例5.35.3有一函数:有一函数:有一函数:有一函数:编一程序,输入一个编一程序,输入一个编一程序,输入一个编一程序,输入一个x x值,输出值,输出值,输出值,输出y y值。值。值。值。算法算法算法算法a:a:若若若若x0 y=-1x0 y=1x0 y=1 输出输出输出输出x x算法算法算法算法b:b:输入输入输入输入x x 若若若若x0 y=-1x0 y=1x0 y=1 输出输出输出输出y y开始输入xx=0)if(x=0)if(x0)y=1;if(x0)y=1;else y=0;else y=0;else y=-1;else y=-1;printf(“x=%d,y=%dn”,x,y);printf(“x=%d,y=%dn”,x,y);x=0Yy=-1x0YNNy=1y=0错误例之一错误例之一错误例之一错误例之一的程序及流程图片段:的程序及流程图片段:的程序及流程图片段:的程序及流程图片段:y=-1y=-1if(x!=0)if(x!=0)if(x0)y=1;if(x0)y=1;else y=0else y=0 x!=0Yy=-1x0YNNy=1y=0此程序的错误此程序的错误在于当在于当x=0时时使使y=-1而产生错误的原因是而产生错误的原因是认为第二行的认为第二行的if和第和第四行的四行的else配对配对书P101程序4也是犯了同样的错误5.3.3 条件运算符条件运算符条件运算符的引入:条件运算符的引入:条件运算符的引入:条件运算符的引入:简化某些简单的简化某些简单的简化某些简单的简化某些简单的if if语句。例如:语句。例如:语句。例如:语句。例如:if(ab)if(ab)max=a;max=a;else else max=b;max=b;可以写为:可以写为:可以写为:可以写为:max=(ab)?a:b;max=(ab)?a:b;条件表达式的一般形式为:条件表达式的一般形式为:条件表达式的一般形式为:条件表达式的一般形式为:表达式表达式表达式表达式1?1?表达式表达式表达式表达式2 2:表达式:表达式:表达式:表达式3 3这是这是这是这是C C语言中惟一的三目运算,其语言中惟一的三目运算,其语言中惟一的三目运算,其语言中惟一的三目运算,其流程图如左图所示。流程图如左图所示。流程图如左图所示。流程图如左图所示。表达式1条件表达式取表达式2的值条件表达式取表达式3的值真(非0)假(0)说明:说明:说明:说明:1 1)执行顺序)执行顺序)执行顺序)执行顺序:先:先:先:先求解表达式求解表达式求解表达式求解表达式1 1,若为若为若为若为真真真真(非非非非0)0),则求解表达,则求解表达,则求解表达,则求解表达式式式式2 2,并把,并把,并把,并把表达式表达式表达式表达式2 2的值的值的值的值作为整个条件表达式的值;否则作为整个条件表达式的值;否则作为整个条件表达式的值;否则作为整个条件表达式的值;否则求解表达式求解表达式求解表达式求解表达式3 3,把,把,把,把表达式表达式表达式表达式3 3的值的值的值的值作为整个条件表达式的值;作为整个条件表达式的值;作为整个条件表达式的值;作为整个条件表达式的值;例:例:例:例:max=(ab)?a:bmax=(ab)?a:b2 2)条件运算符优先于赋值运算符,而低于关系运算符和)条件运算符优先于赋值运算符,而低于关系运算符和)条件运算符优先于赋值运算符,而低于关系运算符和)条件运算符优先于赋值运算符,而低于关系运算符和算术运算符;算术运算符;算术运算符;算术运算符;所以:所以:所以:所以:max=(ab)?a:bmax=(ab)?a:b,可以写成:,可以写成:,可以写成:,可以写成:max=ab?a:b max=ab?a:b ab?a:b+1ab?a:b+1相当于相当于相当于相当于ab?a:(b+1)ab?a:(b+1),而不是,而不是,而不是,而不是(ab?a:b)+1(ab?a:b)+13 3)条件运算符的结合方式为)条件运算符的结合方式为)条件运算符的结合方式为)条件运算符的结合方式为“自右向左自右向左自右向左自右向左”。如:如:如:如:ab?a:cd?c:dab?a:cd?c:d相当于相当于相当于相当于ab?a:(cd?c:d)ab?a:(cd?c:d)4 4)条件表达式不能取代一般的条件表达式不能取代一般的条件表达式不能取代一般的条件表达式不能取代一般的if if语句,只有在语句,只有在语句,只有在语句,只有在if if语句中内语句中内语句中内语句中内嵌的语句为嵌的语句为嵌的语句为嵌的语句为赋值语句赋值语句赋值语句赋值语句,且两个分支都给,且两个分支都给,且两个分支都给,且两个分支都给同一变量赋值同一变量赋值同一变量赋值同一变量赋值时时时时才能代替才能代替才能代替才能代替if if语句。语句。语句。语句。if(ab)max=a;if(ab)max=a;else max=b;else max=b;5 5)条件表达式中,条件表达式中,条件表达式中,条件表达式中,表达式表达式表达式表达式1 1的类型可以与的类型可以与的类型可以与的类型可以与表达式表达式表达式表达式2 2和和和和表达表达表达表达式式式式3 3的的的的类型不同类型不同类型不同类型不同。表达式。表达式。表达式。表达式2 2和表达式和表达式和表达式和表达式3 3的类型也可以不同,的类型也可以不同,的类型也可以不同,的类型也可以不同,而表达式的值取它们之中较高的类型。而表达式的值取它们之中较高的类型。而表达式的值取它们之中较高的类型。而表达式的值取它们之中较高的类型。例例例例1 1:设:设:设:设x x为整型变量,有为整型变量,有为整型变量,有为整型变量,有x?a:bx?a:b例例例例2 2:xy?1:1.5 xy?1:1.5,当,当,当,当xyxy时,表达式的值转换为时,表达式的值转换为时,表达式的值转换为时,表达式的值转换为1.01.0例例例例 5.4 5.4 输入一个字符,判断它是否为大写字母,如果是,将它输入一个字符,判断它是否为大写字母,如果是,将它输入一个字符,判断它是否为大写字母,如果是,将它输入一个字符,判断它是否为大写字母,如果是,将它转换为小写字符;如果不是,不转换。然后输出最后得到的字转换为小写字符;如果不是,不转换。然后输出最后得到的字转换为小写字符;如果不是,不转换。然后输出最后得到的字转换为小写字符;如果不是,不转换。然后输出最后得到的字符。符。符。符。main()main()char ch;char ch;scanf(“%c”,&ch);scanf(“%c”,&ch);ch=(ch=A&ch=A&ch=Z)?(ch+32):ch;printf(“%c”,ch);printf(“%c”,ch);此程序介绍一个大小写字母转换的方法,值得注意和掌握。此程序介绍一个大小写字母转换的方法,值得注意和掌握。此程序介绍一个大小写字母转换的方法,值得注意和掌握。此程序介绍一个大小写字母转换的方法,值得注意和掌握。5.4 switch语句语句一般形式:一般形式:一般形式:一般形式:switch(switch(表达式表达式表达式表达式)case case 常量表达式常量表达式常量表达式常量表达式1 1:语句:语句:语句:语句1 1 case case 常量表达式常量表达式常量表达式常量表达式2 2:语句:语句:语句:语句2 2 case case 常量表达式常量表达式常量表达式常量表达式n n:语句:语句:语句:语句n n default:default:语句语句语句语句n+1n+1 流程图如右图所示。流程图如右图所示。流程图如右图所示。流程图如右图所示。表达式=常量表达式1表达式=常量表达式2表达式=常量表达式n语句1语句2语句ndefault语句n+1例:要求按照考试成绩的登记打印出百分制分数段。例:要求按照考试成绩的登记打印出百分制分数段。例:要求按照考试成绩的登记打印出百分制分数段。例:要求按照考试成绩的登记打印出百分制分数段。switch(grade)switch(grade)caseA:printf(“85100n”);caseA:printf(“85100n”);caseB:printf(“7084n”);caseB:printf(“7084n”);caseC:printf(“6069n”);caseC:printf(“6069n”);caseD:printf(“60n”);caseD:printf(“60n”);default:printf(“errorn”);default:printf(“errorn”);如果如果如果如果gradegrade的值等于的值等于的值等于的值等于AA,则将连续输出:,则将连续输出:,则将连续输出:,则将连续输出:85100851007084 7084 606960696060errorerror产生这样结果的原因是:“case常量表达式”只是起语句标号作用,并不是在该处进行条件判断。因此,根据switch后面表达式的值找到匹配的入口标号,就从此开始执行下去,不再进行判断。而这种流程控制并不是我们通常所希望的。我们通常情况下,希望在执行一个我们通常情况下,希望在执行一个我们通常情况下,希望在执行一个我们通常情况下,希望在执行一个casecase分支后,使流分支后,使流分支后,使流分支后,使流程跳出程跳出程跳出程跳出switchswitch结构,终止结构,终止结构,终止结构,终止switchswitch语句的执行。一般我们使语句的执行。一般我们使语句的执行。一般我们使语句的执行。一般我们使用用用用breakbreak语句语句语句语句来达到此目的。因此,我们通常使用的来达到此目的。因此,我们通常使用的来达到此目的。因此,我们通常使用的来达到此目的。因此,我们通常使用的switchswitch语句的一般形式为:语句的一般形式为:语句的一般形式为:语句的一般形式为:switch(switch(表达式表达式表达式表达式)case case 常量表达式常量表达式常量表达式常量表达式1 1:语句:语句:语句:语句1 1;break break;case case 常量表达式常量表达式常量表达式常量表达式2 2:语句:语句:语句:语句2 2;break break;case case 常量表达式常量表达式常量表达式常量表达式n n:语句:语句:语句:语句n n;breakbreak;default default:语句:语句:语句:语句n+1n+1 最后一个分支可以不加最后一个分支可以不加最后一个分支可以不加最后一个分支可以不加breakbreak语句。语句。语句。语句。这样,这样,这样,这样,switchswitch语句的流程图就改为:语句的流程图就改为:语句的流程图就改为:语句的流程图就改为:表达式=常量表达式1表达式=常量表达式2表达式=常量表达式n语句1语句2语句ndefault语句n+1breakbreakbreakbreak因此上例可以改写为:因此上例可以改写为:因此上例可以改写为:因此上例可以改写为:switch(grade)switch(grade)caseA:printf(“85100n”);break;caseA:printf(“85100n”);break;caseB:printf(“7084n”);break;caseB:printf(“7084n”);break;caseC:printf(“6069n”);break;caseC:printf(“6069n”);break;caseD:printf(“60n”);break;caseD:printf(“60n”);break;default:printf(“errorn”);break;default:printf(“errorn”);break;如果如果如果如果gradegrade的值为的值为的值为的值为 B B,则只输出,则只输出,则只输出,则只输出“70847084”。说明:说明:说明:说明:(1)(1)若所有的若所有的若所有的若所有的casecase中的常量表达式的值都没有与表达中的常量表达式的值都没有与表达中的常量表达式的值都没有与表达中的常量表达式的值都没有与表达式的值匹配,执行式的值匹配,执行式的值匹配,执行式的值匹配,执行defaultdefault后面的语句;后面的语句;后面的语句;后面的语句;(2)(2)每一个每一个每一个每一个casecase的常量表达式的值必须互不相同,否的常量表达式的值必须互不相同,否的常量表达式的值必须互不相同,否的常量表达式的值必须互不相同,否则就会出现互相矛盾的现象;则就会出现互相矛盾的现象;则就会出现互相矛盾的现象;则就会出现互相矛盾的现象;(3)(3)各个各个各个各个casecase和和和和defaultdefault的出现次序不影响执行结果;的出现次序不影响执行结果;的出现次序不影响执行结果;的出现次序不影响执行结果;5.5 程序举例程序举例编写程序的一般步骤:编写程序的一般步骤:编写程序的一般步骤:编写程序的一般步骤:1 1)分析题意;分析题意;分析题意;分析题意;2 2)根据题意划出根据题意划出根据题意划出根据题意划出N-SN-S流程图;流程图;流程图;流程图;3 3)写出伪代码;写出伪代码;写出伪代码;写出伪代码;4 4)写出程序代码;写出程序代码;写出程序代码;写出程序代码;5 5)调试程序。调试程序。调试程序。调试程序。例例例例5.55.5 写程序,判断某一年是否闰年。写程序,判断某一年是否闰年。写程序,判断某一年是否闰年。写程序,判断某一年是否闰年。分析题意可参见例分析题意可参见例分析题意可参见例分析题意可参见例2.32.3和例和例和例和例2.132.13。此题中为了程序书写方。此题中为了程序书写方。此题中为了程序书写方。此题中为了程序书写方便,我们定义一个整型变量便,我们定义一个整型变量便,我们定义一个整型变量便,我们定义一个整型变量leapleap作为是否闰年的标志。作为是否闰年的标志。作为是否闰年的标志。作为是否闰年的标志。画出画出画出画出N-SN-S流程图。流程图。流程图。流程图。year被4整除真假year被100整除year被400整除真真真假假假leap=0leap=0leap=1leap=1leap输出“闰年”输出“非闰年”main()main()int year,leap int year,leap;scanf(“%d”,&year);scanf(“%d”,&year);if(year%4=0)if(year%4=0)if(year%100=0)if(year%100=0)if(year%400=0)if(year%400=0)leap=1;leap=1;else else leap=0;leap=0;else else leap=1;leap=1;else else leap=0;leap=0;if(leap)if(leap)printf(“%d is”,year);printf(“%d is”,year);else else printf(“%d is not”,year);printf(“%d is not”,year);printf(“a leap year.n”);printf(“a leap year.n”);例例例例5.75.7运输公司对用户计算费用。路程运输公司对用户计算费用。路程运输公司对用户计算费用。路程运输公司对用户计算费用。路程(s)(s)越远,每公里运费越越远,每公里运费越越远,每公里运费越越远,每公里运费越低。标准如下:低。标准如下:低。标准如下:低。标准如下:s s 250km250km 没有折扣没有折扣没有折扣没有折扣 250=250=s s 500 500 2%2%折扣折扣折扣折扣 500=500=s s 1000 1000 5%5%折扣折扣折扣折扣 1000=1000=s s 2000 2000 8%8%折扣折扣折扣折扣 2000=2000=s s 3000 3000 10%10%折扣折扣折扣折扣 3000=3000=3000)if(s=3000)c=12;c=12;else else c=s/250;c=s/250;switch(c)switch(c)case 0:d=0;break;case 0:d=0;break;case 1:d=2;break;case 1:d=2;break;case 2:case 2:case 3:d=5;break;case 3:d=5;break;case 4:case 4:case 5:case 5:case 6:case 6:case 7:d=8;break;case 7:d=8;break;case 8:case 8:case 9:case 9:case 10:case 10:case 11:d=10;break;case 11:d=10;break;case 12:d=15;break;case 12:d=15;break;f=p*w*s*(1-d/100.0);f=p*w*s*(1-d/100.0);printf(“freight=%15.4”,f);printf(“freight=%15.4”,f);