3.2 分支语句
分支语句在程序中的作用是使程序更灵活,它允许程序根据不同的情况、不同的条件等采取不同的动作、进行不同的操作,实现选择结构。在Java语言中使用的分支语句有if -else语句和switch语句。
3.2.1 if - else语句
1.用单个if语句实现单选、双选结构
用一个if - else语句可实现根据一个关系或逻辑表达式的值是true还是false两种情况下
进行不同操作的程序结构,它的语法结构如下:
if(布尔表达式) 语句1 [else 语句2]
执行到本语句,首先要计算布尔表达式,若值为真,则执行语句1,否则(值为假时)执行语句2(实现双选结构)。语句1和语句2都可以是复合语句。
if - else语句的else语句2部分可省略,省略时,若布尔表达式的值为假,则不执行任何语句(实现单选结构)。
【例3.2】用Math类的random()方法产生一个字符,若该字符是一个大写英文字母,则输出“Yes!”,否则输出“No!”。
random()方法产生的随机数在0.0和1.0之间,乘以128后,其值在0.0和128.0之间,将它转换为char类型后,用if来判断是否在'A'和'Z'之间。程序如下:
class IsUpper{ public static void main(String args[]){ char ch; ch=(char)(Math.random()*128); if(ch >= 'A' && ch <= 'Z') System.out.println(ch + "是大写字母。"); else System.out.println(ch + "不是大写字母。"); } }
程序的一次运行结果如下:
e不是大写字母。
2.用多个if语句实现多选结构
(1)if语句并列
在多个if语句中可书写多个条件,若这些if并列,且这些条件包含了所有的情况无一遗漏也不重复,就可以实现多选结构。
【例3.3】对任意三个存放在变量a,b,c中的int类型数据,按从小到大的顺序输出它们。
下面程序的设计思想是:将最小数据存入变量a中,这需要将a与b、c比较两次;然后,将b,c中的小者存入变量b中,这需要b与c比较1次,共需比较3次。用3个并列if实现。
class Sort3{ public static void main(String args[]){ int a = 10,b = 8,c = 12,t; if(a > b){t = a;a = b;b = t;} if(a > c){t = a;a = c;c = t;} if(b > c){t = b;b = c;c = t;} System.out.println(a + " " + b + " " + c); } }
程序运行结果如下:
8 10 12
在本例中,程序运行前,数据a,b,c中的值是无序的,程序运行后,a,b,c已经按从小到大的顺序排序。
(2)if语句嵌套
在if - else语句中,若语句1或语句2又是if - else语句时,就构成了if语句的嵌套。采用if嵌套的程序设计方法也可实现多选操作。
【例3.4】检查用random()方法产生的一个字符,判断是否为英文大写字母、小写字母、数字、空格或是其他符号,并输出相应信息。
程序要根据5 种不同的字符情况输出不同的信息。这属于多分支的程序设计,采用if嵌套的方法。程序如下:
class Letter{ public static void main(String args[]){ char ch; ch=(char)(Math.random()*128); if(ch < ' ') System.out.println("是不可显示字符!"); else if(ch >= 'a' && ch <= 'z') System.out.println(ch + " 是小写字母!"); else if(ch >= 'A' && ch <= 'Z') System.out.println(ch + " 是大写字母!"); else if(ch >= '0' && ch <= '9') System.out.println(ch + " 是数字!"); else System.out.println(ch + " 是其他符号!"); } }
需要注意的是,Java编译器总是将else与其最近未配对的if配对。因为if - else语句允许else部分省略,会出现if的个数多于else个数的情况,此时要注意if和else的配对,否则可能发生逻辑错误。例如:
if(x > 5) if(y > 10) System.out.println("x大于5并且y大于10。"); else System.out.println("x不大于5。");
程序员想实现x是否大于5输出不同字符串的本意,但Java编译器却理解为:当x大于5且y大于10时输出第一个字符串,当x大于5且y不大于10时输出第二个字符串。两个字符串均在x大于5时输出,当x不大于5时,什么也不输出,此时出现了逻辑错误。
为避免嵌套时if和else配对时逻辑出错,可用下面的方法之一来解决。
(1)在用if嵌套方法进行多分支程序设计时,将if语句嵌套在else部分。例如,上述例子中的逻辑关系可改写为:
if(x <= 5) System.out.println("x不大于5。");
else if(y > 10) System.out.println("x大于5并且y大于10。");
(2)若需要在if - else语句的语句1部分嵌套if语句,则将内层的if语句用括号括起来,指明正确的if与else的配对组合。例如,上述例子中的逻辑关系可改写为:
if(x > 5){ if(y > 10) System.out.println("x大于5并且y大于10。"); } else System.out.println("x不大于5。");
3.2.2 switch语句
switch多分支语句结构实际上也是一种if - else结构,不过它使得在编码时很容易写出判断条件,特别是条件有很多选项而且比较简单的时候。switch的语法结构如下:
switch(表达式){ case值1: 语句1;break; case值2: 语句2;break; ... case值N: 语句N;break; default: 语句N+1;break; }
执行switch语句时,首先计算表达式的值(其类型是整型或字符型,并与各个case之后的常量值类型相同),然后将该值同每个case后的值做恒等比较:若相等,则程序流程转入该值后的语句;若表达式的值与任何一个case后的值都不相同,则执行default后的语句(若没有default子句,则什么都不执行)。
使用switch语句时,需要注意的是:
(1)各个case后的常量值应各不相同。
(2)通常在每一种case情况后都应使用break语句,否则,遇到第一个相等情况后,下面break前的所有语句都会被执行(包括default后面的语句,若有的话)。可以试着分别加上或去掉break语句来执行例3.4。
(3)语句1至语句N+1可以是一条或多条语句,不必使用复合语句。
(4)不同case后的语句相同时,可以合并多个case子句。
(5)switch语句在用表达式的值比较每一个case后的值时,是从前往后顺序进行的。
若各个值互不相同,则case子句的顺序可任意。通常default子句放在switch结构的最后,使得switch语句最后执行default子句。
【例3.5】查看五级分制的成绩对应的百分制成绩的范围。设百分制与五级分制成绩的对应关系为:
A:90~100 B:80~89 C:70~79 D:60~69 E: 60以下
class SwitchTest{ public static void main(String args[])throws java.io.IOException{ char a; System.out.println("请输入大写字母A ~ E:"); a=(char)System.in.read(); switch(a){ case 'A':System.out.println("范围90~100!");break; case 'B':System.out.println("范围80~89!");break; case 'C':System.out.println("范围70~79!");break; case 'D':System.out.println("范围60~69!");break; case 'E':System.out.println("60分以下!");break; default: System.out.println("重新输入!"); } } }
在代码中加break语句后,应明确知道程序将会发生的变化,并要确认程序没有转移到不想执行的代码上。
【例3.6】输入一个小写字母,判断是元音还是辅音。
因为元音有5 个,都需要执行相同的语句,为避免重复,只需写出最后一个值后的语句和break语句即可。
class EmptyCase { public static void main(String args[])throws java.io.IOException{ // 从键盘输入一个小写字母 char ch =(char)System.in.read(); // 确定是元音还是辅音 switch(ch) { case 'a': case 'e': case 'i': case 'o': case 'u':System.out.println(ch + " 是元音");break; default:System.out.println(ch + " 是辅音"); } } }